From 855b41f29c1944a1a532c47c98bde5cf15c25453 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Wed, 9 Apr 2014 20:30:59 -0700 Subject: [PATCH] remove obsolete/unmaintained files from builds directory --- builds/4chan-X.js | 10263 ---------------------- builds/xpi/4chanx.xpi | Bin 208535 -> 0 bytes builds/xpi/data/4chan-X.user.js | 13534 ------------------------------ builds/xpi/data/greaseshim.js | 62 - builds/xpi/doc/main.md | 0 builds/xpi/icon.png | Bin 185 -> 0 bytes builds/xpi/icon64.png | Bin 232 -> 0 bytes builds/xpi/lib/main.js | 82 - builds/xpi/package.json | 9 - builds/xpi/test/test-main.js | 12 - 10 files changed, 23962 deletions(-) delete mode 100755 builds/4chan-X.js delete mode 100644 builds/xpi/4chanx.xpi delete mode 100644 builds/xpi/data/4chan-X.user.js delete mode 100644 builds/xpi/data/greaseshim.js delete mode 100644 builds/xpi/doc/main.md delete mode 100755 builds/xpi/icon.png delete mode 100755 builds/xpi/icon64.png delete mode 100644 builds/xpi/lib/main.js delete mode 100644 builds/xpi/package.json delete mode 100644 builds/xpi/test/test-main.js diff --git a/builds/4chan-X.js b/builds/4chan-X.js deleted file mode 100755 index b5ea4362f..000000000 --- a/builds/4chan-X.js +++ /dev/null @@ -1,10263 +0,0 @@ -// Generated by CoffeeScript -// ==UserScript== -// @name 4chan X -// @version 1.2.25 -// @namespace 4chan-X -// @description Cross-browser userscript for maximum lurking on 4chan. -// @license MIT; https://github.com/seaweedchan/4chan-x/blob/master/LICENSE -// @match *://api.4chan.org/* -// @match *://boards.4chan.org/* -// @match *://images.4chan.org/* -// @match *://sys.4chan.org/* -// @grant GM_getValue -// @grant GM_setValue -// @grant GM_deleteValue -// @grant GM_openInTab -// @run-at document-start -// @updateURL https://github.com/seaweedchan/4chan-x/raw/stable/builds/4chan-X.meta.js -// @downloadURL https://github.com/seaweedchan/4chan-x/raw/stable/builds/4chan-X.user.js -// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAgMAAAAqbBEUAAAACVBMVEUAAGcAAABmzDNZt9VtAAAAAXRSTlMAQObYZgAAAHFJREFUKFOt0LENACEIBdBv4Qju4wgWanEj3D6OcIVMKaitYHEU/jwTCQj8W75kiVCSBvdQ5/AvfVHBin11BgdRq3ysBgfwBDRrj3MCIA+oAQaku/Q1cNctrAmyDl577tOThYt/Y1RBM4DgOHzM0HFTAyLukH/cmRnqAAAAAElFTkSuQmCC -// ==/UserScript== -/* -* 4chan X - Version 1.2.25 - 2013-08-11 -* -* Licensed under the MIT license. -* https://github.com/seaweedchan/4chan-x/blob/master/LICENSE -* -* Appchan X Copyright © 2013-2013 Zixaphir -* http://zixaphir.github.io/appchan-x/ -* 4chan x Copyright © 2009-2011 James Campos -* https://github.com/aeosynth/4chan-x -* 4chan x Copyright © 2012-2013 Nicolas Stepien -* https://4chan-x.just-believe.in/ -* 4chan x Copyright © 2013-2013 Jordan Bates -* http://seaweedchan.github.io/4chan-x/ -* 4chan x Copyright © 2012-2013 ihavenoface -* http://ihavenoface.github.io/4chan-x/ -* 4chan SS Copyright © 2011-2013 Ahodesuka -* https://github.com/ahodesuka/4chan-Style-Script/ -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, -* copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following -* conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -* OTHER DEALINGS IN THE SOFTWARE. -* -* Contributors: -* aeosynth -* mayhemydg -* noface -* !K.WeEabo0o -* blaise -* that4chanwolf -* desuwa -* seaweed -* e000 -* ahodesuka -* Shou -* ferongr -* xat -* Ongpot -* thisisanon -* Anonymous -* Seiba -* herpaderpderp -* WakiMiko -* btmcsweeney -* AppleBloom -* detharonil -* -* All the people who've taken the time to write bug reports. -* -* Thank you. -*/ - -/* -* Contains data from external sources: -* -* audio/beep.wav from http://freesound.org/people/pierrecartoons1979/sounds/90112/ -* cc-by-nc-3.0 -* -* 4chan/4chan-JS (https://github.com/4chan/4chan-JS) -* Copyright (c) 2012-2013, 4chan LLC -* All rights reserved. -* -* license: https://github.com/4chan/4chan-JS/blob/master/LICENSE -* -* Linkify: (http://userscripts.org/scripts/show/1352) -* Copyright (c) 2011, Anthony Lieuallen -* All rights reserved. -* Originally written by Anthony Lieuallen of http://arantius.com/ -* Licensed for unlimited modification and redistribution as long as -* this notice is kept intact. -* -* license: http://userscripts.org/scripts/review/1352 -* -*/ -(function() { - var $, $$, Anonymize, ArchiveLink, Board, Build, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DataBoards, DeleteLink, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Keybinds, Linkify, Main, Menu, Nav, Notification, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g, - __slice = [].slice, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Config = { - main: { - 'Miscellaneous': { - 'Catalog Links': [true, 'Add toggle link in header menu to turn Navigation links into links to each board\'s catalog.'], - 'External Catalog': [false, 'Link to external catalog instead of the internal one.'], - 'QR Shortcut': [false, 'Adds a small [QR] link in the header.'], - 'Announcement Hiding': [true, 'Add button to hide 4chan announcements.'], - '404 Redirect': [true, 'Redirect dead threads and images.'], - 'Keybinds': [true, 'Bind actions to keyboard shortcuts.'], - 'Time Formatting': [true, 'Localize and format timestamps.'], - 'Relative Post Dates': [true, 'Display dates like "3 minutes ago". Tooltip shows the timestamp.'], - 'File Info Formatting': [true, 'Reformat the file information.'], - 'Comment Expansion': [true, 'Add buttons to expand long comments.'], - 'Thread Expansion': [true, 'Add buttons to expand threads.'], - 'Index Navigation': [false, 'Add buttons to navigate between threads.'], - 'Reply Navigation': [false, 'Add buttons to navigate to top / bottom of thread.'], - 'Check for Updates': [true, 'Check for updated versions of 4chan X.'], - 'Show Updated Notifications': [true, 'Show notifications when 4chan X is successfully updated.'], - 'Emoji': [false, 'Adds icons next to names for different emails'], - 'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'], - 'Remove Spoilers': [false, 'Remove all spoilers in text.'], - 'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'] - }, - 'Linkification': { - 'Linkify': [true, 'Convert text into links where applicable.'], - 'Allow False Positives': [false, 'Linkify everything, allowing more false positives but reducing missed links'], - 'Embedding': [true, 'Embed supported services.'], - 'Auto-embed': [false, 'Auto-embed Linkify Embeds.'], - 'Link Title': [true, 'Replace the link of a supported site with its actual title. Currently Supported: YouTube, Vimeo, SoundCloud, and Github gists'] - }, - 'Filtering': { - 'Anonymize': [false, 'Make everyone Anonymous.'], - 'Filter': [true, 'Self-moderation placebo.'], - 'Recursive Hiding': [true, 'Hide replies of hidden posts, recursively.'], - 'Thread Hiding Buttons': [false, 'Add buttons to hide entire threads.'], - 'Reply Hiding Buttons': [false, 'Add buttons to hide single replies.'], - 'Filtered Backlinks': [true, 'When enabled, shows backlinks to filtered posts with a line-through decoration. Otherwise, hides the backlinks.'], - 'Stubs': [true, 'Show stubs of hidden threads / replies.'] - }, - 'Images': { - 'Image Expansion': [true, 'Expand images.'], - 'Image Hover': [true, 'Show full image on mouseover.'], - 'Sauce': [true, 'Add sauce links to images.'], - 'Reveal Spoiler Thumbnails': [false, 'Replace spoiler thumbnails with the original image.'], - 'Replace GIF': [false, 'Replace thumbnail of gifs with its actual image.'], - 'Replace PNG': [false, 'Replace pngs.'], - 'Replace JPG': [false, 'Replace jpgs.'], - 'Image Prefetching': [false, 'Preload images'], - 'Fappe Tyme': [false, 'Hide posts without images. *hint* *hint*'] - }, - 'Menu': { - 'Menu': [true, 'Add a drop-down menu to posts.'], - 'Report Link': [true, 'Add a report link to the menu.'], - 'Thread Hiding Link': [true, 'Add a link to hide entire threads.'], - 'Reply Hiding Link': [true, 'Add a link to hide single replies.'], - 'Delete Link': [true, 'Add post and image deletion links to the menu.'], - 'Archive Link': [true, 'Add an archive link to the menu.'] - }, - 'Monitoring': { - 'Thread Updater': [true, 'Fetch and insert new replies. Has more options in its own dialog.'], - 'Unread Count': [true, 'Show the unread posts count in the tab title.'], - 'Hide Unread Count at (0)': [false, 'Hide the unread posts count in the tab title when it reaches 0.'], - 'Unread Favicon': [true, 'Show a different favicon when there are unread posts.'], - 'Unread Line': [true, 'Show a line to distinguish read posts from unread ones.'], - 'Scroll to Last Read Post': [true, 'Scroll back to the last read post when reopening a thread.'], - 'Thread Excerpt': [true, 'Show an excerpt of the thread in the tab title.'], - 'Thread Stats': [true, 'Display reply and image count.'], - 'Page Count in Stats': [false, 'Display the page count in the thread stats as well.'], - 'Updater and Stats in Header': [true, 'Places the thread updater and thread stats in the header instead of floating them.'], - 'Thread Watcher': [true, 'Bookmark threads.'], - 'Toggleable Thread Watcher': [true, 'Adds a shortcut for the thread watcher, hides the watcher by default, and makes it scroll with the page.'], - 'Auto Watch': [true, 'Automatically watch threads you start.'], - 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'] - }, - 'Posting': { - 'Quick Reply': [true, 'All-in-one form to reply, create threads, automate dumping and more.'], - 'Persistent QR': [true, 'The Quick reply won\'t disappear after posting.'], - 'Auto Hide QR': [true, 'Automatically hide the quick reply when posting.'], - 'Open Post in New Tab': [true, 'Open new threads or replies to a thread from the index in a new tab.'], - 'Remember Subject': [false, 'Remember the subject field, instead of resetting after posting.'], - 'Remember Spoiler': [false, 'Remember the spoiler state, instead of resetting after posting.'], - 'Hide Original Post Form': [true, 'Hide the normal post form.'], - 'Cooldown': [true, 'Indicate the remaining time before posting again.'], - 'Cooldown Prediction': [true, 'Decrease the cooldown time by taking into account upload speed. Disable it if it\'s inaccurate for you.'], - 'Posting Success Notifications': [true, 'Show notifications on successful post creation or file uploading.'], - 'Captcha Warning Notifications': [true, 'When disabled, shows a red border on the CAPTCHA input until a key is pressed instead of a notification.'] - }, - 'Quote Links': { - 'Quote Backlinks': [true, 'Add quote backlinks.'], - 'OP Backlinks': [true, 'Add backlinks to the OP.'], - 'Quote Inlining': [true, 'Inline quoted post on click.'], - 'Quote Hash Navigation': [false, 'Include an extra link after quotes for autoscrolling to quoted posts.'], - 'Forward Hiding': [true, 'Hide original posts of inlined backlinks.'], - 'Quote Previewing': [true, 'Show quoted post on hover.'], - 'Quote Highlighting': [true, 'Highlight the previewed post.'], - 'Resurrect Quotes': [true, 'Link dead quotes to the archives.'], - 'Mark Quotes of You': [true, 'Add \'(You)\' to quotes linking to your posts.'], - 'Quoted Title': [false, 'Change the page title to reflect you\'ve been quoted.'], - 'Highlight Posts Quoting You': [false, 'Highlights any posts that contain a quote to your post.'], - 'Highlight Own Posts': [false, 'Highlights own posts if Mark Quotes of You is enabled.'], - 'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'], - 'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'], - 'Quote Threading': [true, 'Thread conversations'] - } - }, - imageExpansion: { - 'Fit width': [false, ''], - 'Fit height': [false, ''], - 'Expand spoilers': [true, 'Expand all images along with spoilers.'], - 'Expand from here': [false, 'Expand all images only from current position to thread end.'], - 'Advance on contract': [false, 'Advance to next post when contracting an expanded image.'] - }, - filter: { - name: "# Filter any namefags:\n#/^(?!Anonymous$)/", - uniqueID: "# Filter a specific ID:\n#/Txhvk1Tl/", - tripcode: "# Filter any tripfag\n#/^!/", - capcode: "# Set a custom class for mods:\n#/Mod$/;highlight:mod;op:yes\n# Set a custom class for moot:\n#/Admin$/;highlight:moot;op:yes", - email: "# Filter any e-mails that are not `sage` on /a/ and /jp/:\n#/^(?!sage$)/;boards:a,jp", - subject: "# Filter Generals on /v/:\n#/general/i;boards:v;op:only", - comment: "# Filter Stallman copypasta on /g/:\n#/what you\'re refer+ing to as linux/i;boards:g", - flag: '', - filename: '', - dimensions: "# Highlight potential wallpapers:\n#/1920x1080/;op:yes;highlight;top:no;boards:w,wg", - filesize: '', - MD5: '' - }, - sauces: "https://www.google.com/searchbyimage?image_url=%TURL\nhttp://iqdb.org/?url=%TURL\n#//tineye.com/search?url=%TURL\n#http://saucenao.com/search.php?url=%TURL\n#http://3d.iqdb.org/?url=%TURL\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#http://imgur.com/upload?url=%URL;text:Upload to imgur\n#http://ompldr.org/upload?url1=%URL;text:Upload to ompldr\n# \"View Same\" in archives:\n#//archive.foolz.us/_/search/image/%MD5/;text:View same on foolz\n#//archive.foolz.us/%board/search/image/%MD5/;text:View same on foolz /%board/\n#//archive.installgentoo.net/%board/image/%MD5;text:View same on installgentoo /%board/", - 'sageEmoji': '4chan SS', - 'emojiPos': 'before', - 'Custom CSS': false, - Header: { - 'Fixed Header': true, - 'Header auto-hide': false, - 'Bottom Header': false, - 'Centered links': false, - 'Header catalog links': false, - 'Bottom Board List': true, - 'Custom Board Navigation': true - }, - boardnav: "[ toggle-all ]\na-replace\nc-replace\ng-replace\nk-replace\nv-replace\nvg-replace\nvr-replace\nck-replace\nco-replace\nfit-replace\njp-replace\nmu-replace\nsp-replace\ntv-replace\nvp-replace\nq-replace\n[external-text:\"FAQ\",\"https://github.com/seaweedchan/4chan-x/wiki/Frequently-Asked-Questions\"]", - QR: { - 'QR.personas': "#email:\"sage\";boards:jp;always" - }, - time: '%m/%d/%y(%a)%H:%M:%S', - backlink: '>>%id', - fileInfo: '%L (%p%s, %r)', - favicon: 'ferongr', - usercss: '', - 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': ['i', 'Open QR without post number inserted.'], - 'Open QR': ['Shift+i', 'Open QR with post number inserted.'], - 'Open settings': ['Alt+o', 'Open Settings.'], - 'Close': ['Esc', 'Close Settings, Notifications or QR.'], - '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.'], - 'Toggle sage': ['Alt+s', 'Toggle sage in email field'], - 'Submit QR': ['Ctrl+Enter', 'Submit post.'], - 'Watch': ['w', 'Watch thread.'], - 'Update': ['r', 'Update the thread now.'], - 'Expand image': ['Shift+e', 'Expand selected image.'], - 'Expand images': ['e', 'Expand all images.'], - 'fappeTyme': ['f', 'Fappe Tyme.'], - 'Front page': ['0', 'Jump to page 0.'], - 'Open front page': ['Shift+0', 'Open page 0 in a new tab.'], - 'Next page': ['Shift+Right', 'Jump to the next page.'], - 'Previous page': ['Shift+Left', 'Jump to the previous page.'], - 'Open catalog': ['Shift+c', 'Open the catalog of the current board'], - 'Next thread': ['Shift+Down', 'See next thread.'], - 'Previous thread': ['Shift+Up', 'See previous thread.'], - 'Expand thread': ['Ctrl+e', 'Expand thread.'], - 'Open thread': ['o', 'Open thread in current tab.'], - 'Open thread tab': ['Shift+o', 'Open thread in new tab.'], - 'Next reply': ['j', 'Select next reply.'], - 'Previous reply': ['k', 'Select previous reply.'], - 'Deselect reply': ['Shift+d', 'Deselect reply.'], - 'Hide': ['x', 'Hide thread.'] - }, - updater: { - checkbox: { - 'Beep': [false, 'Beep on new post to completely read thread.'], - 'Auto Scroll': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'], - 'Bottom Scroll': [false, 'Always scroll to the bottom, not the first new post. Useful for event threads.'], - 'Scroll BG': [false, 'Auto-scroll background tabs.'], - 'Auto Update': [true, 'Automatically fetch new posts.'], - 'Optional Increase': [false, 'Increase the intervals between updates on threads without new posts.'] - }, - 'Interval': 30 - } - }; - - if (!/^(boards|images|sys)\.4chan\.org$/.test(location.hostname)) { - return; - } - - Conf = {}; - - c = console; - - d = document; - - doc = d.documentElement; - - g = { - VERSION: '1.2.25', - NAMESPACE: '4chan X.', - boards: {}, - threads: {}, - posts: {} - }; - - String.prototype.capitalize = function() { - return this.charAt(0).toUpperCase() + this.slice(1); - }; - - String.prototype.contains = function(string) { - return this.indexOf(string) > -1; - }; - - Array.prototype.add = function(object, position) { - var keep; - keep = this.slice(position); - this.length = position; - this.push(object); - return this.pushArrays(keep); - }; - - Array.prototype.contains = function(object) { - return this.indexOf(object) > -1; - }; - - Array.prototype.indexOf = function(object) { - var i; - i = this.length; - while (i--) { - if (this[i] === object) { - return i; - } - } - return i; - }; - - Array.prototype.pushArrays = function() { - var arg, args, _i, _len; - args = arguments; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - this.push.apply(this, arg); - } - return this; - }; - - Array.prototype.remove = function(object) { - var index; - if ((index = this.indexOf(object)) > -1) { - return this.splice(index, 1); - } else { - return false; - } - }; - - $ = function(selector, root) { - if (root == null) { - root = d.body; - } - return root.querySelector(selector); - }; - - $.extend = function(object, properties) { - var key, val; - for (key in properties) { - val = properties[key]; - if (!properties.hasOwnProperty(key)) { - continue; - } - object[key] = val; - } - }; - - $.DAY = 24 * ($.HOUR = 60 * ($.MINUTE = 60 * ($.SECOND = 1000))); - - $.id = function(id) { - return d.getElementById(id); - }; - - $.ready = function(fc) { - var cb, _ref; - if ((_ref = d.readyState) === 'interactive' || _ref === 'complete') { - $.queueTask(fc); - return; - } - cb = function() { - $.off(d, 'DOMContentLoaded', cb); - return fc(); - }; - return $.on(d, 'DOMContentLoaded', cb); - }; - - $.formData = function(form) { - var fd, key, val; - if (form instanceof HTMLFormElement) { - return new FormData(form); - } - fd = new FormData(); - for (key in form) { - val = form[key]; - if (!val) { - continue; - } - if (val.size && val.name) { - fd.append(key, val, val.name); - } else { - fd.append(key, val); - } - } - return fd; - }; - - $.ajax = function(url, callbacks, opts) { - var cred, err, form, headers, key, r, sync, type, upCallbacks, val; - if (opts == null) { - opts = {}; - } - type = opts.type, cred = opts.cred, headers = opts.headers, upCallbacks = opts.upCallbacks, form = opts.form, sync = opts.sync; - r = new XMLHttpRequest(); - r.overrideMimeType('text/html'); - type || (type = form && 'post' || 'get'); - r.open(type, url, !sync); - for (key in headers) { - val = headers[key]; - r.setRequestHeader(key, val); - } - $.extend(r, callbacks); - $.extend(r.upload, upCallbacks); - try { - r.withCredentials = cred; - } catch (_error) { - err = _error; - } - r.send(form); - return r; - }; - - $.cache = (function() { - var reqs; - reqs = {}; - return function(url, cb) { - var err, req, rm; - if (req = reqs[url]) { - if (req.readyState === 4) { - cb.call(req, req.evt); - } else { - req.callbacks.push(cb); - } - return; - } - rm = function() { - return delete reqs[url]; - }; - try { - req = $.ajax(url, { - onload: function(e) { - var _i, _len, _ref; - _ref = this.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - cb = _ref[_i]; - cb.call(this, e); - } - this.evt = e; - return delete this.callbacks; - }, - onabort: rm, - onerror: rm - }); - } catch (_error) { - err = _error; - return; - } - req.callbacks = [cb]; - return reqs[url] = req; - }; - })(); - - $.cb = { - checked: function() { - $.set(this.name, this.checked); - return Conf[this.name] = this.checked; - }, - value: function() { - $.set(this.name, this.value.trim()); - return Conf[this.name] = this.value; - } - }; - - $.asap = function(test, cb) { - if (test()) { - return cb(); - } else { - return setTimeout($.asap, 25, test, cb); - } - }; - - $.addStyle = function(css, id) { - var style; - style = $.el('style', { - id: id, - textContent: css - }); - $.asap((function() { - return d.head; - }), function() { - return $.add(d.head, style); - }); - return style; - }; - - $.x = function(path, root) { - root || (root = d.body); - return d.evaluate(path, root, null, 8, null).singleNodeValue; - }; - - $.X = function(path, root) { - root || (root = d.body); - return d.evaluate(path, root, null, 6, null); - }; - - $.addClass = function(el, className) { - return el.classList.add(className); - }; - - $.rmClass = function(el, className) { - return el.classList.remove(className); - }; - - $.toggleClass = function(el, className) { - return el.classList.toggle(className); - }; - - $.hasClass = function(el, className) { - return el.classList.contains(className); - }; - - $.rm = (function() { - if ('remove' in Element.prototype) { - return function(el) { - return el.remove(); - }; - } else { - return function(el) { - var _ref; - return (_ref = el.parentNode) != null ? _ref.removeChild(el) : void 0; - }; - } - })(); - - $.rmAll = function(root) { - var node; - while (node = root.firstChild) { - root.removeChild(node); - } - }; - - $.tn = function(s) { - return d.createTextNode(s); - }; - - $.frag = function() { - return d.createDocumentFragment(); - }; - - $.nodes = function(nodes) { - var frag, node, _i, _len; - if (!(nodes instanceof Array)) { - return nodes; - } - frag = $.frag(); - for (_i = 0, _len = nodes.length; _i < _len; _i++) { - node = nodes[_i]; - frag.appendChild(node); - } - return frag; - }; - - $.add = function(parent, el) { - return parent.appendChild($.nodes(el)); - }; - - $.prepend = function(parent, el) { - return parent.insertBefore($.nodes(el), parent.firstChild); - }; - - $.after = function(root, el) { - return root.parentNode.insertBefore($.nodes(el), root.nextSibling); - }; - - $.before = function(root, el) { - return root.parentNode.insertBefore($.nodes(el), root); - }; - - $.replace = function(root, el) { - return root.parentNode.replaceChild($.nodes(el), root); - }; - - $.el = function(tag, properties) { - var el; - el = d.createElement(tag); - if (properties) { - $.extend(el, properties); - } - return el; - }; - - $.on = function(el, events, handler) { - var event, _i, _len, _ref; - _ref = events.split(' '); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - event = _ref[_i]; - el.addEventListener(event, handler, false); - } - }; - - $.off = function(el, events, handler) { - var event, _i, _len, _ref; - _ref = events.split(' '); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - event = _ref[_i]; - el.removeEventListener(event, handler, false); - } - }; - - $.event = function(event, detail, root) { - if (root == null) { - root = d; - } - return root.dispatchEvent(new CustomEvent(event, { - bubbles: true, - detail: detail - })); - }; - - $.open = function(URL) { - return window.open(URL, '_blank'); - }; - - $.debounce = function(wait, fn) { - var args, exec, lastCall, that, timeout; - lastCall = 0; - timeout = null; - that = null; - args = null; - exec = function() { - lastCall = Date.now(); - return fn.apply(that, args); - }; - return function() { - args = arguments; - that = this; - if (lastCall < Date.now() - wait) { - return exec(); - } - clearTimeout(timeout); - return timeout = setTimeout(exec, wait); - }; - }; - - $.queueTask = (function() { - var execTask, taskChannel, taskQueue; - taskQueue = []; - execTask = function() { - var args, func, task; - task = taskQueue.shift(); - func = task[0]; - args = Array.prototype.slice.call(task, 1); - return func.apply(func, args); - }; - if (window.MessageChannel) { - taskChannel = new MessageChannel(); - taskChannel.port1.onmessage = execTask; - return function() { - taskQueue.push(arguments); - return taskChannel.port2.postMessage(null); - }; - } else { - return function() { - taskQueue.push(arguments); - return setTimeout(execTask, 0); - }; - } - })(); - - $.globalEval = function(code) { - var script; - script = $.el('script', { - textContent: code - }); - $.add(d.head || doc, script); - return $.rm(script); - }; - - $.bytesToString = function(size) { - var unit; - unit = 0; - while (size >= 1024) { - size /= 1024; - unit++; - } - size = unit > 1 ? Math.round(size * 100) / 100 : Math.round(size); - return "" + size + " " + ['B', 'KB', 'MB', 'GB'][unit]; - }; - - $.minmax = function(value, min, max) { - return (value < min ? min : value > max ? max : value); - }; - - $.syncing = {}; - - $.sync = (function() { - window.addEventListener('storage', function(e) { - var cb; - if (cb = $.syncing[e.key]) { - return cb(JSON.parse(e.newValue)); - } - }, false); - return function(key, cb) { - return $.syncing[g.NAMESPACE + key] = cb; - }; - })(); - - $.item = function(key, val) { - var item; - item = {}; - item[key] = val; - return item; - }; - - (function() { - var scriptStorage; - scriptStorage = opera.scriptStorage; - $["delete"] = function(keys) { - var key, _i, _len; - if (!(keys instanceof Array)) { - keys = [keys]; - } - for (_i = 0, _len = keys.length; _i < _len; _i++) { - key = keys[_i]; - key = g.NAMESPACE + key; - localStorage.removeItem(key); - delete scriptStorage[key]; - } - }; - $.get = function(key, val, cb) { - var items; - if (typeof cb === 'function') { - items = $.item(key, val); - } else { - items = key; - cb = val; - } - return $.queueTask(function() { - for (key in items) { - if (val = scriptStorage[g.NAMESPACE + key]) { - items[key] = JSON.parse(val); - } - } - return cb(items); - }); - }; - $.set = (function() { - var set; - set = function(key, val) { - key = g.NAMESPACE + key; - val = JSON.stringify(val); - if (key in $.syncing) { - localStorage.setItem(key, val); - } - return scriptStorage[key] = val; - }; - return function(keys, val) { - var key; - if (typeof keys === 'string') { - set(keys, val); - return; - } - for (key in keys) { - val = keys[key]; - set(key, val); - } - }; - })(); - })(); - - $$ = function(selector, root) { - if (root == null) { - root = d.body; - } - return __slice.call(root.querySelectorAll(selector)); - }; - - Board = (function() { - Board.prototype.toString = function() { - return this.ID; - }; - - function Board(ID) { - this.ID = ID; - this.threads = {}; - this.posts = {}; - g.boards[this] = this; - } - - return Board; - - })(); - - Thread = (function() { - Thread.prototype.callbacks = []; - - Thread.prototype.toString = function() { - return this.ID; - }; - - function Thread(ID, board) { - this.board = board; - this.ID = +ID; - this.fullID = "" + this.board + "." + this.ID; - this.posts = {}; - g.threads[this.fullID] = board.threads[this] = this; - } - - Thread.prototype.kill = function() { - this.isDead = true; - return this.timeOfDeath = Date.now(); - }; - - return Thread; - - })(); - - Post = (function() { - Post.prototype.callbacks = []; - - Post.prototype.toString = function() { - return this.ID; - }; - - function Post(root, thread, board, that) { - var alt, anchor, capcode, date, email, file, fileInfo, flag, info, name, post, size, subject, thumb, tripcode, uniqueID, unit; - this.thread = thread; - this.board = board; - if (that == null) { - that = {}; - } - this.ID = +root.id.slice(2); - this.fullID = "" + this.board + "." + this.ID; - post = $('.post', root); - info = $('.postInfo', post); - this.nodes = { - root: root, - post: post, - info: info, - comment: $('.postMessage', post), - quotelinks: [], - backlinks: info.getElementsByClassName('backlink') - }; - this.info = {}; - if (subject = $('.subject', info)) { - this.nodes.subject = subject; - this.info.subject = subject.textContent; - } - if (name = $('.name', info)) { - this.nodes.name = name; - this.info.name = name.textContent; - } - if (email = $('.useremail', info)) { - this.nodes.email = email; - this.info.email = decodeURIComponent(email.href.slice(7)); - } - if (tripcode = $('.postertrip', info)) { - this.nodes.tripcode = tripcode; - this.info.tripcode = tripcode.textContent; - } - if (uniqueID = $('.posteruid', info)) { - this.nodes.uniqueID = uniqueID; - this.info.uniqueID = uniqueID.firstElementChild.textContent; - } - if (capcode = $('.capcode.hand', info)) { - this.nodes.capcode = capcode; - this.info.capcode = capcode.textContent.replace('## ', ''); - } - if (flag = $('.countryFlag', info)) { - this.nodes.flag = flag; - this.info.flag = flag.title; - } - if (date = $('.dateTime', info)) { - this.nodes.date = date; - this.info.date = new Date(date.dataset.utc * 1000); - } - if (Conf['Quick Reply']) { - this.info.yours = QR.db.get({ - boardID: this.board, - threadID: this.thread, - postID: this.ID - }); - } - this.parseComment(); - this.parseQuotes(); - if ((file = $('.file', post)) && (thumb = $('img[data-md5]', file))) { - alt = thumb.alt; - anchor = thumb.parentNode; - fileInfo = file.firstElementChild; - this.file = { - info: fileInfo, - text: fileInfo.firstElementChild, - thumb: thumb, - URL: anchor.href, - size: alt.match(/[\d.]+\s\w+/)[0], - MD5: thumb.dataset.md5, - isSpoiler: $.hasClass(anchor, 'imgspoiler') - }; - size = +this.file.size.match(/[\d.]+/)[0]; - unit = ['B', 'KB', 'MB', 'GB'].indexOf(this.file.size.match(/\w+$/)[0]); - while (unit-- > 0) { - size *= 1024; - } - this.file.sizeInBytes = size; - this.file.thumbURL = that.isArchived ? thumb.src : "" + location.protocol + "//thumbs.4chan.org/" + board + "/thumb/" + (this.file.URL.match(/(\d+)\./)[1]) + "s.jpg"; - this.file.name = $('span[title]', fileInfo).title.replace(/%22/g, '"'); - if (this.file.isImage = /(jpg|png|gif)$/i.test(this.file.name)) { - this.file.dimensions = this.file.text.textContent.match(/\d+x\d+/)[0]; - } - } - if (!(this.isReply = $.hasClass(post, 'reply'))) { - this.thread.OP = this; - this.thread.isSticky = !!$('.stickyIcon', this.nodes.info); - this.thread.isClosed = !!$('.closedIcon', this.nodes.info); - } - this.clones = []; - g.posts[this.fullID] = thread.posts[this] = board.posts[this] = this; - if (that.isArchived) { - this.kill(); - } - } - - Post.prototype.parseComment = function() { - var bq, data, i, node, nodes, text, _i, _len, _ref; - bq = this.nodes.comment.cloneNode(true); - _ref = $$('.abbr, .capcodeReplies, .exif, b', bq); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - $.rm(node); - } - text = []; - nodes = d.evaluate('.//br|.//text()', bq, null, 7, null); - i = 0; - while (i < nodes.snapshotLength) { - text.push((data = nodes.snapshotItem(i++).data) ? data : '\n'); - } - return this.info.comment = text.join('').trim().replace(/\s+$/gm, ''); - }; - - Post.prototype.parseQuotes = function() { - var hash, pathname, quotelink, quotes, _i, _len, _ref; - quotes = {}; - _ref = $$('.quotelink', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - hash = quotelink.hash; - if (!hash) { - continue; - } - pathname = quotelink.pathname; - if (/catalog$/.test(pathname)) { - continue; - } - if (quotelink.hostname !== 'boards.4chan.org') { - continue; - } - this.nodes.quotelinks.push(quotelink); - if (quotelink.parentNode.parentNode.className === 'capcodeReplies') { - continue; - } - quotes["" + (pathname.split('/')[1]) + "." + hash.slice(2)] = true; - } - if (this.isClone) { - return; - } - return this.quotes = Object.keys(quotes); - }; - - Post.prototype.kill = function(file, now) { - var clone, quotelink, strong, _i, _j, _len, _len1, _ref, _ref1; - now || (now = new Date()); - if (file) { - if (this.file.isDead) { - return; - } - this.file.isDead = true; - this.file.timeOfDeath = now; - $.addClass(this.nodes.root, 'deleted-file'); - } else { - if (this.isDead) { - return; - } - this.isDead = true; - this.timeOfDeath = now; - $.addClass(this.nodes.root, 'deleted-post'); - } - if (!(strong = $('strong.warning', this.nodes.info))) { - strong = $.el('strong', { - className: 'warning', - textContent: this.isReply ? '[Deleted]' : '[Dead]' - }); - $.after($('input', this.nodes.info), strong); - } - strong.textContent = file ? '[File deleted]' : '[Deleted]'; - if (this.isClone) { - return; - } - _ref = this.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - clone.kill(file, now); - } - if (file) { - return; - } - _ref1 = Get.allQuotelinksLinkingTo(this); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - quotelink = _ref1[_j]; - if ($.hasClass(quotelink, 'deadlink')) { - continue; - } - $.add(quotelink, $.tn('\u00A0(Dead)')); - $.addClass(quotelink, 'deadlink'); - } - }; - - Post.prototype.resurrect = function() { - var clone, quotelink, strong, _i, _j, _len, _len1, _ref, _ref1; - delete this.isDead; - delete this.timeOfDeath; - $.rmClass(this.nodes.root, 'deleted-post'); - strong = $('strong.warning', this.nodes.info); - if (this.file && this.file.isDead) { - strong.textContent = '[File deleted]'; - } else { - $.rm(strong); - } - if (this.isClone) { - return; - } - _ref = this.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - clone.resurrect(); - } - _ref1 = Get.allQuotelinksLinkingTo(this); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - quotelink = _ref1[_j]; - if ($.hasClass(quotelink, 'deadlink')) { - quotelink.textContent = quotelink.textContent.replace('\u00A0(Dead)', ''); - $.rmClass(quotelink, 'deadlink'); - } - } - }; - - Post.prototype.addClone = function(context) { - return new Clone(this, context); - }; - - Post.prototype.rmClone = function(index) { - var clone, _i, _len, _ref; - this.clones.splice(index, 1); - _ref = this.clones.slice(index); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - clone.nodes.root.setAttribute('data-clone', index++); - } - }; - - return Post; - - })(); - - Clone = (function(_super) { - __extends(Clone, _super); - - function Clone(origin, context) { - var file, index, info, inline, inlined, key, nodes, post, root, val, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3; - this.origin = origin; - this.context = context; - _ref = ['ID', 'fullID', 'board', 'thread', 'info', 'quotes', 'isReply']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - this[key] = origin[key]; - } - nodes = origin.nodes; - root = nodes.root.cloneNode(true); - post = $('.post', root); - info = $('.postInfo', post); - this.nodes = { - root: root, - post: post, - info: info, - comment: $('.postMessage', post), - quotelinks: [], - backlinks: info.getElementsByClassName('backlink') - }; - _ref1 = $$('.inline', post); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - inline = _ref1[_j]; - $.rm(inline); - } - _ref2 = $$('.inlined', post); - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - inlined = _ref2[_k]; - $.rmClass(inlined, 'inlined'); - } - root.hidden = false; - $.rmClass(root, 'forwarded'); - $.rmClass(post, 'highlight'); - if (nodes.subject) { - this.nodes.subject = $('.subject', info); - } - if (nodes.name) { - this.nodes.name = $('.name', info); - } - if (nodes.email) { - this.nodes.email = $('.useremail', info); - } - if (nodes.tripcode) { - this.nodes.tripcode = $('.postertrip', info); - } - if (nodes.uniqueID) { - this.nodes.uniqueID = $('.posteruid', info); - } - if (nodes.capcode) { - this.nodes.capcode = $('.capcode', info); - } - if (nodes.flag) { - this.nodes.flag = $('.countryFlag', info); - } - if (nodes.date) { - this.nodes.date = $('.dateTime', info); - } - this.parseQuotes(); - if (origin.file) { - this.file = {}; - _ref3 = origin.file; - for (key in _ref3) { - val = _ref3[key]; - this.file[key] = val; - } - file = $('.file', post); - this.file.info = file.firstElementChild; - this.file.text = this.file.info.firstElementChild; - this.file.thumb = $('img[data-md5]', file); - this.file.fullImage = $('.full-image', file); - } - if (origin.isDead) { - this.isDead = true; - } - this.isClone = true; - index = origin.clones.push(this) - 1; - root.setAttribute('data-clone', index); - } - - return Clone; - - })(Post); - - DataBoards = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts']; - - DataBoard = (function() { - function DataBoard(key, sync) { - var init, - _this = this; - this.key = key; - this.data = Conf[key]; - $.sync(key, this.onSync.bind(this)); - this.clean(); - if (!sync) { - return; - } - init = function() { - $.off(d, '4chanXInitFinished', init); - return _this.sync = sync; - }; - $.on(d, '4chanXInitFinished', init); - } - - DataBoard.prototype["delete"] = function(_arg) { - var boardID, postID, threadID; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID; - if (postID) { - delete this.data.boards[boardID][threadID][postID]; - this.deleteIfEmpty({ - boardID: boardID, - threadID: threadID - }); - } else if (threadID) { - delete this.data.boards[boardID][threadID]; - this.deleteIfEmpty({ - boardID: boardID - }); - } else { - delete this.data.boards[boardID]; - } - return $.set(this.key, this.data); - }; - - DataBoard.prototype.deleteIfEmpty = function(_arg) { - var boardID, threadID; - boardID = _arg.boardID, threadID = _arg.threadID; - if (threadID) { - if (!Object.keys(this.data.boards[boardID][threadID]).length) { - delete this.data.boards[boardID][threadID]; - return this.deleteIfEmpty({ - boardID: boardID - }); - } - } else if (!Object.keys(this.data.boards[boardID]).length) { - return delete this.data.boards[boardID]; - } - }; - - DataBoard.prototype.set = function(_arg) { - var boardID, postID, threadID, val, _base, _base1, _base2; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID, val = _arg.val; - if (postID !== void 0) { - ((_base = ((_base1 = this.data.boards)[boardID] || (_base1[boardID] = {})))[threadID] || (_base[threadID] = {}))[postID] = val; - } else if (threadID !== void 0) { - ((_base2 = this.data.boards)[boardID] || (_base2[boardID] = {}))[threadID] = val; - } else { - this.data.boards[boardID] = val; - } - return $.set(this.key, this.data); - }; - - DataBoard.prototype.get = function(_arg) { - var ID, board, boardID, defaultValue, postID, thread, threadID, val, _i, _len; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID, defaultValue = _arg.defaultValue; - if (board = this.data.boards[boardID]) { - if (!threadID) { - if (postID) { - for (thread = _i = 0, _len = board.length; _i < _len; thread = ++_i) { - ID = board[thread]; - if (postID in thread) { - val = thread[postID]; - break; - } - } - } else { - val = board; - } - } else if (thread = board[threadID]) { - val = postID ? thread[postID] : thread; - } - } - return val || defaultValue; - }; - - DataBoard.prototype.clean = function() { - var boardID, now, val, _ref; - _ref = this.data.boards; - for (boardID in _ref) { - val = _ref[boardID]; - this.deleteIfEmpty({ - boardID: boardID - }); - } - now = Date.now(); - if ((this.data.lastChecked || 0) < now - 2 * $.HOUR) { - this.data.lastChecked = now; - for (boardID in this.data.boards) { - this.ajaxClean(boardID); - } - } - return $.set(this.key, this.data); - }; - - DataBoard.prototype.ajaxClean = function(boardID) { - var _this = this; - return $.cache("//api.4chan.org/" + boardID + "/threads.json", function(e) { - var board, page, thread, threads, _i, _j, _len, _len1, _ref, _ref1; - if (e.target.status === 404) { - _this["delete"](boardID); - } else if (e.target.status === 200) { - board = _this.data.boards[boardID]; - threads = {}; - _ref = JSON.parse(e.target.response); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - page = _ref[_i]; - _ref1 = page.threads; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - thread = _ref1[_j]; - if (thread.no in board) { - threads[thread.no] = board[thread.no]; - } - } - } - _this.data.boards[boardID] = threads; - _this.deleteIfEmpty({ - boardID: boardID - }); - } - return $.set(_this.key, _this.data); - }); - }; - - DataBoard.prototype.onSync = function(data) { - this.data = data || { - boards: {} - }; - return typeof this.sync === "function" ? this.sync() : void 0; - }; - - return DataBoard; - - })(); - - Notification = (function() { - function Notification(type, content, timeout) { - this.timeout = timeout; - this.close = __bind(this.close, this); - this.add = __bind(this.add, this); - this.el = $.el('div', { - innerHTML: '×
' - }); - this.el.style.opacity = 0; - this.setType(type); - $.on(this.el.firstElementChild, 'click', this.close); - if (typeof content === 'string') { - content = $.tn(content); - } - $.add(this.el.lastElementChild, content); - $.ready(this.add); - } - - Notification.prototype.setType = function(type) { - return this.el.className = "notification " + type; - }; - - Notification.prototype.add = function() { - if (d.hidden) { - $.on(d, 'visibilitychange', this.add); - return; - } - $.off(d, 'visibilitychange', this.add); - $.add($.id('notifications'), this.el); - this.el.clientHeight; - this.el.style.opacity = 1; - if (this.timeout) { - return setTimeout(this.close, this.timeout * $.SECOND); - } - }; - - Notification.prototype.close = function() { - return $.rm(this.el); - }; - - return Notification; - - })(); - - Polyfill = { - init: function() { - return Polyfill.visibility(); - }, - visibility: function() { - if (!('webkitHidden' in document)) { - return; - } - Object.defineProperties(HTMLDocument.prototype, { - visibilityState: { - get: function() { - return this.webkitVisibilityState; - } - }, - hidden: { - get: function() { - return this.webkitHidden; - } - } - }); - return $.on(d, 'webkitvisibilitychange', function() { - return $.event('visibilitychange'); - }); - } - }; - - Header = { - init: function() { - var barFixedToggler, barPositionToggler, customNavToggler, editCustomNav, footerToggler, headerToggler, linkJustifyToggler, - _this = this; - this.menu = new UI.Menu('header'); - this.menuButton = $.el('span', { - className: 'menu-button', - innerHTML: '' - }); - barFixedToggler = $.el('label', { - innerHTML: ' Fixed Header' - }); - headerToggler = $.el('label', { - innerHTML: ' Auto-hide header' - }); - barPositionToggler = $.el('label', { - innerHTML: ' Bottom header' - }); - linkJustifyToggler = $.el('label', { - innerHTML: " Centered links" - }); - customNavToggler = $.el('label', { - innerHTML: ' Custom board navigation' - }); - footerToggler = $.el('label', { - innerHTML: " Hide bottom board list" - }); - editCustomNav = $.el('a', { - textContent: 'Edit custom board navigation', - href: 'javascript:;' - }); - this.barFixedToggler = barFixedToggler.firstElementChild; - this.barPositionToggler = barPositionToggler.firstElementChild; - this.linkJustifyToggler = linkJustifyToggler.firstElementChild; - this.headerToggler = headerToggler.firstElementChild; - this.footerToggler = footerToggler.firstElementChild; - this.customNavToggler = customNavToggler.firstElementChild; - $.on(this.menuButton, 'click', this.menuToggle); - $.on(this.barFixedToggler, 'change', this.toggleBarFixed); - $.on(this.barPositionToggler, 'change', this.toggleBarPosition); - $.on(this.linkJustifyToggler, 'change', this.toggleLinkJustify); - $.on(this.headerToggler, 'change', this.toggleBarVisibility); - $.on(this.footerToggler, 'change', this.toggleFooterVisibility); - $.on(this.customNavToggler, 'change', this.toggleCustomNav); - $.on(editCustomNav, 'click', this.editCustomNav); - this.setBarFixed(Conf['Fixed Header']); - this.setBarVisibility(Conf['Header auto-hide']); - this.setLinkJustify(Conf['Centered links']); - $.sync('Fixed Header', Header.setBarFixed); - $.sync('Bottom Header', Header.setBarPosition); - $.sync('Header auto-hide', Header.setBarVisibility); - $.sync('Centered links', Header.setLinkJustify); - this.addShortcut(Header.menuButton); - $.event('AddMenuEntry', { - type: 'header', - el: $.el('span', { - textContent: 'Header' - }), - order: 107, - subEntries: [ - { - el: barFixedToggler - }, { - el: headerToggler - }, { - el: barPositionToggler - }, { - el: linkJustifyToggler - }, { - el: footerToggler - }, { - el: customNavToggler - }, { - el: editCustomNav - } - ] - }); - $.on(window, 'load hashchange', Header.hashScroll); - $.on(d, 'CreateNotification', this.createNotification); - $.asap((function() { - return d.body; - }), function() { - if (!Main.isThisPageLegit()) { - return; - } - $.asap((function() { - var _ref; - return $.id('boardNavMobile') || ((_ref = d.readyState) === 'interactive' || _ref === 'complete'); - }), Header.setBoardList); - $.prepend(d.body, _this.bar); - $.add(d.body, Header.hover); - return _this.setBarPosition(Conf['Bottom Header']); - }); - return $.ready(function() { - var a, cs; - _this.footer = $.id('boardNavDesktopFoot'); - if (a = $("a[href*='/" + g.BOARD + "/']", $.id('boardNavDesktopFoot'))) { - a.className = 'current'; - } - cs = $.el('a', { - id: 'settingsWindowLink', - href: 'javascript:;', - textContent: 'Catalog Settings' - }); - if (g.VIEW === 'catalog') { - _this.addShortcut(cs); - } - Header.setFooterVisibility(Conf['Bottom Board List']); - return $.sync('Bottom Board List', Header.setFooterVisibility); - }); - }, - bar: $.el('div', { - id: 'header-bar' - }), - notify: $.el('div', { - id: 'notifications' - }), - shortcuts: $.el('span', { - id: 'shortcuts' - }), - hover: $.el('div', { - id: 'hoverUI' - }), - toggle: $.el('div', { - id: 'scroll-marker' - }), - setBoardList: function() { - var a, boardList, btn, fourchannav, fullBoardList; - fourchannav = $.id('boardNavDesktop'); - if (a = $("a[href*='/" + g.BOARD + "/']", fourchannav)) { - a.className = 'current'; - } - boardList = $.el('span', { - id: 'board-list', - innerHTML: "" - }); - fullBoardList = $('#full-board-list', boardList); - btn = $('.hide-board-list-button', fullBoardList); - $.on(btn, 'click', Header.toggleBoardList); - $.rm($('#navtopright', fullBoardList)); - $.add(boardList, fullBoardList); - $.add(Header.bar, [boardList, Header.shortcuts, Header.notify, Header.toggle]); - Header.setCustomNav(Conf['Custom Board Navigation']); - Header.generateBoardList(Conf['boardnav'].replace(/(\r\n|\n|\r)/g, ' ')); - $.sync('Custom Board Navigation', Header.setCustomNav); - return $.sync('boardnav', Header.generateBoardList); - }, - generateBoardList: function(text) { - var as, list, nodes; - list = $('#custom-board-list', Header.bar); - $.rmAll(list); - if (!text) { - return; - } - as = $$('#full-board-list a', Header.bar); - nodes = text.match(/[\w@]+((-(all|title|replace|full|index|catalog|url:"[^"]+[^"]"|text:"[^"]+")|\,"[^"]+[^"]"))*|[^\w@]+/g).map(function(t) { - var a, board, m, _i, _len; - if (/^[^\w@]/.test(t)) { - return $.tn(t); - } - if (/^toggle-all/.test(t)) { - a = $.el('a', { - className: 'show-board-list-button', - textContent: (t.match(/-text:"(.+)"/) || [null, '+'])[1], - href: 'javascript:;' - }); - $.on(a, 'click', Header.toggleBoardList); - return a; - } - if (/^external/.test(t)) { - a = $.el('a', { - href: (t.match(/\,"(.+)"/) || [null, '+'])[1], - textContent: (t.match(/-text:"(.+)"\,/) || [null, '+'])[1], - className: 'external' - }); - return a; - } - board = /^current/.test(t) ? g.BOARD.ID : t.match(/^[^-]+/)[0]; - for (_i = 0, _len = as.length; _i < _len; _i++) { - a = as[_i]; - if (a.textContent === board) { - a = a.cloneNode(true); - a.textContent = /-title/.test(t) || /-replace/.test(t) && $.hasClass(a, 'current') ? a.title : /-full/.test(t) ? "/" + board + "/ - " + a.title : (m = t.match(/-text:"(.+)"/)) ? m[1] : a.textContent; - if (m = t.match(/-(index|catalog)/)) { - a.setAttribute('data-only', m[1]); - a.href = "//boards.4chan.org/" + board + "/"; - if (m[1] === 'catalog') { - a.href += 'catalog'; - $.addClass(a, 'catalog'); - } - } - if (board === '@') { - $.addClass(a, 'navSmall'); - } - return a; - } - } - return $.tn(t); - }); - return $.add(list, nodes); - }, - toggleBoardList: function() { - var bar, custom, full, showBoardList; - bar = Header.bar; - custom = $('#custom-board-list', bar); - full = $('#full-board-list', bar); - showBoardList = !full.hidden; - custom.hidden = !showBoardList; - return full.hidden = showBoardList; - }, - setBarPosition: function(bottom) { - Header.barPositionToggler.checked = bottom; - if (bottom) { - $.rmClass(doc, 'top'); - $.addClass(doc, 'bottom'); - return $.after(Header.bar, Header.notify); - } else { - $.rmClass(doc, 'bottom'); - $.addClass(doc, 'top'); - return $.add(Header.bar, Header.notify); - } - }, - setLinkJustify: function(centered) { - Header.linkJustifyToggler.checked = centered; - if (centered) { - return $.addClass(doc, 'centered-links'); - } else { - return $.rmClass(doc, 'centered-links'); - } - }, - toggleBarPosition: function() { - $.event('CloseMenu'); - Header.setBarPosition(this.checked); - Conf['Bottom Header'] = this.checked; - return $.set('Bottom Header', this.checked); - }, - toggleLinkJustify: function() { - var centered; - $.event('CloseMenu'); - centered = this.nodeName === 'INPUT' ? this.checked : void 0; - Header.setLinkJustify(centered); - return $.set('Centered links', centered); - }, - setBarFixed: function(fixed) { - Header.barFixedToggler.checked = fixed; - if (fixed) { - $.addClass(doc, 'fixed'); - return $.addClass(Header.bar, 'dialog'); - } else { - $.rmClass(doc, 'fixed'); - return $.rmClass(Header.bar, 'dialog'); - } - }, - toggleBarFixed: function() { - $.event('CloseMenu'); - Header.setBarFixed(this.checked); - Conf['Fixed Header'] = this.checked; - return $.set('Fixed Header', this.checked); - }, - setBarVisibility: function(hide) { - Header.headerToggler.checked = hide; - $.event('CloseMenu'); - (hide ? $.addClass : $.rmClass)(Header.bar, 'autohide'); - return (hide ? $.addClass : $.rmClass)(doc, 'autohide'); - }, - toggleBarVisibility: function(e) { - var hide, message; - if (e.type === 'mousedown' && e.button !== 0) { - return; - } - hide = this.nodeName === 'INPUT' ? this.checked : !$.hasClass(Header.bar, 'autohide'); - Conf['Header auto-hide'] = hide; - $.set('Header auto-hide', hide); - Header.setBarVisibility(hide); - message = hide ? 'The header bar will automatically hide itself.' : 'The header bar will remain visible.'; - return new Notification('info', message, 2); - }, - setFooterVisibility: function(hide) { - Header.footerToggler.checked = hide; - return Header.footer.hidden = hide; - }, - toggleFooterVisibility: function() { - var hide, message; - $.event('CloseMenu'); - hide = this.nodeName === 'INPUT' ? this.checked : !!Header.footer.hidden; - Header.setFooterVisibility(hide); - $.set('Bottom Board List', hide); - message = hide ? 'The bottom navigation will now be hidden.' : 'The bottom navigation will remain visible.'; - return new Notification('info', message, 2); - }, - setCustomNav: function(show) { - var btn, cust, full, _ref; - Header.customNavToggler.checked = show; - cust = $('#custom-board-list', Header.bar); - full = $('#full-board-list', Header.bar); - btn = $('.hide-board-list-button', full); - return _ref = show ? [false, true] : [true, false], cust.hidden = _ref[0], full.hidden = _ref[1], _ref; - }, - toggleCustomNav: function() { - $.cb.checked.call(this); - return Header.setCustomNav(this.checked); - }, - editCustomNav: function() { - var settings; - Settings.open('Advanced'); - settings = $.id('fourchanx-settings'); - return $('input[name=boardnav]', settings).focus(); - }, - hashScroll: function() { - var hash, post; - if (!((hash = this.location.hash.slice(1)) && (post = $.id(hash)))) { - return; - } - if ((Get.postFromRoot(post)).isHidden) { - return; - } - return Header.scrollToPost(post); - }, - scrollToPost: function(post) { - var headRect, top; - top = post.getBoundingClientRect().top; - if (Conf['Fixed Header'] && !Conf['Bottom Header']) { - headRect = Header.bar.getBoundingClientRect(); - top += -headRect.top - headRect.height; - } - return doc.scrollTop += top; - }, - addShortcut: function(el) { - var shortcut; - shortcut = $.el('span', { - className: 'shortcut fourchanx-link' - }); - $.add(shortcut, el); - return $.prepend(Header.shortcuts, shortcut); - }, - menuToggle: function(e) { - return Header.menu.toggle(e, this, g); - }, - createNotification: function(e) { - var cb, content, lifetime, notif, type, _ref; - _ref = e.detail, type = _ref.type, content = _ref.content, lifetime = _ref.lifetime, cb = _ref.cb; - notif = new Notification(type, content, lifetime); - if (cb) { - return cb(notif); - } - } - }; - - Build = { - spoilerRange: {}, - shortFilename: function(filename, isReply) { - var threshold; - threshold = isReply ? 30 : 40; - if (filename.length - 4 > threshold) { - return "" + filename.slice(0, threshold - 5) + "(...)." + filename.slice(-3); - } else { - return filename; - } - }, - postFromObject: function(data, boardID) { - var o; - o = { - postID: data.no, - threadID: data.resto || data.no, - boardID: boardID, - name: data.name, - capcode: data.capcode, - tripcode: data.trip, - uniqueID: data.id, - email: data.email ? encodeURI(data.email.replace(/"/g, '"')) : '', - subject: data.sub, - flagCode: data.country, - flagName: data.country_name, - date: data.now, - dateUTC: data.time, - comment: data.com, - isSticky: !!data.sticky, - isClosed: !!data.closed - }; - if (data.ext || data.filedeleted) { - o.file = { - name: data.filename + data.ext, - timestamp: "" + data.tim + data.ext, - url: boardID === 'f' ? "//images.4channel.org/" + boardID + "/src/" + data.filename + data.ext : "//images.4chan.org/" + boardID + "/src/" + data.tim + data.ext, - height: data.h, - width: data.w, - MD5: data.md5, - size: data.fsize, - turl: "//thumbs.4chan.org/" + boardID + "/thumb/" + data.tim + "s.jpg", - theight: data.tn_h, - twidth: data.tn_w, - isSpoiler: !!data.spoiler, - isDeleted: !!data.filedeleted - }; - } - return Build.post(o); - }, - post: function(o, isArchived) { - /* - This function contains code from 4chan-JS (https://github.com/4chan/4chan-JS). - @license: https://github.com/4chan/4chan-JS/blob/master/LICENSE - */ - - var a, boardID, capcode, capcodeClass, capcodeStart, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, ext, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, href, imgSrc, isClosed, isOP, isSticky, name, postID, quote, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; - postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, file = o.file; - isOP = postID === threadID; - staticPath = '//static.4chan.org/image/'; - if (email) { - emailStart = ''; - emailEnd = ''; - } else { - emailStart = ''; - emailEnd = ''; - } - subject = "" + (subject || '') + ""; - userID = !capcode && uniqueID ? (" (ID: ") + ("" + uniqueID + ") ") : ''; - switch (capcode) { - case 'admin': - case 'admin_highlight': - capcodeClass = " capcodeAdmin"; - capcodeStart = " ## Admin"; - capcode = (" "; - break; - case 'mod': - capcodeClass = " capcodeMod"; - capcodeStart = " ## Mod"; - capcode = (" "; - break; - case 'developer': - capcodeClass = " capcodeDeveloper"; - capcodeStart = " ## Developer"; - capcode = (" "; - break; - default: - capcodeClass = ''; - capcodeStart = ''; - capcode = ''; - } - flag = flagCode ? ("  + flagCode + ") : ''; - if (file != null ? file.isDeleted : void 0) { - fileHTML = isOP ? ("
") + ("File deleted.") + "
" : ("
") + ("File deleted.") + "
"; - } else if (file) { - ext = file.name.slice(-3); - if (!file.twidth && !file.theight && ext === 'gif') { - file.twidth = file.width; - file.theight = file.height; - } - fileSize = $.bytesToString(file.size); - fileThumb = file.turl; - if (file.isSpoiler) { - fileSize = "Spoiler Image, " + fileSize; - if (!isArchived) { - fileThumb = "" + staticPath + "spoiler"; - if (spoilerRange = Build.spoilerRange[boardID]) { - fileThumb += ("-" + boardID) + Math.floor(1 + spoilerRange * Math.random()); - } - fileThumb += '.png'; - file.twidth = file.theight = 100; - } - } - imgSrc = boardID === 'f' ? '' : ("") + ("" + fileSize + "") + ""; - a = $.el('a', { - innerHTML: file.name - }); - filename = a.textContent.replace(/%22/g, '"'); - a.textContent = Build.shortFilename(filename); - shortFilename = a.innerHTML; - a.textContent = filename; - filename = a.innerHTML.replace(/'/g, '''); - fileDims = ext === 'pdf' ? 'PDF' : "" + file.width + "x" + file.height; - fileInfo = ("File: " + file.timestamp + "") + ("-(" + fileSize + ", " + fileDims + (file.isSpoiler ? '' : ", " + shortFilename + "")) + ")"; - fileHTML = "
" + fileInfo + "
" + imgSrc + "
"; - } else { - fileHTML = ''; - } - tripcode = tripcode ? " " + tripcode + "" : ''; - sticky = isSticky ? " Sticky" : ''; - closed = isClosed ? " Closed" : ''; - container = $.el('div', { - id: "pc" + postID, - className: "postContainer " + (isOP ? 'op' : 'reply') + "Container", - innerHTML: (isOP ? '' : "
>>
") + ("
") + ("' + (isOP ? fileHTML : '') + ("' + (isOP ? '' : fileHTML) + ("
" + (comment || '') + "
") + '
' - }); - _ref = $$('.quotelink', container); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - href = quote.getAttribute('href'); - if (href[0] === '/') { - continue; - } - quote.href = "/" + boardID + "/res/" + href; - } - return container; - } - }; - - Get = { - threadExcerpt: function(thread) { - var OP, excerpt, _ref; - OP = thread.OP; - excerpt = ((_ref = OP.info.subject) != null ? _ref.trim() : void 0) || OP.info.comment.replace(/\n+/g, ' // ') || Conf['Anonymize'] && 'Anonymous' || $('.nameBlock', OP.nodes.info).textContent.trim(); - if (excerpt.length > 70) { - excerpt = "" + excerpt.slice(0, 67) + "..."; - } - return "/" + thread.board + "/ - " + excerpt; - }, - threadFromRoot: function(root) { - return g.threads["" + g.BOARD + "." + root.id.slice(1)]; - }, - postFromRoot: function(root) { - var boardID, index, link, post, postID; - link = $('a[title="Highlight this post"]', root); - boardID = link.pathname.split('/')[1]; - postID = link.hash.slice(2); - index = root.dataset.clone; - post = g.posts["" + boardID + "." + postID]; - if (index) { - return post.clones[index]; - } else { - return post; - } - }, - postFromNode: function(root) { - return Get.postFromRoot($.x('ancestor::div[contains(@class,"postContainer")][1]', root)); - }, - contextFromLink: function(quotelink) { - return Get.postFromRoot($.x('ancestor::div[parent::div[@class="thread"]][1]', quotelink)); - }, - postDataFromLink: function(link) { - var boardID, path, postID, threadID; - if (link.hostname === 'boards.4chan.org') { - path = link.pathname.split('/'); - boardID = path[1]; - threadID = path[3]; - postID = link.hash.slice(2); - } else { - boardID = link.dataset.boardid; - threadID = link.dataset.threadid || 0; - postID = link.dataset.postid; - } - return { - boardID: boardID, - threadID: +threadID, - postID: +postID - }; - }, - allQuotelinksLinkingTo: function(post) { - var ID, quote, quotedPost, quotelinks, quoterPost, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3; - quotelinks = []; - _ref = g.posts; - for (ID in _ref) { - quoterPost = _ref[ID]; - if (quoterPost.quotes.contains(post.fullID)) { - _ref1 = [quoterPost].concat(quoterPost.clones); - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - quoterPost = _ref1[_i]; - quotelinks.push.apply(quotelinks, quoterPost.nodes.quotelinks); - } - } - } - if (Conf['Quote Backlinks']) { - _ref2 = post.quotes; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - quote = _ref2[_j]; - if (!(quotedPost = g.posts[quote])) { - continue; - } - _ref3 = [quotedPost].concat(quotedPost.clones); - for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { - quotedPost = _ref3[_k]; - quotelinks.push.apply(quotelinks, __slice.call(quotedPost.nodes.backlinks)); - } - } - } - return quotelinks.filter(function(quotelink) { - var boardID, postID, _ref4; - _ref4 = Get.postDataFromLink(quotelink), boardID = _ref4.boardID, postID = _ref4.postID; - return boardID === post.board.ID && postID === post.ID; - }); - }, - postClone: function(boardID, threadID, postID, root, context) { - var post, url; - if (post = g.posts["" + boardID + "." + postID]) { - Get.insert(post, root, context); - return; - } - root.textContent = "Loading post No." + postID + "..."; - if (threadID) { - return $.cache("//api.4chan.org/" + boardID + "/res/" + threadID + ".json", function() { - return Get.fetchedPost(this, boardID, threadID, postID, root, context); - }); - } else if (url = Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - return $.cache(url, function() { - return Get.archivedPost(this, boardID, postID, root, context); - }); - } - }, - insert: function(post, root, context) { - var clone, nodes; - if (!root.parentNode) { - return; - } - clone = post.addClone(context); - Main.callbackNodes(Clone, [clone]); - nodes = clone.nodes; - $.rmAll(nodes.root); - $.add(nodes.root, nodes.post); - $.rmAll(root); - return $.add(root, nodes.root); - }, - fetchedPost: function(req, boardID, threadID, postID, root, context) { - var board, post, posts, status, thread, url, _i, _len; - if (post = g.posts["" + boardID + "." + postID]) { - Get.insert(post, root, context); - return; - } - status = req.status; - if (![200, 304].contains(status)) { - if (url = Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - $.cache(url, function() { - return Get.archivedPost(this, boardID, postID, root, context); - }); - } else { - $.addClass(root, 'warning'); - root.textContent = status === 404 ? "Thread No." + threadID + " 404'd." : "Error " + req.statusText + " (" + req.status + ")."; - } - return; - } - posts = JSON.parse(req.response).posts; - Build.spoilerRange[boardID] = posts[0].custom_spoiler; - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - if (post.no === postID) { - break; - } - if (post.no > postID) { - if (url = Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - $.cache(url, function() { - return Get.archivedPost(this, boardID, postID, root, context); - }); - } else { - $.addClass(root, 'warning'); - root.textContent = "Post No." + postID + " was not found."; - } - return; - } - } - board = g.boards[boardID] || new Board(boardID); - thread = g.threads["" + boardID + "." + threadID] || new Thread(threadID, board); - post = new Post(Build.postFromObject(post, boardID), thread, board); - Main.callbackNodes(Post, [post]); - return Get.insert(post, root, context); - }, - archivedPost: function(req, boardID, postID, root, context) { - var board, bq, comment, data, o, post, thread, threadID, _ref; - if (post = g.posts["" + boardID + "." + postID]) { - Get.insert(post, root, context); - return; - } - data = JSON.parse(req.response); - if (data.error) { - $.addClass(root, 'warning'); - root.textContent = data.error; - return; - } - bq = $.el('blockquote', { - textContent: data.comment - }); - bq.innerHTML = bq.innerHTML.replace(/\n|\[\/?b\]|\[\/?spoiler\]|\[\/?code\]|\[\/?moot\]|\[\/?banned\]/g, function(text) { - switch (text) { - case '\n': - return '
'; - case '[b]': - return ''; - case '[/b]': - return ''; - case '[spoiler]': - return ''; - case '[/spoiler]': - return ''; - case '[code]': - return '
';
-          case '[/code]':
-            return '
'; - case '[moot]': - return '
'; - case '[/moot]': - return '
'; - case '[banned]': - return ''; - case '[/banned]': - return ''; - } - }); - comment = bq.innerHTML.replace(/(^|>)(>[^<$]*)(<|$)/g, '$1$2$3').replace(/((>){2}(>\/[a-z\d]+\/)?\d+)/g, '$1'); - threadID = data.thread_num; - o = { - postID: "" + postID, - threadID: "" + threadID, - boardID: boardID, - name: data.name_processed, - capcode: (function() { - switch (data.capcode) { - case 'M': - return 'mod'; - case 'A': - return 'admin'; - case 'D': - return 'developer'; - } - })(), - tripcode: data.trip, - uniqueID: data.poster_hash, - email: data.email ? encodeURI(data.email) : '', - subject: data.title_processed, - flagCode: data.poster_country, - flagName: data.poster_country_name_processed, - date: data.fourchan_date, - dateUTC: data.timestamp, - comment: comment - }; - if ((_ref = data.media) != null ? _ref.media_filename : void 0) { - o.file = { - name: data.media.media_filename_processed, - timestamp: data.media.media_orig, - url: data.media.media_link || data.media.remote_media_link, - height: data.media.media_h, - width: data.media.media_w, - MD5: data.media.media_hash, - size: data.media.media_size, - turl: data.media.thumb_link || ("//thumbs.4chan.org/" + boardID + "/thumb/" + data.media.preview_orig), - theight: data.media.preview_h, - twidth: data.media.preview_w, - isSpoiler: data.media.spoiler === '1' - }; - } - board = g.boards[boardID] || new Board(boardID); - thread = g.threads["" + boardID + "." + threadID] || new Thread(threadID, board); - post = new Post(Build.post(o, true), thread, board, { - isArchived: true - }); - Main.callbackNodes(Post, [post]); - return Get.insert(post, root, context); - } - }; - - UI = (function() { - var Menu, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, touchend, touchmove; - dialog = function(id, position, html) { - var child, el, move, _i, _len, _ref; - el = $.el('div', { - className: 'dialog', - innerHTML: html, - id: id - }); - el.style.cssText = position; - $.get("" + id + ".position", position, function(item) { - return el.style.cssText = item["" + id + ".position"]; - }); - move = $('.move', el); - $.on(move, 'touchstart mousedown', dragstart); - _ref = move.children; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - if (!child.tagName) { - continue; - } - $.on(child, 'touchstart mousedown', function(e) { - return e.stopPropagation(); - }); - } - return el; - }; - Menu = (function() { - var close, currentMenu, lastToggledButton; - - currentMenu = null; - - lastToggledButton = null; - - function Menu(type) { - this.type = type; - $.on(d, 'AddMenuEntry', this.addEntry.bind(this)); - this.close = close.bind(this); - this.entries = []; - } - - Menu.prototype.makeMenu = function() { - var menu; - menu = $.el('div', { - className: 'dialog', - id: 'menu', - tabIndex: 0 - }); - $.on(menu, 'click', function(e) { - return e.stopPropagation(); - }); - $.on(menu, 'keydown', this.keybinds.bind(this)); - return menu; - }; - - Menu.prototype.toggle = function(e, button, data) { - var previousButton; - e.preventDefault(); - e.stopPropagation(); - if (currentMenu) { - previousButton = lastToggledButton; - this.close(); - if (previousButton === button) { - return; - } - } - if (!this.entries.length) { - return; - } - return this.open(button, data); - }; - - Menu.prototype.open = function(button, data) { - var bLeft, bRect, bTop, bottom, cHeight, cWidth, entry, left, mRect, menu, right, style, top, _i, _len, _ref, _ref1, _ref2; - menu = this.makeMenu(); - currentMenu = menu; - lastToggledButton = button; - this.entries.sort(function(first, second) { - return first.order - second.order; - }); - _ref = this.entries; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - entry = _ref[_i]; - this.insertEntry(entry, menu, data); - } - $.addClass(lastToggledButton, 'active'); - $.on(d, 'click', this.close); - $.on(d, 'CloseMenu', this.close); - $.add(Header.hover, menu); - mRect = menu.getBoundingClientRect(); - bRect = button.getBoundingClientRect(); - bTop = doc.scrollTop + d.body.scrollTop + bRect.top; - bLeft = doc.scrollLeft + d.body.scrollLeft + bRect.left; - cHeight = doc.clientHeight; - cWidth = doc.clientWidth; - _ref1 = bRect.top + bRect.height + mRect.height < cHeight ? [bRect.bottom, null] : [null, cHeight - bRect.top], top = _ref1[0], bottom = _ref1[1]; - _ref2 = bRect.left + mRect.width < cWidth ? [bRect.left, null] : [null, cWidth - bRect.right], left = _ref2[0], right = _ref2[1]; - style = menu.style; - style.top = "" + top + "px"; - style.right = "" + right + "px"; - style.bottom = "" + bottom + "px"; - style.left = "" + left + "px"; - if (right) { - $.addClass(menu, 'left'); - } - entry = $('.entry', menu); - this.focus(entry); - return menu.focus(); - }; - - Menu.prototype.insertEntry = function(entry, parent, data) { - var subEntry, submenu, _i, _len, _ref; - if (typeof entry.open === 'function') { - if (!entry.open(data)) { - return; - } - } - $.add(parent, entry.el); - if (!entry.subEntries) { - return; - } - if (submenu = $('.submenu', entry.el)) { - $.rm(submenu); - } - submenu = $.el('div', { - className: 'dialog submenu' - }); - _ref = entry.subEntries; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - subEntry = _ref[_i]; - this.insertEntry(subEntry, submenu, data); - } - $.add(entry.el, submenu); - }; - - close = function() { - $.rm(currentMenu); - $.rmClass(lastToggledButton, 'active'); - currentMenu = null; - lastToggledButton = null; - return $.off(d, 'click CloseMenu', this.close); - }; - - Menu.prototype.findNextEntry = function(entry, direction) { - var entries; - entries = __slice.call(entry.parentNode.children); - entries.sort(function(first, second) { - return +(first.style.order || first.style.webkitOrder) - +(second.style.order || second.style.webkitOrder); - }); - return entries[entries.indexOf(entry) + direction]; - }; - - Menu.prototype.keybinds = function(e) { - var entry, next, nextPrev, subEntry, submenu; - entry = $('.focused', currentMenu); - while (subEntry = $('.focused', entry)) { - entry = subEntry; - } - switch (e.keyCode) { - case 27: - lastToggledButton.focus(); - this.close(); - break; - case 13: - case 32: - entry.click(); - break; - case 38: - if (next = this.findNextEntry(entry, -1)) { - this.focus(next); - } - break; - case 40: - if (next = this.findNextEntry(entry, +1)) { - this.focus(next); - } - break; - case 39: - if ((submenu = $('.submenu', entry)) && (next = submenu.firstElementChild)) { - while (nextPrev = this.findNextEntry(next, -1)) { - next = nextPrev; - } - this.focus(next); - } - break; - case 37: - if (next = $.x('parent::*[contains(@class,"submenu")]/parent::*', entry)) { - this.focus(next); - } - break; - default: - return; - } - e.preventDefault(); - return e.stopPropagation(); - }; - - Menu.prototype.focus = function(entry) { - var bottom, cHeight, cWidth, eRect, focused, left, right, sRect, style, submenu, top, _i, _len, _ref, _ref1, _ref2; - while (focused = $.x('parent::*/child::*[contains(@class,"focused")]', entry)) { - $.rmClass(focused, 'focused'); - } - _ref = $$('.focused', entry); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - focused = _ref[_i]; - $.rmClass(focused, 'focused'); - } - $.addClass(entry, 'focused'); - if (!(submenu = $('.submenu', entry))) { - return; - } - sRect = submenu.getBoundingClientRect(); - eRect = entry.getBoundingClientRect(); - cHeight = doc.clientHeight; - cWidth = doc.clientWidth; - _ref1 = eRect.top + sRect.height < cHeight ? ['0px', 'auto'] : ['auto', '0px'], top = _ref1[0], bottom = _ref1[1]; - _ref2 = eRect.right + sRect.width < cWidth ? ['100%', 'auto'] : ['auto', '100%'], left = _ref2[0], right = _ref2[1]; - style = submenu.style; - style.top = top; - style.bottom = bottom; - style.left = left; - return style.right = right; - }; - - Menu.prototype.addEntry = function(e) { - var entry; - entry = e.detail; - if (entry.type !== this.type) { - return; - } - this.parseEntry(entry); - return this.entries.push(entry); - }; - - Menu.prototype.parseEntry = function(entry) { - var el, style, subEntries, subEntry, _i, _len; - el = entry.el, subEntries = entry.subEntries; - $.addClass(el, 'entry'); - $.on(el, 'focus mouseover', (function(e) { - e.stopPropagation(); - return this.focus(el); - }).bind(this)); - style = el.style; - style.webkitOrder = style.order = entry.order || 100; - if (!subEntries) { - return; - } - $.addClass(el, 'has-submenu'); - for (_i = 0, _len = subEntries.length; _i < _len; _i++) { - subEntry = subEntries[_i]; - this.parseEntry(subEntry); - } - }; - - return Menu; - - })(); - dragstart = function(e) { - var el, isTouching, o, rect, screenHeight, screenWidth, _ref; - if (e.type === 'mousedown' && e.button !== 0) { - return; - } - e.preventDefault(); - if (isTouching = e.type === 'touchstart') { - e = e.changedTouches[e.changedTouches.length - 1]; - } - el = $.x('ancestor::div[contains(@class,"dialog")][1]', this); - rect = el.getBoundingClientRect(); - screenHeight = doc.clientHeight; - screenWidth = doc.clientWidth; - o = { - id: el.id, - style: el.style, - dx: e.clientX - rect.left, - dy: e.clientY - rect.top, - height: screenHeight - rect.height, - width: screenWidth - rect.width, - screenHeight: screenHeight, - screenWidth: screenWidth, - isTouching: isTouching - }; - _ref = Conf['Header auto-hide'] || !Conf['Fixed Header'] ? [0, 0] : Conf['Bottom Header'] ? [0, Header.bar.getBoundingClientRect().height] : [Header.bar.getBoundingClientRect().height, 0], o.topBorder = _ref[0], o.bottomBorder = _ref[1]; - if (isTouching) { - o.identifier = e.identifier; - o.move = touchmove.bind(o); - o.up = touchend.bind(o); - $.on(d, 'touchmove', o.move); - return $.on(d, 'touchend touchcancel', o.up); - } else { - o.move = drag.bind(o); - o.up = dragend.bind(o); - $.on(d, 'mousemove', o.move); - return $.on(d, 'mouseup', o.up); - } - }; - touchmove = function(e) { - var touch, _i, _len, _ref; - _ref = e.changedTouches; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - touch = _ref[_i]; - if (touch.identifier === this.identifier) { - drag.call(this, touch); - return; - } - } - }; - drag = function(e) { - var bottom, clientX, clientY, left, right, style, top; - clientX = e.clientX, clientY = e.clientY; - left = clientX - this.dx; - left = left < 10 ? 0 : this.width - left < 10 ? null : left / this.screenWidth * 100 + '%'; - top = clientY - this.dy; - top = top < (10 + this.topBorder) ? this.topBorder + 'px' : this.height - top < (10 + this.bottomBorder) ? null : top / this.screenHeight * 100 + '%'; - right = left === null ? 0 : null; - bottom = top === null ? this.bottomBorder + 'px' : null; - style = this.style; - style.left = left; - style.right = right; - style.top = top; - return style.bottom = bottom; - }; - touchend = function(e) { - var touch, _i, _len, _ref; - _ref = e.changedTouches; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - touch = _ref[_i]; - if (touch.identifier === this.identifier) { - dragend.call(this); - return; - } - } - }; - dragend = function() { - if (this.isTouching) { - $.off(d, 'touchmove', this.move); - $.off(d, 'touchend touchcancel', this.up); - } else { - $.off(d, 'mousemove', this.move); - $.off(d, 'mouseup', this.up); - } - return $.set("" + this.id + ".position", this.style.cssText); - }; - hoverstart = function(_arg) { - var asapTest, cb, el, endEvents, latestEvent, o, root; - root = _arg.root, el = _arg.el, latestEvent = _arg.latestEvent, endEvents = _arg.endEvents, asapTest = _arg.asapTest, cb = _arg.cb; - o = { - root: root, - el: el, - style: el.style, - cb: cb, - endEvents: endEvents, - latestEvent: latestEvent, - clientHeight: doc.clientHeight, - clientWidth: doc.clientWidth - }; - o.hover = hover.bind(o); - o.hoverend = hoverend.bind(o); - $.asap(function() { - return !el.parentNode || asapTest(); - }, function() { - if (el.parentNode) { - return o.hover(o.latestEvent); - } - }); - $.on(root, endEvents, o.hoverend); - if ($.x('ancestor::div[contains(@class,"inline")][1]', root)) { - $.on(d, 'keydown', o.hoverend); - } - return $.on(root, 'mousemove', o.hover); - }; - hover = function(e) { - var clientX, clientY, height, left, right, style, top, _ref; - this.latestEvent = e; - height = this.el.offsetHeight; - clientX = e.clientX, clientY = e.clientY; - top = clientY - 120; - top = this.clientHeight <= height || top <= 0 ? 0 : top + height >= this.clientHeight ? this.clientHeight - height : top; - _ref = clientX <= this.clientWidth - 400 ? [clientX + 45 + 'px', null] : [null, this.clientWidth - clientX + 45 + 'px'], left = _ref[0], right = _ref[1]; - style = this.style; - style.top = top + 'px'; - style.left = left; - return style.right = right; - }; - hoverend = function(e) { - if (e.type === 'keydown' && e.keyCode !== 13 || e.target.nodeName === "TEXTAREA") { - return; - } - $.rm(this.el); - $.off(this.root, this.endEvents, this.hoverend); - $.off(d, 'keydown', this.hoverend); - $.off(this.root, 'mousemove', this.hover); - if (this.cb) { - return this.cb.call(this); - } - }; - return { - dialog: dialog, - Menu: Menu, - hover: hoverstart - }; - })(); - - Anonymize = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Anonymize']) { - return; - } - return Post.prototype.callbacks.push({ - name: 'Anonymize', - cb: this.node - }); - }, - node: function() { - var email, name, tripcode, _ref; - if (this.info.capcode || this.isClone) { - return; - } - _ref = this.nodes, name = _ref.name, tripcode = _ref.tripcode, email = _ref.email; - if (this.info.name !== 'Anonymous') { - name.textContent = 'Anonymous'; - } - if (tripcode) { - $.rm(tripcode); - delete this.nodes.tripcode; - } - if (this.info.email) { - if (/sage/i.test(this.info.email)) { - return email.href = 'mailto:sage'; - } else { - $.replace(email, name); - return delete this.nodes.email; - } - } - } - }; - - Filter = { - filters: {}, - init: function() { - var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4; - if (g.VIEW === 'catalog' || !Conf['Filter']) { - return; - } - if (!Conf['Filtered Backlinks']) { - $.addClass(doc, 'hide-backlinks'); - } - for (key in Config.filter) { - this.filters[key] = []; - _ref = Conf[key].split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - filter = _ref[_i]; - if (filter[0] === '#') { - continue; - } - if (!(regexp = filter.match(/\/(.+)\/(\w*)/))) { - continue; - } - filter = filter.replace(regexp[0], ''); - boards = ((_ref1 = filter.match(/boards:([^;]+)/)) != null ? _ref1[1].toLowerCase() : void 0) || 'global'; - if (boards !== 'global' && !(boards.split(',')).contains(g.BOARD.ID)) { - continue; - } - if (['uniqueID', 'MD5'].contains(key)) { - regexp = regexp[1]; - } else { - try { - regexp = RegExp(regexp[1], regexp[2]); - } catch (_error) { - err = _error; - new Notification('warning', err.message, 60); - continue; - } - } - op = ((_ref2 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref2[1] : void 0) || 'yes'; - stub = (function() { - var _ref3; - switch ((_ref3 = filter.match(/stub:(yes|no)/)) != null ? _ref3[1] : void 0) { - case 'yes': - return true; - case 'no': - return false; - default: - return Conf['Stubs']; - } - })(); - if (hl = /highlight/.test(filter)) { - hl = ((_ref3 = filter.match(/highlight:(\w+)/)) != null ? _ref3[1] : void 0) || 'filter-highlight'; - top = ((_ref4 = filter.match(/top:(yes|no)/)) != null ? _ref4[1] : void 0) || 'yes'; - top = top === 'yes'; - } - this.filters[key].push(this.createFilter(regexp, op, stub, hl, top)); - } - if (!this.filters[key].length) { - delete this.filters[key]; - } - } - if (!Object.keys(this.filters).length) { - return; - } - return Post.prototype.callbacks.push({ - name: 'Filter', - cb: this.node - }); - }, - createFilter: function(regexp, op, stub, hl, top) { - var settings, test; - test = typeof regexp === 'string' ? function(value) { - return regexp === value; - } : function(value) { - return regexp.test(value); - }; - settings = { - hide: !hl, - stub: stub, - "class": hl, - top: top - }; - return function(value, isReply) { - if (isReply && op === 'only' || !isReply && op === 'no') { - return false; - } - if (!test(value)) { - return false; - } - return settings; - }; - }, - node: function() { - var filter, firstThread, key, result, thisThread, value, _i, _len, _ref; - if (this.isClone) { - return; - } - for (key in Filter.filters) { - value = Filter[key](this); - if (value === false) { - continue; - } - _ref = Filter.filters[key]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - filter = _ref[_i]; - if (!(result = filter(value, this.isReply))) { - continue; - } - if (result.hide) { - if (this.isReply) { - PostHiding.hide(this, result.stub); - } else if (g.VIEW === 'index') { - ThreadHiding.hide(this.thread, result.stub); - } else { - continue; - } - return; - } - $.addClass(this.nodes.root, result["class"]); - if (!this.isReply && result.top && g.VIEW === 'index') { - thisThread = this.nodes.root.parentNode; - if (firstThread = $('div[class="postContainer opContainer"]')) { - if (firstThread !== this.nodes.root) { - $.before(firstThread.parentNode, [thisThread, thisThread.nextElementSibling]); - } - } - } - } - } - }, - name: function(post) { - if ('name' in post.info) { - return post.info.name; - } - return false; - }, - uniqueID: function(post) { - if ('uniqueID' in post.info) { - return post.info.uniqueID; - } - return false; - }, - tripcode: function(post) { - if ('tripcode' in post.info) { - return post.info.tripcode; - } - return false; - }, - capcode: function(post) { - if ('capcode' in post.info) { - return post.info.capcode; - } - return false; - }, - email: function(post) { - if ('email' in post.info) { - return post.info.email; - } - return false; - }, - subject: function(post) { - if ('subject' in post.info) { - return post.info.subject || false; - } - return false; - }, - comment: function(post) { - if ('comment' in post.info) { - return post.info.comment; - } - return false; - }, - flag: function(post) { - if ('flag' in post.info) { - return post.info.flag; - } - return false; - }, - filename: function(post) { - if (post.file) { - return post.file.name; - } - return false; - }, - dimensions: function(post) { - if (post.file && post.file.isImage) { - return post.file.dimensions; - } - return false; - }, - filesize: function(post) { - if (post.file) { - return post.file.size; - } - return false; - }, - MD5: function(post) { - if (post.file) { - return post.file.MD5; - } - return false; - }, - menu: { - init: function() { - var div, entry, type, _i, _len, _ref; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Filter']) { - return; - } - div = $.el('div', { - textContent: 'Filter' - }); - entry = { - type: 'post', - el: div, - order: 50, - open: function(post) { - Filter.menu.post = post; - return true; - }, - subEntries: [] - }; - _ref = [['Name', 'name'], ['Unique ID', 'uniqueID'], ['Tripcode', 'tripcode'], ['Capcode', 'capcode'], ['E-mail', 'email'], ['Subject', 'subject'], ['Comment', 'comment'], ['Flag', 'flag'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'MD5']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1])); - } - return $.event('AddMenuEntry', entry); - }, - createSubEntry: function(text, type) { - var el; - el = $.el('a', { - href: 'javascript:;', - textContent: text - }); - el.setAttribute('data-type', type); - $.on(el, 'click', Filter.menu.makeFilter); - return { - el: el, - open: function(post) { - var value; - value = Filter[type](post); - return value !== false; - } - }; - }, - makeFilter: function() { - var re, type, value; - type = this.dataset.type; - value = Filter[type](Filter.menu.post); - re = ['uniqueID', 'MD5'].contains(type) ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) { - if (c === '\n') { - return '\\n'; - } else if (c === '\\') { - return '\\\\'; - } else { - return "\\" + c; - } - }); - re = ['uniqueID', 'MD5'].contains(type) ? "/" + re + "/" : "/^" + re + "$/"; - return $.get(type, Conf[type], function(item) { - var save, section, select, ta, tl; - save = item[type]; - save = save ? "" + save + "\n" + re : re; - $.set(type, save); - Settings.open('Filter'); - section = $('.section-container'); - select = $('select[name=filter]', section); - select.value = type; - Settings.selectFilter.call(select); - ta = $('textarea', section); - tl = ta.textLength; - ta.setSelectionRange(tl, tl); - return ta.focus(); - }); - } - } - }; - - PostHiding = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Reply Hiding Buttons'] && !Conf['Reply Hiding Link']) { - return; - } - if (Conf['Reply Hiding Buttons']) { - $.addClass(doc, "reply-hide"); - } - this.db = new DataBoard('hiddenPosts'); - return Post.prototype.callbacks.push({ - name: 'Reply Hiding', - cb: this.node - }); - }, - node: function() { - var data; - if (!this.isReply || this.isClone) { - return; - } - if (data = PostHiding.db.get({ - boardID: this.board.ID, - threadID: this.thread.ID, - postID: this.ID - })) { - if (data.thisPost) { - PostHiding.hide(this, data.makeStub, data.hideRecursively); - } else { - Recursive.apply(PostHiding.hide, this, data.makeStub, true); - Recursive.add(PostHiding.hide, this, data.makeStub, true); - } - } - if (!Conf['Reply Hiding Buttons']) { - return; - } - return $.replace($('.sideArrows', this.nodes.root), PostHiding.makeButton(this, 'hide')); - }, - menu: { - init: function() { - var apply, div, hideStubLink, makeStub, replies, thisPost; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Reply Hiding Link']) { - return; - } - div = $.el('div', { - className: 'hide-reply-link', - textContent: 'Hide reply' - }); - apply = $.el('a', { - textContent: 'Apply', - href: 'javascript:;' - }); - $.on(apply, 'click', PostHiding.menu.hide); - thisPost = $.el('label', { - innerHTML: ' This post' - }); - replies = $.el('label', { - innerHTML: " Hide replies" - }); - makeStub = $.el('label', { - innerHTML: " Make stub" - }); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(post) { - if (!post.isReply || post.isClone || post.isHidden) { - return false; - } - PostHiding.menu.post = post; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: thisPost - }, { - el: replies - }, { - el: makeStub - } - ] - }); - div = $.el('div', { - className: 'show-reply-link', - textContent: 'Show reply' - }); - apply = $.el('a', { - textContent: 'Apply', - href: 'javascript:;' - }); - $.on(apply, 'click', PostHiding.menu.show); - thisPost = $.el('label', { - innerHTML: ' This post' - }); - replies = $.el('label', { - innerHTML: " Show replies" - }); - hideStubLink = $.el('a', { - textContent: 'Hide stub', - href: 'javascript:;' - }); - $.on(hideStubLink, 'click', PostHiding.menu.hideStub); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(post) { - var data; - if (!post.isReply || post.isClone || !post.isHidden) { - return false; - } - if (!(data = PostHiding.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }))) { - return false; - } - PostHiding.menu.post = post; - thisPost.firstChild.checked = post.isHidden; - replies.firstChild.checked = (data != null ? data.hideRecursively : void 0) != null ? data.hideRecursively : Conf['Recursive Hiding']; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: thisPost - }, { - el: replies - } - ] - }); - return $.event('AddMenuEntry', { - type: 'post', - el: hideStubLink, - order: 15, - open: function(post) { - var data; - if (!post.isReply || post.isClone || !post.isHidden) { - return false; - } - if (!(data = PostHiding.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }))) { - return false; - } - return PostHiding.menu.post = post; - } - }); - }, - hide: function() { - var makeStub, parent, post, replies, thisPost; - parent = this.parentNode; - thisPost = $('input[name=thisPost]', parent).checked; - replies = $('input[name=replies]', parent).checked; - makeStub = $('input[name=makeStub]', parent).checked; - post = PostHiding.menu.post; - if (thisPost) { - PostHiding.hide(post, makeStub, replies); - } else if (replies) { - Recursive.apply(PostHiding.hide, post, makeStub, true); - Recursive.add(PostHiding.hide, post, makeStub, true); - } else { - return; - } - PostHiding.saveHiddenState(post, true, thisPost, makeStub, replies); - return $.event('CloseMenu'); - }, - show: function() { - var data, parent, post, replies, thisPost; - parent = this.parentNode; - thisPost = $('input[name=thisPost]', parent).checked; - replies = $('input[name=replies]', parent).checked; - post = PostHiding.menu.post; - if (thisPost) { - PostHiding.show(post, replies); - } else if (replies) { - Recursive.apply(PostHiding.show, post, true); - Recursive.rm(PostHiding.hide, post, true); - } else { - return; - } - if (data = PostHiding.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - })) { - PostHiding.saveHiddenState(post, !(thisPost && replies), !thisPost, data.makeStub, !replies); - } - return $.event('CloseMenu'); - }, - hideStub: function() { - var post; - post = PostHiding.menu.post; - post.nodes.root.hidden = true; - $.event('CloseMenu'); - } - }, - makeButton: function(post, type) { - var a; - a = $.el('a', { - className: "" + type + "-reply-button", - innerHTML: " " + (type === 'hide' ? '-' : '+') + " ", - href: 'javascript:;' - }); - $.on(a, 'click', PostHiding.toggle); - return a; - }, - saveHiddenState: function(post, isHiding, thisPost, makeStub, hideRecursively) { - var data; - data = { - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }; - if (isHiding) { - data.val = { - thisPost: thisPost !== false, - makeStub: makeStub, - hideRecursively: hideRecursively - }; - return PostHiding.db.set(data); - } else { - return PostHiding.db["delete"](data); - } - }, - toggle: function() { - var post; - post = Get.postFromNode(this); - if (post.isHidden) { - PostHiding.show(post); - } else { - PostHiding.hide(post); - } - return PostHiding.saveHiddenState(post, post.isHidden); - }, - hide: function(post, makeStub, hideRecursively) { - var a, postInfo, quotelink, _i, _len, _ref; - if (makeStub == null) { - makeStub = Conf['Stubs']; - } - if (hideRecursively == null) { - hideRecursively = Conf['Recursive Hiding']; - } - if (post.isHidden) { - return; - } - post.isHidden = true; - if (hideRecursively) { - Recursive.apply(PostHiding.hide, post, makeStub, true); - Recursive.add(PostHiding.hide, post, makeStub, true); - } - _ref = Get.allQuotelinksLinkingTo(post); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - $.addClass(quotelink, 'filtered'); - } - if (!makeStub) { - post.nodes.root.hidden = true; - return; - } - a = PostHiding.makeButton(post, 'show'); - postInfo = Conf['Anonymize'] ? 'Anonymous' : $('.nameBlock', post.nodes.info).textContent; - $.add(a, $.tn(" " + postInfo)); - post.nodes.stub = $.el('div', { - className: 'stub' - }); - $.add(post.nodes.stub, a); - if (Conf['Menu']) { - $.add(post.nodes.stub, [$.tn(' '), Menu.makeButton(post)]); - } - return $.prepend(post.nodes.root, post.nodes.stub); - }, - show: function(post, showRecursively) { - var quotelink, _i, _len, _ref; - if (showRecursively == null) { - showRecursively = Conf['Recursive Hiding']; - } - if (post.nodes.stub) { - $.rm(post.nodes.stub); - delete post.nodes.stub; - } else { - post.nodes.root.hidden = false; - } - post.isHidden = false; - if (showRecursively) { - Recursive.apply(PostHiding.show, post, true); - Recursive.rm(PostHiding.hide, post); - } - _ref = Get.allQuotelinksLinkingTo(post); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - $.rmClass(quotelink, 'filtered'); - } - } - }; - - Recursive = { - recursives: {}, - init: function() { - if (g.VIEW === 'catalog') { - return; - } - return Post.prototype.callbacks.push({ - name: 'Recursive', - cb: this.node - }); - }, - node: function() { - var i, obj, quote, recursive, _i, _j, _len, _len1, _ref, _ref1; - if (this.isClone) { - return; - } - _ref = this.quotes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - if (obj = Recursive.recursives[quote]) { - _ref1 = obj.recursives; - for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { - recursive = _ref1[i]; - recursive.apply(null, [this].concat(__slice.call(obj.args[i]))); - } - } - } - }, - add: function() { - var args, obj, post, recursive, _base, _name; - recursive = arguments[0], post = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - obj = (_base = Recursive.recursives)[_name = post.fullID] || (_base[_name] = { - recursives: [], - args: [] - }); - obj.recursives.push(recursive); - return obj.args.push(args); - }, - rm: function(recursive, post) { - var i, obj, rec, _i, _len, _ref; - if (!(obj = Recursive.recursives[post.fullID])) { - return; - } - _ref = obj.recursives; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - rec = _ref[i]; - if (rec === recursive) { - obj.recursives.splice(i, 1); - obj.args.splice(i, 1); - } - } - }, - apply: function() { - var ID, args, fullID, post, recursive, _ref; - recursive = arguments[0], post = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - fullID = post.fullID; - _ref = g.posts; - for (ID in _ref) { - post = _ref[ID]; - if (post.quotes.contains(fullID)) { - recursive.apply(null, [post].concat(__slice.call(args))); - } - } - } - }; - - ThreadHiding = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Thread Hiding Buttons'] && !Conf['Thread Hiding Link']) { - return; - } - this.db = new DataBoard('hiddenThreads'); - this.syncCatalog(); - return Thread.prototype.callbacks.push({ - name: 'Thread Hiding', - cb: this.node - }); - }, - node: function() { - var data; - if (data = ThreadHiding.db.get({ - boardID: this.board.ID, - threadID: this.ID - })) { - ThreadHiding.hide(this, data.makeStub); - } - if (!Conf['Thread Hiding Buttons']) { - return; - } - return $.prepend(this.OP.nodes.root, ThreadHiding.makeButton(this, 'hide')); - }, - syncCatalog: function() { - var hiddenThreads, hiddenThreadsOnCatalog, threadID; - hiddenThreads = ThreadHiding.db.get({ - boardID: g.BOARD.ID, - defaultValue: {} - }); - hiddenThreadsOnCatalog = JSON.parse(localStorage.getItem("4chan-hide-t-" + g.BOARD)) || {}; - for (threadID in hiddenThreadsOnCatalog) { - if (!(threadID in hiddenThreads)) { - hiddenThreads[threadID] = {}; - } - } - for (threadID in hiddenThreads) { - if (!(threadID in hiddenThreadsOnCatalog)) { - delete hiddenThreads[threadID]; - } - } - if ((ThreadHiding.db.data.lastChecked || 0) > Date.now() - $.MINUTE) { - ThreadHiding.cleanCatalog(hiddenThreadsOnCatalog); - } - return ThreadHiding.db.set({ - boardID: g.BOARD.ID, - val: hiddenThreads - }); - }, - cleanCatalog: function(hiddenThreadsOnCatalog) { - return $.cache("//api.4chan.org/" + g.BOARD + "/threads.json", function() { - var page, thread, threads, _i, _j, _len, _len1, _ref, _ref1; - if (this.status !== 200) { - return; - } - threads = {}; - _ref = JSON.parse(this.response); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - page = _ref[_i]; - _ref1 = page.threads; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - thread = _ref1[_j]; - if (thread.no in hiddenThreadsOnCatalog) { - threads[thread.no] = hiddenThreadsOnCatalog[thread.no]; - } - } - } - if (Object.keys(threads).length) { - return localStorage.setItem("4chan-hide-t-" + g.BOARD, JSON.stringify(threads)); - } else { - return localStorage.removeItem("4chan-hide-t-" + g.BOARD); - } - }); - }, - menu: { - init: function() { - var apply, div, hideStubLink, makeStub; - if (g.VIEW !== 'index' || !Conf['Menu'] || !Conf['Thread Hiding Link']) { - return; - } - div = $.el('div', { - className: 'hide-thread-link', - textContent: 'Hide thread' - }); - apply = $.el('a', { - textContent: 'Apply', - href: 'javascript:;' - }); - $.on(apply, 'click', ThreadHiding.menu.hide); - makeStub = $.el('label', { - innerHTML: " Make stub" - }); - hideStubLink = $.el('a', { - textContent: 'Hide stub', - href: 'javascript:;' - }); - $.on(hideStubLink, 'click', ThreadHiding.menu.hideStub); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(_arg) { - var isReply, thread; - thread = _arg.thread, isReply = _arg.isReply; - if (isReply || thread.isHidden) { - return false; - } - ThreadHiding.menu.thread = thread; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: makeStub - } - ] - }); - return $.event('AddMenuEntry', { - type: 'post', - el: hideStubLink, - order: 15, - open: function(_arg) { - var isReply, thread; - thread = _arg.thread, isReply = _arg.isReply; - if (isReply || !thread.isHidden) { - return false; - } - return ThreadHiding.menu.thread = thread; - } - }); - }, - hide: function() { - var makeStub, thread; - makeStub = $('input', this.parentNode).checked; - thread = ThreadHiding.menu.thread; - ThreadHiding.hide(thread, makeStub); - ThreadHiding.saveHiddenState(thread, makeStub); - return $.event('CloseMenu'); - }, - hideStub: function() { - var thread; - thread = ThreadHiding.menu.thread; - ThreadHiding.hide(thread, false); - $.event('CloseMenu'); - } - }, - makeButton: function(thread, type) { - var a; - a = $.el('a', { - className: "" + type + "-thread-button", - innerHTML: " " + (type === 'hide' ? '-' : '+') + " ", - href: 'javascript:;' - }); - a.setAttribute('data-fullid', thread.fullID); - $.on(a, 'click', ThreadHiding.toggle); - return a; - }, - saveHiddenState: function(thread, makeStub) { - var hiddenThreadsOnCatalog; - hiddenThreadsOnCatalog = JSON.parse(localStorage.getItem("4chan-hide-t-" + g.BOARD)) || {}; - if (thread.isHidden) { - ThreadHiding.db.set({ - boardID: thread.board.ID, - threadID: thread.ID, - val: { - makeStub: makeStub - } - }); - hiddenThreadsOnCatalog[thread] = true; - } else { - ThreadHiding.db["delete"]({ - boardID: thread.board.ID, - threadID: thread.ID - }); - delete hiddenThreadsOnCatalog[thread]; - } - return localStorage.setItem("4chan-hide-t-" + g.BOARD, JSON.stringify(hiddenThreadsOnCatalog)); - }, - toggle: function(thread) { - if (!(thread instanceof Thread)) { - thread = g.threads[this.dataset.fullid]; - } - if (thread.isHidden) { - ThreadHiding.show(thread); - } else { - ThreadHiding.hide(thread); - } - return ThreadHiding.saveHiddenState(thread); - }, - hide: function(thread, makeStub) { - var OP, a, numReplies, opInfo, span, threadRoot; - if (makeStub == null) { - makeStub = Conf['Stubs']; - } - OP = thread.OP; - threadRoot = OP.nodes.root.parentNode; - thread.isHidden = true; - if (!makeStub) { - threadRoot.hidden = threadRoot.nextElementSibling.hidden = true; - return; - } - numReplies = 0; - if (span = $('.summary', threadRoot)) { - numReplies = +span.textContent.match(/\d+/); - } - numReplies += $$('.opContainer ~ .replyContainer', threadRoot).length; - numReplies = numReplies === 1 ? '1 reply' : "" + numReplies + " replies"; - opInfo = Conf['Anonymize'] ? 'Anonymous' : $('.nameBlock', OP.nodes.info).textContent; - a = ThreadHiding.makeButton(thread, 'show'); - $.add(a, $.tn(" " + opInfo + " (" + numReplies + ")")); - thread.stub = $.el('div', { - className: 'stub' - }); - $.add(thread.stub, a); - if (Conf['Menu']) { - $.add(thread.stub, [$.tn(' '), Menu.makeButton(OP)]); - } - return $.prepend(threadRoot, thread.stub); - }, - show: function(thread) { - var threadRoot; - if (thread.stub) { - $.rm(thread.stub); - delete thread.stub; - } - threadRoot = thread.OP.nodes.root.parentNode; - return threadRoot.nextElementSibling.hidden = threadRoot.hidden = thread.isHidden = false; - } - }; - - QuoteBacklink = { - init: function() { - var format; - if (g.VIEW === 'catalog' || !Conf['Quote Backlinks']) { - return; - } - format = Conf['backlink'].replace(/%id/g, "' + id + '"); - this.funk = Function('id', "return '" + format + "'"); - this.containers = {}; - Post.prototype.callbacks.push({ - name: 'Quote Backlinking Part 1', - cb: this.firstNode - }); - return Post.prototype.callbacks.push({ - name: 'Quote Backlinking Part 2', - cb: this.secondNode - }); - }, - firstNode: function() { - var a, clone, container, containers, frag, link, post, quote, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - if (this.isClone || !this.quotes.length) { - return; - } - a = $.el('a', { - href: "/" + this.board + "/res/" + this.thread + "#p" + this, - className: this.isHidden ? 'filtered backlink' : 'backlink', - textContent: (QuoteBacklink.funk(this.ID)) + (Conf['Mark Quotes of You'] && this.info.yours ? '\u00A0(You)' : '') - }); - _ref = this.quotes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - containers = [QuoteBacklink.getContainer(quote)]; - if ((post = g.posts[quote]) && post.nodes.backlinkContainer) { - _ref1 = post.clones; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - clone = _ref1[_j]; - containers.push(clone.nodes.backlinkContainer); - } - } - for (_k = 0, _len2 = containers.length; _k < _len2; _k++) { - container = containers[_k]; - frag = [$.tn(' '), link = a.cloneNode(true)]; - if (Conf['Quote Previewing']) { - $.on(link, 'mouseover', QuotePreview.mouseover); - } - if (Conf['Quote Inlining']) { - $.on(link, 'click', QuoteInline.toggle); - if (Conf['Quote Hash Navigation']) { - frag.pushArrays(QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); - } - } - $.add(container, frag); - } - } - }, - secondNode: function() { - var container; - if (this.isClone && (this.origin.isReply || Conf['OP Backlinks'])) { - this.nodes.backlinkContainer = $('.container', this.nodes.info); - return; - } - if (!(this.isReply || Conf['OP Backlinks'])) { - return; - } - container = QuoteBacklink.getContainer(this.fullID); - this.nodes.backlinkContainer = container; - return $.add(this.nodes.info, container); - }, - getContainer: function(id) { - var _base; - return (_base = this.containers)[id] || (_base[id] = $.el('span', { - className: 'container' - })); - } - }; - - QuoteCT = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Mark Cross-thread Quotes']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - this.text = '\u00A0(Cross-thread)'; - return Post.prototype.callbacks.push({ - name: 'Mark Cross-thread Quotes', - cb: this.node - }); - }, - node: function() { - var board, boardID, quotelink, quotelinks, quotes, thread, threadID, _i, _len, _ref, _ref1; - if (this.isClone && this.thread === this.context.thread) { - return; - } - if (!(quotes = this.quotes).length) { - return; - } - quotelinks = this.nodes.quotelinks; - _ref = this.isClone ? this.context : this, board = _ref.board, thread = _ref.thread; - for (_i = 0, _len = quotelinks.length; _i < _len; _i++) { - quotelink = quotelinks[_i]; - _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, threadID = _ref1.threadID; - if (!threadID) { - continue; - } - if (this.isClone) { - quotelink.textContent = quotelink.textContent.replace(QuoteCT.text, ''); - } - if (boardID === this.board.ID && threadID !== thread.ID) { - $.add(quotelink, $.tn(QuoteCT.text)); - } - } - } - }; - - QuoteInline = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Quote Inlining']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - if (Conf['Quote Hash Navigation']) { - this.node = function() { - var link, _i, _len, _ref; - _ref = this.nodes.quotelinks.concat(__slice.call(this.nodes.backlinks)); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - if (!this.isClone) { - $.after(link, QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); - } - $.on(link, 'click', QuoteInline.toggle); - } - }; - } else { - this.node = function() { - var link, _i, _len, _ref; - _ref = this.nodes.quotelinks.concat(__slice.call(this.nodes.backlinks)); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - $.on(link, 'click', QuoteInline.toggle); - } - }; - } - return Post.prototype.callbacks.push({ - name: 'Quote Inlining', - cb: this.node - }); - }, - qiQuote: function(link, hidden) { - return [ - $.tn(' '), $.el('a', { - className: hidden ? 'hashlink filtered' : 'hashlink', - textContent: '#', - href: link.href - }) - ]; - }, - toggle: function(e) { - var boardID, context, postID, threadID, _ref; - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - _ref = Get.postDataFromLink(this), boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - context = Get.contextFromLink(this); - if ($.hasClass(this, 'inlined')) { - QuoteInline.rm(this, boardID, threadID, postID, context); - } else { - if ($.x("ancestor::div[@id='p" + postID + "']", this)) { - return; - } - QuoteInline.add(this, boardID, threadID, postID, context); - } - return this.classList.toggle('inlined'); - }, - findRoot: function(quotelink, isBacklink) { - if (isBacklink) { - return quotelink.parentNode.parentNode; - } else { - return $.x('ancestor-or-self::*[parent::blockquote][1]', quotelink); - } - }, - add: function(quotelink, boardID, threadID, postID, context) { - var inline, isBacklink, post, qroot, root; - isBacklink = $.hasClass(quotelink, 'backlink'); - inline = $.el('div', { - id: "i" + postID, - className: 'inline' - }); - root = QuoteInline.findRoot(quotelink, isBacklink); - $.after(root, inline); - qroot = $.x('ancestor::*[contains(@class,"postContainer")][1]', root); - $.addClass(qroot, 'hasInline'); - Get.postClone(boardID, threadID, postID, inline, context); - if (!((post = g.posts["" + boardID + "." + postID]) && context.thread === post.thread)) { - return; - } - if (isBacklink && Conf['Forward Hiding']) { - $.addClass(post.nodes.root, 'forwarded'); - post.forwarded++ || (post.forwarded = 1); - } - if (!Unread.posts) { - return; - } - return Unread.readSinglePost(post); - }, - rm: function(quotelink, boardID, threadID, postID, context) { - var el, inlined, isBacklink, post, qroot, root, _ref; - isBacklink = $.hasClass(quotelink, 'backlink'); - root = QuoteInline.findRoot(quotelink, isBacklink); - root = $.x("following-sibling::div[@id='i" + postID + "'][1]", root); - qroot = $.x('ancestor::*[contains(@class,"postContainer")][1]', root); - $.rm(root); - if (!$('.inline', qroot)) { - $.rmClass(qroot, 'hasInline'); - } - if (!(el = root.firstElementChild)) { - return; - } - post = g.posts["" + boardID + "." + postID]; - post.rmClone(el.dataset.clone); - if (Conf['Forward Hiding'] && isBacklink && context.thread === g.threads["" + boardID + "." + threadID] && !--post.forwarded) { - delete post.forwarded; - $.rmClass(post.nodes.root, 'forwarded'); - } - while (inlined = $('.inlined', el)) { - _ref = Get.postDataFromLink(inlined), boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - QuoteInline.rm(inlined, boardID, threadID, postID, context); - $.rmClass(inlined, 'inlined'); - } - } - }; - - QuoteOP = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Mark OP Quotes']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - this.text = '\u00A0(OP)'; - return Post.prototype.callbacks.push({ - name: 'Mark OP Quotes', - cb: this.node - }); - }, - node: function() { - var boardID, op, postID, quotelink, quotelinks, quotes, _i, _j, _len, _len1, _ref; - if (this.isClone && this.thread === this.context.thread) { - return; - } - if (!(quotes = this.quotes).length) { - return; - } - quotelinks = this.nodes.quotelinks; - if (this.isClone && quotes.contains(this.thread.fullID)) { - for (_i = 0, _len = quotelinks.length; _i < _len; _i++) { - quotelink = quotelinks[_i]; - quotelink.textContent = quotelink.textContent.replace(QuoteOP.text, ''); - } - } - op = (this.isClone ? this.context : this).thread.fullID; - if (!quotes.contains(op)) { - return; - } - for (_j = 0, _len1 = quotelinks.length; _j < _len1; _j++) { - quotelink = quotelinks[_j]; - _ref = Get.postDataFromLink(quotelink), boardID = _ref.boardID, postID = _ref.postID; - if (("" + boardID + "." + postID) === op) { - $.add(quotelink, $.tn(QuoteOP.text)); - } - } - } - }; - - QuotePreview = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Quote Previewing']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.prototype.callbacks.push({ - name: 'Quote Previewing', - cb: this.node - }); - }, - node: function() { - var link, _i, _len, _ref; - _ref = this.nodes.quotelinks.concat(__slice.call(this.nodes.backlinks)); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - $.on(link, 'mouseover', QuotePreview.mouseover); - } - }, - mouseover: function(e) { - var boardID, clone, origin, post, postID, posts, qp, quote, quoterID, root, threadID, workaround, _i, _j, _len, _len1, _ref, _ref1; - if ($.hasClass(this, 'inlined')) { - return; - } - _ref = Get.postDataFromLink(this), boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - qp = $.el('div', { - id: 'qp', - className: 'dialog' - }); - $.add(Header.hover, qp); - Get.postClone(boardID, threadID, postID, qp, Get.contextFromLink(this)); - UI.hover({ - root: this, - el: qp, - latestEvent: e, - endEvents: 'mouseout click', - cb: QuotePreview.mouseout, - asapTest: function() { - return qp.firstElementChild; - } - }); - root = this; - workaround = function(e) { - if (this === root) { - e.stopPropagation(); - return; - } - $.event('mouseout', null, root); - $.off(d, 'mousemove', workaround); - return $.off(root, 'mousemove', workaround); - }; - $.on(d, 'mousemove', workaround); - $.on(root, 'mousemove', workaround); - if (!(origin = g.posts["" + boardID + "." + postID])) { - return; - } - if (Conf['Quote Highlighting']) { - posts = [origin].concat(origin.clones); - posts.pop(); - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - $.addClass(post.nodes.post, 'qphl'); - } - } - quoterID = $.x('ancestor::*[@id][1]', this).id.match(/\d+$/)[0]; - clone = Get.postFromRoot(qp.firstChild); - _ref1 = clone.nodes.quotelinks.concat(__slice.call(clone.nodes.backlinks)); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - quote = _ref1[_j]; - if (quote.hash.slice(2) === quoterID) { - $.addClass(quote, 'forwardlink'); - } - } - }, - mouseout: function() { - var clone, post, root, _i, _len, _ref; - if (!(root = this.el.firstElementChild)) { - return; - } - clone = Get.postFromRoot(root); - post = clone.origin; - post.rmClone(root.dataset.clone); - if (!Conf['Quote Highlighting']) { - return; - } - _ref = [post].concat(post.clones); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post = _ref[_i]; - $.rmClass(post.nodes.post, 'qphl'); - } - } - }; - - QuoteStrikeThrough = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Reply Hiding Buttons'] && !Conf['Reply Hiding Link'] && !Conf['Filter']) { - return; - } - return Post.prototype.callbacks.push({ - name: 'Strike-through Quotes', - cb: this.node - }); - }, - node: function() { - var boardID, postID, quotelink, _i, _len, _ref, _ref1, _ref2; - if (this.isClone) { - return; - } - _ref = this.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, postID = _ref1.postID; - if ((_ref2 = g.posts["" + boardID + "." + postID]) != null ? _ref2.isHidden : void 0) { - $.addClass(quotelink, 'filtered'); - } - } - } - }; - - /* - <3 aeosynth - */ - - - QuoteThreading = { - init: function() { - var input; - if (!(Conf['Quote Threading'] && g.VIEW === 'thread')) { - return; - } - this.enabled = true; - this.controls = $.el('span', { - innerHTML: '' - }); - input = $('input', this.controls); - $.on(input, 'change', QuoteThreading.toggle); - $.event('AddMenuEntry', { - type: 'header', - el: this.controls, - order: 98 - }); - $.on(d, '4chanXInitFinished', this.setup); - return Post.prototype.callbacks.push({ - name: 'Quote Threading', - cb: this.node - }); - }, - setup: function() { - var ID, post, posts; - $.off(d, '4chanXInitFinished', QuoteThreading.setup); - posts = g.posts; - for (ID in posts) { - post = posts[ID]; - if (post.cb) { - post.cb.call(post); - } - } - return QuoteThreading.hasRun = true; - }, - node: function() { - var ID, fullID, keys, len, post, posts, qid, quote, quotes, uniq, _i, _len; - if (this.isClone || !QuoteThreading.enabled || this.thread.OP === this) { - return; - } - quotes = this.quotes, ID = this.ID, fullID = this.fullID; - posts = g.posts; - if (!(post = posts[fullID]) || post.isHidden) { - return; - } - uniq = {}; - len = ("" + g.BOARD).length + 1; - for (_i = 0, _len = quotes.length; _i < _len; _i++) { - quote = quotes[_i]; - qid = quote; - if (!(qid.slice(len) < ID)) { - continue; - } - if (qid in posts) { - uniq[qid.slice(len)] = true; - } - } - keys = Object.keys(uniq); - if (keys.length !== 1) { - return; - } - this.threaded = "" + g.BOARD + "." + keys[0]; - return this.cb = QuoteThreading.nodeinsert; - }, - nodeinsert: function() { - var bottom, height, posts, qpost, qroot, threadContainer, top, _ref; - posts = g.posts; - qpost = posts[this.threaded]; - delete this.threaded; - delete this.cb; - if (this.thread.OP === qpost) { - return false; - } - if (QuoteThreading.hasRun) { - height = doc.clientHeight; - _ref = qpost.nodes.root.getBoundingClientRect(), bottom = _ref.bottom, top = _ref.top; - if (!(Unread.posts.contains(qpost) || ((bottom < height) && (top > 0)))) { - return false; - } - } - qroot = qpost.nodes.root; - if (!$.hasClass(qroot, 'threadOP')) { - $.addClass(qroot, 'threadOP'); - threadContainer = $.el('div', { - className: 'threadContainer' - }); - $.after(qroot, threadContainer); - } else { - threadContainer = qroot.nextSibling; - } - $.add(threadContainer, this.nodes.root); - return true; - }, - toggle: function() { - var container, containers, node, nodes, replies, reply, thread, _i, _j, _len, _len1; - thread = $('.thread'); - replies = $$('.thread > .replyContainer, .threadContainer > .replyContainer', thread); - QuoteThreading.enabled = this.checked; - if (this.checked) { - nodes = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - _results.push(Get.postFromNode(reply)); - } - return _results; - })(); - for (_i = 0, _len = nodes.length; _i < _len; _i++) { - node = nodes[_i]; - QuoteThreading.node(node); - } - } else { - replies.sort(function(a, b) { - var aID, bID; - aID = Number(a.id.slice(2)); - bID = Number(b.id.slice(2)); - return aID - bID; - }); - $.add(thread, replies); - containers = $$('.threadContainer', thread); - for (_j = 0, _len1 = containers.length; _j < _len1; _j++) { - container = containers[_j]; - $.rm(container); - } - Unread.update(true); - } - }, - kb: function() { - var control; - control = $.id('threadingControl'); - return control.click(); - } - }; - - QuoteYou = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Mark Quotes of You'] || !Conf['Quick Reply']) { - return; - } - if (Conf['Highlight Own Posts']) { - $.addClass(doc, 'highlight-own'); - } - if (Conf['Highlight Posts Quoting You']) { - $.addClass(doc, 'highlight-you'); - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.prototype.callbacks.push({ - name: 'Mark Quotes of You', - cb: this.node - }); - }, - node: function() { - var quotelink, _i, _len, _ref; - if (this.isClone) { - return; - } - if (this.info.yours) { - $.addClass(this.nodes.root, 'yourPost'); - } - if (!this.quotes.length) { - return; - } - _ref = this.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - if (QR.db.get(Get.postDataFromLink(quotelink))) { - $.add(quotelink, $.tn('\u00A0(You)')); - $.addClass(this.nodes.root, 'quotesYou'); - } - } - } - }; - - Quotify = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Resurrect Quotes']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.prototype.callbacks.push({ - name: 'Resurrect Quotes', - cb: this.node - }); - }, - node: function() { - var deadlink, _i, _len, _ref; - _ref = $$('.deadlink', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - deadlink = _ref[_i]; - if (this.isClone) { - if ($.hasClass(deadlink, 'quotelink')) { - this.nodes.quotelinks.push(deadlink); - } - } else { - Quotify.parseDeadlink.call(this, deadlink); - } - } - }, - parseDeadlink: function(deadlink) { - var a, boardID, m, post, postID, quote, quoteID, redirect, _ref; - if (deadlink.parentNode.className === 'prettyprint') { - $.replace(deadlink, __slice.call(deadlink.childNodes)); - return; - } - quote = deadlink.textContent; - if (!(postID = (_ref = quote.match(/\d+$/)) != null ? _ref[0] : void 0)) { - return; - } - boardID = (m = quote.match(/^>>>\/([a-z\d]+)/)) ? m[1] : this.board.ID; - quoteID = "" + boardID + "." + postID; - if (post = g.posts[quoteID]) { - if (!post.isDead) { - a = $.el('a', { - href: "/" + boardID + "/" + post.thread + "/res/#p" + postID, - className: 'quotelink', - textContent: quote - }); - } else { - a = $.el('a', { - href: "/" + boardID + "/" + post.thread + "/res/#p" + postID, - className: 'quotelink deadlink', - target: '_blank', - textContent: "" + quote + "\u00A0(Dead)" - }); - a.setAttribute('data-boardid', boardID); - a.setAttribute('data-threadid', post.thread.ID); - a.setAttribute('data-postid', postID); - } - } else if (redirect = Redirect.to('thread', { - boardID: boardID, - threadID: 0, - postID: postID - })) { - a = $.el('a', { - href: redirect, - className: 'deadlink', - target: '_blank', - textContent: "" + quote + "\u00A0(Dead)" - }); - if (Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - $.addClass(a, 'quotelink'); - a.setAttribute('data-boardid', boardID); - a.setAttribute('data-postid', postID); - } - } - if (!this.quotes.contains(quoteID)) { - this.quotes.push(quoteID); - } - if (!a) { - deadlink.textContent = "" + quote + "\u00A0(Dead)"; - return; - } - $.replace(deadlink, a); - if ($.hasClass(a, 'quotelink')) { - return this.nodes.quotelinks.push(a); - } - } - }; - - Linkify = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Linkify']) { - return; - } - this.regString = Conf['Allow False Positives'] ? /(\b([a-z]+:\/\/|[a-z]{3,}\.[-a-z0-9]+\.[a-z]+|[-a-z0-9]+\.[a-z]|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[a-z]{3,}:[a-z0-9?]|[a-z0-9._%+-:]+@[a-z0-9.-]+\.[a-z0-9])[^\s'"]+)/gi : /(((magnet|mailto)\:|(www\.)|(news|(ht|f)tp(s?))\:\/\/){1}\S+)/gi; - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.prototype.callbacks.push({ - name: 'Linkify', - cb: this.node - }); - }, - cypher: $.el('div'), - node: function() { - var a, child, cypher, cypherText, data, embed, embedder, embeds, i, index, len, link, links, lookahead, name, next, node, nodes, snapshot, spoiler, text, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2; - if (this.isClone && Conf['Embedding']) { - _ref = $$('.embedder', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - embedder = _ref[_i]; - $.on(embedder, "click", Linkify.toggle); - } - return; - } - snapshot = $.X('.//text()', this.nodes.comment); - cypher = Linkify.cypher; - i = -1; - len = snapshot.snapshotLength; - while (++i < len) { - nodes = $.frag(); - node = snapshot.snapshotItem(i); - data = node.data; - if (!(node.parentNode && Linkify.regString.test(data))) { - continue; - } - Linkify.regString.lastIndex = 0; - cypherText = []; - if (next = node.nextSibling) { - cypher.textContent = node.textContent; - cypherText[0] = cypher.innerHTML; - while ((next.nodeName.toLowerCase() === 'wbr' || next.nodeName.toLowerCase() === 's') && (lookahead = next.nextSibling) && ((name = lookahead.nodeName) === "#text" || name.toLowerCase() === 'br')) { - cypher.textContent = lookahead.textContent; - cypherText.push((spoiler = next.innerHTML) ? "" + (spoiler.replace(/" : ''); - cypherText.push(cypher.innerHTML); - $.rm(next); - next = lookahead.nextSibling; - if (lookahead.nodeName === "#text") { - $.rm(lookahead); - } - if (!next) { - break; - } - } - } - if (cypherText.length) { - data = cypherText.join(''); - } - links = data.match(Linkify.regString); - for (_j = 0, _len1 = links.length; _j < _len1; _j++) { - link = links[_j]; - index = data.indexOf(link); - if (text = data.slice(0, index)) { - cypher.innerHTML = text; - _ref1 = __slice.call(cypher.childNodes); - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - child = _ref1[_k]; - $.add(nodes, child); - } - } - cypher.innerHTML = (link.indexOf(':') < 0 ? (link.indexOf('@') > 0 ? 'mailto:' + link : 'http://' + link) : link).replace(/<(wbr|s|\/s)>/g, ''); - a = $.el('a', { - innerHTML: link, - className: 'linkify', - rel: 'nofollow noreferrer', - target: '_blank', - href: cypher.textContent - }); - $.add(nodes, Linkify.embedder(a)); - data = data.slice(index + link.length); - } - if (data) { - cypher.innerHTML = data; - _ref2 = __slice.call(cypher.childNodes); - for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { - child = _ref2[_l]; - $.add(nodes, child); - } - } - $.replace(node, nodes); - } - if (Conf['Auto-embed']) { - embeds = $$('.embedder', this.nodes.comment); - for (_m = 0, _len4 = embeds.length; _m < _len4; _m++) { - embed = embeds[_m]; - embed.click(); - } - } - }, - toggle: function() { - var el, embed, style, type, url; - embed = this.previousElementSibling; - if (this.className.contains("embedded")) { - el = $.el('a', { - rel: 'nofollow noreferrer', - target: 'blank', - className: 'linkify', - href: url = this.getAttribute("data-originalURL"), - textContent: this.getAttribute("data-title") || url - }); - this.textContent = '(embed)'; - $.addClass(el, "" + (this.getAttribute('data-service'))); - } else { - el = (type = Linkify.types[this.getAttribute("data-service")]).el.call(this); - el.style.cssText = (style = type.style) ? style : "border: 0; width: 640px; height: 390px"; - this.textContent = '(unembed)'; - } - $.replace(embed, el); - return $.toggleClass(this, 'embedded'); - }, - types: { - YouTube: { - regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*)\??(t\=.*)?/, - el: function() { - return $.el('iframe', { - src: "//www.youtube.com/embed/" + this.name + (this.option ? '#' + this.option : '') + "?wmode=opaque" - }); - }, - title: { - api: function() { - return "https://gdata.youtube.com/feeds/api/videos/" + this.name + "?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"; - }, - text: function() { - return JSON.parse(this.responseText).entry.title.$t; - } - } - }, - Vocaroo: { - regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/, - style: 'border: 0; width: 150px; height: 45px;', - el: function() { - return $.el('object', { - innerHTML: "" - }); - } - }, - Vimeo: { - regExp: /.*(?:vimeo.com\/)([^#\&\?]*).*/, - el: function() { - return $.el('iframe', { - src: "//player.vimeo.com/video/" + this.name + "?wmode=opaque" - }); - }, - title: { - api: function() { - return "https://vimeo.com/api/oembed.json?url=http://vimeo.com/" + this.name; - }, - text: function() { - return JSON.parse(this.responseText).title; - } - } - }, - LiveLeak: { - regExp: /.*(?:liveleak.com\/view.+i=)([0-9a-z_]+)/, - el: function() { - return $.el('object', { - innerHTML: "" - }); - } - }, - audio: { - regExp: /(.*\.(mp3|ogg|wav))$/, - el: function() { - return $.el('audio', { - controls: 'controls', - preload: 'auto', - src: this.name - }); - } - }, - image: { - regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, - style: 'border: 0; width: auto; height: auto;', - el: function() { - return $.el('div', { - innerHTML: "" - }); - } - }, - SoundCloud: { - regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, - style: 'height: auto; width: 500px; display: inline-block;', - el: function() { - var div; - div = $.el('div', { - className: "soundcloud", - name: "soundcloud" - }); - $.ajax("//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + this.name, { - div: div, - onloadend: function() { - return this.div.innerHTML = JSON.parse(this.responseText).html; - } - }, false); - return div; - }, - title: { - api: function() { - return "//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + this.name; - }, - text: function() { - return JSON.parse(this.responseText).title; - } - } - }, - pastebin: { - regExp: /.*(?:pastebin.com\/(?!u\/))([^#\&\?]*).*/, - el: function() { - var div; - return div = $.el('iframe', { - src: "http://pastebin.com/embed_iframe.php?i=" + this.name - }); - } - }, - gist: { - regExp: /.*(?:gist.github.com.*\/)([^\/][^\/]*)$/, - el: function() { - var div; - return div = $.el('iframe', { - src: "http://www.purplegene.com/script?url=https://gist.github.com/" + this.name + ".js" - }); - }, - title: { - api: function() { - return "https://api.github.com/gists/" + this.name; - }, - text: function() { - var file, response; - response = JSON.parse(this.responseText).files; - for (file in response) { - if (response.hasOwnProperty(file)) { - return file; - } - } - } - } - }, - InstallGentoo: { - regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/, - el: function() { - return $.el('iframe', { - src: "http://paste.installgentoo.com/view/embed/" + this.name - }); - } - } - }, - embedder: function(a) { - var callbacks, embed, key, match, service, titles, type, _ref; - if (!Conf['Link Title']) { - return [a]; - } - titles = {}; - callbacks = function() { - var title; - return a.textContent = (function() { - switch (this.status) { - case 200: - case 304: - title = "" + (service.text.call(this)); - embed.setAttribute('data-title', title); - titles[embed.name] = [title, Date.now()]; - $.set('CachedTitles', titles); - return title; - case 404: - return "[" + key + "] Not Found"; - case 403: - return "[" + key + "] Forbidden or Private"; - default: - return "[" + key + "] " + this.status + "'d"; - } - }).call(this); - }; - _ref = Linkify.types; - for (key in _ref) { - type = _ref[key]; - if (!(match = a.href.match(type.regExp))) { - continue; - } - embed = $.el('a', { - name: (a.name = match[1]), - option: match[2], - className: 'embedder', - href: 'javascript:;', - textContent: '(embed)' - }); - embed.setAttribute('data-service', key); - embed.setAttribute('data-originalURL', a.href); - $.addClass(a, "" + (embed.getAttribute('data-service'))); - $.on(embed, 'click', Linkify.toggle); - if (!Conf['Embedding']) { - embed.hidden = true; - } - if (Conf['Link Title'] && (service = type.title)) { - $.get('CachedTitles', {}, function(item) { - var err, title; - titles = item['CachedTitles']; - if (title = titles[match[1]]) { - a.textContent = title[0]; - return embed.setAttribute('data-title', title[0]); - } else { - try { - return $.cache(service.api.call(a), callbacks); - } catch (_error) { - err = _error; - return a.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; - } - } - }); - } - return [a, $.tn(' '), embed]; - } - return [a]; - } - }; - - QR = { - init: function() { - var sc; - if (!Conf['Quick Reply']) { - return; - } - this.db = new DataBoard('yourPosts'); - if (Conf['QR Shortcut']) { - sc = $.el('a', { - className: "qr-shortcut " + (!Conf['Persistent QR'] ? 'disabled' : ''), - textContent: 'QR', - title: 'Quick Reply', - href: 'javascript:;' - }); - $.on(sc, 'click', function() { - if (Conf['Persistent QR'] || !QR.nodes || QR.nodes.el.hidden) { - $.event('CloseMenu'); - QR.open(); - QR.nodes.com.focus(); - return $.rmClass(this, 'disabled'); - } else { - QR.close(); - return $.addClass(this, 'disabled'); - } - }); - Header.addShortcut(sc); - } - if (Conf['Hide Original Post Form']) { - $.asap((function() { - return doc; - }), function() { - return $.addClass(doc, 'hide-original-post-form'); - }); - } - $.ready(this.initReady); - if (Conf['Persistent QR']) { - if (!(g.BOARD.ID === 'f' && g.VIEW === 'index')) { - $.on(d, '4chanXInitFinished', this.persist); - } else { - $.ready(this.persist); - } - } - return Post.prototype.callbacks.push({ - name: 'Quick Reply', - cb: this.node - }); - }, - initReady: function() { - var link; - QR.postingIsEnabled = !!$.id('postForm'); - if (!QR.postingIsEnabled) { - return; - } - link = $.el('h1', { - innerHTML: "" + (g.VIEW === 'thread' ? 'Reply to Thread' : 'Start a Thread') + "", - className: "qr-link-container" - }); - $.on(link.firstChild, 'click', function() { - $.event('CloseMenu'); - QR.open(); - QR.nodes.com.focus(); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }); - $.before($.id('postForm'), link); - $.on(d, 'QRGetSelectedPost', function(_arg) { - var cb; - cb = _arg.detail; - return cb(QR.selected); - }); - $.on(d, 'QRAddPreSubmitHook', function(_arg) { - var cb; - cb = _arg.detail; - return QR.preSubmitHooks.push(cb); - }); - $.on(d, 'dragover', QR.dragOver); - $.on(d, 'drop', QR.dropFile); - $.on(d, 'dragstart dragend', QR.drag); - return $.on(d, 'ThreadUpdate', function() { - if (g.DEAD) { - return QR.abort(); - } else { - return QR.status(); - } - }); - }, - node: function() { - return $.on($('a[title="Quote this post"]', this.nodes.info), 'click', QR.quote); - }, - persist: function() { - if (!QR.postingIsEnabled) { - return; - } - QR.open(); - if (Conf['Auto Hide QR']) { - return QR.hide(); - } - }, - open: function() { - var err; - if (QR.nodes) { - QR.nodes.el.hidden = false; - QR.unhide(); - return; - } - try { - return QR.dialog(); - } catch (_error) { - err = _error; - delete QR.nodes; - return Main.handleErrors({ - message: 'Quick Reply dialog creation crashed.', - error: err - }); - } - }, - close: function() { - var i, _i, _len, _ref; - if (QR.req) { - QR.abort(); - return; - } - QR.nodes.el.hidden = true; - QR.cleanNotifications(); - d.activeElement.blur(); - $.rmClass(QR.nodes.el, 'dump'); - if (!Conf['Captcha Warning Notifications']) { - $.rmClass(QR.captcha.nodes.input, 'error'); - } - if (Conf['QR Shortcut']) { - $.toggleClass($('.qr-shortcut'), 'disabled'); - } - _ref = QR.posts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - i = _ref[_i]; - QR.posts[0].rm(); - } - QR.cooldown.auto = false; - return QR.status(); - }, - focusin: function() { - return $.addClass(QR.nodes.el, 'has-focus'); - }, - focusout: function() { - return $.rmClass(QR.nodes.el, 'has-focus'); - }, - hide: function() { - d.activeElement.blur(); - $.addClass(QR.nodes.el, 'autohide'); - return QR.nodes.autohide.checked = true; - }, - unhide: function() { - $.rmClass(QR.nodes.el, 'autohide'); - return QR.nodes.autohide.checked = false; - }, - toggleHide: function() { - if (this.checked) { - return QR.hide(); - } else { - return QR.unhide(); - } - }, - error: function(err) { - var el; - QR.open(); - if (typeof err === 'string') { - el = $.tn(err); - } else { - el = err; - el.removeAttribute('style'); - } - if (QR.captcha.isEnabled && /captcha|verification/i.test(el.textContent)) { - QR.captcha.nodes.input.focus(); - if (Conf['Captcha Warning Notifications']) { - QR.notifications.push(new Notification('warning', el)); - } else { - $.addClass(QR.captcha.nodes.input, 'error'); - $.on(QR.captcha.nodes.input, 'keydown', function() { - return $.rmClass(QR.captcha.nodes.input, 'error'); - }); - } - } else { - QR.notifications.push(new Notification('warning', el)); - } - if (d.hidden) { - return alert(el.textContent); - } - }, - notifications: [], - cleanNotifications: function() { - var notification, _i, _len, _ref; - _ref = QR.notifications; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - notification = _ref[_i]; - notification.close(); - } - return QR.notifications = []; - }, - status: function() { - var disabled, status, value; - if (!QR.nodes) { - return; - } - if (g.DEAD) { - value = 404; - disabled = true; - QR.cooldown.auto = false; - } - value = QR.req ? QR.req.progress : QR.cooldown.seconds || value; - status = QR.nodes.status; - status.value = !value ? 'Submit' : QR.cooldown.auto ? "Auto " + value : value; - return status.disabled = disabled || false; - }, - persona: { - pwd: '', - always: {}, - init: function() { - QR.persona.getPassword(); - return $.get('QR.personas', Conf['QR.personas'], function(_arg) { - var arr, item, personas, type, types, _i, _len, _ref; - personas = _arg['QR.personas']; - types = { - name: [], - email: [], - sub: [] - }; - _ref = personas.split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - item = _ref[_i]; - QR.persona.parseItem(item.trim(), types); - } - for (type in types) { - arr = types[type]; - QR.persona.loadPersonas(type, arr); - } - }); - }, - parseItem: function(item, types) { - var boards, match, type, val, _ref, _ref1; - if (item[0] === '#') { - return; - } - if (!(match = item.match(/(name|email|subject|password):"(.*)"/i))) { - return; - } - _ref = match, match = _ref[0], type = _ref[1], val = _ref[2]; - item = item.replace(match, ''); - boards = ((_ref1 = item.match(/boards:([^;]+)/i)) != null ? _ref1[1].toLowerCase() : void 0) || 'global'; - if (boards !== 'global' && !((boards.split(',')).contains(g.BOARD.ID))) { - return; - } - if (type === 'password') { - QR.persona.pwd = val; - return; - } - if (type === 'subject') { - type = 'sub'; - } - if (/always/i.test(item)) { - QR.persona.always[type] = val; - } - if (!types[type].contains(val)) { - return types[type].push(val); - } - }, - loadPersonas: function(type, arr) { - var list, val, _i, _len; - list = $("#list-" + type, QR.nodes.el); - for (_i = 0, _len = arr.length; _i < _len; _i++) { - val = arr[_i]; - if (!val) { - continue; - } - $.add(list, $.el('option', { - textContent: val - })); - } - }, - getPassword: function() { - var input, m; - if (!QR.persona.pwd) { - QR.persona.pwd = (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : (input = $.id('postPassword')) ? input.value : $.id('delPassword').value; - } - return QR.persona.pwd; - }, - get: function(cb) { - return $.get('QR.persona', {}, function(_arg) { - var persona; - persona = _arg['QR.persona']; - return cb(persona); - }); - }, - set: function(post) { - return $.get('QR.persona', {}, function(_arg) { - var persona; - persona = _arg['QR.persona']; - persona = { - name: post.name, - email: /^sage$/.test(post.email) ? persona.email : post.email, - sub: Conf['Remember Subject'] ? post.sub : void 0 - }; - return $.set('QR.persona', persona); - }); - } - }, - cooldown: { - init: function() { - var board; - if (!Conf['Cooldown']) { - return; - } - board = g.BOARD.ID; - QR.cooldown.types = { - thread: (function() { - switch (board) { - case 'q': - return 86400; - case 'b': - case 'soc': - case 'r9k': - return 600; - default: - return 300; - } - })(), - sage: board === 'q' ? 600 : 60, - file: board === 'q' ? 300 : 30, - post: board === 'q' ? 150 : 30 - }; - QR.cooldown.upSpd = 0; - QR.cooldown.upSpdAccuracy = .5; - $.get("cooldown." + board, {}, function(item) { - QR.cooldown.cooldowns = item["cooldown." + board]; - return QR.cooldown.start(); - }); - return $.sync("cooldown." + board, QR.cooldown.sync); - }, - start: function() { - if (!Conf['Cooldown']) { - return; - } - if (QR.cooldown.isCounting) { - return; - } - QR.cooldown.isCounting = true; - return QR.cooldown.count(); - }, - sync: function(cooldowns) { - var id; - for (id in cooldowns) { - QR.cooldown.cooldowns[id] = cooldowns[id]; - } - return QR.cooldown.start(); - }, - set: function(data) { - var cooldown, delay, hasFile, isReply, isSage, post, req, start, type, upSpd; - if (!Conf['Cooldown']) { - return; - } - req = data.req, post = data.post, isReply = data.isReply, delay = data.delay; - start = req ? req.uploadEndTime : Date.now(); - if (delay) { - cooldown = { - delay: delay - }; - } else { - if (post.file) { - upSpd = post.file.size / ((req.uploadEndTime - req.uploadStartTime) / $.SECOND); - QR.cooldown.upSpdAccuracy = ((upSpd > QR.cooldown.upSpd * .9) + QR.cooldown.upSpdAccuracy) / 2; - QR.cooldown.upSpd = upSpd; - } - isSage = /sage/i.test(post.email); - hasFile = !!post.file; - type = !isReply ? 'thread' : isSage ? 'sage' : hasFile ? 'file' : 'post'; - cooldown = { - isReply: isReply, - isSage: isSage, - hasFile: hasFile, - timeout: start + QR.cooldown.types[type] * $.SECOND - }; - } - QR.cooldown.cooldowns[start] = cooldown; - $.set("cooldown." + g.BOARD, QR.cooldown.cooldowns); - return QR.cooldown.start(); - }, - unset: function(id) { - delete QR.cooldown.cooldowns[id]; - if (Object.keys(QR.cooldown.cooldowns).length) { - return $.set("cooldown." + g.BOARD, QR.cooldown.cooldowns); - } else { - return $["delete"]("cooldown." + g.BOARD); - } - }, - count: function() { - var cooldown, cooldowns, elapsed, hasFile, isReply, isSage, now, post, seconds, start, type, types, upSpd, upSpdAccuracy, update, _ref; - if (!Object.keys(QR.cooldown.cooldowns).length) { - $["delete"]("" + g.BOARD + ".cooldown"); - delete QR.cooldown.isCounting; - delete QR.cooldown.seconds; - QR.status(); - return; - } - setTimeout(QR.cooldown.count, $.SECOND); - now = Date.now(); - post = QR.posts[0]; - isReply = post.thread !== 'new'; - isSage = /sage/i.test(post.email); - hasFile = !!post.file; - seconds = null; - _ref = QR.cooldown, types = _ref.types, cooldowns = _ref.cooldowns, upSpd = _ref.upSpd, upSpdAccuracy = _ref.upSpdAccuracy; - for (start in cooldowns) { - cooldown = cooldowns[start]; - if ('delay' in cooldown) { - if (cooldown.delay) { - seconds = Math.max(seconds, cooldown.delay--); - } else { - seconds = Math.max(seconds, 0); - QR.cooldown.unset(start); - } - continue; - } - if (isReply === cooldown.isReply) { - type = !isReply ? 'thread' : isSage && cooldown.isSage ? 'sage' : hasFile && cooldown.hasFile ? 'file' : 'post'; - elapsed = Math.floor((now - start) / $.SECOND); - if (elapsed >= 0) { - seconds = Math.max(seconds, types[type] - elapsed); - if (Conf['Cooldown Prediction'] && hasFile && upSpd) { - seconds -= Math.floor(post.file.size / upSpd * upSpdAccuracy); - seconds = Math.max(seconds, 0); - } - } - } - if (!((start <= now && now <= cooldown.timeout))) { - QR.cooldown.unset(start); - } - } - update = seconds !== null || !!QR.cooldown.seconds; - QR.cooldown.seconds = seconds; - if (update) { - QR.status(); - } - if (seconds === 0 && QR.cooldown.auto && !QR.req) { - return QR.submit(); - } - } - }, - quote: function(e) { - var OP, caretPos, com, index, post, range, s, sel, selectionRoot, text, thread, _ref; - if (e != null) { - e.preventDefault(); - } - if (!QR.postingIsEnabled) { - return; - } - sel = d.getSelection(); - selectionRoot = $.x('ancestor::div[contains(@class,"postContainer")][1]', sel.anchorNode); - post = Get.postFromNode(this); - OP = Get.contextFromLink(this).thread.OP; - text = ">>" + post + "\n"; - if ((s = sel.toString().trim()) && post.nodes.root === selectionRoot) { - s = s.replace(/\n/g, '\n>'); - text += ">" + s + "\n"; - } - QR.open(); - if (QR.selected.isLocked) { - index = QR.posts.indexOf(QR.selected); - (QR.posts[index + 1] || new QR.post()).select(); - $.addClass(QR.nodes.el, 'dump'); - QR.cooldown.auto = true; - } - _ref = QR.nodes, com = _ref.com, thread = _ref.thread; - if (!com.value) { - thread.value = OP.ID; - } - caretPos = com.selectionStart; - com.value = com.value.slice(0, caretPos) + text + com.value.slice(com.selectionEnd); - range = caretPos + text.length; - com.setSelectionRange(range, range); - com.focus(); - QR.selected.save(com); - QR.selected.save(thread); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }, - characterCount: function() { - var count, counter; - counter = QR.nodes.charCount; - count = QR.nodes.com.textLength; - counter.textContent = count; - counter.hidden = count < 1000; - return (count > 1500 ? $.addClass : $.rmClass)(counter, 'warning'); - }, - drag: function(e) { - var toggle; - toggle = e.type === 'dragstart' ? $.off : $.on; - toggle(d, 'dragover', QR.dragOver); - return toggle(d, 'drop', QR.dropFile); - }, - dragOver: function(e) { - e.preventDefault(); - return e.dataTransfer.dropEffect = 'copy'; - }, - dropFile: function(e) { - if (!e.dataTransfer.files.length) { - return; - } - e.preventDefault(); - QR.open(); - QR.fileInput(e.dataTransfer.files); - return $.addClass(QR.nodes.el, 'dump'); - }, - paste: function(e) { - var blob, files, item, _i, _len, _ref; - files = []; - _ref = e.clipboardData.items; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - item = _ref[_i]; - if (item.kind === 'file') { - blob = item.getAsFile(); - blob.name = 'file'; - if (blob.type) { - blob.name += '.' + blob.type.split('/')[1]; - } - files.push(blob); - } - } - if (!files.length) { - return; - } - QR.open(); - return QR.fileInput(files); - }, - openFileInput: function(e) { - if (e.keyCode && e.keyCode !== 32) { - return; - } - return QR.nodes.fileInput.click(); - }, - fileInput: function(files) { - var file, length, max, post, _i, _len; - if (this instanceof Element) { - files = __slice.call(this.files); - QR.nodes.fileInput.value = null; - } - length = files.length; - if (!length) { - return; - } - max = QR.nodes.fileInput.max; - QR.cleanNotifications(); - if (length === 1) { - file = files[0]; - if (/^text/.test(file.type)) { - QR.selected.pasteText(file); - } else if (file.size > max) { - QR.error("File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ")."); - } else if (!QR.mimeTypes.contains(file.type)) { - QR.error('Unsupported file type.'); - } else { - QR.selected.setFile(file); - } - return; - } - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - if (/^text/.test(file.type)) { - if ((post = QR.posts[QR.posts.length - 1]).com) { - post = new QR.post(); - } - post.pasteText(file); - } else if (file.size > max) { - QR.error("" + file.name + ": File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ")."); - } else if (!QR.mimeTypes.contains(file.type)) { - QR.error("" + file.name + ": Unsupported file type."); - } else { - if ((post = QR.posts[QR.posts.length - 1]).file) { - post = new QR.post(); - } - post.setFile(file); - } - } - return $.addClass(QR.nodes.el, 'dump'); - }, - posts: [], - post: (function() { - function _Class(select) { - var el, event, prev, _i, _len, _ref, - _this = this; - el = $.el('a', { - className: 'qr-preview', - draggable: true, - href: 'javascript:;', - innerHTML: '×' - }); - this.nodes = { - el: el, - rm: el.firstChild, - label: $('label', el), - spoiler: $('input', el), - span: el.lastChild - }; - $.on(el, 'click', this.select.bind(this)); - $.on(this.nodes.rm, 'click', function(e) { - e.stopPropagation(); - return _this.rm(); - }); - $.on(this.nodes.label, 'click', function(e) { - return e.stopPropagation(); - }); - $.on(this.nodes.spoiler, 'change', function(e) { - _this.spoiler = e.target.checked; - if (_this === QR.selected) { - return QR.nodes.spoiler.checked = _this.spoiler; - } - }); - $.add(QR.nodes.dumpList, el); - _ref = ['dragStart', 'dragEnter', 'dragLeave', 'dragOver', 'dragEnd', 'drop']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - event = _ref[_i]; - $.on(el, event.toLowerCase(), this[event]); - } - this.thread = g.VIEW === 'thread' ? g.THREADID : 'new'; - prev = QR.posts[QR.posts.length - 1]; - QR.posts.push(this); - this.nodes.spoiler.checked = this.spoiler = prev && Conf['Remember Spoiler'] ? prev.spoiler : false; - QR.persona.get(function(persona) { - _this.name = 'name' in QR.persona.always ? QR.persona.always.name : prev ? prev.name : persona.name; - _this.email = 'email' in QR.persona.always ? QR.persona.always.email : prev && !/^sage$/.test(prev.email) ? prev.email : persona.email; - _this.sub = 'sub' in QR.persona.always ? QR.persona.always.sub : Conf['Remember Subject'] ? prev ? prev.sub : persona.sub : ''; - if (QR.selected === _this) { - return _this.load(); - } - }); - if (select) { - this.select(); - } - this.unlock(); - } - - _Class.prototype.rm = function() { - var index; - $.rm(this.nodes.el); - index = QR.posts.indexOf(this); - if (QR.posts.length === 1) { - new QR.post(true); - $.rmClass(QR.nodes.el, 'dump'); - } else if (this === QR.selected) { - (QR.posts[index - 1] || QR.posts[index + 1]).select(); - } - QR.posts.splice(index, 1); - if (!window.URL) { - return; - } - return URL.revokeObjectURL(this.URL); - }; - - _Class.prototype.lock = function(lock) { - var name, _i, _len, _ref; - if (lock == null) { - lock = true; - } - this.isLocked = lock; - if (this !== QR.selected) { - return; - } - _ref = ['thread', 'name', 'email', 'sub', 'com', 'spoiler']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - QR.nodes[name].disabled = lock; - } - this.nodes.rm.style.visibility = QR.nodes.fileRM.style.visibility = lock ? 'hidden' : ''; - (lock ? $.off : $.on)(QR.nodes.filename.parentNode, 'click', QR.openFileInput); - this.nodes.spoiler.disabled = lock; - return this.nodes.el.draggable = !lock; - }; - - _Class.prototype.unlock = function() { - return this.lock(false); - }; - - _Class.prototype.select = function() { - var rectEl, rectList; - if (QR.selected) { - QR.selected.nodes.el.id = null; - QR.selected.forceSave(); - } - QR.selected = this; - this.lock(this.isLocked); - this.nodes.el.id = 'selected'; - rectEl = this.nodes.el.getBoundingClientRect(); - rectList = this.nodes.el.parentNode.getBoundingClientRect(); - this.nodes.el.parentNode.scrollLeft += rectEl.left + rectEl.width / 2 - rectList.left - rectList.width / 2; - this.load(); - return $.event('QRPostSelection', this); - }; - - _Class.prototype.load = function() { - var name, _i, _len, _ref; - _ref = ['thread', 'name', 'email', 'sub', 'com']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - QR.nodes[name].value = this[name] || null; - } - this.showFileData(); - return QR.characterCount(); - }; - - _Class.prototype.save = function(input) { - var value, _ref; - if (input.type === 'checkbox') { - this.spoiler = input.checked; - return; - } - value = input.value; - this[input.dataset.name] = value; - if (input.nodeName !== 'TEXTAREA') { - return; - } - this.nodes.span.textContent = value; - QR.characterCount(); - if (QR.cooldown.auto && this === QR.posts[0] && (0 < (_ref = QR.cooldown.seconds) && _ref <= 5)) { - return QR.cooldown.auto = false; - } - }; - - _Class.prototype.forceSave = function() { - var name, _i, _len, _ref; - if (this !== QR.selected) { - return; - } - _ref = ['thread', 'name', 'email', 'sub', 'com', 'spoiler']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - this.save(QR.nodes[name]); - } - }; - - _Class.prototype.setFile = function(file) { - this.file = file; - this.filename = "" + file.name + " (" + ($.bytesToString(file.size)) + ")"; - this.nodes.el.title = this.filename; - if (QR.spoiler) { - this.nodes.label.hidden = false; - } - if (window.URL) { - URL.revokeObjectURL(this.URL); - } - this.showFileData(); - if (!/^image/.test(file.type)) { - this.nodes.el.style.backgroundImage = null; - return; - } - return this.setThumbnail(); - }; - - _Class.prototype.setThumbnail = function(fileURL) { - var img, reader, - _this = this; - if (!window.URL) { - if (!fileURL) { - reader = new FileReader(); - reader.onload = function(e) { - return _this.setThumbnail(e.target.result); - }; - reader.readAsDataURL(this.file); - return; - } - } else { - fileURL = URL.createObjectURL(this.file); - } - img = $.el('img'); - img.onload = function() { - var applyBlob, cv, data, height, i, l, s, ui8a, width, _i; - s = 90 * 2; - if (_this.file.type === 'image/gif') { - s *= 3; - } - height = img.height, width = img.width; - if (height < s || width < s) { - if (window.URL) { - _this.URL = fileURL; - } - _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - return; - } - if (height <= width) { - width = s / height * width; - height = s; - } else { - height = s / width * height; - width = s; - } - cv = $.el('canvas'); - cv.height = img.height = height; - cv.width = img.width = width; - cv.getContext('2d').drawImage(img, 0, 0, width, height); - if (!window.URL) { - _this.nodes.el.style.backgroundImage = "url(" + (cv.toDataURL()) + ")"; - delete _this.URL; - return; - } - URL.revokeObjectURL(fileURL); - applyBlob = function(blob) { - _this.URL = URL.createObjectURL(blob); - return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - }; - if (cv.toBlob) { - cv.toBlob(applyBlob); - return; - } - data = atob(cv.toDataURL().split(',')[1]); - l = data.length; - ui8a = new Uint8Array(l); - for (i = _i = 0; 0 <= l ? _i < l : _i > l; i = 0 <= l ? ++_i : --_i) { - ui8a[i] = data.charCodeAt(i); - } - return applyBlob(new Blob([ui8a], { - type: 'image/png' - })); - }; - return img.src = fileURL; - }; - - _Class.prototype.rmFile = function() { - delete this.file; - delete this.filename; - this.nodes.el.title = null; - this.nodes.el.style.backgroundImage = null; - if (QR.spoiler) { - this.nodes.label.hidden = true; - } - this.showFileData(); - if (!window.URL) { - return; - } - return URL.revokeObjectURL(this.URL); - }; - - _Class.prototype.showFileData = function() { - if (this.file) { - QR.nodes.filename.textContent = this.filename; - QR.nodes.filename.title = this.filename; - QR.nodes.spoiler.checked = this.spoiler; - return $.addClass(QR.nodes.fileSubmit, 'has-file'); - } else { - return $.rmClass(QR.nodes.fileSubmit, 'has-file'); - } - }; - - _Class.prototype.pasteText = function(file) { - var reader, - _this = this; - reader = new FileReader(); - reader.onload = function(e) { - var text; - text = e.target.result; - if (_this.com) { - _this.com += "\n" + text; - } else { - _this.com = text; - } - if (QR.selected === _this) { - QR.nodes.com.value = _this.com; - } - return _this.nodes.span.textContent = _this.com; - }; - return reader.readAsText(file); - }; - - _Class.prototype.dragStart = function() { - return $.addClass(this, 'drag'); - }; - - _Class.prototype.dragEnd = function() { - return $.rmClass(this, 'drag'); - }; - - _Class.prototype.dragEnter = function() { - return $.addClass(this, 'over'); - }; - - _Class.prototype.dragLeave = function() { - return $.rmClass(this, 'over'); - }; - - _Class.prototype.dragOver = function(e) { - e.preventDefault(); - return e.dataTransfer.dropEffect = 'move'; - }; - - _Class.prototype.drop = function() { - var el, index, newIndex, oldIndex, post; - el = $('.drag', this.parentNode); - $.rmClass(el, 'drag'); - $.rmClass(this, 'over'); - if (!this.draggable) { - return; - } - index = function(el) { - return __slice.call(el.parentNode.children).indexOf(el); - }; - oldIndex = index(el); - newIndex = index(this); - (oldIndex < newIndex ? $.after : $.before)(this, el); - post = QR.posts.splice(oldIndex, 1)[0]; - return QR.posts.splice(newIndex, 0, post); - }; - - return _Class; - - })(), - captcha: { - init: function() { - if (d.cookie.indexOf('pass_enabled=1') >= 0) { - return; - } - if (!(this.isEnabled = !!$.id('captchaFormPart'))) { - return; - } - return $.asap((function() { - return $.id('recaptcha_challenge_field_holder'); - }), this.ready.bind(this)); - }, - ready: function() { - var imgContainer, input, observer, setLifetime, - _this = this; - setLifetime = function(e) { - return _this.lifetime = e.detail; - }; - $.on(window, 'captcha:timeout', setLifetime); - $.globalEval('window.dispatchEvent(new CustomEvent("captcha:timeout", {detail: RecaptchaState.timeout}))'); - $.off(window, 'captcha:timeout', setLifetime); - imgContainer = $.el('div', { - className: 'captcha-img', - title: 'Reload', - innerHTML: '' - }); - input = $.el('input', { - className: 'captcha-input field', - title: 'Verification', - autocomplete: 'off', - spellcheck: false, - tabIndex: 55 - }); - this.nodes = { - challenge: $.id('recaptcha_challenge_field_holder'), - img: imgContainer.firstChild, - input: input - }; - if (window.MutationObserver) { - observer = new MutationObserver(this.load.bind(this)); - observer.observe(this.nodes.challenge, { - childList: true - }); - } else { - $.on(this.nodes.challenge, 'DOMNodeInserted', this.load.bind(this)); - } - $.on(imgContainer, 'click', this.reload.bind(this)); - $.on(input, 'keydown', this.keydown.bind(this)); - $.on(input, 'focus', function() { - return $.addClass(QR.nodes.el, 'focus'); - }); - $.on(input, 'blur', function() { - return $.rmClass(QR.nodes.el, 'focus'); - }); - $.get('captchas', [], function(_arg) { - var captchas; - captchas = _arg.captchas; - return _this.sync(captchas); - }); - $.sync('captchas', this.sync); - this.reload(); - $.addClass(QR.nodes.el, 'has-captcha'); - return $.after(QR.nodes.com.parentNode, [imgContainer, input]); - }, - sync: function(captchas) { - QR.captcha.captchas = captchas; - return QR.captcha.count(); - }, - getOne: function() { - var captcha, challenge, response; - this.clear(); - if (captcha = this.captchas.shift()) { - challenge = captcha.challenge, response = captcha.response; - this.count(); - $.set('captchas', this.captchas); - } else { - challenge = this.nodes.img.alt; - if (response = this.nodes.input.value) { - this.reload(); - } - } - if (response) { - response = response.trim(); - if (!/\s/.test(response)) { - response = "" + response + " " + response; - } - } - return { - challenge: challenge, - response: response - }; - }, - save: function() { - var response; - if (!(response = this.nodes.input.value.trim())) { - return; - } - this.captchas.push({ - challenge: this.nodes.img.alt, - response: response, - timeout: this.timeout - }); - this.count(); - this.reload(); - return $.set('captchas', this.captchas); - }, - clear: function() { - var captcha, i, now, _i, _len, _ref; - now = Date.now(); - _ref = this.captchas; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - captcha = _ref[i]; - if (captcha.timeout > now) { - break; - } - } - if (!i) { - return; - } - this.captchas = this.captchas.slice(i); - this.count(); - return $.set('captchas', this.captchas); - }, - load: function() { - var challenge; - if (!this.nodes.challenge.firstChild) { - return; - } - this.timeout = Date.now() + this.lifetime * $.SECOND - $.MINUTE; - challenge = this.nodes.challenge.firstChild.value; - this.nodes.img.alt = challenge; - this.nodes.img.src = "//www.google.com/recaptcha/api/image?c=" + challenge; - this.nodes.input.value = null; - return this.clear(); - }, - count: function() { - var count; - count = this.captchas.length; - this.nodes.input.placeholder = (function() { - switch (count) { - case 0: - return 'Verification (Shift + Enter to cache)'; - case 1: - return 'Verification (1 cached captcha)'; - default: - return "Verification (" + count + " cached captchas)"; - } - })(); - return this.nodes.input.alt = count; - }, - reload: function(focus) { - $.globalEval('Recaptcha.reload("t")'); - if (focus) { - return this.nodes.input.focus(); - } - }, - keydown: function(e) { - if (e.keyCode === 8 && !this.nodes.input.value) { - this.reload(); - } else if (e.keyCode === 13 && e.shiftKey) { - this.save(); - } else { - return; - } - return e.preventDefault(); - } - }, - dialog: function() { - var dialog, mimeTypes, name, nodes, thread, _i, _len, _ref; - dialog = UI.dialog('qr', 'top:0;right:0;', "
×
No selected file×+
"); - QR.nodes = nodes = { - el: dialog, - move: $('.move', dialog), - autohide: $('#autohide', dialog), - thread: $('select', dialog), - close: $('.close', dialog), - form: $('form', dialog), - dumpButton: $('#dump-button', dialog), - name: $('[data-name=name]', dialog), - email: $('[data-name=email]', dialog), - sub: $('[data-name=sub]', dialog), - com: $('[data-name=com]', dialog), - dumpList: $('#dump-list', dialog), - addPost: $('#add-post', dialog), - charCount: $('#char-count', dialog), - fileSubmit: $('#file-n-submit', dialog), - filename: $('#qr-filename', dialog), - fileRM: $('#qr-filerm', dialog), - fileExtras: $('#qr-extras-container', dialog), - spoiler: $('#qr-file-spoiler', dialog), - status: $('[type=submit]', dialog), - fileInput: $('[type=file]', dialog) - }; - mimeTypes = $('ul.rules > li').textContent.trim().match(/: (.+)/)[1].toLowerCase().replace(/\w+/g, function(type) { - switch (type) { - case 'jpg': - return 'image/jpeg'; - case 'pdf': - return 'application/pdf'; - case 'swf': - return 'application/x-shockwave-flash'; - default: - return "image/" + type; - } - }); - QR.mimeTypes = mimeTypes.split(', '); - QR.mimeTypes.push(''); - nodes.fileInput.max = $('input[name=MAX_FILE_SIZE]').value; - QR.spoiler = !!$('input[name=spoiler]'); - if (QR.spoiler) { - $.addClass(QR.nodes.el, 'has-spoiler'); - } else { - nodes.spoiler.parentElement.hidden = true; - } - if (g.BOARD.ID === 'f') { - nodes.flashTag = $.el('select', { - name: 'filetag', - innerHTML: "\n\n\n\n\n\n" - }); - $.add(nodes.form, nodes.flashTag); - } - for (thread in g.BOARD.threads) { - $.add(nodes.thread, $.el('option', { - value: thread, - textContent: "Thread No." + thread - })); - } - $.on(nodes.filename.parentNode, 'click keyup', QR.openFileInput); - $.on(dialog, 'focusin', QR.focusin); - $.on(dialog, 'focusout', QR.focusout); - $.on(nodes.autohide, 'change', QR.toggleHide); - $.on(nodes.close, 'click', QR.close); - $.on(nodes.dumpButton, 'click', function() { - return nodes.el.classList.toggle('dump'); - }); - $.on(nodes.addPost, 'click', function() { - return new QR.post(true); - }); - $.on(nodes.form, 'submit', QR.submit); - $.on(nodes.fileRM, 'click', function() { - return QR.selected.rmFile(); - }); - $.on(nodes.fileExtras, 'click', function(e) { - return e.stopPropagation(); - }); - $.on(nodes.spoiler, 'change', function() { - return QR.selected.nodes.spoiler.click(); - }); - $.on(nodes.fileInput, 'change', QR.fileInput); - _ref = ['name', 'email', 'sub', 'com']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - $.on(nodes[name], 'input', function() { - return QR.selected.save(this); - }); - } - $.on(nodes.thread, 'change', function() { - return QR.selected.save(this); - }); - QR.persona.init(); - new QR.post(true); - QR.status(); - QR.cooldown.init(); - QR.captcha.init(); - $.add(d.body, dialog); - return $.event('QRDialogCreation', null, dialog); - }, - preSubmitHooks: [], - submit: function(e) { - var callbacks, challenge, err, filetag, hook, opts, post, postData, response, textOnly, thread, threadID, _i, _len, _ref, _ref1; - if (e != null) { - e.preventDefault(); - } - if (QR.req) { - QR.abort(); - return; - } - if (QR.cooldown.seconds) { - QR.cooldown.auto = !QR.cooldown.auto; - QR.status(); - return; - } - post = QR.posts[0]; - post.forceSave(); - if (g.BOARD.ID === 'f') { - filetag = QR.nodes.flashTag.value; - } - threadID = post.thread; - thread = g.BOARD.threads[threadID]; - if (threadID === 'new') { - threadID = null; - if (['vg', 'q'].contains(g.BOARD.ID) && !post.sub) { - err = 'New threads require a subject.'; - } else if (!(post.file || (textOnly = !!$('input[name=textonly]', $.id('postForm'))))) { - err = 'No file selected.'; - } - } else if (g.BOARD.threads[threadID].isClosed) { - err = 'You can\'t reply to this thread anymore.'; - } else if (!(post.com || post.file)) { - err = 'No file selected.'; - } else if (post.file && thread.fileLimit) { - err = 'Max limit of image replies has been reached.'; - } else { - _ref = QR.preSubmitHooks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - hook = _ref[_i]; - if (err = hook(post, thread)) { - break; - } - } - } - if (QR.captcha.isEnabled && !err) { - _ref1 = QR.captcha.getOne(), challenge = _ref1.challenge, response = _ref1.response; - if (!response) { - err = 'No valid captcha.'; - } - } - QR.cleanNotifications(); - if (err) { - QR.cooldown.auto = false; - QR.status(); - QR.error(err); - return; - } - QR.cooldown.auto = QR.posts.length > 1; - if (Conf['Auto Hide QR'] && !QR.cooldown.auto) { - QR.hide(); - } - if (!QR.cooldown.auto && $.x('ancestor::div[@id="qr"]', d.activeElement)) { - d.activeElement.blur(); - } - post.lock(); - postData = { - resto: threadID, - name: post.name, - email: post.email, - sub: post.sub, - com: post.com, - upfile: post.file, - filetag: filetag, - spoiler: post.spoiler, - textonly: textOnly, - mode: 'regist', - pwd: QR.persona.pwd, - recaptcha_challenge_field: challenge, - recaptcha_response_field: response - }; - callbacks = { - onload: QR.response, - onerror: function() { - delete QR.req; - post.unlock(); - QR.cooldown.auto = false; - QR.status(); - return QR.error($.el('span', { - innerHTML: "4chan X encountered an error while posting. \n[Banned?] [More info]" - })); - } - }; - opts = { - cred: true, - form: $.formData(postData), - upCallbacks: { - onload: function() { - QR.req.isUploadFinished = true; - QR.req.uploadEndTime = Date.now(); - QR.req.progress = '...'; - return QR.status(); - }, - onprogress: function(e) { - QR.req.progress = "" + (Math.round(e.loaded / e.total * 100)) + "%"; - return QR.status(); - } - } - }; - QR.req = $.ajax($.id('postForm').parentNode.action, callbacks, opts); - QR.req.uploadStartTime = Date.now(); - QR.req.progress = '...'; - return QR.status(); - }, - response: function() { - var URL, ban, board, err, h1, isReply, m, post, postID, req, threadID, tmpDoc, _, _ref, _ref1; - QR.req.upload.onload(); - req = QR.req; - delete QR.req; - post = QR.posts[0]; - post.unlock(); - tmpDoc = d.implementation.createHTMLDocument(''); - tmpDoc.documentElement.innerHTML = req.response; - if (ban = $('.banType', tmpDoc)) { - board = $('.board', tmpDoc).innerHTML; - err = $.el('span', { - innerHTML: ban.textContent.toLowerCase() === 'banned' ? ("You are banned on " + board + "! ;_;
") + "Click here to see the reason." : ("You were issued a warning on " + board + " as " + ($('.nameBlock', tmpDoc).innerHTML) + ".
") + ("Reason: " + ($('.reason', tmpDoc).innerHTML)) - }); - } else if (err = tmpDoc.getElementById('errmsg')) { - if ((_ref = $('a', err)) != null) { - _ref.target = '_blank'; - } - } else if (tmpDoc.title !== 'Post successful!') { - err = 'Connection error with sys.4chan.org.'; - } else if (req.status !== 200) { - err = "Error " + req.statusText + " (" + req.status + ")"; - } - if (err) { - if (/captcha|verification/i.test(err.textContent) || err === 'Connection error with sys.4chan.org.') { - if (/mistyped/i.test(err.textContent)) { - err = 'You seem to have mistyped the CAPTCHA.'; - } - QR.cooldown.auto = QR.captcha.isEnabled ? !!QR.captcha.captchas.length : err === 'Connection error with sys.4chan.org.' ? true : false; - QR.cooldown.set({ - delay: 2 - }); - } else if (err.textContent && (m = err.textContent.match(/wait\s(\d+)\ssecond/i))) { - QR.cooldown.auto = QR.captcha.isEnabled ? !!QR.captcha.captchas.length : true; - QR.cooldown.set({ - delay: m[1] - }); - } else { - QR.cooldown.auto = false; - } - QR.status(); - QR.error(err); - return; - } - QR.cleanNotifications(); - h1 = $('h1', tmpDoc); - if (Conf['Posting Success Notifications']) { - QR.notifications.push(new Notification('success', h1.textContent, 5)); - } - QR.persona.set(post); - _ref1 = h1.nextSibling.textContent.match(/thread:(\d+),no:(\d+)/), _ = _ref1[0], threadID = _ref1[1], postID = _ref1[2]; - postID = +postID; - threadID = +threadID || postID; - isReply = threadID !== postID; - QR.db.set({ - boardID: g.BOARD.ID, - threadID: threadID, - postID: postID, - val: true - }); - ThreadUpdater.postID = postID; - $.event('QRPostSuccessful', { - board: g.BOARD, - threadID: threadID, - postID: postID - }); - QR.cooldown.auto = QR.posts.length > 1 && isReply; - if (!(Conf['Persistent QR'] || QR.cooldown.auto)) { - QR.close(); - } else { - post.rm(); - } - QR.cooldown.set({ - req: req, - post: post, - isReply: isReply - }); - if (threadID === postID) { - URL = "/" + g.BOARD + "/res/" + threadID; - } else if (g.VIEW === 'index' && !QR.cooldown.auto && Conf['Open Post in New Tab']) { - URL = "/" + g.BOARD + "/res/" + threadID + "#p" + postID; - } - if (URL) { - if (Conf['Open Post in New Tab']) { - $.open("/" + g.BOARD + "/res/" + threadID); - } else { - window.location = "/" + g.BOARD + "/res/" + threadID; - } - } - return QR.status(); - }, - abort: function() { - if (QR.req && !QR.req.isUploadFinished) { - QR.req.abort(); - delete QR.req; - QR.posts[0].unlock(); - QR.notifications.push(new Notification('info', 'QR upload aborted.', 5)); - } - return QR.status(); - } - }; - - FappeTyme = { - init: function() { - var el, input; - if (!Conf['Fappe Tyme'] || g.VIEW === 'catalog' || g.BOARD === 'f') { - return; - } - el = $.el('label', { - innerHTML: " Fappe Tyme", - title: 'Fappe Tyme' - }); - FappeTyme.input = input = el.firstElementChild; - $.on(input, 'change', FappeTyme.toggle); - $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 97 - }); - return Post.prototype.callbacks.push({ - name: 'Fappe Tyme', - cb: this.node - }); - }, - node: function() { - if (this.file) { - return; - } - return $.addClass(this.nodes.root, "noFile"); - }, - toggle: function() { - $.event('CloseMenu'); - return (this.checked ? $.addClass : $.rmClass)(doc, 'fappeTyme'); - } - }; - - ImageExpand = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { - return; - } - this.EAI = $.el('a', { - className: 'expand-all-shortcut', - textContent: 'EAI', - title: 'Expand All Images', - href: 'javascript:;' - }); - $.on(this.EAI, 'click', ImageExpand.cb.toggleAll); - Header.addShortcut(this.EAI); - return Post.prototype.callbacks.push({ - name: 'Image Expansion', - cb: this.node - }); - }, - node: function() { - var thumb, _ref; - if (!((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - thumb = this.file.thumb; - $.on(thumb.parentNode, 'click', ImageExpand.cb.toggle); - if (this.isClone && $.hasClass(thumb, 'expanding')) { - ImageExpand.contract(this); - ImageExpand.expand(this); - return; - } - if (ImageExpand.on && !this.isHidden) { - return ImageExpand.expand(this); - } - }, - cb: { - toggle: function(e) { - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - return ImageExpand.toggle(Get.postFromNode(this)); - }, - toggleAll: function() { - var ID, file, func, post, _i, _len, _ref, _ref1; - $.event('CloseMenu'); - if (ImageExpand.on = $.hasClass(ImageExpand.EAI, 'expand-all-shortcut')) { - ImageExpand.EAI.className = 'contract-all-shortcut'; - ImageExpand.EAI.title = 'Contract All Images'; - func = ImageExpand.expand; - } else { - ImageExpand.EAI.className = 'expand-all-shortcut'; - ImageExpand.EAI.title = 'Expand All Images'; - func = ImageExpand.contract; - } - _ref = g.posts; - for (ID in _ref) { - post = _ref[ID]; - _ref1 = [post].concat(post.clones); - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - post = _ref1[_i]; - file = post.file; - if (!(file && file.isImage && doc.contains(post.nodes.root))) { - continue; - } - if (ImageExpand.on && (!Conf['Expand spoilers'] && file.isSpoiler || Conf['Expand from here'] && file.thumb.getBoundingClientRect().top < 0)) { - continue; - } - $.queueTask(func, post); - } - } - }, - setFitness: function() { - (this.checked ? $.addClass : $.rmClass)(doc, this.name.toLowerCase().replace(/\s+/g, '-')); - if (this.name !== 'Fit height') { - return; - } - if (this.checked) { - $.on(window, 'resize', ImageExpand.resize); - if (!ImageExpand.style) { - ImageExpand.style = $.addStyle(null); - } - return ImageExpand.resize(); - } else { - return $.off(window, 'resize', ImageExpand.resize); - } - } - }, - resize: function() { - return ImageExpand.style.textContent = ":root.fit-height .full-image {max-height:" + doc.clientHeight + "px}"; - }, - toggle: function(post) { - var headRect, node, rect, root, thumb, top; - thumb = post.file.thumb; - if (!(post.file.isExpanded || $.hasClass(thumb, 'expanding'))) { - ImageExpand.expand(post); - return; - } - ImageExpand.contract(post); - node = post.nodes.root; - rect = Conf['Advance on contract'] ? (function() { - while (node.nextElementSibling) { - if (!(node = node.nextElementSibling)) { - return post.nodes.root; - } - if (!$.hasClass(node, 'postContainer')) { - continue; - } - if (node.offsetHeight > 0 && !$('.stub', node)) { - break; - } - } - return node.getBoundingClientRect(); - })() : post.nodes.root.getBoundingClientRect(); - if (!(rect.top <= 0 || rect.left <= 0)) { - return; - } - top = rect.top; - if (Conf['Fixed Header'] && !Conf['Bottom Header']) { - headRect = Header.bar.getBoundingClientRect(); - top += -headRect.top - headRect.height; - } - root = doc; - if (rect.top < 0) { - root.scrollTop += top; - } - if (rect.left < 0) { - return root.scrollLeft = 0; - } - }, - contract: function(post) { - $.rmClass(post.nodes.root, 'expanded-image'); - $.rmClass(post.file.thumb, 'expanding'); - return post.file.isExpanded = false; - }, - expand: function(post, src) { - var img, thumb; - thumb = post.file.thumb; - if (post.isHidden || post.file.isExpanded || $.hasClass(thumb, 'expanding')) { - return; - } - $.addClass(thumb, 'expanding'); - if (post.file.fullImage) { - $.asap((function() { - return post.file.fullImage.naturalHeight; - }), function() { - return ImageExpand.completeExpand(post); - }); - return; - } - post.file.fullImage = img = $.el('img', { - className: 'full-image', - src: src || post.file.URL - }); - $.on(img, 'error', ImageExpand.error); - $.asap((function() { - return post.file.fullImage.naturalHeight; - }), function() { - return ImageExpand.completeExpand(post); - }); - return $.after(thumb, img); - }, - completeExpand: function(post) { - var prev, thumb; - thumb = post.file.thumb; - if (!$.hasClass(thumb, 'expanding')) { - return; - } - post.file.isExpanded = true; - if (!post.nodes.root.parentNode) { - $.addClass(post.nodes.root, 'expanded-image'); - $.rmClass(post.file.thumb, 'expanding'); - return; - } - prev = post.nodes.root.getBoundingClientRect(); - return $.queueTask(function() { - var curr, root; - $.addClass(post.nodes.root, 'expanded-image'); - $.rmClass(post.file.thumb, 'expanding'); - if (!(prev.top + prev.height <= 0)) { - return; - } - root = doc; - curr = post.nodes.root.getBoundingClientRect(); - return root.scrollTop += curr.height - prev.height + curr.top - prev.top; - }); - }, - error: function() { - var URL, post, src, timeoutID; - post = Get.postFromNode(this); - $.rm(this); - delete post.file.fullImage; - if (!($.hasClass(post.file.thumb, 'expanding') || $.hasClass(post.nodes.root, 'expanded-image'))) { - return; - } - ImageExpand.contract(post); - src = this.src.split('/'); - if (src[2] === 'images.4chan.org') { - URL = Redirect.to('file', { - boardID: src[3], - filename: src[5] - }); - if (URL) { - setTimeout(ImageExpand.expand, 10000, post, URL); - return; - } - if (g.DEAD || post.isDead || post.file.isDead) { - return; - } - } - timeoutID = setTimeout(ImageExpand.expand, 10000, post); - return $.ajax("//api.4chan.org/" + post.board + "/res/" + post.thread + ".json", { - onload: function() { - var postObj, _i, _len, _ref; - if (this.status !== 200) { - return; - } - _ref = JSON.parse(this.response).posts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - postObj = _ref[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - clearTimeout(timeoutID); - return post.kill(); - } else if (postObj.filedeleted) { - clearTimeout(timeoutID); - return post.kill(true); - } - } - }); - }, - menu: { - init: function() { - var conf, createSubEntry, el, key, subEntries, _ref; - if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { - return; - } - el = $.el('span', { - textContent: 'Image Expansion', - className: 'image-expansion-link' - }); - createSubEntry = ImageExpand.menu.createSubEntry; - subEntries = []; - _ref = Config.imageExpansion; - for (key in _ref) { - conf = _ref[key]; - subEntries.push(createSubEntry(key, conf)); - } - return $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 105, - subEntries: subEntries - }); - }, - createSubEntry: function(type, config) { - var input, label; - label = $.el('label', { - innerHTML: " " + type - }); - input = label.firstElementChild; - if (type === 'Fit width' || type === 'Fit height') { - $.on(input, 'change', ImageExpand.cb.setFitness); - } - if (config) { - label.title = config[1]; - input.checked = Conf[type]; - $.event('change', null, input); - $.on(input, 'change', $.cb.checked); - } - return { - el: label - }; - } - }, - menuToggle: function(e) { - return ImageExpand.opmenu.toggle(e, this, g); - } - }; - - ImageHover = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Image Hover']) { - return; - } - return Post.prototype.callbacks.push({ - name: 'Image Hover', - cb: this.node - }); - }, - node: function() { - var _ref; - if (!((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - return $.on(this.file.thumb, 'mouseover', ImageHover.mouseover); - }, - mouseover: function(e) { - var el, post; - post = Get.postFromNode(this); - el = $.el('img', { - id: 'ihover', - src: post.file.URL - }); - el.setAttribute('data-fullid', post.fullID); - $.add(Header.hover, el); - UI.hover({ - root: this, - el: el, - latestEvent: e, - endEvents: 'mouseout click', - asapTest: function() { - return el.naturalHeight; - } - }); - return $.on(el, 'error', ImageHover.error); - }, - error: function() { - var URL, post, src, timeoutID, - _this = this; - if (!doc.contains(this)) { - return; - } - post = g.posts[this.dataset.fullid]; - src = this.src.split('/'); - if (src[2] === 'images.4chan.org') { - URL = Redirect.to('file', { - boardID: src[3], - filename: src[5].replace(/\?.+$/, '') - }); - if (URL) { - this.src = URL; - return; - } - if (g.DEAD || post.isDead || post.file.isDead) { - return; - } - } - timeoutID = setTimeout((function() { - return _this.src = post.file.URL + '?' + Date.now(); - }), 3000); - return $.ajax("//api.4chan.org/" + post.board + "/res/" + post.thread + ".json", { - onload: function() { - var postObj, _i, _len, _ref; - if (this.status !== 200) { - return; - } - _ref = JSON.parse(this.response).posts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - postObj = _ref[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - clearTimeout(timeoutID); - return post.kill(); - } else if (postObj.filedeleted) { - clearTimeout(timeoutID); - return post.kill(true); - } - } - }); - } - }; - - ImageLoader = { - init: function() { - var prefetch; - if (g.VIEW === 'catalog') { - return; - } - if (!(Conf["Image Prefetching"] || Conf["Replace JPG"] || Conf["Replace PNG"] || Conf["Replace GIF"])) { - return; - } - Post.prototype.callbacks.push({ - name: 'Image Replace', - cb: this.node - }); - if (!(Conf['Image Prefetching'] && g.VIEW === 'thread')) { - return; - } - prefetch = $.el('label', { - innerHTML: ' Prefetch Images' - }); - this.el = prefetch.firstElementChild; - $.on(this.el, 'change', this.toggle); - return $.event('AddMenuEntry', { - type: 'header', - el: prefetch, - order: 104 - }); - }, - node: function() { - var URL, img, string, style, thumb, type, _ref, _ref1; - if (this.isClone || this.isHidden || this.thread.isHidden || !((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - _ref1 = this.file, thumb = _ref1.thumb, URL = _ref1.URL; - if (!((Conf[string = "Replace " + ((type = (URL.match(/\w{3}$/))[0].toUpperCase()) === 'PEG' ? 'JPG' : type)] && !/spoiler/.test(thumb.src)) || Conf['prefetch'])) { - return; - } - if (this.file.isSpoiler) { - style = thumb.style; - style.maxHeight = style.maxWidth = this.isReply ? '125px' : '250px'; - } - img = $.el('img'); - if (Conf[string]) { - $.on(img, 'load', function() { - return thumb.src = URL; - }); - } - return img.src = URL; - }, - toggle: function() { - var enabled, id, post, _ref; - enabled = Conf['prefetch'] = this.checked; - if (enabled) { - _ref = g.threads["" + g.BOARD.ID + "." + g.THREADID].posts; - for (id in _ref) { - post = _ref[id]; - ImageLoader.node.call(post); - } - } - } - }; - - RevealSpoilers = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Reveal Spoiler Thumbnails']) { - return; - } - return Post.prototype.callbacks.push({ - name: 'Reveal Spoiler Thumbnails', - cb: this.node - }); - }, - node: function() { - var thumb, _ref; - if (this.isClone || !((_ref = this.file) != null ? _ref.isSpoiler : void 0)) { - return; - } - thumb = this.file.thumb; - thumb.removeAttribute('style'); - return thumb.src = this.file.thumbURL; - } - }; - - ArchiveLink = { - init: function() { - var div, entry, type, _i, _len, _ref; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Archive Link']) { - return; - } - div = $.el('div', { - textContent: 'Archive' - }); - entry = { - type: 'post', - el: div, - order: 90, - open: function(_arg) { - var ID, board, thread; - ID = _arg.ID, thread = _arg.thread, board = _arg.board; - return !!Redirect.to('thread', { - postID: ID, - threadID: thread.ID, - boardID: board.ID - }); - }, - subEntries: [] - }; - _ref = [['Post', 'post'], ['Name', 'name'], ['Tripcode', 'tripcode'], ['E-mail', 'email'], ['Subject', 'subject'], ['Filename', 'filename'], ['Image MD5', 'MD5']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - entry.subEntries.push(this.createSubEntry(type[0], type[1])); - } - return $.event('AddMenuEntry', entry); - }, - createSubEntry: function(text, type) { - var el, open; - el = $.el('a', { - textContent: text, - target: '_blank' - }); - open = type === 'post' ? function(_arg) { - var ID, board, thread; - ID = _arg.ID, thread = _arg.thread, board = _arg.board; - el.href = Redirect.to('thread', { - postID: ID, - threadID: thread.ID, - boardID: board.ID - }); - return true; - } : function(post) { - var value; - value = Filter[type](post); - if (!value) { - return false; - } - el.href = Redirect.to('search', { - boardID: post.board.ID, - type: type, - value: value, - isSearch: true - }); - return true; - }; - return { - el: el, - open: open - }; - } - }; - - DeleteLink = { - init: function() { - var div, fileEl, fileEntry, postEl, postEntry; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Delete Link']) { - return; - } - div = $.el('div', { - className: 'delete-link', - textContent: 'Delete' - }); - postEl = $.el('a', { - className: 'delete-post', - href: 'javascript:;' - }); - fileEl = $.el('a', { - className: 'delete-file', - href: 'javascript:;' - }); - postEntry = { - el: postEl, - open: function() { - postEl.textContent = 'Post'; - $.on(postEl, 'click', DeleteLink["delete"]); - return true; - } - }; - fileEntry = { - el: fileEl, - open: function(_arg) { - var file; - file = _arg.file; - if (!file || file.isDead) { - return false; - } - fileEl.textContent = 'File'; - $.on(fileEl, 'click', DeleteLink["delete"]); - return true; - } - }; - return $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 40, - open: function(post) { - var node; - if (post.isDead || post.board.ID === 'q') { - return false; - } - DeleteLink.post = post; - node = div.firstChild; - node.textContent = 'Delete'; - DeleteLink.cooldown.start(post, node); - return true; - }, - subEntries: [postEntry, fileEntry] - }); - }, - "delete": function() { - var fileOnly, form, link, post; - post = DeleteLink.post; - if (DeleteLink.cooldown.counting === post) { - return; - } - $.off(this, 'click', DeleteLink["delete"]); - this.textContent = "Deleting " + this.textContent + "..."; - fileOnly = $.hasClass(this, 'delete-file'); - form = { - mode: 'usrdel', - onlyimgdel: fileOnly, - pwd: QR.persona.getPassword() - }; - form[post.ID] = 'delete'; - link = this; - return $.ajax($.id('delform').action.replace("/" + g.BOARD + "/", "/" + post.board + "/"), { - onload: function() { - return DeleteLink.load(link, post, fileOnly, this.response); - }, - onerror: function() { - return DeleteLink.error(link); - } - }, { - cred: true, - form: $.formData(form) - }); - }, - load: function(link, post, fileOnly, html) { - var msg, s, tmpDoc; - tmpDoc = d.implementation.createHTMLDocument(''); - tmpDoc.documentElement.innerHTML = html; - if (tmpDoc.title === '4chan - Banned') { - s = 'Banned!'; - } else if (msg = tmpDoc.getElementById('errmsg')) { - s = msg.textContent; - $.on(link, 'click', DeleteLink["delete"]); - } else { - if (tmpDoc.title === 'Updating index...') { - (post.origin || post).kill(fileOnly); - } - s = 'Deleted'; - } - return link.textContent = s; - }, - error: function(link) { - link.textContent = 'Connection error, please retry.'; - return $.on(link, 'click', DeleteLink["delete"]); - }, - cooldown: { - start: function(post, node) { - var length, seconds, _ref; - if (!((_ref = QR.db) != null ? _ref.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }) : void 0)) { - delete DeleteLink.cooldown.counting; - return; - } - DeleteLink.cooldown.counting = post; - length = 30; - seconds = Math.ceil((length * $.SECOND - (Date.now() - post.info.date)) / $.SECOND); - return DeleteLink.cooldown.count(post, seconds, length, node); - }, - count: function(post, seconds, length, node) { - if (DeleteLink.cooldown.counting !== post) { - return; - } - if (!((0 <= seconds && seconds <= length))) { - if (DeleteLink.cooldown.counting === post) { - node.textContent = 'Delete'; - delete DeleteLink.cooldown.counting; - } - return; - } - setTimeout(DeleteLink.cooldown.count, 1000, post, seconds - 1, length, node); - return node.textContent = "Delete (" + seconds + ")"; - } - } - }; - - DownloadLink = { - init: function() { - var a; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Download Link']) { - return; - } - a = $.el('a', { - className: 'download-link', - textContent: 'Download file' - }); - return $.event('AddMenuEntry', { - type: 'post', - el: a, - order: 100, - open: function(_arg) { - var file; - file = _arg.file; - if (!file) { - return false; - } - a.href = file.URL; - a.download = file.name; - return true; - } - }); - } - }; - - Menu = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Menu']) { - return; - } - this.menu = new UI.Menu('post'); - return Post.prototype.callbacks.push({ - name: 'Menu', - cb: this.node - }); - }, - node: function() { - var button; - button = Menu.makeButton(this); - if (this.isClone) { - $.replace($('.menu-button', this.nodes.info), button); - return; - } - return $.add(this.nodes.info, [$.tn('\u00A0'), button]); - }, - makeButton: (function() { - var a; - a = null; - return function(post) { - var clone; - a || (a = $.el('a', { - className: 'menu-button fourchanx-link', - innerHTML: '', - href: 'javascript:;' - })); - clone = a.cloneNode(true); - clone.setAttribute('data-postid', post.fullID); - if (post.isClone) { - clone.setAttribute('data-clone', true); - } - $.on(clone, 'click', Menu.toggle); - return clone; - }; - })(), - toggle: function(e) { - var post; - post = this.dataset.clone ? Get.postFromNode(this) : g.posts[this.dataset.postid]; - return Menu.menu.toggle(e, this, post); - } - }; - - ReportLink = { - init: function() { - var a; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Report Link']) { - return; - } - a = $.el('a', { - className: 'report-link', - href: 'javascript:;', - textContent: 'Report this post' - }); - $.on(a, 'click', ReportLink.report); - return $.event('AddMenuEntry', { - type: 'post', - el: a, - order: 10, - open: function(post) { - ReportLink.post = post; - return !post.isDead; - } - }); - }, - report: function() { - var id, post, set, url; - post = ReportLink.post; - url = "//sys.4chan.org/" + post.board + "/imgboard.php?mode=report&no=" + post; - id = Date.now(); - set = "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,resizable=1,width=685,height=200"; - return window.open(url, id, set); - } - }; - - Favicon = { - init: function() { - return $.ready(function() { - var href; - Favicon.el = $('link[rel="shortcut icon"]', d.head); - Favicon.el.type = 'image/x-icon'; - href = Favicon.el.href; - Favicon.SFW = /ws\.ico$/.test(href); - Favicon["default"] = href; - return Favicon["switch"](); - }); - }, - "switch": function() { - switch (Conf['favicon']) { - case 'ferongr': - Favicon.unreadDead = 'data:image/gif;base64,R0lGODlhEAAQAOMHAOgLAnMFAL8AAOgLAukMA/+AgP+rq////////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw=='; - Favicon.unreadDeadY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAS1BMVEUAAAAAAAAAAAAJAAASAAAZAQAaAQAiAQAkAQAoFBQyAgAzAgA1AgA4AABBAgBXAwBzBQCEBgGvCAG/AADoCwLpDAP/gID/q6v///9zILr8AAAAA3RSTlMAx9dmesIgAAAAc0lEQVQY02WPgQ6DIBBDmTqnbE70Cvb/v3TAnW5OSKB9ybXg3HUBOAmEEH4FQtrSn4gxi+xjVC9SVOEiSvbZI8zSV+/Xo7icnryZ15GObMxvtWUkB/VJW57kHU7fUcHStm8FkncGE/mwP6CGzq/eauHwvT7sWQt3gZLW+AAAAABJRU5ErkJggg=='; - Favicon.unreadSFW = 'data:image/gif;base64,R0lGODlhEAAQAOMHAADX8QBwfgC2zADX8QDY8nnl8qLp8v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw=='; - Favicon.unreadSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAAAAAAAAAAAACAkAERMAGBsAGR0AISUALzQALzUAMTcANjwAP0cAVF8AcH4AeokAorYAtswA1/EA2PISIyV55fKi6fL////l+pZqAAAAA3RSTlMAx9dmesIgAAAAcklEQVQY02VPARLCIAxjsjnUWdcg6/9/ukIr00nvIMldEhrC/wHwA0BE3wBUtnICOStQnrNx5oqqzmzKx9vDPH1Nae3F9U4ig3OzjCIX51treYvMxou13EQmBPtHE14xLiawjgoPtfgOaKHP+9VrEXA8O1v7CmSPE3u0AAAAAElFTkSuQmCC'; - Favicon.unreadNSFW = 'data:image/gif;base64,R0lGODlhEAAQAOMHAFT+ACh5AEncAFT+AFX/Acz/su7/5v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw=='; - Favicon.unreadNSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAS1BMVEUAAAAAAAAAAAADCgAGEgAIGgAJGwALJAANJwASNwASOAATOgAVQQAWRAAeWwAgKBsoeQAwkQA/wABJ3ABU/gBV/wHM/7Lu/+b////r+K2AAAAAA3RSTlMAx9dmesIgAAAAc0lEQVQY02WPgQ6DIBBDmTonbk70Cvb/v3TAnW5OSKB9ybXg3HUBOAmEEH4FQtrSn4gxi+xjVC9SVOEiSvbZI8zSV+/Xo7icnryZ15GObMxvtWUmB/VJW0byDqfvqGBp20mB5J3Bi3zYH1BD38/eauHwvT7sEAt1Fb320QAAAABJRU5ErkJggg=='; - break; - case 'xat-': - Favicon.unreadDead = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2ElEQVQ4y61TQQrCMBDMQ8WDIEV6LbT2A4og2Hq0veo7fIAH04dY9N4xmyYlpGmI2MCQTWYy3Wy2DAD7B2wWAzWgcTgVeZKlZRxHNYFi2jM18oBh0IcKtC6ixf22WT4IFLs0owxswXu9egm0Ls6bwfCFfNsJYJKfqoEkd3vgUgFVLWObtzNgVKyruC+ljSzr5OEnBzjvjcQecaQhbZgBb4CmGQw+PoMkTUtdbd8VSEPakcGxPOcsoIgUKy0LecY29BmdBrqRfjIwZ93KLs5loHvBnL3cLH/jF+C/+z5dgUysAAAAAElFTkSuQmCC'; - Favicon.unreadDeadY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAdVBMVEUAAAAAAACKkJGNkpN0d3d0eHdra2dGRkORZ1wAAACmaV6naV4PDw8LCwsLCwvyZWLyZWIeExEyFBTAWlr/eHj/enkAAAAKAAAoAAA4AAA4GhpMAACRAAD/AAD/enn/h4j/m5z/nJ3/0dL/0tL/0tP/09P///9VK8WFAAAAFnRSTlMAPnp6kpKdtcHEzc3p6u7v8PT7/v7++jx7+QAAAIFJREFUGNONj90OgjAMhStKmU5k/h1UmAzUvv8jSrYBIeGC9qLtl/a0JVphAJKUOU36xNfWWiitlU9GUphZbXF/hxg10Li2QdQgPhQ3133c9XLOJvD9uZfI0YOdiiMiJw+2CKIPkZzGtcbgKYIJaI26LAfQOzOqoYNA4Z49Nguv/gEEhw2/C5BUZgAAAABJRU5ErkJggg=='; - Favicon.unreadSFW = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA30lEQVQ4y2P4//8/AyWYgSoGQMF/GJ7Y11VVUVoyKTM9ey4Ig9ggMWQ1YA1IBvzXm34YjkH8mPyJB+Nqlp8FYRAbmxoMF6ArSNrw6T0Qf8Amh9cFMEWVR/7/A+L/uORxhgEIt5/+/3/2lf//5wAxiI0uj+4CBlBgxVUvOwtydgXQZpDmi2/+/7/0GmIQSAwkB1IDUkuUAZeABlx+g2zAZ9wGlAOjChba+LwAUgNSi2HA5Am9VciBhSsQQWyoWgZiovEDsdGI1QBYQiLJAGQalpSxyWEzAJYWkGm8clTJjQCZ1hkoVG0CygAAAABJRU5ErkJggg=='; - Favicon.unreadSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAdVBMVEUAAAAAAACRjoqTkI13dXR4dXRpZ2tFQ0Zcb5EAAABee6ZefKcPDw8LCwsLCwtisPJisPIRFh4UJDJalMB4xP95xP8AAAABBQcHFx4KISoNLToaKzgaVW4ul8N5xP+Hy/+b1P+c1P/R7P/S6//S7P/T7P////9P0rk0AAAAFnRSTlMAPnp6kpKdtcHEzc3p6u7v8PT7/v7++jx7+QAAAIFJREFUGNONj90OgjAMhStKmU5k/h1UmAzUvv8jSrYBIeGC9qLtl/a0JVphAJKUOU36xNfWWiitlU9GUphZbXF/hxg10Li2QdQgPhQ3133c9XLOJvD9uUrk6MFOxRGRkwdbBNGHSE7jWmPwFMEEtEZdlgPonRmvoYNA4Z49Nguv/gEE3A2/sQ7iRgAAAABJRU5ErkJggg=='; - Favicon.unreadNSFW = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA4ElEQVQ4y2P4//8/AyWYgSoGQMF/GJ7YNbGqrKRiUnp21lwQBrFBYshqwBqQDPifdsYYjkH8mInxB+OWx58FYRAbmxoMF6ArKPmU9B6IP2CTw+sCmKKe/5X/gPg/LnmcYQDCs/63/1/9fzYQzwGz0eXRXcAACqy4ZfFnQc7u+V/xD6T55v+LQHwJbBBIDCQHUgNSS5QBt4Cab/2/jDDgMx4DykrKJ8FCG58XQGpAajEMmNw7uQo5sHAFIogNVctATDR+IDYasRoAS0gkGYBMw5IyNjlsBsDSAjKNV44quREAx58Mr9vt5wQAAAAASUVORK5CYII='; - Favicon.unreadNSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAdVBMVEUAAAAAAACRipGTjZN2dHd2dHhna2pDRkVckV8AAABepl9ep18PDw8LCwsLCwt08mJ08mIRHhEYMhRpwFqM/3iM/3kAAAAECAIQIAgWLAseOBoePA86dB1mzDOM/3ma/4er/5ur/5zZ/9HZ/9La/9La/9P///85Jx7jAAAAFnRSTlMAPnp6kpKdtcHEzc3p6u7v8PT7/v7++jx7+QAAAIFJREFUGNONj90OgjAMhStKmU5k/h1UmAzUvv8jSrYBIeGC9qLtl/a0JVphAJKUOU36xNfWWiitlU9GUphZbXF/hxg10Li2QdQgPhQ3133c9XLOJvD9uZfI0YOdiiMiJw+2CKIPkZzGtcbgKYIJaI26LAfQOzOqoYNA4Z49Nguv/gEEhw2/C5BUZgAAAABJRU5ErkJggg=='; - break; - case 'Mayhem': - Favicon.unreadDead = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABIUlEQVQ4jZ2ScWuDMBDFgw4pIkU0WsoQkWAYIkXZH4N9/+/V3dmfXSrKYIFHwt17j8vdGWNMIkgFuaDgzgQnwRs4EQs5KdolUQtagRN0givEDBTEOjgtGs0Zq8F7cKqqusVxrMQLaDUWcjBSrXkn8gs51tpJSWLk9b3HUa0aNIL5gPBR1/V4kJvR7lTwl8GmAm1Gf9+c3S+89qBHa8502AsmSrtBaEBPbIbj0ah2madlNAPEccdgJDfAtWifBjqWKShRBT6KoiH8QlEUn/qt0CCjnNdmPUwmFWzj9Oe6LpKuZXcwqq88z78Pch3aZU3dPwwc2sWlfZKCW5tWluV8kGvXClLm6dYN4/aUqfCbnEOzNDGhGZbNargvxCzvMGfRJD8UaDVvgkzo6QAAAABJRU5ErkJggg=='; - Favicon.unreadDeadY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABj0lEQVQ4y42TQUorQRCGv+oekpj43pOhOyIiKoHBxTMkuAnEtWcwx/AY3sUbBIRcwCw8gCfIMkaTOOUiNdgGRRuKoav+v2qq/i4BakBmXweUwDoxLF5ZhVkC64rYBHYMUAIvwKuBMEwdaFiCNbAAngEC0NHkxBi73vsOsG92HGPsphigY1wOzfNhqhpC6AEd730RQuh9hQEOAY6A/jeAs3a7/f+bWB84ckCpqg+I8Osjgqo+AKUDViJS8LkGMcY+sJrNZssYY387LiIFsBLgL9AC/pgaArzZlF+sZgO4BG7sfgvcA3MxUtOStBIpX7cS3Klqd9OBTIEr4DlLOsuAmqpODXQOiHMuy/O8FkLoJth/6Uh2gQPg87Q3k+7leX6hqnpmPvM/GWfXWeWGqj5+oUS9LMs6wF7iHAwGJ9ZW5uxpup+UGwEtEVoijEYjKl66PJujmvIW3vsFwBiYqzJXZTweY5wSU6Bd7UP1KoECODUrJpOJAtPhcKjAtXGaYptWs57qWyv9Zn/it1a5knj5Dm3v4q8APeACAAAAAElFTkSuQmCC'; - Favicon.unreadSFW = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABCElEQVQ4jZ2S4crCMAxF+0OGDJEPKYrIGKOsiJSx/fJRfSAfTJNyKqXfiuDg0C25N2RJjTGmEVrhTzhw7oStsIEtsVzT4o2Jo9ALThiEM8IdHIgNaHo8mjNWg6/ske8bohPo+63QOLzmooHp8fyAICBSQkVz0QKdsFQEV6WSW/D+7+BbgbIDHcb4Kp61XyjyI16zZ8JemGltQtDBSGxB4/GoN+7TpkkjDCsFArm0IYv3U0BbnYtf8BCy+JytsE0X6VyuKhPPK/GAJ14kvZZDZVV3pZIb8MZr6n4o4PDGKn0S5SdDmyq5PnXQsk+Xbhinp03FFzmHJw6xYRiWm9VxnohZ3vOcxdO8ARmXRvbWdtzQAAAAAElFTkSuQmCC'; - Favicon.unreadSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAkFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBQcHFx4KISoNLToaVW4oKCgul8M4ODg7OztMTEyRkZHBwcH///9dzWZ0AAAAI3RSTlMEBggKDA4QEhQWFxkbHR8hIyUmKCosLjAxN1hbYc7P0dLc3mzWzBUAAAC+SURBVBjTNY3pcsIwEIM3ePERx/bG5IIe0NIrhVbv/3Y4Ydj9Ic030ogqpY3mDdGGi1EVsYuSvGE2Pkl0TFYAdLGuY1eMWGowzzN6kX41DYVpNbvdKlO4Jx5gSbi2VO+Vcq2jrc/jNLQhtM+n05PfkrKxG/oFHIEXqwqQsVRy7n+AtwLYL3sYR3wA755Jp3Vvv8cn8Js0GXmA7/P5TwzpiLn8MOALuEZNygkm5JTy/+vl4BRVbJvQ1NbWRSxXN64PGOBlhG0qAAAAAElFTkSuQmCC'; - Favicon.unreadNSFW = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABCklEQVQ4jZ2S0WrDMAxF/TBCCKWMYhZKCSGYmFJMSNjD/mhf239qJXNcjBdTWODgRLpXKJKNMaYROuFTOHEehFb4gJZYrunwxsSXMApOmIQzwgOciE1oRjyaM1aDj+yR7xuiHvT9VmgcXnPRwO/9+wWCgEgJFc1FCwzCVhFclUpuw/u3g3cFyg50GPOjePZ+ocjPeM2RCXthpbUFwQAzsQ2Nx6PeuE+bJo0w7BQI5NKGLN5XAW11LX7BQ8jia7bCLl2kc7mqTLzuxAOeeJH0Wk6VVf0oldyEN15T948CDm+sMiZRfjK0pZIbUwcd+3TphnF62lR8kXN44hAbhmG5WQNnT8zynucsnuYJhFpBfkMzqD4AAAAASUVORK5CYII='; - Favicon.unreadNSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAkFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAIQIAgWLAsePA8oKCg4ODg6dB07OztMTExmzDORkZHBwcH///92I3mvAAAAI3RSTlMEBggKDA4QEhQWFxkbHR8hIyUmKCosLjAxN1hbYc7P0dLc3mzWzBUAAAC+SURBVBjTNY3pcsIwEIM3ePERx/bG5IIe0NIT0ur93w4nDLs/pPlGGlGltNG8IdpwMaoidlGSN8zGJ4mOyQqALtZ17IoRSw3meUYv0q+moTCtZrdbZQr3xAMsCdeW6r1SrnW09XmchjaE9vl0evJbUjZ2Q7+AI/BiVQEylkrO/TfwVgD7ZQ/jiA/g3TPptO7t9/gEfpImIw/wez7/iSEdMZcfBnwB16hJOcGEnFL+f70cnKKKbROa2tq6iOXqBuMXGTe4CAUbAAAAAElFTkSuQmCC'; - break; - case 'Original': - Favicon.unreadDead = 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAP8AAP///////yH5BAEKAAMALAAAAAAQABAAAAI/nI95wsqygIRxDgGCBhTrwF3Zxowg5H1cSopS6FrGQ82PU1951ckRmYKJVCXizLRC9kAnT0aIiR6lCFT1cigAADs='; - Favicon.unreadDeadY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAALVBMVEUAAAAAAAAAAAAAAAAKAAAoAAAoKCg4AAA4ODg7OztMAACRAADBwcH/AAD///+WCcPSAAAAA3RSTlMAx9dmesIgAAAAZ0lEQVQI1z2LsQmAUAxEb4Isk0rwp3EPR3ECcRQrh7C3/nAasPwzmCgYuPBy5AH/NALSImqAK+H1oJRqyJVHNAnZqDITVhj7/PrAciJ9il0BHs/jjU+fnB9sQ0IxX6OBO6Xr0xKAxANLZzUanCWzZQAAAABJRU5ErkJggg=='; - Favicon.unreadSFW = 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAC6Xw////////yH5BAEKAAMALAAAAAAQABAAAAI/nI95wsqygIRxDgGCBhTrwF3Zxowg5H1cSopS6FrGQ82PU1951ckRmYKJVCXizLRC9kAnT0aIiR6lCFT1cigAADs='; - Favicon.unreadSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAALVBMVEUAAAAAAAAAAAAAAAABBQcHFx4KISoNLToaVW4oKCgul8M4ODg7OzvBwcH///8uS/CdAAAAA3RSTlMAx9dmesIgAAAAZ0lEQVQI1z2LsQ2AUAhEbwKWoftRGvdwBEewchM7d9BFbE6pbP4Mgj+R5MjjwgP+qQSkRtQAV8K3lVI2Q648oknIRpWZsMI4988HjgvpU+wO8HgeHzR9cjZYhoRiPkcDd0rXpyUAiRd5YjKC7MvNRgAAAABJRU5ErkJggg=='; - Favicon.unreadNSFW = 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAGbMM////////yH5BAEKAAMALAAAAAAQABAAAAI/nI95wsqygIRxDgGCBhTrwF3Zxowg5H1cSopS6FrGQ82PU1951ckRmYKJVCXizLRC9kAnT0aIiR6lCFT1cigAADs='; - Favicon.unreadNSFWY = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAALVBMVEUAAAAAAAAAAAAAAAAECAIQIAgWLAsePA8oKCg4ODg6dB07OztmzDPBwcH///+rsf3XAAAAA3RSTlMAx9dmesIgAAAAZ0lEQVQI1z2LsQ2AUAhEbwKWofRL4x6O4AhuopWb2P4F7E5prP4MgiaSHHlceMA/jYC0iBrgSnjdKaUacuURTUI2qsyEFcaxvD6wnkifYleAx/N449Mn5wfbkFDM52jgTun6tAQg8QAEvjQg42KY2AAAAABJRU5ErkJggg=='; - } - if (Favicon.SFW) { - Favicon.unread = Favicon.unreadSFW; - return Favicon.unreadY = Favicon.unreadSFWY; - } else { - Favicon.unread = Favicon.unreadNSFW; - return Favicon.unreadY = Favicon.unreadNSFWY; - } - }, - dead: 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAP8AAP///////yH5BAEKAAIALAAAAAAQABAAAAIvlI+pq+D9DAgUoFkPDlbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==' - }; - - ThreadExcerpt = { - init: function() { - if (g.VIEW !== 'thread' || !Conf['Thread Excerpt']) { - return; - } - return Thread.prototype.callbacks.push({ - name: 'Thread Excerpt', - cb: this.node - }); - }, - node: function() { - return d.title = Get.threadExcerpt(this); - } - }; - - ThreadStats = { - init: function() { - var sc, - _this = this; - if (g.VIEW !== 'thread' || !Conf['Thread Stats']) { - return; - } - if (Conf['Updater and Stats in Header']) { - this.dialog = sc = $.el('span', { - innerHTML: "0 / 0" + (Conf["Page Count in Stats"] ? " / 0" : ""), - id: 'thread-stats', - title: 'Post Count / File Count' + (Conf["Page Count in Stats"] ? " / Page Count" : "") - }); - $.ready(function() { - return Header.addShortcut(sc); - }); - } else { - this.dialog = sc = UI.dialog('thread-stats', 'bottom: 0px; right: 0px;', "
0 / 0" + (Conf["Page Count in Stats"] ? " / 0" : "") + "
"); - $.ready(function() { - return $.add(d.body, sc); - }); - } - this.postCountEl = $('#post-count', sc); - this.fileCountEl = $('#file-count', sc); - this.pageCountEl = $('#page-count', sc); - this.lastModified = '0'; - return Thread.prototype.callbacks.push({ - name: 'Thread Stats', - cb: this.node - }); - }, - node: function() { - var ID, fileCount, post, postCount, _ref; - postCount = 0; - fileCount = 0; - _ref = this.posts; - for (ID in _ref) { - post = _ref[ID]; - postCount++; - if (post.file) { - fileCount++; - } - } - ThreadStats.thread = this; - ThreadStats.fetchPage(); - ThreadStats.update(postCount, fileCount); - return $.on(d, 'ThreadUpdate', ThreadStats.onUpdate); - }, - onUpdate: function(e) { - var fileCount, postCount, _ref; - if (e.detail[404]) { - return; - } - _ref = e.detail, postCount = _ref.postCount, fileCount = _ref.fileCount; - return ThreadStats.update(postCount, fileCount); - }, - update: function(postCount, fileCount) { - var fileCountEl, postCountEl, thread; - thread = ThreadStats.thread, postCountEl = ThreadStats.postCountEl, fileCountEl = ThreadStats.fileCountEl; - postCountEl.textContent = postCount; - fileCountEl.textContent = fileCount; - (thread.postLimit && !thread.isSticky ? $.addClass : $.rmClass)(postCountEl, 'warning'); - return (thread.fileLimit && !thread.isSticky ? $.addClass : $.rmClass)(fileCountEl, 'warning'); - }, - fetchPage: function() { - if (!Conf["Page Count in Stats"]) { - return; - } - if (ThreadStats.thread.isDead) { - ThreadStats.pageCountEl.textContent = 'Dead'; - $.addClass(ThreadStats.pageCountEl, 'warning'); - return; - } - setTimeout(ThreadStats.fetchPage, 2 * $.MINUTE); - return $.ajax("//api.4chan.org/" + ThreadStats.thread.board + "/threads.json", { - onload: ThreadStats.onThreadsLoad - }, { - headers: { - 'If-Modified-Since': ThreadStats.lastModified - } - }); - }, - onThreadsLoad: function() { - var page, pages, thread, _i, _j, _len, _len1, _ref; - if (!Conf["Page Count in Stats"]) { - return; - } - ThreadStats.lastModified = this.getResponseHeader('Last-Modified'); - if (this.status !== 200) { - return; - } - pages = JSON.parse(this.response); - for (_i = 0, _len = pages.length; _i < _len; _i++) { - page = pages[_i]; - _ref = page.threads; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - thread = _ref[_j]; - if (thread.no === ThreadStats.thread.ID) { - ThreadStats.pageCountEl.textContent = page.page; - (page.page === pages.length - 1 ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); - return; - } - } - } - } - }; - - ThreadUpdater = { - init: function() { - var checked, conf, el, input, name, sc, settings, subEntries, _ref, - _this = this; - if (g.VIEW !== 'thread' || !Conf['Thread Updater']) { - return; - } - checked = Conf['Auto Update'] ? 'checked' : ''; - if (Conf['Updater and Stats in Header']) { - this.dialog = sc = $.el('span', { - innerHTML: "", - id: 'updater' - }); - $.ready(function() { - return Header.addShortcut(sc); - }); - } else { - this.dialog = sc = UI.dialog('updater', 'bottom: 0px; left: 0px;', "
"); - $.addClass(doc, 'float'); - $.ready(function() { - $.addClass(doc, 'float'); - return $.add(d.body, sc); - }); - } - this.checkPostCount = 0; - this.timer = $('#update-timer', sc); - this.status = $('#update-status', sc); - $.on(this.timer, 'click', ThreadUpdater.update); - $.on(this.status, 'click', ThreadUpdater.update); - subEntries = []; - _ref = Config.updater.checkbox; - for (name in _ref) { - conf = _ref[name]; - checked = Conf[name] ? 'checked' : ''; - el = $.el('label', { - title: "" + conf[1], - innerHTML: " " + name - }); - input = el.firstElementChild; - $.on(input, 'change', $.cb.checked); - if (input.name === 'Scroll BG') { - $.on(input, 'change', ThreadUpdater.cb.scrollBG); - ThreadUpdater.cb.scrollBG(); - } else if (input.name === 'Auto Update') { - $.on(input, 'change', ThreadUpdater.update); - } - subEntries.push({ - el: el - }); - } - settings = $.el('span', { - innerHTML: 'Interval' - }); - $.on(settings, 'click', this.intervalShortcut); - subEntries.push({ - el: settings - }); - $.event('AddMenuEntry', { - type: 'header', - el: $.el('span', { - textContent: 'Updater' - }), - order: 110, - subEntries: subEntries - }); - return Thread.prototype.callbacks.push({ - name: 'Thread Updater', - cb: this.node - }); - }, - node: function() { - ThreadUpdater.thread = this; - ThreadUpdater.root = this.OP.nodes.root.parentNode; - ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0]; - ThreadUpdater.outdateCount = 0; - ThreadUpdater.lastModified = '0'; - ThreadUpdater.cb.interval.call($.el('input', { - value: Conf['Interval'] - })); - $.on(window, 'online offline', ThreadUpdater.cb.online); - $.on(d, 'QRPostSuccessful', ThreadUpdater.cb.checkpost); - $.on(d, 'visibilitychange', ThreadUpdater.cb.visibility); - return ThreadUpdater.cb.online(); - }, - /* - http://freesound.org/people/pierrecartoons1979/sounds/90112/ - cc-by-nc-3.0 - */ - - beep: 'data:audio/wav;base64,UklGRjQDAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAc21wbDwAAABBAAADAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkYXRhzAIAAGMms8em0tleMV4zIpLVo8nhfSlcPR102Ki+5JspVEkdVtKzs+K1NEhUIT7DwKrcy0g6WygsrM2k1NpiLl0zIY/WpMrjgCdbPhxw2Kq+5Z4qUkkdU9K1s+K5NkVTITzBwqnczko3WikrqM+l1NxlLF0zIIvXpsnjgydZPhxs2ay95aIrUEkdUdC3suK8N0NUIjq+xKrcz002WioppdGm091pK1w0IIjYp8jkhydXPxxq2K295aUrTkoeTs65suK+OUFUIzi7xqrb0VA0WSoootKm0t5tKlo1H4TYqMfkiydWQBxm16+85actTEseS8y7seHAPD9TIza5yKra01QyWSson9On0d5wKVk2H4DYqcfkjidUQB1j1rG75KsvSkseScu8seDCPz1TJDW2yara1FYxWSwnm9Sn0N9zKVg2H33ZqsXkkihSQR1g1bK65K0wSEsfR8i+seDEQTxUJTOzy6rY1VowWC0mmNWoz993KVc3H3rYq8TklSlRQh1d1LS647AyR0wgRMbAsN/GRDpTJTKwzKrX1l4vVy4lldWpzt97KVY4IXbUr8LZljVPRCxhw7W3z6ZISkw1VK+4sMWvXEhSPk6buay9sm5JVkZNiLWqtrJ+TldNTnquqbCwilZXU1BwpKirrpNgWFhTaZmnpquZbFlbVmWOpaOonHZcXlljhaGhpZ1+YWBdYn2cn6GdhmdhYGN3lp2enIttY2Jjco+bnJuOdGZlZXCImJqakHpoZ2Zug5WYmZJ/bGlobX6RlpeSg3BqaW16jZSVkoZ0bGtteImSk5KIeG5tbnaFkJKRinxxbm91gY2QkIt/c3BwdH6Kj4+LgnZxcXR8iI2OjIR5c3J0e4WLjYuFe3VzdHmCioyLhn52dHR5gIiKioeAeHV1eH+GiYqHgXp2dnh9hIiJh4J8eHd4fIKHiIeDfXl4eHyBhoeHhH96eHmA', - cb: { - online: function() { - if (ThreadUpdater.online = navigator.onLine) { - ThreadUpdater.outdateCount = 0; - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - ThreadUpdater.update(); - ThreadUpdater.set('status', null, null); - } else { - ThreadUpdater.set('timer', null); - ThreadUpdater.set('status', 'Offline', 'warning'); - } - return ThreadUpdater.cb.autoUpdate(); - }, - post: function(e) { - if (e.detail.threadID !== ThreadUpdater.thread.ID) { - return; - } - ThreadUpdater.outdateCount = 0; - if (ThreadUpdater.seconds > 2) { - return setTimeout(ThreadUpdater.update, 1000); - } - }, - checkpost: function(e) { - if (!ThreadUpdater.checkPostCount) { - if (e.detail.threadID !== ThreadUpdater.thread.ID) { - return; - } - ThreadUpdater.seconds = 0; - ThreadUpdater.outdateCount = 0; - ThreadUpdater.set('timer', '...'); - } - if (!(g.DEAD || ThreadUpdater.foundPost || ThreadUpdater.checkPostCount >= 5)) { - return setTimeout(ThreadUpdater.update, ++ThreadUpdater.checkPostCount * $.SECOND); - } - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - ThreadUpdater.checkPostCount = 0; - delete ThreadUpdater.foundPost; - return delete ThreadUpdater.postID; - }, - visibility: function() { - if (d.hidden) { - return; - } - ThreadUpdater.outdateCount = 0; - if (ThreadUpdater.seconds > ThreadUpdater.interval) { - return ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } - }, - scrollBG: function() { - return ThreadUpdater.scrollBG = Conf['Scroll BG'] ? function() { - return true; - } : function() { - return !d.hidden; - }; - }, - autoUpdate: function() { - if (ThreadUpdater.online) { - return ThreadUpdater.timeoutID = setTimeout(ThreadUpdater.timeout, 1000); - } else { - return clearTimeout(ThreadUpdater.timeoutID); - } - }, - interval: function() { - var val; - val = +this.value; - if (val < 1) { - val = 1; - } - ThreadUpdater.interval = this.value = val; - return $.cb.value.call(this); - }, - load: function() { - var klass, req, text, _ref; - req = ThreadUpdater.req; - switch (req.status) { - case 200: - g.DEAD = false; - ThreadUpdater.parse(JSON.parse(req.response).posts); - ThreadUpdater.lastModified = req.getResponseHeader('Last-Modified'); - if (Conf['Auto Update']) { - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } - break; - case 404: - g.DEAD = true; - ThreadUpdater.set('timer', null); - ThreadUpdater.set('status', '404', 'warning'); - clearTimeout(ThreadUpdater.timeoutID); - ThreadUpdater.thread.kill(); - $.event('ThreadUpdate', { - 404: true, - thread: ThreadUpdater.thread - }); - break; - default: - if (Conf['Auto Update']) { - ThreadUpdater.outdateCount++; - ThreadUpdater.set('timer', ThreadUpdater.getInterval()); - } - /* - Status Code 304: Not modified - By sending the `If-Modified-Since` header we get a proper status code, and no response. - This saves bandwidth for both the user and the servers and avoid unnecessary computation. - */ - - _ref = [0, 304].contains(req.status) ? [null, null] : ["" + req.statusText + " (" + req.status + ")", 'warning'], text = _ref[0], klass = _ref[1]; - ThreadUpdater.set('status', text, klass); - } - if (ThreadUpdater.postID) { - ThreadUpdater.cb.checkpost(); - } - return delete ThreadUpdater.req; - } - }, - getInterval: function() { - var i, j; - i = ThreadUpdater.interval; - j = Math.min(ThreadUpdater.outdateCount, 10); - if (!d.hidden) { - j = Math.min(j, 7); - } - return ThreadUpdater.seconds = Conf['Optional Increase'] ? Math.max(i, [0, 5, 10, 15, 20, 30, 60, 90, 120, 240, 300][j]) : i; - }, - intervalShortcut: function() { - var settings; - Settings.open('Advanced'); - settings = $.id('fourchanx-settings'); - return $('input[name=Interval]', settings).focus(); - }, - set: function(name, text, klass) { - var el, node; - el = ThreadUpdater[name]; - if (node = el.firstChild) { - node.data = text; - } else { - el.textContent = text; - } - if (klass !== void 0) { - return el.className = klass; - } - }, - timeout: function() { - var n; - ThreadUpdater.timeoutID = setTimeout(ThreadUpdater.timeout, 1000); - if (!(n = --ThreadUpdater.seconds)) { - return ThreadUpdater.update(); - } else if (n <= -60) { - ThreadUpdater.set('status', 'Retrying', null); - return ThreadUpdater.update(); - } else if (n > 0) { - return ThreadUpdater.set('timer', n); - } - }, - update: function() { - var url; - if (!ThreadUpdater.online) { - return; - } - ThreadUpdater.seconds = 0; - if (Conf['Auto Update']) { - ThreadUpdater.set('timer', '...'); - } else { - ThreadUpdater.set('timer', 'Update'); - } - if (ThreadUpdater.req) { - ThreadUpdater.req.onloadend = null; - ThreadUpdater.req.abort(); - } - url = "//api.4chan.org/" + ThreadUpdater.thread.board + "/res/" + ThreadUpdater.thread + ".json"; - return ThreadUpdater.req = $.ajax(url, { - onloadend: ThreadUpdater.cb.load - }, { - headers: { - 'If-Modified-Since': ThreadUpdater.lastModified - } - }); - }, - updateThreadStatus: function(title, OP) { - var icon, message, root, titleLC; - titleLC = title.toLowerCase(); - if (ThreadUpdater.thread["is" + title] === !!OP[titleLC]) { - return; - } - if (!(ThreadUpdater.thread["is" + title] = !!OP[titleLC])) { - message = title === 'Sticky' ? 'The thread is not a sticky anymore.' : 'The thread is not closed anymore.'; - new Notification('info', message, 30); - $.rm($("." + titleLC + "Icon", ThreadUpdater.thread.OP.nodes.info)); - return; - } - message = title === 'Sticky' ? 'The thread is now a sticky.' : 'The thread is now closed.'; - new Notification('info', message, 30); - icon = $.el('img', { - src: "//static.4chan.org/image/" + titleLC + ".gif", - alt: title, - title: title, - className: "" + titleLC + "Icon" - }); - root = $('[title="Quote this post"]', ThreadUpdater.thread.OP.nodes.info); - if (title === 'Closed') { - root = $('.stickyIcon', ThreadUpdater.thread.OP.nodes.info) || root; - } - return $.after(root, [$.tn(' '), icon]); - }, - parse: function(postObjects) { - var ID, OP, count, deletedFiles, deletedPosts, files, index, key, node, num, post, postObject, posts, root, scroll, _i, _len, _ref; - OP = postObjects[0]; - Build.spoilerRange[ThreadUpdater.thread.board] = OP.custom_spoiler; - ThreadUpdater.updateThreadStatus('Sticky', OP); - ThreadUpdater.updateThreadStatus('Closed', OP); - ThreadUpdater.thread.postLimit = !!OP.bumplimit; - ThreadUpdater.thread.fileLimit = !!OP.imagelimit; - posts = []; - index = []; - files = []; - count = 0; - for (_i = 0, _len = postObjects.length; _i < _len; _i++) { - postObject = postObjects[_i]; - num = postObject.no; - index.push(num); - if (postObject.fsize) { - files.push(num); - } - if (num <= ThreadUpdater.lastPost) { - continue; - } - count++; - node = Build.postFromObject(postObject, ThreadUpdater.thread.board.ID); - posts.push(new Post(node, ThreadUpdater.thread, ThreadUpdater.thread.board)); - } - deletedPosts = []; - deletedFiles = []; - _ref = ThreadUpdater.thread.posts; - for (ID in _ref) { - post = _ref[ID]; - ID = +ID; - if (post.isDead && index.contains(ID)) { - post.resurrect(); - } else if (!index.contains(ID)) { - post.kill(); - deletedPosts.push(post); - } else if (post.file && !post.file.isDead && !files.contains(ID)) { - post.kill(true); - deletedFiles.push(post); - } - if (ThreadUpdater.postID && ThreadUpdater.postID === ID) { - ThreadUpdater.foundPost = true; - } - } - if (!count) { - ThreadUpdater.set('status', null, null); - ThreadUpdater.outdateCount++; - } else { - ThreadUpdater.set('status', "+" + count, 'new'); - ThreadUpdater.outdateCount = 0; - if (Conf['Beep'] && d.hidden && Unread.posts && !Unread.posts.length) { - if (!ThreadUpdater.audio) { - ThreadUpdater.audio = $.el('audio', { - src: ThreadUpdater.beep - }); - } - ThreadUpdater.audio.play(); - } - ThreadUpdater.lastPost = posts[count - 1].ID; - Main.callbackNodes(Post, posts); - scroll = Conf['Auto Scroll'] && ThreadUpdater.scrollBG() && ThreadUpdater.root.getBoundingClientRect().bottom - doc.clientHeight < 25; - for (key in posts) { - post = posts[key]; - if (!posts.hasOwnProperty(key)) { - continue; - } - root = post.nodes.root; - if (post.cb) { - if (!post.cb.call(post)) { - $.add(ThreadUpdater.root, root); - } - } else { - $.add(ThreadUpdater.root, root); - } - } - if (scroll) { - if (Conf['Bottom Scroll']) { - doc.scrollTop = d.body.clientHeight; - } else { - if (root) { - Header.scrollToPost(root); - } - } - } - $.queueTask(function() { - var length, threadID; - threadID = ThreadUpdater.thread.ID; - length = $$('.thread > .postContainer', ThreadUpdater.root).length; - return Fourchan.parseThread(threadID, length - count, length); - }); - } - return $.event('ThreadUpdate', { - 404: false, - thread: ThreadUpdater.thread, - newPosts: posts, - deletedPosts: deletedPosts, - deletedFiles: deletedFiles, - postCount: OP.replies + 1, - fileCount: OP.images + (!!ThreadUpdater.thread.OP.file && !ThreadUpdater.thread.OP.file.isDead) - }); - } - }; - - ThreadWatcher = { - init: function() { - var sc; - if (!Conf['Thread Watcher']) { - return; - } - this.shortcut = sc = $.el('a', { - textContent: 'Watcher', - id: 'watcher-link', - href: 'javascript:;', - className: 'disabled' - }); - this.dialog = UI.dialog('watcher', 'top: 50px; left: 0px;', '
Thread Watcher×
'); - $.on(d, 'QRPostSuccessful', this.cb.post); - $.sync('WatchedThreads', this.refresh); - $.on(sc, 'click', this.toggleWatcher); - $.on($('.move>.close', ThreadWatcher.dialog), 'click', this.toggleWatcher); - if (Conf['Toggleable Thread Watcher']) { - Header.addShortcut(sc); - $.addClass(doc, 'fixed-watcher'); - } - $.ready(function() { - ThreadWatcher.refresh(); - $.add(d.body, ThreadWatcher.dialog); - if (Conf['Toggleable Thread Watcher']) { - return ThreadWatcher.dialog.hidden = true; - } - }); - return Thread.prototype.callbacks.push({ - name: 'Thread Watcher', - cb: this.node - }); - }, - node: function() { - var favicon, - _this = this; - favicon = $.el('a', { - className: 'watch-thread-link', - href: 'javascript:;' - }); - $.on(favicon, 'click', ThreadWatcher.cb.toggle); - $.before($('input', this.OP.nodes.post), favicon); - if (g.VIEW !== 'thread') { - return; - } - return $.get('AutoWatch', 0, function(item) { - if (item['AutoWatch'] !== _this.ID) { - return; - } - ThreadWatcher.watch(_this); - return $["delete"]('AutoWatch'); - }); - }, - refresh: function(watched) { - var ID, board, div, favicon, id, link, nodes, props, thread, x, _ref, _ref1; - if (!watched) { - $.get('WatchedThreads', {}, function(item) { - return ThreadWatcher.refresh(item['WatchedThreads']); - }); - return; - } - nodes = [$('.move', ThreadWatcher.dialog)]; - for (board in watched) { - _ref = watched[board]; - for (id in _ref) { - props = _ref[id]; - x = $.el('a', { - textContent: '×', - className: 'close', - href: 'javascript:;' - }); - $.on(x, 'click', ThreadWatcher.cb.x); - link = $.el('a', props); - link.title = link.textContent; - div = $.el('div'); - $.add(div, [x, $.tn(' '), link]); - nodes.push(div); - } - } - $.rmAll(ThreadWatcher.dialog); - $.add(ThreadWatcher.dialog, nodes); - watched = watched[g.BOARD] || {}; - _ref1 = g.BOARD.threads; - for (ID in _ref1) { - thread = _ref1[ID]; - favicon = $('.watch-thread-link', thread.OP.nodes.post); - if (ID in watched) { - $.addClass(favicon, 'watched'); - } else { - $.rmClass(favicon, 'watched'); - } - } - }, - toggleWatcher: function() { - $.toggleClass(ThreadWatcher.shortcut, 'disabled'); - return ThreadWatcher.dialog.hidden = !ThreadWatcher.dialog.hidden; - }, - cb: { - toggle: function() { - return ThreadWatcher.toggle(Get.postFromNode(this).thread); - }, - x: function() { - var thread; - thread = this.nextElementSibling.pathname.split('/'); - return ThreadWatcher.unwatch(thread[1], thread[3]); - }, - post: function(e) { - var board, postID, threadID, _ref; - _ref = e.detail, board = _ref.board, postID = _ref.postID, threadID = _ref.threadID; - if (postID === threadID) { - if (Conf['Auto Watch']) { - return $.set('AutoWatch', threadID); - } - } else if (Conf['Auto Watch Reply']) { - return ThreadWatcher.watch(board.threads[threadID]); - } - } - }, - toggle: function(thread) { - if (!$.hasClass($('.watch-thread-link', thread.OP.nodes.post), 'watched')) { - return ThreadWatcher.watch(thread); - } else { - return ThreadWatcher.unwatch(thread.board, thread.ID); - } - }, - unwatch: function(board, threadID) { - return $.get('WatchedThreads', {}, function(item) { - var watched; - watched = item['WatchedThreads']; - delete watched[board][threadID]; - if (!Object.keys(watched[board]).length) { - delete watched[board]; - } - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); - }); - }, - watch: function(thread) { - return $.get('WatchedThreads', {}, function(item) { - var watched, _name; - watched = item['WatchedThreads']; - watched[_name = thread.board] || (watched[_name] = {}); - watched[thread.board][thread] = { - href: "/" + thread.board + "/res/" + thread, - textContent: Get.threadExcerpt(thread) - }; - ThreadWatcher.refresh(watched); - return $.set('WatchedThreads', watched); - }); - } - }; - - Unread = { - init: function() { - if (g.VIEW !== 'thread' || !Conf['Unread Count'] && !Conf['Unread Favicon']) { - return; - } - this.db = new DataBoard('lastReadPosts', this.sync); - this.hr = $.el('hr', { - id: 'unread-line' - }); - this.posts = []; - this.postsQuotingYou = []; - return Thread.prototype.callbacks.push({ - name: 'Unread', - cb: this.node - }); - }, - node: function() { - Unread.thread = this; - Unread.title = d.title; - Unread.lastReadPost = Unread.db.get({ - boardID: this.board.ID, - threadID: this.ID, - defaultValue: 0 - }); - $.on(d, '4chanXInitFinished', Unread.ready); - $.on(d, 'ThreadUpdate', Unread.onUpdate); - $.on(d, 'scroll visibilitychange', Unread.read); - if (Conf['Unread Line']) { - return $.on(d, 'visibilitychange', Unread.setLine); - } - }, - ready: function() { - var ID, post, posts, _ref; - $.off(d, '4chanXInitFinished', Unread.ready); - posts = []; - _ref = Unread.thread.posts; - for (ID in _ref) { - post = _ref[ID]; - if (post.isReply) { - posts.push(post); - } - } - Unread.addPosts(posts); - if (Conf['Scroll to Last Read Post']) { - return Unread.scroll(); - } - }, - scroll: function() { - var checkPosition, hash, onload, post, posts, prevID, root; - if ((hash = location.hash.match(/\d+/)) && hash[0] in Unread.thread.posts) { - return; - } - if (Unread.posts.length) { - prevID = 0; - while (root = $.x('preceding-sibling::div[contains(@class,"postContainer")][1]', Unread.posts[0].nodes.root)) { - post = Get.postFromRoot(root); - if (prevID === post.ID) { - break; - } - prevID = post.ID; - if (!post.isHidden) { - break; - } - } - onload = function() { - if (checkPosition(root)) { - return root.scrollIntoView(false); - } - }; - } else { - posts = Object.keys(Unread.thread.posts); - root = Unread.thread.posts[posts[posts.length - 1]].nodes.root; - onload = function() { - if (checkPosition(root)) { - return Header.scrollToPost(root); - } - }; - } - checkPosition = function(target) { - var height, top, _ref; - _ref = target.getBoundingClientRect(), top = _ref.top, height = _ref.height; - return top + height - doc.clientHeight > 0; - }; - return $.on(window, 'load', onload); - }, - sync: function() { - var lastReadPost; - lastReadPost = Unread.db.get({ - boardID: Unread.thread.board.ID, - threadID: Unread.thread.ID, - defaultValue: 0 - }); - if (!(Unread.lastReadPost < lastReadPost)) { - return; - } - Unread.lastReadPost = lastReadPost; - Unread.readArray(Unread.posts); - Unread.readArray(Unread.postsQuotingYou); - Unread.setLine(); - return Unread.update(); - }, - addPosts: function(posts) { - var ID, data, post, _i, _len, _ref; - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - ID = post.ID; - if (ID <= Unread.lastReadPost || post.isHidden) { - continue; - } - if (QR.db) { - data = { - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }; - if (QR.db.get(data)) { - continue; - } - } - Unread.posts.push(post); - Unread.addPostQuotingYou(post); - } - if (Conf['Unread Line']) { - Unread.setLine((_ref = Unread.posts[0], __indexOf.call(posts, _ref) >= 0)); - } - Unread.read(); - return Unread.update(); - }, - addPostQuotingYou: function(post) { - var quotelink, _i, _len, _ref; - if (!QR.db) { - return; - } - _ref = post.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - if (QR.db.get(Get.postDataFromLink(quotelink))) { - Unread.postsQuotingYou.push(post); - } - } - }, - onUpdate: function(e) { - if (e.detail[404]) { - return Unread.update(); - } else { - return Unread.addPosts(e.detail.newPosts); - } - }, - readSinglePost: function(post) { - var i; - if ((i = Unread.posts.indexOf(post)) === -1) { - return; - } - Unread.posts.splice(i, 1); - if (i === 0) { - Unread.lastReadPost = post.ID; - Unread.saveLastReadPost(); - } - if ((i = Unread.postsQuotingYou.indexOf(post)) !== -1) { - Unread.postsQuotingYou.splice(i, 1); - } - return Unread.update(); - }, - readArray: function(arr) { - var i, post, _i, _len; - for (i = _i = 0, _len = arr.length; _i < _len; i = ++_i) { - post = arr[i]; - if (post.ID > Unread.lastReadPost) { - break; - } - } - return arr.splice(0, i); - }, - read: $.debounce(50, function(e) { - var ID, bottom, height, i, post, posts, read; - if (d.hidden || !Unread.posts.length) { - return; - } - height = doc.clientHeight; - posts = Unread.posts; - read = []; - i = posts.length; - while (post = posts[--i]) { - bottom = post.nodes.root.getBoundingClientRect().bottom; - if (bottom < height) { - ID = post.ID; - posts.remove(post); - } - } - if (!ID) { - return; - } - Unread.lastReadPost = ID; - Unread.saveLastReadPost(); - Unread.readArray(Unread.postsQuotingYou); - if (e) { - return Unread.update(); - } - }), - saveLastReadPost: $.debounce(2 * $.SECOND, function() { - return Unread.db.set({ - boardID: Unread.thread.board.ID, - threadID: Unread.thread.ID, - val: Unread.lastReadPost - }); - }), - setLine: function(force) { - var post, root; - if (!(d.hidden || force === true)) { - return; - } - if (post = Unread.posts[0]) { - root = post.nodes.root; - if (root !== $('.thread > .replyContainer', root.parentNode)) { - return $.before(root, Unread.hr); - } - } else { - return $.rm(Unread.hr); - } - }, - update: function() { - var count; - count = Unread.posts.length; - if (Conf['Unread Count']) { - d.title = "" + (Conf['Quoted Title'] && Unread.postsQuotingYou.length ? '(!) ' : '') + (count || !Conf['Hide Unread Count at (0)'] ? "(" + count + ") " : '') + (g.DEAD ? "/" + g.BOARD + "/ - 404" : "" + Unread.title); - } - if (!Conf['Unread Favicon']) { - return; - } - Favicon.el.href = g.DEAD ? Unread.postsQuotingYou.length ? Favicon.unreadDeadY : count ? Favicon.unreadDead : Favicon.dead : count ? Unread.postsQuotingYou.length ? Favicon.unreadY : Favicon.unread : Favicon["default"]; - return $.add(d.head, Favicon.el); - } - }; - - Redirect = { - thread: {}, - post: {}, - file: {}, - init: function() { - var archive, arr, boardID, data, id, name, type, _i, _len, _ref, _ref1, _ref2, _ref3; - _ref = Conf['selectedArchives']; - for (boardID in _ref) { - data = _ref[boardID]; - for (type in data) { - id = data[type]; - _ref1 = Redirect.archives; - for (name in _ref1) { - archive = _ref1[name]; - if (name !== id || type === 'post' && archive.software !== 'foolfuuka') { - continue; - } - arr = type === 'file' ? archive.files : archive.boards; - if (arr.contains(boardID)) { - Redirect[type][boardID] = archive; - } - } - } - } - _ref2 = Redirect.archives; - for (name in _ref2) { - archive = _ref2[name]; - _ref3 = archive.boards; - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - boardID = _ref3[_i]; - if (!(boardID in Redirect.thread)) { - Redirect.thread[boardID] = archive; - } - if (!(boardID in Redirect.post || archive.software !== 'foolfuuka')) { - Redirect.post[boardID] = archive; - } - if (!(boardID in Redirect.file || !archive.files.contains(boardID))) { - Redirect.file[boardID] = archive; - } - } - } - }, - archives: { - 'Foolz': { - 'domain': 'archive.foolz.us', - 'http': false, - 'https': true, - 'software': 'foolfuuka', - 'boards': ['a', 'co', 'gd', 'jp', 'm', 'q', 'sp', 'tg', 'tv', 'v', 'vg', 'vp', 'vr', 'wsg'], - 'files': ['a', 'gd', 'jp', 'm', 'q', 'tg', 'vg', 'vp', 'vr', 'wsg'] - }, - 'NSFW Foolz': { - 'domain': 'nsfw.foolz.us', - 'http': false, - 'https': true, - 'software': 'foolfuuka', - 'boards': ['u'], - 'files': ['u'] - }, - 'The Dark Cave': { - 'domain': 'archive.thedarkcave.org', - 'http': true, - 'https': true, - 'software': 'foolfuuka', - 'boards': ['c', 'int', 'out', 'po'], - 'files': ['c', 'po'] - }, - '4plebs': { - 'domain': 'archive.4plebs.org', - 'http': true, - 'software': 'foolfuuka', - 'boards': ['hr', 'tg', 'tv', 'x'], - 'files': ['hr', 'tg', 'tv', 'x'] - }, - 'Nyafuu': { - 'domain': 'archive.nyafuu.org', - 'http': true, - 'https': true, - 'software': 'foolfuuka', - 'boards': ['c', 'w', 'wg'], - 'files': ['c', 'w', 'wg'] - }, - 'Foolz a Shit': { - 'domain': 'archive.foolzashit.com', - 'http': true, - 'https': true, - 'software': 'foolfuuka', - 'boards': ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'], - 'files': ['adv', 'asp', 'cm', 'i', 'lgbt', 'n', 'o', 'p', 's4s', 't', 'trv'] - }, - 'World Athletic Project': { - 'domain': 'fuuka.worldathleticproject.org', - 'http': true, - 'https': false, - 'software': 'foolfuuka', - 'boards': ['e', 'h', 'hc', 'p', 's', 'u'], - 'files': ['e', 'h', 'hc', 'p', 's', 'u'] - }, - 'Install Gentoo': { - 'domain': 'archive.installgentoo.net', - 'http': false, - 'https': true, - 'software': 'fuuka', - 'boards': ['diy', 'g', 'sci'], - 'files': [] - }, - 'warosu': { - 'domain': 'fuuka.warosu.org', - 'http': true, - 'https': true, - 'software': 'fuuka', - 'boards': ['3', 'cgl', 'ck', 'fa', 'ic', 'jp', 'lit', 'q', 'tg', 'vr'], - 'files': ['3', 'cgl', 'ck', 'fa', 'ic', 'jp', 'lit', 'q', 'tg', 'vr'] - }, - 'Rebecca Black Tech': { - 'domain': 'rbt.asia', - 'http': true, - 'https': true, - 'software': 'fuuka', - 'boards': ['cgl', 'g', 'mu', 'w'], - 'files': ['cgl', 'g', 'mu', 'w'] - }, - 'Heinessen': { - 'domain': 'archive.heinessen.com', - 'http': true, - 'software': 'fuuka', - 'boards': ['an', 'fit', 'k', 'mlp', 'r9k', 'toy'], - 'files': ['an', 'k', 'toy'] - } - }, - to: function(dest, data) { - var archive; - archive = (dest === 'search' ? Redirect.thread : Redirect[dest])[data.boardID]; - if (!archive) { - return ''; - } - return Redirect[dest](archive, data); - }, - protocol: function(archive) { - var protocol; - protocol = location.protocol; - if (!archive[protocol.slice(0, -1)]) { - protocol = protocol === 'https:' ? 'http:' : 'https:'; - } - return "" + protocol + "//"; - }, - thread: function(archive, _arg) { - var boardID, path, postID, threadID; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID; - path = threadID ? "" + boardID + "/thread/" + threadID : "" + boardID + "/post/" + postID; - if (archive.software === 'foolfuuka') { - path += '/'; - } - if (threadID && postID) { - path += archive.software === 'foolfuuka' ? "#" + postID : "#p" + postID; - } - return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; - }, - post: function(archive, _arg) { - var boardID, postID, protocol; - boardID = _arg.boardID, postID = _arg.postID; - protocol = Redirect.protocol(archive); - if (['Foolz', 'NSFW Foolz'].contains(archive.name)) { - protocol = 'https://'; - } - return "" + protocol + archive.domain + "/_/api/chan/post/?board=" + boardID + "&num=" + postID; - }, - file: function(archive, _arg) { - var boardID, filename; - boardID = _arg.boardID, filename = _arg.filename; - return "" + (Redirect.protocol(archive)) + archive.domain + "/" + boardID + "/full_image/" + filename; - }, - search: function(archive, _arg) { - var boardID, path, type, value; - boardID = _arg.boardID, type = _arg.type, value = _arg.value; - type = type === 'name' ? 'username' : type === 'MD5' ? 'image' : type; - value = encodeURIComponent(value); - path = archive.software === 'foolfuuka' ? "" + boardID + "/search/" + type + "/" + value : "" + boardID + "/?task=search2&search_" + (type === 'image' ? 'media_hash' : type) + "=" + value; - return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; - } - }; - - PSAHiding = { - init: function() { - if (!Conf['Announcement Hiding']) { - return; - } - $.addClass(doc, 'hide-announcement'); - return $.on(d, '4chanXInitFinished', this.setup); - }, - setup: function() { - var btn, entry, psa; - $.off(d, '4chanXInitFinished', PSAHiding.setup); - if (!(psa = $.id('globalMessage'))) { - $.rmClass(doc, 'hide-announcement'); - return; - } - entry = { - type: 'header', - el: $.el('a', { - textContent: 'Show announcement', - className: 'show-announcement', - href: 'javascript:;' - }), - order: 50, - open: function() { - return psa.hidden; - } - }; - $.event('AddMenuEntry', entry); - $.on(entry.el, 'click', PSAHiding.toggle); - PSAHiding.btn = btn = $.el('a', { - innerHTML: ' - ', - title: 'Hide announcement.', - className: 'hide-announcement', - href: 'javascript:;' - }); - $.on(btn, 'click', PSAHiding.toggle); - $.get('hiddenPSA', 0, function(_arg) { - var hiddenPSA; - hiddenPSA = _arg.hiddenPSA; - PSAHiding.sync(hiddenPSA); - $.before(psa, btn); - return $.rmClass(doc, 'hide-announcement'); - }); - return $.sync('hiddenPSA', PSAHiding.sync); - }, - toggle: function(e) { - var UTC; - if ($.hasClass(this, 'hide-announcement')) { - UTC = +$.id('globalMessage').dataset.utc; - $.set('hiddenPSA', UTC); - } else { - $.event('CloseMenu'); - $["delete"]('hiddenPSA'); - } - return PSAHiding.sync(UTC); - }, - sync: function(UTC) { - var hr, psa; - psa = $.id('globalMessage'); - psa.hidden = PSAHiding.btn.hidden = UTC && UTC >= +psa.dataset.utc ? true : false; - if ((hr = psa.nextElementSibling) && hr.nodeName === 'HR') { - return hr.hidden = psa.hidden; - } - } - }; - - CatalogLinks = { - init: function() { - var el, input; - if (!Conf['Catalog Links']) { - return; - } - el = $.el('label', { - id: 'toggleCatalog', - href: 'javascript:;', - innerHTML: " Catalog Links", - title: "Turn catalog links " + (Conf['Header catalog links'] ? 'off' : 'on') + "." - }); - input = $('input', el); - $.on(input, 'change', this.toggle); - $.sync('Header catalog links', CatalogLinks.set); - $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 95 - }); - return $.on(d, '4chanXInitFinished', function() { - return CatalogLinks.set(Conf['Header catalog links']); - }); - }, - toggle: function() { - var useCatalog; - $.event('CloseMenu'); - $.set('Header catalog links', useCatalog = this.checked); - return CatalogLinks.set(useCatalog); - }, - set: function(useCatalog) { - var a, board, path, _i, _len, _ref; - path = useCatalog ? 'catalog' : ''; - _ref = $$("#board-list a[href*=\"boards.4chan.org\"]:not(.catalog),\n#boardNavDesktopFoot a[href*=\"boards.4chan.org\"]"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - board = a.pathname.split('/')[1]; - if (['f', 'status', '4chan'].contains(board) || !board) { - continue; - } - if (Conf['External Catalog']) { - a.href = useCatalog ? CatalogLinks.external(board) : "//boards.4chan.org/" + board + "/"; - } else { - a.pathname = "/" + board + "/" + path; - } - } - return this.title = "Turn catalog links " + (useCatalog ? 'off' : 'on') + "."; - }, - external: function(board) { - return (['a', 'c', 'g', 'co', 'k', 'm', 'o', 'p', 'v', 'vg', 'w', 'cm', '3', 'adv', 'an', 'cgl', 'ck', 'diy', 'fa', 'fit', 'int', 'jp', 'mlp', 'lit', 'mu', 'n', 'po', 'sci', 'toy', 'trv', 'tv', 'vp', 'x', 'q'].contains(board) ? "http://catalog.neet.tv/" + board : ['d', 'e', 'gif', 'h', 'hr', 'hc', 'r9k', 's', 'pol', 'soc', 'u', 'i', 'ic', 'hm', 'r', 'w', 'wg', 'wsg', 't', 'y'].contains(board) ? "http://4index.gropes.us/" + board : "//boards.4chan.org/" + board + "/catalog"); - } - }; - - IDColor = { - init: function() { - if (!Conf['Color User IDs']) { - return; - } - return Post.prototype.callbacks.push({ - name: 'Reveal Spoilers', - cb: this.node - }); - }, - node: function(post) { - var str, uid; - if (!(uid = $('.hand', this.nodes.uniqueID))) { - return; - } - str = this.info.uniqueID; - if (uid.nodeName === 'SPAN') { - return uid.style.cssText = IDColor.apply.call(str); - } - }, - ids: {}, - compute: function(str) { - var hash, rgb; - hash = this.hash(str); - rgb = [(hash >> 24) & 0xFF, (hash >> 16) & 0xFF, (hash >> 8) & 0xFF]; - rgb[3] = ((rgb[0] * 0.299) + (rgb[1] * 0.587) + (rgb[2] * 0.114)) > 125; - this.ids[str] = rgb; - return rgb; - }, - apply: function() { - var rgb; - rgb = IDColor.ids[this] || IDColor.compute(this); - return ("background-color: rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "); color: ") + (rgb[3] ? "black; border-radius: 3px; padding: 0px 2px;" : "white; border-radius: 3px; padding: 0px 2px;"); - }, - hash: function(str) { - var i, j, msg; - msg = 0; - i = 0; - j = str.length; - while (i < j) { - msg = ((msg << 5) - msg) + str.charCodeAt(i); - ++i; - } - return msg; - } - }; - - CustomCSS = { - init: function() { - if (!Conf['Custom CSS']) { - return; - } - return this.addStyle(); - }, - addStyle: function() { - return this.style = $.addStyle(Conf['usercss']); - }, - rmStyle: function() { - if (this.style) { - $.rm(this.style); - return delete this.style; - } - }, - update: function() { - if (!this.style) { - this.addStyle(); - } - return this.style.textContent = Conf['usercss']; - } - }; - - Emoji = { - init: function() { - var css, icon, name, pos, _ref; - if (!Conf['Emoji']) { - return; - } - pos = Conf['emojiPos']; - css = ["a.useremail[href]:last-of-type::" + pos + " {\n vertical-align: top;\n margin-" + (pos === "before" ? "right" : "left") + ": 5px;\n}\n"]; - this.icons["PlanNine"] = Emoji.icons["Plan9"]; - this.icons['Sage'] = Emoji.sage[Conf['sageEmoji']]; - _ref = this.icons; - for (name in _ref) { - icon = _ref[name]; - if (!this.icons.hasOwnProperty(name)) { - continue; - } - css.push("a.useremail[href*='" + name + "']:last-of-type::" + pos + ",\na.useremail[href*='" + (name.toLowerCase()) + "']:last-of-type::" + pos + ",\na.useremail[href*='" + (name.toUpperCase()) + "']:last-of-type::" + pos + " {\n content: url('data:image/png;base64," + icon + "');\n}\n"); - } - return $.addStyle(css.join(""), 'emoji'); - }, - sage: { - '4chan SS': 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAANCAYAAACZ3F9/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAa9JREFUKFOdkt0rg2EUwM95b2zlL0CRRLngksznXrJsNtYW1tjYhM3mY6+IXZAbikhTKJp8XZAp81UmWYhIRHHhUi60e7s6ntdCa2449es8PfU7z+k5B6AbyuE/wQlc4BcO2d06unAUBCgFE0hianOd3NHIcy8NPwrUf9NBPZcOEi7ayXZiea/1V7+ljaXeYAfOgg2So2TOwQWGnwQafOgi962TnMFmatozUeNu4yetASspVvgXiUvii5K5Nm6z56ol3Hdtpy+cwSYy+HRUt1nLsoEato0kXyh6wTac+24brThWv6MNOYNW9prlG/uxmbRrFaT0VrCspZoNPSUNJNyCBcoiLZuhLH0o9U6UrAfGKCz7RlLM81Q8XUwqr4oKPLIQmnA8IupBigacVy7yrya/2JouhryJHJJNykg+UxLGOtz6+SQNpEiMcduls4Wvoli9WklVKz+ol5SU4U6ngql8Qj2eRI+GyajBhSRH4r3cUxhSeRVhsYBmWUWiyM+UMDmDUI2nsfuSC1I27nLgYZJlP8jhjJ3PY8iE+L8tWx4kQC6MQA5b1D9HNiRCFhx8AF/e2qh92VnKAAAAAElFTkSuQmCC', - 'appchan': 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAABa1BMVEUAAACqrKiCgYIAAAAAAAAAAACHmX5pgl5NUEx/hnx4hXRSUVMiIyKwrbFzn19SbkZ1d3OvtqtpaWhcX1ooMyRsd2aWkZddkEV8vWGcpZl+kHd7jHNdYFuRmI4bHRthaV5WhUFsfGZReUBFZjdJazpGVUBnamYfHB9TeUMzSSpHgS1cY1k1NDUyOC8yWiFywVBoh1lDSEAZHBpucW0ICQgUHhBjfFhCRUA+QTtEQUUBAQFyo1praWspKigWFRZHU0F6j3E9Oz5VWFN0j2hncWONk4sAAABASDxJWkJKTUgAAAAvNC0fJR0DAwMAAAA9QzoWGhQAAAA8YytvrFOJsnlqyT9oqExqtkdrsExpsUsqQx9rpVJDbzBBbi5utk9jiFRuk11iqUR64k5Wf0JIZTpadk5om1BkyjmF1GRNY0FheFdXpjVXhz86XSp2yFJwslR3w1NbxitbtDWW5nNnilhFXTtYqDRwp1dSijiJ7H99AAAAUnRSTlMAJTgNGQml71ypu3cPEN/RDh8HBbOwQN7wVg4CAQZ28vs9EDluXjo58Ge8xwMy0P3+rV8cT73sawEdTv63NAa3rQwo4cUdAl3hWQSWvS8qqYsjEDiCzAAAAIVJREFUeNpFx7GKAQAYAOD/A7GbZVAWZTBZFGQw6LyCF/MIkiTdcOmWSzYbJVE2u1KX0J1v+8QDv/EkyS0yXF/NgeEILiHfyc74mICTQltqYXBeAWU9HGxU09YqqEvAElGjyZYjPyLqitjzHSEiGkrsfMWr0VLe+oy/djGP//YwfbeP8bN3Or0bkqEVblAAAAAASUVORK5CYII=' - }, - icons: { - 'Plan9': 'iVBORw0KGgoAAAANSUhEUgAAAAwAAAAPCAYAAAGn5h7fAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AoYAzE15J1s7QAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAACAElEQVQoz3WSz4sSARTHvzMjygpqYg3+KIhkE83DKtKlf0C9SrTRuZNEx0VowU6CuSeJNlwwpEO2kJ6SQBiIUAzFjRDF4wrjKosnGx3HmdehFDfpe/2+z/s++D5gU7IsEwRByICIiAEAIiIAYAFAXsjYVr/fLxMRNVvN+prJ5/OA3+/XERFNf02JyeVyDx0OxyvLNQsnimLKfcf9KRQKXQAAnE6nlf5qMpnQycnbP/kAoKoqsSwLAJhOp+AAwOv1otvtpqxWq73dbt/r9XqvEQ6HUalUEvF4XLd5IpvNZqlerzd5nlf6/f6tTCZjBACk0+nb+XxeW4UrikLJZPImAGA0Gq0NIqJyuSyyANDr9Q5Wu1utFvR6/SULAI1G4+vK8Pv90DTtGwsAJpPpaGUYDAZ0Op3PHAAEg8H3tVqtbrtu21sqyxuRSOQJk0ql9IvF4r7b7f7pcrlejkaj57IsH58Pzp8dvjhc/lsBk0gkbLFYrFqtVvd27+4qOk733ePxPDCbzVBVFfP5fCiK4rvhxfDN/qP9wSasGwwGMv1HiqJQsVg8ZlfTHMepkiR1t05gGJBGmM/nMBqNj9nN9kql0lNN064ARISzH2cQBAGz2ewLu2na7XYLwzBbvxYIBBCNRrFj3BmsAZ/PZ+J5/kOhUIAkSVeA8XiMZqt5efrx9OA3GfcgvyVno9cAAAAASUVORK5CYII=', - 'Neko': 'iVBORw0KGgoAAAANSUhEUgAAABMAAAARCAMAAAAIRmf1AAACoFBMVEUAAABnUFZoUVddU1T6+PvFwLzn4eFXVlT/+vZpZGCgm5dKU1Cfnpz//flbWljr5uLp5OCalpNZWFb//f3r6+n28ff9+PRaVVH59Pr//vr38vj57/Dp7eyjn5zq8O5aVVJbYV9nVFhjUFRiWFlZVlFgZGOboJzm5uZhamfz9/bt8fDw6+drb26bl5j/8/lkX1z06uldWFS5r61UT0tfWlbDwr3Ew76moqNRTU7Mx8P75OpeY19pWl1XW1qzr6x5eHaLiojv7+1UT0xIU0uzqadVS0nV0MxkZGT5+PPk497///ra29Xq5eFtY2H28e2hnJignJlUUE1dXV2vrqxkY2FkYF/m3d5vZmfDuruhl5aZlJHx8O75+PZWVVP29vT/9fTj3trv6ubh5eRdXFqTkpBOTUtqZmX88/RMQ0T78vPEvr7HwcHDwsDq6ef///3Gx8H++fXEv7tZWVedmZZXXVudnJp0c3FZU1f79fnb1dlXUVVjXWFrZmy8t7359/qLj455e3q4s69vamZjX1zy4+avpaReWFz/+f1NR0vu6Ozp4+f48/lnYmi8ur3Iw7/69fHz7+xbV1SZmJZVUk1ZV1zq5ez++f/c196uqbDn4uj9+P7z7vRVVVXt6ORiXl/OycXHw8CPi4ihoJ5aWF3/+v/k3+axrLOsp67LzMZYU1m2sq9dWF5WUU1WUk/Au7eYlJGqpqObmphYVV749f7p5Or38fPu6OpiXFz38fH79vLz7urv6+hhYF5cWWKal6D//f/Z09Xg29exraqbl5RqaW6kpKTq5uPv7Of/+PDj29D//vP18Ozs5+OloJymoZ1ZVVJZWVlkYF2hnpmblIyspJmVjYKQi4enop5STUlRTUpcWUhqY1BgWT9ZUjhcV1NiXVkkhke3AAAABHRSTlMA5vjapJ+a9wAAAP9JREFUGBk9wA1EAwEAhuHv3dTQAkLiUlJFJWF0QDLFYDRXIMkomBgxNIYxhOk4wwCqQhQjxgxSGIsALFA5BiYbMZHajz1oJlx51sBJpf6Gd3zONcrqm/r1W8ByK0r+XV1LXyOLLnjW6hMGpu0u1IzPSdO17DgrGC6AadrVodGcDQYbhguP6wAvAaC0BRZQalkUQ8UQDz5tAof0XbejOFcV5xiUoCfjj3O/nf0ZbqAMPYmzU18KSDaRQ08qnfw+B2JNdAEQt2O5vctUGjhoIBU4ygPsj2Vh5zYopDK73hsirdkPTwGCbSHpiYFwYVVC/17pCFSBeUmoqwYQuZtWxx+BVEz0LeVKIQAAAABJRU5ErkJggg==', - 'Madotsuki': 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAMAAADTRh9nAAAALVBMVEUAAAC3iopWLTtWPkHnvqUcBxx5GCZyAAARERGbdXJrRUyGRUyYbY23coZFGDRFGEYfAAAAAXRSTlMAQObYZgAAAGhJREFUeF5Vy1kOQyEMQ1Fshzd12P9y61AixLX4yJFo1cvVUfT23GaflF0HPLln6bhnZVKCcrIWGqpCUcKYSP3JSIRySKTtULPNwMaD8/NC8tsyqsd1hR+6qeqIDHc3LD0B3KdtV1f2A+LJBBIHSgcEAAAAAElFTkSuQmCC', - 'Sega': 'iVBORw0KGgoAAAANSUhEUgAAACwAAAALBAMAAAD2A3K8AAAAMFBMVEUAAACMjpOChImytLmdnqMrKzDIyM55dnkODQ94foQ7PkXm5Olsb3VUUVVhZmw8Sl6klHLxAAAAAXRSTlMAQObYZgAAANFJREFUGJVjYIACRiUlJUUGDHBk4syTkxQwhO3/rQ/4ZYsuymi3YEFUqAhC4LCJZJGIi1uimKKjk3KysbOxsaMnAwNLyqoopaXhttf2it1anrJqke1pr1DlBAZhicLnM5YXZ4RWlIYoezx0zrjYqG6czCDsYRzxIko6Q/qFaKy0690Ij0MxN8K2MIhJXF+hsfxJxuwdpYGVaUU3Mm5bqgKFOZOFit3Vp23J3pgsqLxFUXpLtlD5bgcGBs45794dn6mkOVFQUOjNmXPPz8ysOcAAANw6SHLtrqolAAAAAElFTkSuQmCC', - 'Sakamoto': 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAxVJREFUOE+Nk19IU1EYwK+GQQTVQ39egh6ibKlzw91z7rn3bvfOmddNszl1bjKXc5rJJGmBUr7Yg9qTD0IalFgRBEYg6EDQQB+GovQyQgiaUZsoLcgHMcr069w7MgcGXfi453zn+37fv3MYZt/n99e76tzVj4JN/hP79fvXnV3hnNabwUBjoOHcgTYOu/JQspgTzsqKgn9BfD4vkWTzur287PqLVy+zM+yePB7KsRXLywTjnSpnZctBkPCdW8ccDuU55vBO8RXbkC/oP5ph19V5+7LIky0OY1BKbZEbLcFSt7u6pN7jLmltCVrr3DV5jY3+KovFEsccB1KJNVpefe10BqS2tqqO4/AuphBB4L/LkrRqNgtJs1lMypLls1kU38mytMLz/E8VIlutqVqX6/weZG52OttRXjbE0cP/FYLRlpVjDXuQ/r77x2XZPKkCHA4HBAIBkCQpAygIAvh8Pu2MZgO0Lz+QSa/sQfwN9RfpVN66XC6Ynp6GhYUFGBwczAC1t7fD0tISxONx6O7upgHILmsqvLcHodOggfiV/v5+SCaT4HQ6IRaLgdfr1bIRRREmJyfBZrNBNBqF+fl5sNsdgE2GiAbp6bmbdbXC7qWQbxMTE7C2tgY6nQ5SqRSEw2ENopaoZpCXlwdTU1NaoECgCbgiU6y8QH+ECYWaTymK7TWdys7MzIwGaWtrg42NDejo6AB1WjU1NZo+FArB2NgYrK6uQrAlCASxn2z6wkuMp87VIAhkE2MEAwMDkEgkYHx8HBYXF0HtkQpRy1BLiEQisLy8rPVNKSsFjEzrXH4+z1hlS4xDhKadNu7t7YPR0VHweDzAEVWfHru6HxkZgeHhYVAURYNjkylVWKArZjjMzqmdVi+QCsLUkQiEjvDvncEkvU7/qQ0Vgukeo48Go87IiCJnZNmipxiz7wXEbVDnbUxQOgM12h9n6qTq6NvapRdtkwaP0XK8RmPuYSbxYfaQ/sJJhjfknuFRURUi7AMOozcCwl94hLZp5F+EioDQVwqYI6jomZU1NFtM+rOSxZjVazcyvwHr/p/Kws1jegAAAABJRU5ErkJggg==', - 'Baka': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA0pJREFUOE91k3tI01EUx39JOpA0H4jNx0pbD3XTalISWf8YFlEgldqDsBLLyqjEKBCiLLWiggh6/KEV1WZ7OaelLZvDdDafNW1JFraWe/32+01FrUZ9uy4ylLpw4Z5z7/nc77n3HIqaMRIjZJyEcNX+uFCFeGmI/GZciEIsCFJUTvoAzDz+1y7K76MSwhX5hXl6z+WSbrzU2KB8YEGDwgrTaxZ3b7xHcaHhR3xw7Z5/UviB1ReP5XSg3+TAqYJOxMzWISFIC0GQDomhTVA9skCnsaAwp/vnMq66dBokNuBR9uFd7T9Z1zCunjci0qcRJUVdoJ3DYOhRnC/qBZ+jQbfeCc+37yjY2UEg0iwvJE0k9l8Z+8xqHmTgot0QLdQgTaQFQ2AsOzlHvOu1S5pwOLsHHo8HjHMCq2MazNvTlByKHyrJLDvdR25jMWRxYx5HjeMH2r1BDOOeguRua4OI14jx8a8YH5tA+al3EHKlW6mYOapb2oZBOOwMbEMseAE12L+jjUh3w+VipyAZ65oxn1NP/GMYGR6Ftn4Qsf7qa9S82Y/l/X122G0uL2TbxmZEz1WhXW8mUol8moXu+SCi/OoQ6VsDh3UUwyQ1k9GOaI5MTkX4yWTGHutvgI1F28sviAlRgxeoRm62HvsyW8En9pZ1TYgi6TntoyQtFm86rVgUoJZRvDnKMmXVAGxWmkAYOBwudBqGcHCvHulrGpGT2Uy+z4yT+QYsCXtCUpp8GxbKhx8gDK0ro+KjJGvzdjfDZnN6VdisLD5/JjArQ2zW66PJOj2lEZtStaBphkwah7K6kMJ/GEulp1bMWhAmMbTozOQRaWRtfoZVgjo4iRra4SYgGi26TwjxVeDKhR7Y7U606ixICq9tr7hd7+OthRWL7yUnJ1WPmXotqLhpRICPHCePtuFV6xdUPTAhcWEtRHEqfHpPyto4hPXLXnzflSEJnFaN3OCKDcsFsrEntR9RUmxARLAUgT5iBPuJsXWDBj0dZjRU9yNV+PTbpjTp9OA/pOSk24nRkXf1J462oPxcJ65f6ULlHSMulepRerYDgvj7A0cKpNz/tyTZqbzXO4t0ZZGQJ34RH11lFHIlA8LIqreCCMUZRY3cd2bwL/5/RmjNSXqtAAAAAElFTkSuQmCC', - 'Ponyo': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAuNJREFUOE+Nk3tI01EUx39BTytConQTt1am07m5abi5KT5S8z2dj1yOEMUC7aUgIoimlmUEWX9kBZGWaamEmE6U1BI1XNPNGTrnHs33IwuSXrL4NgcJ0mNdOHDh3PPhnPP9XoKwcroJYvMQiRSicHCQKCgUyZC9/T5rNet5KUFs0zCZbZMsFmZ9fTEjEEBDp4/KSSSb/4JoGIyWaTYbiykpWEhOxhSHAzWD0aqkUGhWAcVkW58xlvuPhfh4zItEmOHxYDR3MhcdDaNAsKJydAz5IySKRNjEUmy88vjOVaU8F0iPCqCNjEBHkC/UYaGYFwqxmJoKLYOhkxPElg0QsbNtTlmox9yjRD9UCbnoOR+J/lwRWtOCcdXfDc2BPpg0d7CQlIQZPh9KKlVkAQjJ2x2zmOSsQu7hpzUJfBhLjsNQmADjxcT10Bcl4rE4EHc5LjBEhEPn7f1WTqXSLQB/s1Tp7vslsoIkyPPiMJAbi86McBguiaHKjoEqR4jJy2K0nAxApzMN5iUGrclrKVaz2fUvuF4tRbxDKA90w5VjTFyLZKHpTBSq4/1QnxGB2qxoVIZx0JopRCPHFSNOThfWZzfrXDcZEowH4iA05ATg68hDtBaL0HAuCm3lJ9Bfcx2fFNUoi/DCjRgfNHHd1wCZA2TyXjNkE6F0cBDpPFiojeNi8EkJdFoN3vXch0nbBJOhDd907dANv8JITxNqziag3ZsJbUDAwLin50Q9QWwl1qSYoNOVvUcOoqOqAAa9Fu9H2/F9+B5WZLcwOyxFX18flLI+VASyMGVeoJHD+Tzq5BS1PoaKRrNT8127P74swsq4FCa9FKvqBqwaOiz3hdEuLKueYSyECT2LNW0eIfo3E/WmEbvnG1MUJnWdpWhDGDvxQXZHo+RR0uW2tnv+auPX+TvtJm7zKpaen/4y2yjBUlcxlvtvmvT16ZWDpQeoVv3/60F/NrHjTf4ugazIXtJ8ivjnz/sJ+yGQRjcqUdIAAAAASUVORK5CYII=', - 'Rabite': 'iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAD/0lEQVR4Xl2MXUxbdQDFz/9+9Lb3tkBLCxTKhzgoOOZAsokbJmZxDFHnd+LL4hKVzBgfNCY++ODbjDEaZowvErOM6HRu6hKZY2rIAOkCY4OSDTpFaAsrlJa2t5+39+NvjT7tnJzknIfzI98Nf/C6TuXdguWBd1q9rcb8/CwsZiu2Ywm4nDVo3VWLZCKDaDwJq9mCg31PgjAMKKUwmcyYvTbek9iJRDm6M/XswEDjwNz6plWW6wdZhjUAintFCEEhn0N04zYskljaDLaj8ar49oUrsYR6mrFJNj322w46H8y+mitM/ZJKZmyE4XAvjJSsazpyuSzslVZIkgWKOvvRgQ6Xrdlhqmds7o7bFZoLkctreKxf7GtuCE7IyUQjBQcQ8j/lvxCGQJZz0IoCVpamTtzfIh9nwiaIrCQyjNg8mq11oDLUhNXRJfT1Ozr3tS/PqpnQ80qRgjAmKIqBfK4ItbSLKoOZqR/6neLkENlSUAIhlktvEf+sD2rkm8nWTHtvZCGMVON1ePuaoBER31/MXGly1wSqq9Uug6FluYyWXJiPqFXmjd4Dh9oF9ZKKimYXRtYCx8lmMIDIxlIPGz591av0mtanF7FcCEN6iMXeox2wOJ0QJAmUAoRQaIqCnWAQY1/ewKNGNeQuYXkm0d2NC2e+wvmRr/Hx+6+8PHayrbDyyQBNDb9As3PHKDWG6MTM23RoeJAWsqeoWvyUUv0UHf7pBB0fe4OeeXe3/vmHbx3+8dwIGJ4IsFpMMFe0fbtAn+nwZePr1u4MBK8XIALG/Rt479wYrs2vgeNNAMNgMbiNzybuoKVvn+Gs9kbr6qpBfJfGYHFIkJUCoGwfqcoMX/b27EGhwgOjoCADDlP+CA51ugFFRzoB8FYNaQ1oqKD44+eNL+wNj7zJGQSIhe8+jgQ9thk+27v/KRY6L4FSCkVOwtlQj6P73Qgt/o1ERoKt4iUkE7+jrZMHyzIoK9cOBFfT4LbWAk+0a7ZLnvqHcTNdACgFScfAcjxEdy00VQclHGo7dqGeYxHbvIo6hwhSghCehb3G5p6eW7VxXC5/xGWToMgrKKoaCnIalI9CIARasQAqloMI/x4BWrLLYwE1AEPTwCGHaGjz7pw/leZUNV8wNm9BLy6CxsvxZ1kMbaY4TKIIXlNBsynoVjvAC4CuAoYOVi+CMfLYCUfg95tPHuzZB0YtKzsb58RMucWE/fZmhCbdOP9rNnLnxko6GVoB8lFwyVVw8b/AyeulHoJyN4Rb19dTFyeqBlu6njvfsWcvOJvLs7DMmw/7bvpeE4pU2OIcgcqmp4fGAgt2Txwvqr7lTp5V7LquZxXC6+BqEvGcY5pyjaM1tffJbk89NE3FP5VQ6y7a+paZAAAAAElFTkSuQmCC', - 'Arch': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABCFBMVEUAAAAA//8rqtVAqtUQj88tpdIYks46otwVldUbktEaldMjldM2qNcXk9IWktQZkdIYlc8mnNUXlNEZktEZlNIYktIWlNMXktE7o9klmdMXktFHqdkXk9EWk9EYk9IlmtQXlNEXktAWk9AWlNEYlNFDptkZldMYk9E4otg/p9kXktEXk9AXlNA4otclmdQXk9IYktEXlNEwn9YXk9IXk9FFp9o3otgXk9FPrdwXk9E2otdCptkXk9E/ptkcldIXk9Edl9IXk9EjmdUXk9EXk9EXk9EbldIcldIjmdMmmtQsndUvntYyn9YyoNYzoNc0odc1odc2odc6pNg7pNg9pdlDp9pJqttOrdzlYlFbAAAARXRSTlMAAQYMEBEVFhgcHR0mLS8zNTY3PT4/RU1kdXp6e3+Cg4WIiYqMjZGXl5mbnqSnrbS3zMzV3OPk7Ozv8fT29vf4+fz8/f7SyXIjAAAAmUlEQVR4XlXI1WLCUBQF0YM3SHB3a1B3l7Bx1///E6ANkDtva0jKbCW2XIH1z2hiZEZ4uUgxo7JedTQye/KN/Sb5tbJ+7V9OXd1n+O+38257TL+tah3mADAwSMM7wzQWF4Hff6ubQIZIAIb6vxEF4CZyATXhZa4HwEnEA+2QgoiyQDnIEWkjVSBBZBqXbCRlKYo8+Rwkyx54AOYfFe7HhFa7AAAAAElFTkSuQmCC', - 'CentOS': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB5lBMVEUAAADy8tng4Ovs9tnk5O3c7bX44LLduNO1tdDh7r/eutj43q2kocX23az07N+qqsvUqcmXl7331ZXJj7r40o/Pn8T42qP63KjNw9n21p3Y387Ml7732JzR55z05MSxtMLGn8TC4Hx8eqt8e62Af6/B4HnG4oPC4HzH44fBf7LCgbOkoMTcsrmtn8PWqcfFtKrj4Jvs2ZOz2FnMqLXT3KfY5p60Z6NUU5XRuqHzwWSywqDn3JaiiLWahrWhkry5zJjRmqm1Z6P1wmb1y319fK632mK5cKi5nH+73Gu73Gy73W283W+9eK17e6y1yZS3aqRZWJdcW5ldXJplXZppaKBwb6VwcKV5eKswL306OYNPTpGkfK+m0kGpUJWq1EnEqIuXK3+Xh7ahP4qhkryMfK6BgK+CdpGMaKKMa6O9ea2+eq6+oYW/eq+NbqWVlL2Wlr7AjanA4HnA4HrBkqbBlafB33rCgbLCmKjCxIzC1mSs1UytV5mtxIWt1lCuz2evWpuvXJywxYzHjrvH4oXIjrrN2HXO5pTO5pXUlYnUlYvVl5Hb0G7e0XTg03rhr5fpzHPpzXTp0Hvtz3/wrDHytknyt0zyuE3yuVHzvVr0wGP1x3T1yHf1yXe0ZaL2zYP30o730pD31ZeRIcF5AAAAQ3RSTlMAFBkbHEhJS0xMTk5UWWBsd4SEiIiPkJCVlZaam6CjpK29wMPDxMTFxcnK193e3+Dg4uTn5+fo6e/v8/P4+fn7/P7+J4XBAAAAAOBJREFUeF5Vj1OvAwEYBb/yGlu717atLW0b17Zt2/6nze42TTpvMw8nOZCAmwUpiIY6c5IiLi9tPX64GairqszHQ4X2VB64v1Cs6PxMPJSdHM777s6/jyaMRGiRLyyrb88OpjZ3CzAXrm1sqzSNNeN7kVBPNgB7cG51abE5l9cXDces7emQ1uadHhutFUg6gpPKkSIqQGavwz7r7O/+/3t/rSdjI9XDM3qz4fr3B/3iA0aJTG9x71+9oR/PLDwUe2wm19bly+fTIxHyEETatbPewGEw6Mk/tKZCEqSQQUlIHB/QNBEjjVN1AAAAAElFTkSuQmCC', - 'Debian': 'iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAZ5JREFUOE+Nkk0oBHEYxv8fu5GQj3JwcaDkIAc5IpR87M7MKnIVJVKclaIQ5Sy5OLkgR7n5OigcSNpmd2c2Vyfl4KT8/muWiVU79TTv+7zv837NCBF6PG1X+NpZyEYSD9mIc+tHnBPe23B9xKrCuTmbQA/JKfABrhBswa1hH4A38IwfOxPdX1qcjiCQxO5NyrjKV70TnSbeRPwJvGN3i4yyqnEucPY8ZZX9GSEgGK+RvFfyjk2VKZxzBNG8wJWWgh/xtDOeUXZ7Slr6TrSLYL9N4SMgYTTcwdc2ArvJcElhSVcM6mCNSV8n9hA59yTU5UWMG6HIbLhIWlglgWiC2L4Z79qTdo40D6ISuOWwKCWHyk9Fv8ldpUHOuGTuynwSBUynddPdlbEosVpP9Eu4FnOsRzUYNTsdmZN/d5LDiqM0w+2CMdAFFsFGWgfXxZnheqe/z+0puwEM0HHYV3Z9Sgz8TEz7GkQvpuJ/36ggj2AaHLrSlkULWV5x+h2E8xkZL16YVjGNaAUscfZ/f6c/k9ywLKI2MMcRWl0RLy007idmRbQJ7RIfDAAAAABJRU5ErkJggg==', - 'Fedora': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABPlBMVEUAAAApQXIpQXIpQXIqQ3UpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIqQ3QpQXIpQXIqRHYpQXIpQXIqQ3QqRHYpQXI8brT///8uTYMpQnM5Zqg5ZqnS1+I4ZaY4ZactSn8uRnYrQ3MrRXgsRHUsR3s8bbM8brMtSX4wUosxVI01XZw2X50vUIguToQvR3c6X5o6aKs6aq08Un8qQnM9VIFDWINJXohKcKlXapEqQ3UvUIc2X55bhcBdcJVgcpdhfapmd5tuk8dxgqJ1hKR5jbB6iah/m8Shudq3v9C4wNG/x9bFy9nFzNnFzNrIz9zK0NzK0t/O2+3P1eA2YaDU2eTb3+jb4Oje4urj6fHm6e/s7/Tz9fj3+fz7/P38/f3+/v83YaEa/NNxAAAAHnRSTlMABAoVGyY1SVlpeIuQsLfDzdHW4+3y8/b39/n6+vr4+ns8AAAAyklEQVR4XiWN5XrDMAxF75KOknYdZJS0klNmHjMzMzO9/wvMcH7I37mSJShsJ+5NjMT6umDoHyXDcI/2qJadh++P3cle1de+9yPe3/bTY92wzfzr7wGtP3JrAI72BZGVtcAdQlwHy+JS1pDbBE9qamZF3BYrjQxPEXwKc6dC8bXFm0QIpmt8kn0Rn093q82UCtK8oXZckwFJzuulV8bHkajPyXdbnJnARfDHs0trz+JQ+5AFvzp/L0+cL2qPAINUPrq5OC6p/64F/AMnrST+Dq/r7QAAAABJRU5ErkJggg==', - 'FreeBSD': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAABIAAAASABGyWs+AAAABmJLR0QA/wD/AP+gvaeTAAADXklEQVQYGQXBS2wUZQDA8f83j33M9rF9d7u4loaWklaDpkSo9KDGaIKUaGxshD2YSPRiuDVeTDyhBxosJCoa40ktpAkPDcUqAYVIpUSUPrAulEdD2bbb7e7ObGcfM/P5+4kwKDvq6yJ1FYYcvb+YAkqAHo/HQ7FYrFIoCiurq9ZXJ06YSOkA+kBzfX06bys3zHxS9EL0tXDVyZfefacqV+X/ZSJx5+qLbx98LhaL9RiGEZWlEsWC/Thd9q6Pf3vs2u6Orc83rFsvTwwfLf5obgywT1Vjh2Hh+rbNsnTssJdNLedK5aIrpSuldKVXKsnH4+Pyn6FDXn5tMef9O+3NvdkvP1V4+EYw2AoQ+KSx8dRYS6NXXnwovaItXduSrrkinWxGOmZWJi9OyOK9m1LmsjIz9IH8QUMOd3WfAQwNKCy2tJwbHB5+XasPaxIHmc4g7WWEZ1MquBiRFlJTf1E7+Tl/H/8asavPzTY1nWd2ZkMDRPeBeHPz5ojwsilEQCBvTSKunCF3M8FSNkBGVTHDYYrLj8jVNhDZ2SMa2zo3MTamaIC/u6Ojr3DtrOrvP0BpdATnyBeIhTxpR5ABUlKSUlXS1dWstbVxdz6hPL0l1quGqkLaKwNvVcjEXNRd/4mit4Z19DjefBEPyCKxgQJQcF28dBrHNDGTSZSezsjeff0hraa2Vs2vrvit81O4vj9xLJcC4ADrQA7YAGqBGsAql/EtLdFQE/L7dF1XZmdnSrbPMJfXoLDmolQK8gJyQBowgQhQDRQBD+hsraVhd4e5MH+/oExfvWLJ9q3/3S7qMpNH2hsS40kFS4EUUAMA2IANRIBXv4uzuO67c2PykqkA5YmZ6bN18YPi0Yoknxc4AsJPCMLVAk2BLKDosCWqs/PZaulkuxk9fekcUBAAQGDks5FT0W++3NuYuC0DVUL4DIEdlIQDAj0IRkigaMjArkFx0tf523sffrQHyKsAgHPhwoXLL+yP9/kePNhk5ExUTyKFkJVAUAiCFZrQup4Rv9ftuLV/6ONBYBVABQAArMvJ5MXW7duD6P62sD8UrPAFRU1TpeCpCnGvPZr7WW///v0jpw+VC9ZdAAABAAAAAMLo7drWrmQyPWG/r8tnaGIjaM05ujr16x/ZBFh5AACA/wGZnIuw4Z4A3AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMi0wNy0wNFQxMDowOTo0OS0wNDowMOPVpFwAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTItMDctMDRUMTA6MDk6NDktMDQ6MDCSiBzgAAAAAElFTkSuQmCC', - 'Gentoo': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB9VBMVEUAAAD///+AgICqqv+AgIC/v9+Ojqqii9GAgKptYZKQkOmPj/ddUYBgW4eVjeCTgfiWjO5wbJaZkvPBvepkXomYkNldV4Bzbpl6dJ+Uj7ynoO6Vi+1qZI63se2mnudjXYjOy+GCfaqZjvWlm/Pc2e+Oh7NeWIOWjfeXjeW1sd+gl+diXIfp5/KHgKnn5/F2cZx6c6ZgWoXc2e6dltrAvNu0scrX1eTOyujCvup4c5qpovVpY43///+6uPPJyPXq6fvm5vrz8/z8/P7+/v/d3PixqvmxrPSyrfe0sPO0sfS3tMve2/3r6vy6ufPz8/3d3fi3tM63tPO4tsu5tsu5tvO6tfe6t/Vva5KRjKy7tvW7t/W9vPO/vM+/vvPCwfPEw/TFwvTFxOfGxfTGxvTHxvTIx/TJx/aTiOrNzPXNzfXQzfnRzuHS0fbS0vbT0uHU0e/U0uTU0/bW0+zW1ffX1vfY1/jZ2Pjb2/jc2uSTiemVkLSlnvbe3PTe3vng3fzg3f3g4Pnh4Pnh4fri4enj4/nk5Prl5Prm4/ymn/bn5vro5/rp6O/p6funoPWsqs3t7Pvt7fXv7vzv7v3w7/nx7/3y8f3y8v3z8vytqPWuqPX09P319P319P719f339v739/34+P35+f37+/+uqev9/f6vqvSwrPQAR0dcAAAAPHRSTlMAAQIDBAgJCwwVFyAsNUFHSVBneH+Bh4mVmZmanKCxsrK2tr3ExtDW19rb4ODl5u3t7u/w8/T6+/z9/f4MkNJ1AAAA8ElEQVR4XjXNw5aDURSE0YrRtm3b54+dtm3btm3bz9k3Wek9+2pSYFwT8ibzE93hwAtdJqK3nZo4J9hFXbP+vFHOthV6gnGzstZq94wdCs4UCCDymQ2v7X0LdYoSQ0MIENRYzJbRlPTTHu73ZNAL8vivmVui98PpzuqffX0mIPHJGtOQenukteJ+aS3b9htNpDnT9TeZH1bHAwBRMhGpd6e6uNrLoRgxBKmsX47nBlp678ojpEA40fejcmW4e/No0V8IIPfj6eKgbEJ3ZUnzgE1OqWp9Q3VeWRAsg51f1dZ8c31RmAsc+N5JGbG+zvj3BzDCPrzMDC9SAAAAAElFTkSuQmCC', - 'Mint': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACVVBMVEUAAADh4eEAAAAAAAAAAAAAAAAAAAAsLCyXl5dgYGCnp6eTk5N3d3fBwcGqqqq8vLzNzc3Ozs7Ozs7Pz8/Pz9DQ0NHR0dLS0tLS0tPT09Pf3t/Pz8/i4eLb29vZ2drZ2tna2dra2trf3t/u7O/u7e/u7O/r6+vt7O/w7/Lw8PDy8fTz8fXz8fbx8fHz8/P19fb49/j49/n6+vuPxlmWyGOx437h9NDr9eD6/fj////+/v75/vTA5Jv6/fb7/fnL5bDL5q+AxjeDxUCEzTyGxUaGzjyHxkiHzz6J0D+Kxk6K0kCLyE2M00WNy06P00mSz1OUyF+W2FGX1FiY0F6Z02CZ21ac0Wiez2yfz2+f2mOh4GCi4GOi4WKi4mOk12+k3Wul32um1Hin0nun4G6n5Gin5Wmo23Op2Huq1n+q43Cr526s4Hit23+v6XSw34Cw34Gw6nWx4IKy4IOy44Cy63ez146z34az4IWz4YW03Y217nu38H2625e645G74pK83pu98Iq984W+4ZjA4px0tzDA5ZrB8ZDC5p7D55/E947F6KHF+JHH4qvH6qTI46/K5LLL5LN1tzLL5bN1uTDL57DM5bPM6qzM66/N5rTP6LbP6bTR6rfS573T67vT7LrV7r3X68XX7MHX773Y77/Y9rvZ8cHa7cjd88bi88/j8tTk8djk9tHm8trn89vo89zo9N3p9N3p9d7p9tvq9d/s+93s/dzy+erz+O73+vT4/PX5/fT5/fX5/vN1uzB3vTD6/ff6/fh5uTj8/fv9/vr9/vx8wjV/xDmrMRH0AAAAOXRSTlMAAAECAwQJDzk/RUlNU3F0kpSVlpeYmpucnaKjpKWqqqqtu8LExMTEzdTU1NXY4evy8vP+/v7+/v6LaR1mAAABD0lEQVR4XiXI03bEABAA0KltW9kaW3eSZW3btm3btm3b/q4mp/fxgqKOtpamhrqaqoqykrQYABh+PVMU9fjE5Xp8o54kgPHN0EBHU2N5YXZykiua0HHd2759VF2Sk5IYE5GGsmCEWLV1kVWwt5O+3x/qpgsy8k4ja+cJl2/v5C22tlgCAHtw9TQSa4s+AzfPSm0BRNl9SydhWJzLC567KrNhgrNwHIJ5qTz/2f9w7Jw/DNqIjVr04exW0AEOXcN3Ab7enr9eDW2VTJgehONyc2Z8XP5YdD0Tcuhcc4/r45OjGX51TEjYPbh8THRPvbz+CHusgSZlT7rP8PkCwfQKaQUi9Igr6JsRBMFiWZgb/AHKElRzKopZJQAAAABJRU5ErkJggg==', - 'Osx': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABrVBMVEUAAAD///////+qqqr///+ZmZn///+qqqqAgID///////+tra339/eAgICoqKjx8fGMjIzm5ubh4eGPj4/g4ODIyMiAgICSkpKLi4vS1tbPz8+Xl5eMjIypqanIyMjW1tZ2dnbR0dGamprFxcV3d3d+fn60tbV3d3dcXFx3d3epqal7fHxxcXF+foCnp6hYWFhyc3Ojo6SMjI5fX196enp+fn6Li4xERERqamqgoKFpaWmFhoeen6A/Pz9QUFCWlpeSk5SUlZWUlZaOjo+Tk5RHR0cuLi5YWFgwMDAeHh40NDQ3Nzc6OjpcXF1rbG0XFxdSU1NVVVVXV1dZWVlbW1tnZ2lwcHABAQEEBAQXFxchISI+P0BISUpaW1xHR0kNDg4qKyszNDU1NTY9Pj8NDQ1cXF4XFxhSU1QSEhIDAwMrKywtLS4uLi4wMDFHSElISEggISE0NDVJSktNTU1FRUVWVlhGRkYEBAVBQUE0NTZQUVJQUVMFBQUqKitWV1lXV1daWlpaWlw+Pj8bGxtcXV9dXV1fX19fYGFgYGBkZGRlZmhpaWlsbGxwcHB2dna844Y9AAAAV3RSTlMAAQIDAwUFBggMDhkeICMkKCgqMDIzPj9ERFBib4CCg4iMjZCcnp+jqamrw83W1tvb3ePl6Ojp6+vs7u7v8PHy9PT09PT3+vr7/f39/f39/v7+/v7+/v50ou7NAAAA30lEQVR4XkXIY3vDYABG4SepMdq2bRSz/capzdm2fvOuDO397Rw0Ly4tz2QAQPbcxuZ2E/STJwfxPhWgG355fRrVAIVb1zeP9UDLfiSwkAcADe8fn7tFxWuEXFRDoer/OgoMTRBCumj8yJwPBo8Zhpk14U856/HI8n0ZUtpZ1udrSzfVneA4roNKjdrwpcMRilb8d8G60+lKnrpWcn9bO+B23w2O8Tzfq4aiNSZJqzn5O4Kw16h06fPZ+VUlUHfo97+VAEb7rSh2UgDd4/U+TBlQY7FMj5gBIGvcarVVfQPVPTG94D0j9QAAAABJRU5ErkJggg==', - 'Rhel': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABj1BMVEUAAAD///////8AAAD///////8AAAD///8AAAD///////8AAAD///8AAAD+/v4AAAAAAAAAAAArKysAAAD///////8AAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAD///8AAAAAAAAAAAAAAAB5eXn+/v5JSUnKysrS0tJ5eXmqqqqxsrL+/v4ZCgknJyeHh4eIiIjo6OgZCAdOTk7t7e3///8GCwwPAAArKyv19fX29vb9/f0EAAD////+/v4AAAAGBgYHAAAJAAAMAAANAQAPAQAVAQFyCQV9fX2pIRzmEQjn5+cBAAAFAAAAAADnEQjvEgn////uEQjyEgnsEQjzEgnxEgljBwPaEAj9EwnwEglHBQJHBQNNBQIBAAB3CQR5CQSHCgWLCgWRCgWTCwadDAWmDAapDAa/DgfKDwjWEAgGAADh4eHiEQjmEQjmEQkKAADoEQgLAQDtEQgMAQDuEQnvEQjvEQkPAQAfAgEuAwEvAwE8BAL1Egn3Egn4Egn6Egk+BAL+/v5CBQJrB0muAAAAT3RSTlMAAAMEBAkYGhsbMTRLUmpvcHeIjLe6vcHCxM3P0NbW3Ojp6u/w9ff5+fn6+vr6+/v7+/v8/Pz9/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+Q8UoNAAAAO5JREFUeF4tiwVPA0EYRL9SXIsWl+LuxfcOd2Z3764quLu788NZNrxkksmbDP2R7vH6GioLs+iffEzNXd4+TqPErUUpVqMOvwgdzMPn1rv5vPsVeufBTaBK/bH2FPvkEUuIG5jIIc+sHYn/HJ3dC/Hxuo4y8s44dzwBbFkisHN8bVIdXs6jb+H97aCwbHEIqgcml64CD7YllNkAVQC940MLYe5YzvIeQAXNrd19Roc5MdzfdQLUUKaUYyuG9I8y1g4gj6hIak4X5cBIT2MquZJrJdOqpY11ZpAiqVwbY/C7KY1cRCrZxX4pWXVuiuq/hs49kg4OyP4AAAAASUVORK5CYII=', - 'Sabayon': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABvFBMVEUAAAAcUaYdVKwAAAAAAAUABAwWRY4YSZYhZtIhaNYHDx0KCgoFDBcKCgoRMmYSNm0fXL0fXb8AAAAYS5gaTp8fXLwgXsEGBgYFBQUZSpgZTZ4JFSgODg4IEiIOJkwOKVIkW7EnXbQLGzUTExMKGC8LHjwMIkITExMiIiIPEBEPJ00QEhMXOXAaPncOJEgoXbApXbEcHBwwMDAEAgAfHRgQDgo3NC8AAAAHBwcKCgoLCwsJCQkaGhofHx8lJSUwMDA0NDQ4ODiRkZEICQocHBweHh4GBgYHCg8mJiYnJycpKSkrKystLS0uLi4ICAgODg43NzcRERF1dXUUFBSjo6O1tbUbGxsEBAMLGS8MDA0iIiIjIyMkJCQNDQ0NHTYKCQkoKCgPDw8QEBArMDkKCgkRERIREhMxMTEyMjISIz00Njk1NTU2NjYCAgIVFRU5OTo5P0c8PD0+Pj4/QURAQEBHR0dKSkpMTExSUlJiYmJlZWVnZ2cWFhZ2dnZ4eHh8fHx9fX2FhYUXFxeVlZWXl5eYmJiZmZmcnJwZGRmlpaWrq6usrKyvr68KFiq/v7/FxcXY2Nji4uLn5+ft7e0yif9uAAAAN3RSTlMAAAApKSkqKioqg4OEhISEhoa1tra3t7y9vr7S09PT09TU+Pj5+fn5+/v7+/v7+/v7/v7+/v7+70RY/wAAAPpJREFUeF4dyWNjw2AUBeC7dfYyorM6rx1exKltzLZt2/rDa/J8OgBVVlFDX39jcTZoUqCse251a2dvu6ccUtWlanLQ4Vpel+ThlWq1l3wEz58tx4dOt1dMlAJk9A5gMjG75LHwo46hzkwosGOMbejumoRvubC9EOrMviT0E0Us9fvN9dA6zxJCNv6+ECGsb6oNWsgmpZT9/UTUZo3Em6AW34guTL4jiAudiCM1kLcw8/SmHERfT1/eueBiDqR1GK1n9w+K8nglxYxd6QAML4ztXoQuj8YFgWcgqdJp8qzty26vaboCNIxBCshyQDKov0aXr29v1ufq1PwPx5Q7bCoh6eoAAAAASUVORK5CYII=', - 'Slackware': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AcEDi0qZWWDgAAAAx1JREFUOMt9kktoXHUchb/ffc1M7rySSdJMOknFPMRitLgoNKKI8ZHGKkgrjU8SitidimSh2UkXoQmoO1dGQSxJjdvOtqSaqlR0USEGSjVJGxuSmWR6M3fu4/93YX0g4rc9HA6cc4Q7DI+fpzz7PA8++2mxvZAeBZ4xhHtFcJRmXWsWvb36/OLcyxf5B/KHeYHy7DmGx1+YSDjmWTdlobTGMAStQGkNoLXS4tXDq7u7tUcWz49tA8jR8QUuzB5n5NTCV13F9JEo1JJwTLKuzU61QiOMcd0UDb+BncwQK3Rl15eNja3ui/Njq8aF2eMcO/XlBz0H8oO2ZUkum6A13WB99TtyzXlaCi24SaFa+ZFCzsG2DNnfkdbFjsI1APPhk+d6ujqznycdCxFozadYWvyMpx47wa+bPkGksKwUNnsk3TaCGASRXDZh5LpHXPPg4Rcni+3uYBxrtBbQghlscOVKmYHeEm0ZIZ9xyLffw41ND6VAa43SmjiMByzHYtjzwr9arfshxf5jOKlvKZfn8es77N2uks24PPfSFD/9Uvt7AtPKWmEU9d645eHYJo5tcKi/FX/zG+zmQxQH+rANk862DOW5N/hhaY64cJSa5xNFCgDDILZACMKYWAmh73HmzFsMlBQJ06LeiMinE1S3KzRCm5rXIIoUIoKIYCVM36urZFbEoiBLNMIhAE6/NsSB7h6SKZdL8xsUOnpx9j1KbTdARACIowArYe1ergfNT2i0mIbJys0GI6PT3N1/hJvrPxOFdRJNBQIy/FapI4Bpgohgcjuw+jq8jy8tV55MNBWI4ohS802CpizKv8q+FgALZAfYgSyAZtNro1oLaU1VvxCA029Oraxs7u/tKnXiNjn8HyKwur6lI++6vPK4V7IA7u+1Dyu1tr183ddNbkHuXP8/zEIYeFqiLRl6YO/p0bHJdflT/PD9qZa1W+ry99fcvlAlcZwUpuUAglIRYVgnDEIOlna4q0M/NPnuO1/PzMwg/045O/XeibUt5/Xangx6viSVFpK2jtMpvdyWCz+5ryf10clX3/amp6eZmJjgd441URWWJY8BAAAAAElFTkSuQmCC', - 'Trisquel': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABjFBMVEX///8AAAAAAAAAAAAAADMAAGYAAAAAHFUAGWYAF10AImYAIGAAHloAHGMAKGsAGmYAJmYAJGEAKnUAJ1gAMXYAJnEAJGQAI2EAK28AK3cAGTEAMHgALXEALXgALG0AFUAAI2oAK3EAMngANoYALXMANIAAM4IANIIAL3gANIcANokANoQANYQAOY0ANIYANooAN4kAN40AOY0APZMANIUAOY0AO5AAPZUAPJAAP5MAPpQAQJUAOYsAPpYANoUAPpoAPpUAM4AAQJkAPZIAPJEAQpgAN4cAPpQAPZUAPJEAO4oAOosAOo8AQJoAOYsAO44AQpsAO48AQp0AP5UAQpoARJwAQ58ARaAAQZgAQ54AQ50AQpgARaIARqMARaMARaIAR6QARaIARaEASakARKEAR6MASqsARKEASKcAR6MARqYAR6UATbEATa8ARqUARKAAR6oARqMASKgATK8AR6QATbIATbAASq0AR6cASKgASqwAR6UASKcATa8ASqoASqwAS6wASKoAS60ATbHn4CTpAAAAhHRSTlMAAQIFBQUGCQoLDxAREhMUFBUYGhobHB0eHh8gIiIjJCQkJCYoLC0xMTE0NDo6Oz1BQUNHSUxOVFVVVldaWl5iY2RkZWZoamtsb3FycnR1ent9f4KDhIiJioyNkJGYm5+foqOkpqamqKmqrKytsLKzs7e4uLy8v8TFxcXGx8rO0NXY2eZc4XYcAAAA00lEQVR4XkWN1VoCUQAG/3NWtwh7CTsQJOyk7BaDxuxA6bbrxf32gt25m7kZqDRYxziooDV7+1AalMUavQh2AsEZoWvzigLun+T17/c8QiJZ7qu2QKiNmyZthdcR1/as353jIeU1GxMHo5XHdqPFeX8IaDMdHPYN6dRN7LR4qQewdTa35HWkyh+fbxERAMjwlAWJv3CPSKDQ+H7XvHdkV4Pua3Gtm4sPKIF/WV8dop4VKBw/NU33B3x1JbTt+XwhkJQoqRfWvHOy28uqH8JIdomR/R+s9yR3Cso77AAAAABJRU5ErkJggg==', - 'Ubuntu': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABKVBMVEX////ojFzplGf1zbnqnHLvs5P10b3yuZv1xKrytZXvtJXys5LysI32waT0n3HxiVHwg0jxhk31kFn0h0zxf0P0hUrveTv2iU3yfkD1hEfyejv5eDLybSX0aR7zZxvyayH6ZxnxZBj4YhH7XAb5WALlUQLeTwHgUAHeTgHfTwD65NzdTQDdTQHdTgD31MfcTgLcTADcTQD////xt5/31Mf54dfmfE/dUAbeVQ/jcUDcTgHeWBnnflHohFvpjGbqkGztnX342Mz53dLgXiP65d399PHdUgrtoYLyu6Xzvaf76eLfXB/rkm/fWhvupojwrpTeVhTgYSfgYynzwa30xbL1ybnngFT31snngljhZS3539XhZzDiajbibDn77OX88Ovrl3X99vTjbz1fisGCAAAAMHRSTlMABgYGBwcHJiorMDA1NXGHjY2Nl5mZmZyfn6O5u8XHzc3X193j9fj4+vr6/f39/f08OUojAAAAx0lEQVR4Xi3HZVbDYBhGwQctWqzFPXiQ+36pu+LubvtfBKcN82/UEhld2vWXxyL6F92gbTPabse8hU/uHMx1SZoyyJWPTwq1Rs7GpYE9+Cg+OJcs1MHvU9y4fnrN31yUm18vMCIPjtw3QMndw4rs8ieVzAAcBlewpe1KM3uaBuD3Dda1BhWXAsi6AFY1a2SqifxZ+rnxWYcJDRkUS3fO1R5vwe+XZgw4D4L3RAJiknoXCVX3WeiUpJ5pIxTvVmg45pl5k4Ot/AGV2iqZBWgJJAAAAABJRU5ErkJggg==', - 'Windows': 'iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA+pJREFUOE+F0n84FHYcB3CWSsL9ojo/6ik64c6PnTjmSS0limmrpBm2G002y++xzXRz6zE0R4nbw+RnTj/WD4sbanLkkAe55ccYlyNme4SrO9u9d13PI3/saZ+/vs/3831ez+f9eb5aWsuqy2mjRYeNUa7YmtjfTico7jNJ8z0eG24NB9vvnDrvufzpq89Npnr8VjMddNmuRh9rDfp36mFg91oM7qPIc5JdbDJq3An/JfCu7Hl53W2lpS220pP2OuniN299jAYbYizSENIoAgbCTdrTKtxOJVdvGo8psUwKy7Vxe4ez1YEVudGP8YEZzyveInFJ6mZRHHqYazDspw/pJwTIuERM5JIwmUdGdyo9K7/BszGzzg6fXzZHGJ8KvzQqXKOpoIeZLjofWR++BPWyCEnPY4xFGEKWQcLjMjKmr1MwfcMYwmz/Y4KOgNki0V5k1dkjUWCK93Kp2PMFFawos8cm1gZ2GqjLXktL4mbQPHLQ4B9ZDFE5+S356fQlyuJMqzH++HnTo6ui2OO1ko9Ul+4fxfd3d4F7k4YTReqpuFS88bGZUE2QNNDobuIq8Q5CduHb7lFJaTnvnym9ergjMWD/FG8zf+aKS3G9JO5C01Asah6wUXrvALKEDoitMMHhDKrKJdg8RU2s0EB2EWWur8dd7PDPFv6dUC0Gv3kAN36VPRGP/5k5NS6lljWxG0TDiSr1VKhoPwhevRMSqkwRxDObc/DavGtpP6zoi8XOyZfhnyNEvKANBU0P8VPfI/wyNCGXSn7wlEmyA9KrgmOKGth3eDVvPfyywq2dnUEv2R9qG2rLsH7xJXziKnWcI8tlTvEC7Mu8hROlImTU9aKqcwQ1vWOihWFu+sJknmph5CvxQh87c7bNh/NXo03hrMCosyvLmMNgMF7TQL6J1dsZIUVwjKqEO+cajp5vxPN439U/gKBt8PTcYHzL/BgHCyOf4unAISj6mFC2bYC82kB5Ls460NHRUVsDeYSXpGw7UgC7sAtwShDgzdM38W7BbURXtqpqhfmB8sEQuXwoCM/6faGQuGCxyxyKWhIm+PrSD495WL3cT0hhi8Whc3NbAs9KaOyCTvrJ8qkdX19XBeTUDU00+55USFzVU2yHstcaix0mUAjJkJeuRU868Ucmk0lcguiBnMAVxjbbdHV1yeq8+u4Hgo22huSG+iQXp83ftaxW3lsPZcs6KG5T8OwaAfJiPcxlrVRVRhvF02i0F/t5VbHZ7JWDfErKTLnhE3mFPuRFepg/uxqz6TqLv6euGj3ut87t/4ylvre3t3ZehOWWO1zjSFEqMVP4GfGb/DBykJcjmaZOoLsc+hcVY/LaAgcTQAAAAABJRU5ErkJggg==', - 'OpenBSD': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AoYAykIPu64pQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADTklEQVQ4y32RXUxTdxjGn3N6eujoKT3SUkuk3VoBGfVjgFXAsZ7WkipyYXQbuu3CzUXZmGRbssnFEseFkWzgcGzGXky9MWL8TsC4IeFgtK4oAqOnG5vMVl1pCMVWQD7b/y5M6jLdflfvxfPked/nBQA0NDSChqnGVrLuGkES742NhJAdhAKAuk9yyUs5Gry7RQMZAARCWgivpQiPe71P5DUfH0xaqTL7m/iiLkJmphawa+e4SM2PvUyC4yUIBu8CnAQKAK53rCA5OUtQtStVpJ4Gw/FOBddZVKhCfq4MP4n6+at+DUsJm/e0G9JZzYEvI2tHwlEYjDxomkZ+3nG8WroRtHihZVOhVlorDQzh0okhcByDP4ZGcf+X9XAsvY5/RsBa7Kq5H/CqLctKyl/g08S2i6fq8W/MS3P34T9wNDVYSeDX1eTD9xhiLXbtB/Akwmmv6Kr+ICFkLpGhtNSM3qsSstS3oX8lSsmsxS6ZVn3j6PvVVqhUcvC8AtPxVPxwygVKvngN89WOjgVprggGA4eenjB4nsXsTASpC63I0wVTZYPR11FoKRB8Ax54PCFk6BhMTk5CPR3GSbHouGzknr/bYFq9EAvfc9Tu1sLjHcXNKxLuTOTgzOlOe7IHBc/beAXWpWmXlz8a84nhcLQ+ecVzsAEQrMWuMX+f9HZF2YPZ28FVSNfoPWqOzMUmqYMAJm7+/OOzXQFwHGpyEV+vi+yvtxBC9pDmpgJC4tvI3mo9GTitIxvW24nT7ug67HY/3eDs2bbyrVsrY2day70rV6kRfDAHk5lDLJqAmmeRiD9GJDKHvwb74R8G0mkTPjrQTTG122xkTTbwaV2b1H4u16JQKXGr7yG2b8/H1MQ09IsTSEmRwzf4CCwzD+dmE1re8CI7wwi5XNlFf9vaTXX4dWJg4LLl7h05fpNGwNAMWpp9CIVYNO/tRCzGwpDFQaVMQTS2CKY0BWr3GVGWNSXKACDDaA4Mh976pq9f5Sy09GgKlmeAMIBKzUKpU+BFoxJecRhUfAbMxDi4eADfHVmE79v7q575gvvYeVvjZ58LD5mwsKUyX0hnf0feslnQCWD4zxnc6reKisxsfH2oscqcmTmK/+Ow252cna7K52r+Bky6PqmoT5HBAAAAAElFTkSuQmCC', - 'Gnu': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AoYAywUV5gQrwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADcElEQVQ4y43Tb0jjBRzH8c9v+7nNMebcUW21Cc78g/wcuhByIScoMRwoTBmFlZCmIJ14axqkgoYIkXIqKIVBEuJNUBEUPRlpqDC3Q2Ex0nTezun2YOaPLXNIv7Vvj7zgiOj1+PPk/eADjuNEuHN6ekqMw+H4IzMz8xChUCjV1NT0JbO7uxtfXFy8NZvNr21tbd0AAEQikY6I0m1tbQbx2NjYZiqV+vn29jY+PDw8xhYWFj45PDzcb25uhlQqfSTief6X0dFRpqKigvF4PPPipaWlY7lcXhCLxXJnZmY+ZTY2NnzX19ePGxsbHw0MDLivrq5mc3Jy2pPJZLVWq/2cdbvdDSzLholoNJ1OMy6Xq0Ymk5HNZktOTU29qMgA8HYqlaKDgwNKp9M0PT09BgAM/iGuqqoimUx2yPP8U5/P9wEAMB0dHRUKheJHiUTyeGhoqAUAnE7nR0qlsjcQCLwjlsvlz+bm5mQWi0VSWlr6bXV1tU6hUMj6+/vfN5lMN0xxcfG1zWZ7SETTSqWSGhoamPHxcajV6s+8Xu9Xou7u7t9VKtW00+mkSCTC6PV6aDQa8Dw/Wl9fP8UAQCgUosvLSyovL2eWl5dRUFBw7Ha7v9vc3By5K3g1EAg8FQSBiIguLi4IgBwA2LtEjuPuJxKJ62AwKFpdXf0eQBIvYVmW/cLlchEAWK1WAADT09NzX6PR/OTz+eKVlZUzKpVqTyqVvsnzfLCkpGSrtrb2t97eXnFeXl5ZKpWyZ2RkPPP7/UUnJyefGI3GU+zt7aU4jotOTk7mAUBfX1+b1Wq9kcvlBIAcDgctLCyQxWKhoqIi6uzs/BoAVlZW3qqpqbllZmdnf1hfX//Q4/HEzWbzX+3t7fcMBgMFg0EYjUYmEolAEAREo1Hk5+fT+fk5Mzg4GD86OpJ0dXXJGQBoaWl5Ra/XP6yrq3tQVlam2N7ehslkAsuySCaTUKvVSCQS2NnZSXAcJxYEQTEyMvKeIAhLDADY7fZ7BoPhm6ysLFpbWzuan5//WKvVvsHzPEWjUSYSiSA3N5d0Oh0TjUaf+/1+S2Nj46/4FwYAr7e2tnbF4/E/iYjC4TCFw+F0LBaj/f19mpiYeID/IAagAyABYLXb7cLZ2Rml02nyer3POY6rwv8hEr34u0IkEk1mZ2cTgGMA7768/RtL5JKsGzrLIgAAAABJRU5ErkJggg==', - 'CrunchBang': 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAQCAQAAAC45EetAAAA8ElEQVR4XnWOsUpCYQBGz1TIHYu2Qix6g0DEtSeQu/UIISJtUS8gJq61F1wcdMohcBDxKUR8hsz1xA/y44/cs3znbB+RJ0Skl3pSkeFQbUs79VAPzrwPFRmN1Ja0Ug/16I93+1oi4lKte+zMXv32WuoAm43lXMrqzbFncgWw21lORf4+/PREKpAhYqZuPXZ+T/3yXbZEajV1JavUQ104sRcq0myqc5mnHurWqc/7yhExVwuPncl+C4Bu13L60ueAwcByOtLhgAIRCzU38fRGTmSxUBvSSD3Ui1NvQkXWa7Uq1dRD9R17HiqyRUSy1NP6B7e1Yu2GtlUKAAAAAElFTkSuQmCC', - 'Yuno': 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAPCAYAAAD+pA/bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAABDtJREFUOE+FlHtMm1UYxrtsi8aEgCb+oTFmZur+WNS5RaPERU10C2qGaBgb6hgwLwMmHTIKlIKlQIHSQrmU24BSSmnpBVooUmihtEC5yKWDjVu5uOkcEca4lG5E93j6EQmELX7Jky/fOed9fu973vMdGu0xT3Cgz57yXMZLDdXcy821PFWLKmuA6HqLMqtLX5POl4iYb2ukWW8IOOFe/qfe3/M4n0eOjwyZD8//bldODOk37N1yDJgl+LVdjEGLFKO9KkzZm8hbje7mIrTXZ7sMtTydrJh15H8hHW11XvN/jGS7VudcD5w34ZZzeQYb67fwYO03LN4exo1+LWzNxbA05O5QuzbHqRYn+++CHDx4YK9WLfaedfQzV5em54g5Zbi8OIml+VFMDLWQ7GXoaSmFWZsDZVGCO2u0EbkhHTrhFqi9PmelSsQ8tAtSVch60dpUeGe4kxgZxegzVkBzlQ2NKBG2+iJIMqMok9r8OLRIMqApToSqmAWTmk9B2+o2YW79oshU7ABcuvAFrVGWXkVKpBYoSaBSxIS2mINpiwbjZiUMZRloVfJQyaXDKObBpimBScpHFe8KmmXpaKhK3arGrBVuVBclHN2CiPNin1OVs1tVJYlQlyZBxA6DviQVo6ZaOKd7sTplw53BVugruBBzfsRslw7rZPxaczWutSpQV/gzJPxo1JexyfaxKBBpuiEx+tw+CpKdEvGWTprGlhcwqbIzL5/DYKMYndpK3L1hxf3ZfkrzwybUZjPhnOqmvlcmutFF1jis9QSShOrcWNSXJ1MA0ou/NZWc8Ddfe4VGO3bk0JON1dyMMlK+gmxNrZCFhZF2Kng7YNO0awt4b7wLNp2EqtAsF6ImP56SG0B6siovTYpIjg15gapCVhAfJRUyIBFEo6k8AyuTtkcC/qvG/XbDexulWJvqgYH0o0nKhVHFJ40XwFQnWM5OCX+XMg86c3KvVMSMapCmPpSTIygTxGKZZOcOXhrr3Mp4uzkFuG6B3ajE3TELDDU8qEmsmvRATxquKkxAnSTFjwKEfv3JU9JC5unG6rQ1bTkbQ4Yq/DVgxOqwBWt2K9Yne3ZCZvrgHO2k5paHzOhSiVCZSkdNTgzy40JRlPgDhDHBCxUZdCs91G8fLeK87zOl6XSOICZYXMGNhDqX9fDP/mbK2DXVi/szm03eLpejl5pzOfqwOt4JBT8OeYwQt/4R/BR0OzXiLCM5LOCji/4nXt46rpywgG+zor5RxgSdupBzJdglSY+5ZZbl3XNY6mbn7W0Lcx06zBg1WBjtcC6OmG+OmRTrFrnIUZESZeVeCpwh8TpiPsQ47/tloM97T+/6m8mg55mT3tStyL54mhlwwtszNvjzD8/6HH8i7PvvPPRioZdRWuDBZUR6pEWG7I8P9Xs1Jsj36MfvvO5J/+rTw58dP7afJPfBgeef3XGz/gskFVpJc4HwGwAAAABJRU5ErkJggg==' - } - }; - - ExpandComment = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Comment Expansion']) { - return; - } - if (g.BOARD.ID === 'g') { - this.callbacks.push(Fourchan.code); - } - if (g.BOARD.ID === 'sci') { - this.callbacks.push(Fourchan.math); - } - return Post.prototype.callbacks.push({ - name: 'Comment Expansion', - cb: this.node - }); - }, - node: function() { - var a; - if (a = $('.abbr > a:not([onclick])', this.nodes.comment)) { - return $.on(a, 'click', ExpandComment.cb); - } - }, - callbacks: [], - cb: function(e) { - var post; - e.preventDefault(); - post = Get.postFromNode(this); - return ExpandComment.expand(post); - }, - expand: function(post) { - var a; - if (post.nodes.longComment && !post.nodes.longComment.parentNode) { - $.replace(post.nodes.shortComment, post.nodes.longComment); - post.nodes.comment = post.nodes.longComment; - return; - } - if (!(a = $('.abbr > a', post.nodes.comment))) { - return; - } - a.textContent = "Post No." + post + " Loading..."; - return $.cache("//api.4chan.org" + a.pathname + ".json", function() { - return ExpandComment.parse(this, a, post); - }); - }, - contract: function(post) { - var a; - if (!post.nodes.shortComment) { - return; - } - a = $('.abbr > a', post.nodes.shortComment); - a.textContent = 'here'; - $.replace(post.nodes.longComment, post.nodes.shortComment); - return post.nodes.comment = post.nodes.shortComment; - }, - parse: function(req, a, post) { - var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - status = req.status; - if (![200, 304].contains(status)) { - a.textContent = "Error " + req.statusText + " (" + status + ")"; - return; - } - posts = JSON.parse(req.response).posts; - if (spoilerRange = posts[0].custom_spoiler) { - Build.spoilerRange[g.BOARD] = spoilerRange; - } - for (_i = 0, _len = posts.length; _i < _len; _i++) { - postObj = posts[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - a.textContent = "Post No." + post + " not found."; - return; - } - comment = post.nodes.comment; - clone = comment.cloneNode(false); - clone.innerHTML = postObj.com; - _ref = $$('.quotelink', clone); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - quote = _ref[_j]; - href = quote.getAttribute('href'); - if (href[0] === '/') { - continue; - } - quote.href = "/" + post.board + "/res/" + href; - } - post.nodes.shortComment = comment; - $.replace(comment, clone); - post.nodes.comment = post.nodes.longComment = clone; - post.parseComment(); - post.parseQuotes(); - _ref1 = ExpandComment.callbacks; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - callback = _ref1[_k]; - callback.call(post); - } - } - }; - - ExpandThread = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Thread Expansion']) { - return; - } - return Thread.prototype.callbacks.push({ - name: 'Thread Expansion', - cb: this.node - }); - }, - node: function() { - var a, span; - if (!(span = $('.summary', this.OP.nodes.root.parentNode))) { - return; - } - a = $.el('a', { - textContent: "+ " + span.textContent, - className: 'summary', - href: 'javascript:;' - }); - $.on(a, 'click', ExpandThread.cbToggle); - return $.replace(span, a); - }, - cbToggle: function() { - var op; - op = Get.postFromRoot(this.previousElementSibling); - return ExpandThread.toggle(op.thread); - }, - toggle: function(thread) { - var a, inlined, num, post, replies, reply, threadRoot, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - threadRoot = thread.OP.nodes.root.parentNode; - a = $('.summary', threadRoot); - switch (thread.isExpanded) { - case false: - case void 0: - thread.isExpanded = 'loading'; - _ref = $$('.thread > .postContainer', threadRoot); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post = _ref[_i]; - ExpandComment.expand(Get.postFromRoot(post)); - } - if (!a) { - thread.isExpanded = true; - return; - } - thread.isExpanded = 'loading'; - a.textContent = a.textContent.replace('+', '...'); - $.cache("//api.4chan.org/" + thread.board + "/res/" + thread + ".json", function() { - return ExpandThread.parse(this, thread, a); - }); - break; - case 'loading': - thread.isExpanded = false; - if (!a) { - return; - } - a.textContent = a.textContent.replace('...', '+'); - break; - case true: - thread.isExpanded = false; - if (a) { - a.textContent = a.textContent.replace('-', '+').replace('hide', 'view').replace('expanded', 'omitted'); - num = (function() { - if (thread.isSticky) { - return 1; - } else { - switch (g.BOARD.ID) { - case 'b': - case 'vg': - case 'q': - return 3; - case 't': - return 1; - default: - return 5; - } - } - })(); - replies = $$('.thread > .replyContainer', threadRoot).slice(0, -num); - for (_j = 0, _len1 = replies.length; _j < _len1; _j++) { - reply = replies[_j]; - if (Conf['Quote Inlining']) { - while (inlined = $('.inlined', reply)) { - inlined.click(); - } - } - $.rm(reply); - } - } - _ref1 = $$('.thread > .postContainer', threadRoot); - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - post = _ref1[_k]; - ExpandComment.contract(Get.postFromRoot(post)); - } - } - }, - parse: function(req, thread, a) { - var link, node, nodes, post, posts, replies, reply, spoilerRange, status, _i, _len; - if (a.textContent[0] === '+') { - return; - } - status = req.status; - if (![200, 304].contains(status)) { - a.textContent = "Error " + req.statusText + " (" + status + ")"; - $.off(a, 'click', ExpandThread.cb.toggle); - return; - } - thread.isExpanded = true; - a.textContent = a.textContent.replace('...', '-').replace('view', 'hide').replace('omitted', 'expanded'); - posts = JSON.parse(req.response).posts; - if (spoilerRange = posts[0].custom_spoiler) { - Build.spoilerRange[g.BOARD] = spoilerRange; - } - replies = posts.slice(1); - posts = []; - nodes = []; - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (post = thread.posts[reply.no]) { - nodes.push(post.nodes.root); - continue; - } - node = Build.postFromObject(reply, thread.board.ID); - post = new Post(node, thread, thread.board); - link = $('a[title="Highlight this post"]', node); - link.href = "res/" + thread + "#p" + post; - link.nextSibling.href = "res/" + thread + "#q" + post; - posts.push(post); - nodes.push(node); - } - Main.callbackNodes(Post, posts); - $.after(a, nodes); - return Fourchan.parseThread(thread.ID, 1, nodes.length); - } - }; - - FileInfo = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['File Info Formatting']) { - return; - } - this.funk = this.createFunc(Conf['fileInfo']); - return Post.prototype.callbacks.push({ - name: 'File Info Formatting', - cb: this.node - }); - }, - node: function() { - if (!this.file || this.isClone) { - return; - } - return this.file.text.innerHTML = FileInfo.funk(FileInfo, this); - }, - createFunc: function(format) { - var code; - code = format.replace(/%(.)/g, function(s, c) { - if (c in FileInfo.formatters) { - return "' + FileInfo.formatters." + c + ".call(post) + '"; - } else { - return s; - } - }); - return Function('FileInfo', 'post', "return '" + code + "'"); - }, - convertUnit: function(size, unit) { - var i; - if (unit === 'B') { - return "" + (size.toFixed()) + " Bytes"; - } - i = 1 + ['KB', 'MB'].indexOf(unit); - while (i--) { - size /= 1024; - } - size = unit === 'MB' ? Math.round(size * 100) / 100 : size.toFixed(); - return "" + size + " " + unit; - }, - escape: function(name) { - return name.replace(/<|>/g, function(c) { - return c === '<' && '<' || '>'; - }); - }, - formatters: { - t: function() { - return this.file.URL.match(/\d+\..+$/)[0]; - }, - T: function() { - return "" + (FileInfo.formatters.t.call(this)) + ""; - }, - l: function() { - return "" + (FileInfo.formatters.n.call(this)) + ""; - }, - L: function() { - return "" + (FileInfo.formatters.N.call(this)) + ""; - }, - n: function() { - var fullname, shortname; - fullname = this.file.name; - shortname = Build.shortFilename(this.file.name, this.isReply); - if (fullname === shortname) { - return FileInfo.escape(fullname); - } else { - return "" + (FileInfo.escape(shortname)) + "" + (FileInfo.escape(fullname)) + ""; - } - }, - N: function() { - return FileInfo.escape(this.file.name); - }, - p: function() { - if (this.file.isSpoiler) { - return 'Spoiler, '; - } else { - return ''; - } - }, - s: function() { - return this.file.size; - }, - B: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'B'); - }, - K: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'KB'); - }, - M: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'MB'); - }, - r: function() { - if (this.file.isImage) { - return this.file.dimensions; - } else { - return 'PDF'; - } - } - } - }; - - Fourchan = { - init: function() { - var board; - if (g.VIEW === 'catalog') { - return; - } - board = g.BOARD.ID; - if (board === 'g') { - $.globalEval("window.addEventListener('prettyprint', function(e) {\n var pre = e.detail;\n pre.innerHTML = prettyPrintOne(pre.innerHTML);\n}, false);"); - Post.prototype.callbacks.push({ - name: 'Parse /g/ code', - cb: this.code - }); - } - if (board === 'sci') { - $.globalEval("window.addEventListener('jsmath', function(e) {\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(e.detail);\n } else {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push('ProcessBeforeShowing', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);"); - return Post.prototype.callbacks.push({ - name: 'Parse /sci/ math', - cb: this.math - }); - } - }, - code: function() { - var pre, _i, _len, _ref; - if (this.isClone) { - return; - } - _ref = $$('.prettyprint', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - pre = _ref[_i]; - if (!$('.pln', pre)) { - $.event('prettyprint', pre, window); - } - } - }, - math: function() { - if (this.isClone || !$('.math', this.nodes.comment)) { - return; - } - return $.event('jsmath', this.nodes.post, window); - }, - parseThread: function(threadID, offset, limit) { - return $.event('4chanParsingDone', { - threadId: threadID, - offset: offset, - limit: limit - }); - } - }; - - Keybinds = { - init: function() { - var init; - if (g.VIEW === 'catalog' || !Conf['Keybinds']) { - return; - } - init = function() { - var node, _i, _len, _ref; - $.off(d, '4chanXInitFinished', init); - $.on(d, 'keydown', Keybinds.keydown); - _ref = $$('[accesskey]'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - node.removeAttribute('accesskey'); - } - }; - return $.on(d, '4chanXInitFinished', init); - }, - keydown: function(e) { - var form, key, notification, notifications, op, target, thread, threadRoot, _i, _len; - if (!(key = Keybinds.keyCode(e))) { - return; - } - target = e.target; - if (['INPUT', 'TEXTAREA'].contains(target.nodeName)) { - if (!/(Esc|Alt|Ctrl|Meta)/.test(key)) { - return; - } - } - threadRoot = Nav.getThread(); - if (op = $('.op', threadRoot)) { - thread = Get.postFromNode(op).thread; - } - switch (key) { - case Conf['Toggle board list']: - if (Conf['Custom Board Navigation']) { - Header.toggleBoardList(); - } - break; - case Conf['Toggle header']: - if (!$('#menu.left')) { - Header.menuButton.click(); - } - Header.headerToggler.click(); - break; - case Conf['Open empty QR']: - Keybinds.qr(threadRoot); - break; - case Conf['Open QR']: - Keybinds.qr(threadRoot, true); - break; - case Conf['Open settings']: - Settings.open(); - break; - case Conf['Close']: - if (Settings.dialog) { - Settings.close(); - } else if ((notifications = $$('.notification')).length) { - for (_i = 0, _len = notifications.length; _i < _len; _i++) { - notification = notifications[_i]; - $('.close', notification).click(); - } - } else if (QR.nodes) { - if (Conf['Persistent QR']) { - QR.hide(); - } else { - QR.close(); - } - } - break; - case Conf['Spoiler tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('spoiler', target); - break; - case Conf['Code tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('code', target); - break; - case Conf['Eqn tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('eqn', target); - break; - case Conf['Math tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('math', target); - break; - case Conf['Toggle sage']: - if (QR.nodes) { - Keybinds.sage(); - } - break; - case Conf['Submit QR']: - if (QR.nodes && !QR.status()) { - QR.submit(); - } - break; - case Conf['Watch']: - ThreadWatcher.toggle(thread); - break; - case Conf['Update']: - ThreadUpdater.update(); - break; - case Conf['Expand image']: - Keybinds.img(threadRoot); - break; - case Conf['Expand images']: - Keybinds.img(threadRoot, true); - break; - case Conf['fappeTyme']: - if (!$('#menu.left')) { - Header.menuButton.click(); - } - FappeTyme.input.click(); - break; - case Conf['Front page']: - window.location = "/" + g.BOARD + "/0#delform"; - break; - case Conf['Open front page']: - $.open("/" + g.BOARD + "/#delform"); - break; - case Conf['Next page']: - if (g.VIEW === 'thread') { - return; - } - if (form = $('.next form')) { - window.location = form.action; - } - break; - case Conf['Previous page']: - if (g.VIEW === 'thread') { - return; - } - if (form = $('.prev form')) { - window.location = form.action; - } - break; - case Conf['Open catalog']: - if (Conf['External Catalog']) { - window.location = CatalogLinks.external(g.BOARD.ID); - } else { - window.location = "/" + g.BOARD + "/catalog"; - } - break; - case Conf['Next thread']: - if (g.VIEW === 'thread') { - return; - } - Nav.scroll(+1); - break; - case Conf['Previous thread']: - if (g.VIEW === 'thread') { - return; - } - Nav.scroll(-1); - break; - case Conf['Expand thread']: - ExpandThread.toggle(thread); - break; - case Conf['Open thread']: - Keybinds.open(thread); - break; - case Conf['Open thread tab']: - Keybinds.open(thread, true); - break; - case Conf['Next reply']: - Keybinds.hl(+1, threadRoot); - break; - case Conf['Previous reply']: - Keybinds.hl(-1, threadRoot); - break; - case Conf['Deselect reply']: - Keybinds.hl(0, threadRoot); - break; - case Conf['Hide']: - if (g.VIEW === 'index') { - ThreadHiding.toggle(thread); - } - break; - default: - return; - } - e.preventDefault(); - return e.stopPropagation(); - }, - keyCode: function(e) { - var kc, key; - key = (function() { - switch (kc = e.keyCode) { - case 8: - return ''; - case 13: - return 'Enter'; - case 27: - return 'Esc'; - case 37: - return 'Left'; - case 38: - return 'Up'; - case 39: - return 'Right'; - case 40: - return 'Down'; - default: - if ((48 <= kc && kc <= 57) || (65 <= kc && kc <= 90)) { - return String.fromCharCode(kc).toLowerCase(); - } else { - return null; - } - } - })(); - if (key) { - if (e.altKey) { - key = 'Alt+' + key; - } - if (e.ctrlKey) { - key = 'Ctrl+' + key; - } - if (e.metaKey) { - key = 'Meta+' + key; - } - if (e.shiftKey) { - key = 'Shift+' + key; - } - } - return key; - }, - qr: function(thread, quote) { - if (!(Conf['Quick Reply'] && QR.postingIsEnabled)) { - return; - } - QR.open(); - if (quote) { - QR.quote.call($('input', $('.post.highlight', thread) || thread)); - } - QR.nodes.com.focus(); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }, - tags: function(tag, ta) { - var range, selEnd, selStart, value; - value = ta.value; - selStart = ta.selectionStart; - selEnd = ta.selectionEnd; - ta.value = value.slice(0, selStart) + ("[" + tag + "]") + value.slice(selStart, selEnd) + ("[/" + tag + "]") + value.slice(selEnd); - range = ("[" + tag + "]").length + selEnd; - ta.setSelectionRange(range, range); - return $.event('input', null, ta); - }, - sage: function() { - var isSage; - isSage = /sage/i.test(QR.nodes.email.value); - return QR.nodes.email.value = isSage ? "" : "sage"; - }, - img: function(thread, all) { - var post; - if (all) { - return ImageExpand.cb.toggleAll(); - } else { - post = Get.postFromNode($('.post.highlight', thread) || $('.op', thread)); - return ImageExpand.toggle(post); - } - }, - open: function(thread, tab) { - var url; - if (g.VIEW !== 'index') { - return; - } - url = "/" + thread.board + "/res/" + thread; - if (tab) { - return $.open(url); - } else { - return location.href = url; - } - }, - hl: function(delta, thread) { - var axe, headRect, next, postEl, rect, replies, reply, root, topMargin, _i, _len; - if (!delta) { - if (postEl = $('.reply.highlight', thread)) { - $.rmClass(postEl, 'highlight'); - } - return; - } - if (Conf['Fixed Header'] && Conf['Bottom header']) { - topMargin = 0; - } else { - headRect = Header.bar.getBoundingClientRect(); - topMargin = headRect.top + headRect.height; - } - if (postEl = $('.reply.highlight', thread)) { - $.rmClass(postEl, 'highlight'); - rect = postEl.getBoundingClientRect(); - if (rect.bottom >= topMargin && rect.top <= doc.clientHeight) { - root = postEl.parentNode; - axe = delta === +1 ? 'following' : 'preceding'; - next = $.x("" + axe + "-sibling::div[contains(@class,'replyContainer')][1]/child::div[contains(@class,'reply')]", root); - if (!next) { - this.focus(postEl); - return; - } - if (!(g.VIEW === 'thread' || $.x('ancestor::div[parent::div[@class="board"]]', next) === thread)) { - return; - } - rect = next.getBoundingClientRect(); - if (rect.top < 0 || rect.bottom > doc.clientHeight) { - if (delta === -1) { - window.scrollBy(0, rect.top - topMargin); - } else { - next.scrollIntoView(false); - } - } - this.focus(next); - return; - } - } - replies = $$('.reply', thread); - if (delta === -1) { - replies.reverse(); - } - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - rect = reply.getBoundingClientRect(); - if (delta === +1 && rect.top >= topMargin || delta === -1 && rect.bottom <= doc.clientHeight) { - this.focus(reply); - return; - } - } - }, - focus: function(post) { - return $.addClass(post, 'highlight'); - } - }; - - Nav = { - init: function() { - var append, next, prev, span; - switch (g.VIEW) { - case 'index': - if (!Conf['Index Navigation']) { - return; - } - break; - case 'thread': - if (!Conf['Reply Navigation']) { - return; - } - break; - default: - return; - } - span = $.el('span', { - id: 'navlinks' - }); - prev = $.el('a', { - textContent: '▲', - href: 'javascript:;' - }); - next = $.el('a', { - textContent: '▼', - href: 'javascript:;' - }); - $.on(prev, 'click', this.prev); - $.on(next, 'click', this.next); - $.add(span, [prev, $.tn(' '), next]); - append = function() { - $.off(d, '4chanXInitFinished', append); - return $.add(d.body, span); - }; - return $.on(d, '4chanXInitFinished', append); - }, - prev: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, 0); - } else { - return Nav.scroll(-1); - } - }, - next: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, d.body.scrollHeight); - } else { - return Nav.scroll(+1); - } - }, - getThread: function(full) { - var headRect, i, rect, thread, threads, topMargin, _i, _len; - if (Conf['Bottom header'] || !Conf['Fixed Header']) { - topMargin = 0; - } else { - headRect = Header.bar.getBoundingClientRect(); - topMargin = headRect.top + headRect.height; - } - threads = $$('.thread').filter(function(thread) { - thread = Get.threadFromRoot(thread); - return !(thread.isHidden && !thread.stub); - }); - for (i = _i = 0, _len = threads.length; _i < _len; i = ++_i) { - thread = threads[i]; - rect = thread.getBoundingClientRect(); - if (rect.bottom > topMargin) { - if (full) { - return [threads, thread, i, rect, topMargin]; - } else { - return thread; - } - } - } - return $('.board'); - }, - scroll: function(delta) { - var i, rect, thread, threads, top, topMargin, _ref, _ref1; - _ref = Nav.getThread(true), threads = _ref[0], thread = _ref[1], i = _ref[2], rect = _ref[3], topMargin = _ref[4]; - top = rect.top - topMargin; - if (!((delta === -1 && Math.ceil(top) < 0) || (delta === +1 && top > 1))) { - i += delta; - } - top = ((_ref1 = threads[i]) != null ? _ref1.getBoundingClientRect().top : void 0) - topMargin; - return window.scrollBy(0, top); - } - }; - - RelativeDates = { - INTERVAL: $.MINUTE / 2, - init: function() { - if (g.VIEW === 'catalog' || !Conf['Relative Post Dates']) { - return; - } - $.on(d, 'visibilitychange ThreadUpdate', this.flush); - this.flush(); - return Post.prototype.callbacks.push({ - name: 'Relative Post Dates', - cb: this.node - }); - }, - node: function() { - var dateEl; - if (this.isClone) { - return; - } - dateEl = this.nodes.date; - dateEl.title = dateEl.textContent; - return RelativeDates.setUpdate(this); - }, - relative: function(diff, now, date) { - var days, months, number, rounded, unit, years; - unit = (number = diff / $.DAY) >= 1 ? (years = now.getYear() - date.getYear(), months = now.getMonth() - date.getMonth(), days = now.getDate() - date.getDate(), years > 1 ? (number = years - (months < 0 || months === 0 && days < 0), 'year') : years === 1 && (months > 0 || months === 0 && days >= 0) ? (number = years, 'year') : (months = (months + 12) % 12) > 1 ? (number = months - (days < 0), 'month') : months === 1 && days >= 0 ? (number = months, 'month') : 'day') : (number = diff / $.HOUR) >= 1 ? 'hour' : (number = diff / $.MINUTE) >= 1 ? 'minute' : (number = Math.max(0, diff) / $.SECOND, 'second'); - rounded = Math.round(number); - if (rounded !== 1) { - unit += 's'; - } - return "" + rounded + " " + unit + " ago"; - }, - stale: [], - flush: function() { - var now, update, _i, _len, _ref; - if (d.hidden) { - return; - } - now = new Date(); - _ref = RelativeDates.stale; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - update = _ref[_i]; - update(now); - } - RelativeDates.stale = []; - clearTimeout(RelativeDates.timeout); - return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); - }, - setUpdate: function(post) { - var markStale, setOwnTimeout, update; - setOwnTimeout = function(diff) { - var delay; - delay = diff < $.MINUTE ? $.SECOND - (diff + $.SECOND / 2) % $.SECOND : diff < $.HOUR ? $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE : diff < $.DAY ? $.HOUR - (diff + $.HOUR / 2) % $.HOUR : $.DAY - (diff + $.DAY / 2) % $.DAY; - return setTimeout(markStale, delay); - }; - update = function(now) { - var date, diff, relative, singlePost, _i, _len, _ref; - date = post.info.date; - diff = now - date; - relative = RelativeDates.relative(diff, now, date); - _ref = [post].concat(post.clones); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - singlePost = _ref[_i]; - singlePost.nodes.date.firstChild.textContent = relative; - } - return setOwnTimeout(diff); - }; - markStale = function() { - return RelativeDates.stale.push(update); - }; - return update(new Date()); - } - }; - - RemoveSpoilers = { - init: function() { - if (Conf['Reveal Spoilers'] && !Conf['Remove Spoilers']) { - $.addClass(doc, 'reveal-spoilers'); - } - if (!Conf['Remove Spoilers']) { - return; - } - if (Conf['Reveal Spoilers']) { - this.wrapper = function(text) { - return "[spoiler]" + text + "[/spoiler]"; - }; - } - return Post.prototype.callbacks.push({ - name: 'Reveal Spoilers', - cb: this.node - }); - }, - wrapper: function(text) { - return text; - }, - node: function(post) { - var spoiler, spoilers, _i, _len; - spoilers = $$('s', this.nodes.comment); - for (_i = 0, _len = spoilers.length; _i < _len; _i++) { - spoiler = spoilers[_i]; - $.replace(spoiler, $.tn(RemoveSpoilers.wrapper(spoiler.textContent))); - } - } - }; - - Report = { - init: function() { - if (!(/report/.test(location.search) && d.cookie.indexOf('pass_enabled=1') === -1)) { - return; - } - return $.asap((function() { - return $.id('recaptcha_response_field'); - }), Report.ready); - }, - ready: function() { - var field; - field = $.id('recaptcha_response_field'); - $.on(field, 'keydown', function(e) { - if (e.keyCode === 8 && !field.value) { - return $.globalEval('Recaptcha.reload("t")'); - } - }); - return $.on($('form'), 'submit', function(e) { - var response; - e.preventDefault(); - response = field.value.trim(); - if (!/\s/.test(response)) { - field.value = "" + response + " " + response; - } - return this.submit(); - }); - } - }; - - Sauce = { - init: function() { - var err, link, links, _i, _len, _ref; - if (g.VIEW === 'catalog' || !Conf['Sauce']) { - return; - } - links = []; - _ref = Conf['sauces'].split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - if (link[0] === '#') { - continue; - } - try { - links.push(this.createSauceLink(link.trim())); - } catch (_error) { - err = _error; - continue; - } - } - if (!links.length) { - return; - } - this.links = links; - this.link = $.el('a', { - target: '_blank' - }); - return Post.prototype.callbacks.push({ - name: 'Sauce', - cb: this.node - }); - }, - createSauceLink: function(link) { - var m, text; - link = link.replace(/%(T?URL|MD5|board)/ig, function(parameter) { - switch (parameter) { - case '%TURL': - return "' + encodeURIComponent(post.file.thumbURL) + '"; - case '%URL': - return "' + encodeURIComponent(post.file.URL) + '"; - case '%MD5': - return "' + encodeURIComponent(post.file.MD5) + '"; - case '%board': - return "' + encodeURIComponent(post.board) + '"; - default: - return parameter; - } - }); - text = (m = link.match(/;text:(.+)$/)) ? m[1] : link.match(/(\w+)\.\w+\//)[1]; - link = link.replace(/;text:.+$/, ''); - return Function('post', 'a', "a.href = '" + link + "';\na.textContent = '" + text + "';\nreturn a;"); - }, - node: function() { - var link, nodes, _i, _len, _ref; - if (this.isClone || !this.file) { - return; - } - nodes = []; - _ref = Sauce.links; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - nodes.push($.tn('\u00A0'), link(this, Sauce.link.cloneNode(true))); - } - return $.add(this.file.info, nodes); - } - }; - - Time = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Time Formatting']) { - return; - } - this.funk = this.createFunc(Conf['time']); - return Post.prototype.callbacks.push({ - name: 'Time Formatting', - cb: this.node - }); - }, - node: function() { - if (this.isClone) { - return; - } - return this.nodes.date.textContent = Time.funk(Time, this.info.date); - }, - createFunc: function(format) { - var code; - code = format.replace(/%([A-Za-z])/g, function(s, c) { - if (c in Time.formatters) { - return "' + Time.formatters." + c + ".call(date) + '"; - } else { - return s; - } - }); - return Function('Time', 'date', "return '" + code + "'"); - }, - day: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - zeroPad: function(n) { - if (n < 10) { - return "0" + n; - } else { - return n; - } - }, - formatters: { - a: function() { - return Time.day[this.getDay()].slice(0, 3); - }, - A: function() { - return Time.day[this.getDay()]; - }, - b: function() { - return Time.month[this.getMonth()].slice(0, 3); - }, - B: function() { - return Time.month[this.getMonth()]; - }, - d: function() { - return Time.zeroPad(this.getDate()); - }, - e: function() { - return this.getDate(); - }, - H: function() { - return Time.zeroPad(this.getHours()); - }, - I: function() { - return Time.zeroPad(this.getHours() % 12 || 12); - }, - k: function() { - return this.getHours(); - }, - l: function() { - return this.getHours() % 12 || 12; - }, - m: function() { - return Time.zeroPad(this.getMonth() + 1); - }, - M: function() { - return Time.zeroPad(this.getMinutes()); - }, - p: function() { - if (this.getHours() < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - P: function() { - if (this.getHours() < 12) { - return 'am'; - } else { - return 'pm'; - } - }, - S: function() { - return Time.zeroPad(this.getSeconds()); - }, - y: function() { - return this.getFullYear() % 100; - }, - Y: function() { - return this.getFullYear(); - } - } - }; - - Settings = { - init: function() { - var link, settings; - link = $.el('a', { - className: 'settings-link', - textContent: 'Settings', - href: 'javascript:;' - }); - $.on(link, 'click', Settings.open); - Header.addShortcut(link); - $.get('previousversion', null, function(item) { - var changelog, el, previous; - if (previous = item['previousversion']) { - if (previous === g.VERSION) { - return; - } - changelog = 'https://github.com/seaweedchan/4chan-x/blob/master/CHANGELOG.md'; - el = $.el('span', { - innerHTML: "4chan X has been updated to version " + g.VERSION + "." - }); - if (Conf['Show Updated Notifications']) { - new Notification('info', el, 30); - } - } else { - $.on(d, '4chanXInitFinished', Settings.open); - } - return $.set({ - lastchecked: Date.now(), - previousversion: g.VERSION - }); - }); - Settings.addSection('Main', Settings.main); - Settings.addSection('Filter', Settings.filter); - Settings.addSection('Sauce', Settings.sauce); - Settings.addSection('Advanced', Settings.advanced); - Settings.addSection('Keybinds', Settings.keybinds); - $.on(d, 'AddSettingsSection', Settings.addSection); - $.on(d, 'OpenSettings', function(e) { - return Settings.open(e.detail); - }); - settings = JSON.parse(localStorage.getItem('4chan-settings')) || {}; - if (settings.disableAll) { - return; - } - settings.disableAll = true; - return localStorage.setItem('4chan-settings', JSON.stringify(settings)); - }, - open: function(openSection) { - var dialog, html, link, links, overlay, section, sectionToOpen, _i, _len, _ref; - $.off(d, '4chanXInitFinished', Settings.open); - if (Settings.dialog) { - return; - } - $.event('CloseMenu'); - html = "
"; - Settings.overlay = overlay = $.el('div', { - id: 'overlay' - }); - Settings.dialog = dialog = $.el('div', { - id: 'fourchanx-settings', - className: 'dialog', - innerHTML: html - }); - $.on($('.export', Settings.dialog), 'click', Settings["export"]); - $.on($('.import', Settings.dialog), 'click', Settings["import"]); - $.on($('input', Settings.dialog), 'change', Settings.onImport); - links = []; - _ref = Settings.sections; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - section = _ref[_i]; - link = $.el('a', { - className: "tab-" + section.hyphenatedTitle, - textContent: section.title, - href: 'javascript:;' - }); - $.on(link, 'click', Settings.openSection.bind(section)); - links.push(link, $.tn(' | ')); - if (section.title === openSection) { - sectionToOpen = link; - } - } - links.pop(); - $.add($('.sections-list', dialog), links); - (sectionToOpen ? sectionToOpen : links[0]).click(); - $.on($('.close', dialog), 'click', Settings.close); - $.on(overlay, 'click', Settings.close); - $.add(d.body, [overlay, dialog]); - return $.event('OpenSettings', null, dialog); - }, - close: function() { - if (!Settings.dialog) { - return; - } - $.rm(Settings.overlay); - $.rm(Settings.dialog); - delete Settings.overlay; - return delete Settings.dialog; - }, - sections: [], - addSection: function(title, open) { - var hyphenatedTitle, _ref; - if (typeof title !== 'string') { - _ref = title.detail, title = _ref.title, open = _ref.open; - } - hyphenatedTitle = title.toLowerCase().replace(/\s+/g, '-'); - return Settings.sections.push({ - title: title, - hyphenatedTitle: hyphenatedTitle, - open: open - }); - }, - openSection: function() { - var section, selected; - if (selected = $('.tab-selected', Settings.dialog)) { - $.rmClass(selected, 'tab-selected'); - } - $.addClass($(".tab-" + this.hyphenatedTitle, Settings.dialog), 'tab-selected'); - section = $('section', Settings.dialog); - $.rmAll(section); - section.className = "section-" + this.hyphenatedTitle; - this.open(section, g); - section.scrollTop = 0; - return $.event('OpenSettings', null, section); - }, - main: function(section) { - var arr, button, description, div, fs, hiddenNum, input, inputs, items, key, obj, _ref; - items = {}; - inputs = {}; - _ref = Config.main; - for (key in _ref) { - obj = _ref[key]; - fs = $.el('fieldset', { - innerHTML: "" + key + "" - }); - for (key in obj) { - arr = obj[key]; - description = arr[1]; - div = $.el('div', { - innerHTML: ": " + description + "" - }); - input = $('input', div); - $.on(input, 'change', $.cb.checked); - items[key] = Conf[key]; - inputs[key] = input; - $.add(fs, div); - } - $.add(section, fs); - } - $.get(items, function(items) { - var val; - for (key in items) { - val = items[key]; - inputs[key].checked = val; - } - }); - div = $.el('div', { - innerHTML: ": Clear manually-hidden threads and posts on all boards. Refresh the page to apply." - }); - button = $('button', div); - hiddenNum = 0; - $.get('hiddenThreads', { - boards: {} - }, function(item) { - var ID, board, thread, _ref1; - _ref1 = item.hiddenThreads.boards; - for (ID in _ref1) { - board = _ref1[ID]; - for (ID in board) { - thread = board[ID]; - hiddenNum++; - } - } - return button.textContent = "Hidden: " + hiddenNum; - }); - $.get('hiddenPosts', { - boards: {} - }, function(item) { - var ID, board, post, thread, _ref1; - _ref1 = item.hiddenPosts.boards; - for (ID in _ref1) { - board = _ref1[ID]; - for (ID in board) { - thread = board[ID]; - for (ID in thread) { - post = thread[ID]; - hiddenNum++; - } - } - } - return button.textContent = "Hidden: " + hiddenNum; - }); - $.on(button, 'click', function() { - this.textContent = 'Hidden: 0'; - return $.get('hiddenThreads', { - boards: {} - }, function(item) { - var boardID; - for (boardID in item.hiddenThreads.boards) { - localStorage.removeItem("4chan-hide-t-" + boardID); - } - return $["delete"](['hiddenThreads', 'hiddenPosts']); - }); - }); - return $.after($('input[name="Stubs"]', section).parentNode.parentNode, div); - }, - "export": function(now, data) { - var a, db, _i, _len; - if (typeof now !== 'number') { - now = Date.now(); - data = { - version: g.VERSION, - date: now - }; - Conf['WatchedThreads'] = {}; - for (_i = 0, _len = DataBoards.length; _i < _len; _i++) { - db = DataBoards[_i]; - Conf[db] = { - boards: {} - }; - } - $.get(Conf, function(Conf) { - delete Conf['archives']; - data.Conf = Conf; - return Settings["export"](now, data); - }); - return; - } - a = $.el('a', { - className: 'warning', - textContent: 'Save me!', - download: "4chan X v" + g.VERSION + "-" + now + ".json", - href: "data:application/json;base64," + (btoa(unescape(encodeURIComponent(JSON.stringify(data, null, 2))))), - target: '_blank' - }); - return a.click(); - }, - "import": function() { - return this.nextElementSibling.click(); - }, - onImport: function() { - var file, output, reader; - if (!(file = this.files[0])) { - return; - } - output = $('.imp-exp-result'); - if (!confirm('Your current settings will be entirely overwritten, are you sure?')) { - output.textContent = 'Import aborted.'; - return; - } - reader = new FileReader(); - reader.onload = function(e) { - var data, err; - try { - data = JSON.parse(e.target.result); - Settings.loadSettings(data); - if (confirm('Import successful. Refresh now?')) { - return window.location.reload(); - } - } catch (_error) { - err = _error; - output.textContent = 'Import failed due to an error.'; - return c.error(err.stack); - } - }; - return reader.readAsText(file); - }, - loadSettings: function(data) { - var key, val, version, _ref; - version = data.version.split('.'); - if (version[0] === '2') { - data = Settings.convertSettings(data, { - 'Disable 4chan\'s extension': '', - 'Catalog Links': '', - 'Reply Navigation': '', - 'Show Stubs': 'Stubs', - 'Image Auto-Gif': 'Auto-GIF', - 'Expand From Current': '', - 'Unread Tab Icon': 'Unread Favicon', - 'Post in Title': 'Thread Excerpt', - 'Auto Hide QR': '', - 'Open Reply in New Tab': '', - 'Remember QR size': '', - 'Quote Inline': 'Quote Inlining', - 'Quote Preview': 'Quote Previewing', - 'Indicate OP quote': 'Mark OP Quotes', - 'Indicate Cross-thread Quotes': 'Mark Cross-thread Quotes', - 'Reply Hiding': 'Reply Hiding Buttons', - 'Thread Hiding': 'Thread Hiding Buttons', - 'uniqueid': 'uniqueID', - 'mod': 'capcode', - 'country': 'flag', - 'md5': 'MD5', - 'openEmptyQR': 'Open empty QR', - 'openQR': 'Open QR', - 'openOptions': 'Open settings', - 'close': 'Close', - 'spoiler': 'Spoiler tags', - 'code': 'Code tags', - 'submit': 'Submit QR', - 'watch': 'Watch', - 'update': 'Update', - 'unreadCountTo0': '', - 'expandAllImages': 'Expand images', - 'expandImage': 'Expand image', - 'zero': 'Front page', - 'nextPage': 'Next page', - 'previousPage': 'Previous page', - 'nextThread': 'Next thread', - 'previousThread': 'Previous thread', - 'expandThread': 'Expand thread', - 'openThreadTab': 'Open thread', - 'openThread': 'Open thread tab', - 'nextReply': 'Next reply', - 'previousReply': 'Previous reply', - 'hide': 'Hide', - 'Scrolling': 'Auto Scroll', - 'Verbose': '' - }); - data.Conf.sauces = data.Conf.sauces.replace(/\$\d/g, function(c) { - switch (c) { - case '$1': - return '%TURL'; - case '$2': - return '%URL'; - case '$3': - return '%MD5'; - case '$4': - return '%board'; - default: - return c; - } - }); - _ref = Config.hotkeys; - for (key in _ref) { - val = _ref[key]; - if (!(key in data.Conf)) { - continue; - } - data.Conf[key] = data.Conf[key].replace(/ctrl|alt|meta/g, function(s) { - return "" + (s[0].toUpperCase()) + s.slice(1); - }).replace(/(^|.+\+)[A-Z]$/g, function(s) { - return "Shift+" + s.slice(0, -1) + (s.slice(-1).toLowerCase()); - }); - } - data.Conf.WatchedThreads = data.WatchedThreads; - } else if (version[0] === '3') { - data = Settings.convertSettings(data, { - 'Reply Hiding': 'Reply Hiding Buttons', - 'Thread Hiding': 'Thread Hiding Buttons', - 'Bottom header': 'Bottom Header', - 'Unread Tab Icon': 'Unread Favicon' - }); - } - return $.set(data.Conf); - }, - convertSettings: function(data, map) { - var newKey, prevKey; - for (prevKey in map) { - newKey = map[prevKey]; - if (newKey) { - data.Conf[newKey] = data.Conf[prevKey]; - } - delete data.Conf[prevKey]; - } - return data; - }, - filter: function(section) { - var select; - section.innerHTML = "
"; - select = $('select', section); - $.on(select, 'change', Settings.selectFilter); - return Settings.selectFilter.call(select); - }, - selectFilter: function() { - var div, name, ta; - div = this.nextElementSibling; - if ((name = this.value) !== 'guide') { - $.rmAll(div); - ta = $.el('textarea', { - name: name, - className: 'field', - spellcheck: false - }); - $.get(name, Conf[name], function(item) { - return ta.value = item[name]; - }); - $.on(ta, 'change', $.cb.value); - $.add(div, ta); - return; - } - return div.innerHTML = "
Filter is disabled.

\nUse regular expressions, one per line.
\nLines starting with a # will be ignored.
\nFor example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.
\nMD5 filtering uses exact string matching, not regular expressions.\n

    You can use these settings with each regular expression, separate them with semicolons:\n
  • \n Per boards, separate them with commas. It is global if not specified.
    \n For example: boards:a,jp;.\n
  • \n Filter OPs only along with their threads (`only`), replies only (`no`), or both (`yes`, this is default).
    \n For example: op:only;, op:no; or op:yes;.\n
  • \n Overrule the `Show Stubs` setting if specified: create a stub (`yes`) or not (`no`).
    \n For example: stub:yes; or stub:no;.\n
  • \n Highlight instead of hiding. You can specify a class name to use with a userstyle.
    \n For example: highlight; or highlight:wallpaper;.\n
  • \n Highlighted OPs will have their threads put on top of board pages by default.
    \n For example: top:yes; or top:no;.\n
"; - }, - sauce: function(section) { - var ta; - section.innerHTML = "
Sauce is disabled.
Lines starting with a # will be ignored.
You can specify a display text by appending ;text:[text] to the URL.
    These parameters will be replaced by their corresponding values:\n
  • %TURL: Thumbnail URL.
  • %URL: Full image URL.
  • %MD5: MD5 hash.
  • %board: Current board.
"; - ta = $('textarea', section); - $.get('sauces', Conf['sauces'], function(item) { - return ta.value = item['sauces']; - }); - return $.on(ta, 'change', $.cb.value); - }, - advanced: function(section) { - var archive, boardID, boardOptions, boardSelect, boards, data, event, input, inputs, item, items, name, row, rows, ta, table, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _ref4; - section.innerHTML = "
Archiver
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection
Disabled selections indicate that only one archive is available for that board and redirection type.
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 Status/Twitter link (status, @).
Board link: g
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
External link: external-text:\"Google\",\"http://www.google.com\"
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\"]
\n will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
\n if you are on /g/.\n
Time Formatting is disabled.
:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Quote Backlinks formatting is disabled.
:
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (Unix timestamp)
Original file name: %n (truncated), %N (untruncated), %t (Unix timestamp)
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Quick Reply Personas is disabled.

\n One item per line.
\n Items will be added in the relevant input's auto-completion list.
\n Password items will always be used, since there is no password input.
\n Lines starting with a # will be ignored.\n

    You can use these settings with each item, separate them with semicolons:\n
  • Possible items are: name, email, subject and password.
  • Wrap values of items with quotes, like this: email:\"sage\".
  • Force values as defaults with the always keyword, for example: email:\"sage\";always.
  • Select specific boards for an item, separated with commas, for example: email:\"sage\";boards:jp;always.
Unread Favicon is disabled.
Emoji is disabled.
\n Sage Icon:
\n Position:
Thread Updater is disabled.
\n Interval:
"; - items = {}; - inputs = {}; - _ref = ['boardnav', 'time', 'backlink', 'fileInfo', 'favicon', 'sageEmoji', 'emojiPos', 'usercss']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - input = $("[name=" + name + "]", section); - items[name] = Conf[name]; - inputs[name] = input; - event = ['favicon', 'usercss', 'sageEmoji', 'emojiPos'].contains(name) ? 'change' : 'input'; - $.on(input, event, $.cb.value); - } - ta = $('.personafield', section); - $.get('QR.personas', Conf['QR.personas'], function(item) { - return ta.value = item['QR.personas']; - }); - $.on(ta, 'change', $.cb.value); - $.get(items, function(items) { - var key, val; - for (key in items) { - val = items[key]; - if (['emojiPos'].contains(key)) { - continue; - } - input = inputs[key]; - input.value = val; - if (key === 'usercss') { - continue; - } - $.on(input, event, Settings[key]); - Settings[key].call(input); - } - }); - $.on($('input[name=Interval]', section), 'change', ThreadUpdater.cb.interval); - $.on($('input[name="Custom CSS"]', section), 'change', Settings.togglecss); - $.on($.id('apply-css'), 'click', Settings.usercss); - boards = {}; - _ref1 = Redirect.archives; - for (name in _ref1) { - archive = _ref1[name]; - _ref2 = archive.boards; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - boardID = _ref2[_j]; - data = boards[boardID] || (boards[boardID] = { - thread: [], - post: [], - file: [] - }); - data.thread.push(name); - if (archive.software === 'foolfuuka') { - data.post.push(name); - } - if (archive.files.contains(boardID)) { - data.file.push(name); - } - } - } - rows = []; - boardOptions = []; - _ref3 = Object.keys(boards).sort(); - for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { - boardID = _ref3[_k]; - row = $.el('tr', { - className: "board-" + boardID - }); - row.hidden = boardID !== g.BOARD.ID; - boardOptions.push($.el('option', { - textContent: "/" + boardID + "/", - value: "board-" + boardID, - selected: boardID === g.BOARD.ID - })); - data = boards[boardID]; - _ref4 = ['thread', 'post', 'file']; - for (_l = 0, _len3 = _ref4.length; _l < _len3; _l++) { - item = _ref4[_l]; - $.add(row, Settings.addArchiveCell(boardID, data, item)); - } - rows.push(row); - } - $.add($('tbody', section), rows); - boardSelect = $('#archive-board-select', section); - $.add(boardSelect, boardOptions); - table = $.id('archive-table'); - $.on(boardSelect, 'change', function() { - $('tbody > :not([hidden])', table).hidden = true; - return $("tbody > ." + this.value, table).hidden = false; - }); - $.get('selectedArchives', Conf['selectedArchives'], function(_arg) { - var option, selectedArchives, type; - selectedArchives = _arg.selectedArchives; - for (boardID in selectedArchives) { - data = selectedArchives[boardID]; - for (type in data) { - name = data[type]; - if (option = $("select[data-boardid='" + boardID + "'][data-type='" + type + "'] > option[value='" + name + "']", section)) { - option.selected = true; - } - } - } - }); - }, - addArchiveCell: function(boardID, data, type) { - var archive, i, length, options, select, td; - length = data[type].length; - td = $.el('td', { - className: 'archive-cell' - }); - if (!length) { - td.textContent = '--'; - return td; - } - options = []; - i = 0; - while (i < length) { - archive = data[type][i++]; - options.push($.el('option', { - textContent: archive, - value: archive - })); - } - td.innerHTML = ''; - select = td.firstElementChild; - if (!(select.disabled = length === 1)) { - select.setAttribute('data-boardid', boardID); - select.setAttribute('data-type', type); - $.on(select, 'change', Settings.saveSelectedArchive); - } - $.add(select, options); - return td; - }, - saveSelectedArchive: function() { - var _this = this; - return $.get('selectedArchives', Conf['selectedArchives'], function(_arg) { - var selectedArchives, _name; - selectedArchives = _arg.selectedArchives; - (selectedArchives[_name = _this.dataset.boardid] || (selectedArchives[_name] = {}))[_this.dataset.type] = _this.value; - return $.set('selectedArchives', selectedArchives); - }); - }, - boardnav: function() { - return Header.generateBoardList(this.value); - }, - time: function() { - var funk; - funk = Time.createFunc(this.value); - return this.nextElementSibling.textContent = funk(Time, new Date()); - }, - backlink: function() { - return this.nextElementSibling.textContent = this.value.replace(/%id/, '123456789'); - }, - fileInfo: function() { - var data, funk; - data = { - isReply: true, - file: { - URL: '//images.4chan.org/g/src/1334437723720.jpg', - name: 'd9bb2efc98dd0df141a94399ff5880b7.jpg', - size: '276 KB', - sizeInBytes: 276 * 1024, - dimensions: '1280x720', - isImage: true, - isSpoiler: true - } - }; - funk = FileInfo.createFunc(this.value); - return this.nextElementSibling.innerHTML = funk(FileInfo, data); - }, - favicon: function() { - Favicon["switch"](); - if (g.VIEW === 'thread' && Conf['Unread Favicon']) { - Unread.update(); - } - return this.nextElementSibling.innerHTML = "\n\n\n"; - }, - sageEmoji: function() { - return this.nextElementSibling.innerHTML = ""; - }, - togglecss: function() { - if ($('textarea[name=usercss]', $.x('ancestor::fieldset[1]', this)).disabled = !this.checked) { - CustomCSS.rmStyle(); - } else { - CustomCSS.addStyle(); - } - return $.cb.checked.call(this); - }, - usercss: function() { - return CustomCSS.update(); - }, - keybinds: function(section) { - var arr, input, inputs, items, key, tbody, tr, _ref; - section.innerHTML = "
Keybinds are disabled.
Allowed keys: a-z, 0-9, Ctrl, Shift, Alt, Meta, Enter, Esc, Up, Down, Right, Left.
Press Backspace to disable a keybind.
ActionsKeybinds
"; - tbody = $('tbody', section); - items = {}; - inputs = {}; - _ref = Config.hotkeys; - for (key in _ref) { - arr = _ref[key]; - tr = $.el('tr', { - innerHTML: "" + arr[1] + "" - }); - input = $('input', tr); - input.name = key; - input.spellcheck = false; - items[key] = Conf[key]; - inputs[key] = input; - $.on(input, 'keydown', Settings.keybind); - $.add(tbody, tr); - } - return $.get(items, function(items) { - var val; - for (key in items) { - val = items[key]; - inputs[key].value = val; - } - }); - }, - keybind: function(e) { - var key; - if (e.keyCode === 9) { - return; - } - e.preventDefault(); - e.stopPropagation(); - if ((key = Keybinds.keyCode(e)) == null) { - return; - } - this.value = key; - return $.cb.value.call(this); - } - }; - - Main = { - init: function(items) { - var db, flatten, _i, _len; - flatten = function(parent, obj) { - var key, val; - if (obj instanceof Array) { - Conf[parent] = obj[0]; - } else if (typeof obj === 'object') { - for (key in obj) { - val = obj[key]; - flatten(key, val); - } - } else { - Conf[parent] = obj; - } - }; - flatten(null, Config); - for (_i = 0, _len = DataBoards.length; _i < _len; _i++) { - db = DataBoards[_i]; - Conf[db] = { - boards: {} - }; - } - Conf['selectedArchives'] = {}; - $.get(Conf, Main.initFeatures); - $.on(d, '4chanMainInit', Main.initStyle); - return $.asap((function() { - var _ref; - return d.head && $('link[rel="shortcut icon"]', d.head) || ((_ref = d.readyState) === 'interactive' || _ref === 'complete'); - }), Main.initStyle); - }, - initFeatures: function(items) { - var init, pathname, _ref; - Conf = items; - pathname = location.pathname.split('/'); - g.BOARD = new Board(pathname[1]); - if ((_ref = g.BOARD.ID) === 'z' || _ref === 'fk') { - return; - } - g.VIEW = (function() { - switch (pathname[2]) { - case 'res': - return 'thread'; - case 'catalog': - return 'catalog'; - default: - return 'index'; - } - })(); - if (g.VIEW === 'thread') { - g.THREADID = +pathname[3]; - } - switch (location.hostname) { - case 'api.4chan.org': - return; - case 'sys.4chan.org': - Report.init(); - return; - case 'images.4chan.org': - $.ready(function() { - var URL; - if (Conf['404 Redirect'] && d.title === '4chan - 404 Not Found') { - Redirect.init(); - pathname = location.pathname.split('/'); - URL = Redirect.to('file', { - boardID: g.BOARD.ID, - filename: pathname[pathname.length - 1] - }); - if (URL) { - return location.replace(URL); - } - } - }); - return; - } - init = function(features) { - var err, module, name; - for (name in features) { - module = features[name]; - try { - module.init(); - } catch (_error) { - err = _error; - Main.handleErrors({ - message: "\"" + name + "\" initialization crashed.", - error: err - }); - } - } - }; - init({ - 'Polyfill': Polyfill, - 'Redirect': Redirect, - 'Header': Header, - 'Catalog Links': CatalogLinks, - 'Settings': Settings, - 'Announcement Hiding': PSAHiding, - 'Fourchan thingies': Fourchan, - 'Emoji': Emoji, - 'Color User IDs': IDColor, - 'Remove Spoilers': RemoveSpoilers, - 'Custom CSS': CustomCSS, - 'Linkify': Linkify, - 'Resurrect Quotes': Quotify, - 'Filter': Filter, - 'Thread Hiding Buttons': ThreadHiding, - 'Reply Hiding Buttons': PostHiding, - 'Recursive': Recursive, - 'Strike-through Quotes': QuoteStrikeThrough, - 'Quick Reply': QR, - 'Menu': Menu, - 'Report Link': ReportLink, - 'Thread Hiding (Menu)': ThreadHiding.menu, - 'Reply Hiding (Menu)': PostHiding.menu, - 'Delete Link': DeleteLink, - 'Filter (Menu)': Filter.menu, - 'Download Link': DownloadLink, - 'Archive Link': ArchiveLink, - 'Quote Inlining': QuoteInline, - 'Quote Previewing': QuotePreview, - 'Quote Backlinks': QuoteBacklink, - 'Mark Quotes of You': QuoteYou, - 'Mark OP Quotes': QuoteOP, - 'Mark Cross-thread Quotes': QuoteCT, - 'Anonymize': Anonymize, - 'Time Formatting': Time, - 'Relative Post Dates': RelativeDates, - 'File Info Formatting': FileInfo, - 'Fappe Tyme': FappeTyme, - 'Sauce': Sauce, - 'Image Expansion': ImageExpand, - 'Image Expansion (Menu)': ImageExpand.menu, - 'Reveal Spoilers': RevealSpoilers, - 'Image Loading': ImageLoader, - 'Image Hover': ImageHover, - 'Comment Expansion': ExpandComment, - 'Thread Expansion': ExpandThread, - 'Thread Excerpt': ThreadExcerpt, - 'Favicon': Favicon, - 'Unread': Unread, - 'Quote Threading': QuoteThreading, - 'Thread Stats': ThreadStats, - 'Thread Updater': ThreadUpdater, - 'Thread Watcher': ThreadWatcher, - 'Index Navigation': Nav, - 'Keybinds': Keybinds - }); - $.on(d, 'AddCallback', Main.addCallback); - return $.ready(Main.initReady); - }, - initStyle: function() { - var mainStyleSheet, observer, setStyle, style, styleSheets, _ref; - $.off(d, '4chanMainInit', Main.initStyle); - if (!Main.isThisPageLegit() || $.hasClass(doc, 'fourchan-x')) { - return; - } - if ((_ref = $('link[href*=mobile]', d.head)) != null) { - _ref.disabled = true; - } - $.addClass(doc, 'presto'); - $.addClass(doc, 'fourchan-x'); - $.addClass(doc, g.VIEW); - $.addStyle(Main.css); - if (g.VIEW === 'catalog') { - $.addClass(doc, $.id('base-css').href.match(/catalog_(\w+)/)[1].replace('_new', '').replace(/_+/g, '-')); - return; - } - style = 'yotsuba-b'; - mainStyleSheet = $('link[title=switch]', d.head); - styleSheets = $$('link[rel="alternate stylesheet"]', d.head); - setStyle = function() { - var styleSheet, _i, _len; - $.rmClass(doc, style); - for (_i = 0, _len = styleSheets.length; _i < _len; _i++) { - styleSheet = styleSheets[_i]; - if (styleSheet.href === mainStyleSheet.href) { - style = styleSheet.title.toLowerCase().replace('new', '').trim().replace(/\s+/g, '-'); - break; - } - } - return $.addClass(doc, style); - }; - setStyle(); - if (!mainStyleSheet) { - return; - } - if (window.MutationObserver) { - observer = new MutationObserver(setStyle); - return observer.observe(mainStyleSheet, { - attributes: true, - attributeFilter: ['href'] - }); - } else { - return $.on(mainStyleSheet, 'DOMAttrModified', setStyle); - } - }, - initReady: function() { - var board, boardChild, err, errors, href, passLink, posts, styleSelector, thread, threadChild, threads, _i, _j, _len, _len1, _ref, _ref1; - if (d.title === '4chan - 404 Not Found') { - if (Conf['404 Redirect'] && g.VIEW === 'thread') { - href = Redirect.to('thread', { - boardID: g.BOARD.ID, - threadID: g.THREADID, - postID: +location.hash.match(/\d+/) - }); - location.replace(href || ("/" + g.BOARD + "/")); - } - return; - } - if (!$.hasClass(doc, 'fourchan-x')) { - Main.initStyle(); - } - if (board = $('.board')) { - threads = []; - posts = []; - _ref = board.children; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - boardChild = _ref[_i]; - if (!$.hasClass(boardChild, 'thread')) { - continue; - } - thread = new Thread(boardChild.id.slice(1), g.BOARD); - threads.push(thread); - _ref1 = boardChild.children; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - threadChild = _ref1[_j]; - if (!$.hasClass(threadChild, 'postContainer')) { - continue; - } - try { - posts.push(new Post(threadChild, thread, g.BOARD)); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Parsing of Post No." + (threadChild.id.match(/\d+/)) + " failed. Post will be skipped.", - error: err - }); - } - } - } - if (errors) { - Main.handleErrors(errors); - } - Main.callbackNodes(Thread, threads); - Main.callbackNodesDB(Post, posts, function() { - $.event('4chanXInitFinished'); - return Main.checkUpdate(); - }); - if (styleSelector = $.id('styleSelector')) { - passLink = $.el('a', { - textContent: '4chan Pass', - href: 'javascript:;' - }); - $.on(passLink, 'click', function() { - return window.open('//sys.4chan.org/auth', 'This will steal your data.', 'left=0,top=0,width=500,height=255,toolbar=0,resizable=0'); - }); - $.before(styleSelector.previousSibling, [$.tn('['), passLink, $.tn(']\u00A0\u00A0')]); - } - return; - } - try { - localStorage.getItem('4chan-settings'); - } catch (_error) { - err = _error; - new Notification('warning', 'Cookies need to be enabled on 4chan for 4chan X to properly function.', 30); - } - $.event('4chanXInitFinished'); - return Main.checkUpdate(); - }, - callbackNodes: function(klass, nodes) { - var callback, err, errors, i, len, node, _i, _len, _ref; - len = nodes.length; - _ref = klass.prototype.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - callback = _ref[_i]; - i = 0; - while (i < len) { - node = nodes[i++]; - try { - callback.cb.call(node); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", - error: err - }); - } - } - } - if (errors) { - return Main.handleErrors(errors); - } - }, - callbackNodesDB: function(klass, nodes, cb) { - var errors, func, i, len, node, queue, softTask; - queue = []; - softTask = function() { - var args, func, task; - task = queue.shift(); - func = task[0]; - args = Array.prototype.slice.call(task, 1); - func.apply(func, args); - if (!queue.length) { - return; - } - if ((queue.length % 7) === 0) { - return setTimeout(softTask, 0); - } else { - return softTask(); - } - }; - len = nodes.length; - i = 0; - errors = null; - func = function(node, i) { - var callback, err, _i, _len, _ref; - _ref = klass.prototype.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - callback = _ref[_i]; - try { - callback.cb.call(node); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", - error: err - }); - } - } - if (i === len) { - if (errors) { - Main.handleErrors(errors); - } - if (cb) { - return cb(); - } - } - }; - while (i < len) { - node = nodes[i]; - queue.push([func, node, ++i]); - } - return softTask(); - }, - addCallback: function(e) { - var Klass, obj; - obj = e.detail; - if (typeof obj.callback.name !== 'string') { - throw new Error("Invalid callback name: " + obj.callback.name); - } - switch (obj.type) { - case 'Post': - Klass = Post; - break; - case 'Thread': - Klass = Thread; - break; - default: - return; - } - obj.callback.isAddon = true; - return Klass.prototype.callbacks.push(obj.callback); - }, - message: function(e) { - var el, version; - version = e.data.version; - if (version && version !== g.VERSION) { - el = $.el('span', { - innerHTML: "Update: 4chan X v" + version + " is out, get it here." - }); - return new Notification('info', el, 120); - } - }, - checkUpdate: function() { - var now; - if (!(Conf['Check for Updates'] && Main.isThisPageLegit())) { - return; - } - now = Date.now(); - return $.get('lastchecked', 0, function(_arg) { - var lastchecked; - lastchecked = _arg.lastchecked; - if (lastchecked > now - $.DAY) { - return; - } - return $.ready(function() { - $.on(window, 'message', Main.message); - $.set('lastchecked', now); - return $.add(d.head, $.el('script', { - src: 'https://github.com/seaweedchan/4chan-x/raw/master/latest.js' - })); - }); - }); - }, - handleErrors: function(errors) { - var div, error, logs, _i, _len; - if (!(errors instanceof Array)) { - error = errors; - } else if (errors.length === 1) { - error = errors[0]; - } - if (error) { - new Notification('error', Main.parseError(error), 15); - return; - } - div = $.el('div', { - innerHTML: "" + errors.length + " errors occurred. [show]" - }); - $.on(div.lastElementChild, 'click', function() { - var _ref; - return _ref = this.textContent === 'show' ? ['hide', false] : ['show', true], this.textContent = _ref[0], logs.hidden = _ref[1], _ref; - }); - logs = $.el('div', { - hidden: true - }); - for (_i = 0, _len = errors.length; _i < _len; _i++) { - error = errors[_i]; - $.add(logs, Main.parseError(error)); - } - return new Notification('error', [div, logs], 30); - }, - parseError: function(data) { - var error, message; - Main.logError(data); - message = $.el('div', { - textContent: data.message - }); - error = $.el('div', { - textContent: data.error - }); - return [message, error]; - }, - errors: [], - logError: function(data) { - c.error(data.message, data.error.stack); - return Main.errors.push(data); - }, - isThisPageLegit: function() { - var _ref; - if (!('thisPageIsLegit' in Main)) { - Main.thisPageIsLegit = location.hostname === 'boards.4chan.org' && !$('link[href*="favicon-status.ico"]', d.head) && ((_ref = d.title) !== '4chan - Temporarily Offline' && _ref !== '4chan - Error'); - } - return Main.thisPageIsLegit; - }, - css: "/* General */\n.dialog {\nbox-shadow: 0 1px 2px rgba(0, 0, 0, .15);\nborder: 1px solid;\ndisplay: block;\npadding: 0;\n}\n.captcha-img,\n.field {\nbackground-color: #FFF;\nborder: 1px solid #CCC;\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\ncolor: #333;\nfont: 13px sans-serif;\noutline: none;\ntransition: color .25s, border-color .25s;\ntransition: color .25s, border-color .25s;\n}\n.field::-moz-placeholder,\n.field:hover::-moz-placeholder {\ncolor: #AAA !important;\nfont-size: 13px !important;\nopacity: 1.0 !important;\n}\n.captch-img:hover,\n.field:hover {\nborder-color: #999;\n}\n.field:hover, .field:focus {\ncolor: #000;\n}\n.field[disabled] {\nbackground-color: #F2F2F2;\ncolor: #888;\n}\n.move {\ncursor: move;\noverflow: hidden;\n}\nlabel, .favicon {\ncursor: pointer;\n}\na[href=\"javascript:;\"] {\ntext-decoration: none;\n}\n.warning {\ncolor: red;\n}\n#boardNavDesktop {\ndisplay: none !important;\n}\na {\noutline: none !important;\n}\n\n/* 4chan style fixes */\n.opContainer, .op {\ndisplay: block !important;\noverflow: visible !important;\n}\n[hidden] {\ndisplay: none !important;\n}\n\n/* fixed, z-index */\n#overlay,\n#fourchanx-settings,\n#qp, #ihover,\n#navlinks, .fixed #header-bar,\n:root.float #updater,\n:root.float #thread-stats,\n#qr {\nposition: fixed;\n}\n#fourchanx-settings {\nz-index: 999;\n}\n#overlay {\nz-index: 900;\n}\n#notifications {\nz-index: 70;\n}\n#qp, #ihover {\nz-index: 60;\n}\n#menu {\nz-index: 50;\n}\n#navlinks, #updater, #thread-stats {\nz-index: 40;\n}\n.fixed #header-bar.autohide {\nz-index: 35;\n}\n#qr {\nz-index: 30;\n}\n#watcher {\nz-index: 8;\n}\n:root.fixed-watcher #watcher {\nz-index: 20;\n}\n.fixed #header-bar {\nz-index: 10;\n}\n/* Header */\n.fixed.top body {\npadding-top: 2em;\n}\n.fixed.bottom body {\npadding-bottom: 2em;\n}\n.fixed #header-bar {\nright: 0;\nleft: 0;\npadding: 3px 4px 4px;\n}\n.fixed.top #header-bar {\ntop: 0;\n}\n.fixed.bottom #header-bar {\nbottom: 0;\n}\n#header-bar {\nborder-width: 0;\ntransition: all .1s .05s ease-in-out;\n}\n:root.centered-links #shortcuts {\nwidth: 300px;\ntext-align: right;\n}\n:root.centered-links #header-bar {\ntext-align: center;\n}\n:root.centered-links #custom-board-list {\nposition: relative;\nleft: 150px;\n}\n.fixed.top #header-bar {\nborder-bottom-width: 1px;\n}\n.fixed.bottom #header-bar {\nbox-shadow: 0 -1px 2px rgba(0, 0, 0, .15);\nborder-top-width: 1px;\n}\n.fixed.bottom #header-bar .menu-button i {\nborder-top: none;\nborder-bottom: 6px solid;\n}\n#board-list {\ntext-align: center;\n}\n.fixed #header-bar.autohide:not(:hover) {\nbox-shadow: none;\ntransition: all .8s .6s cubic-bezier(.55, .055, .675, .19);\n}\n.fixed.top #header-bar.autohide:not(:hover) {\nmargin-bottom: -1em;\n-webkit-transform: translateY(-100%);\ntransform: translateY(-100%);\n}\n.fixed.bottom #header-bar.autohide:not(:hover) {\n-webkit-transform: translateY(100%);\ntransform: translateY(100%);\n}\n#scroll-marker {\nleft: 0;\nright: 0;\nheight: 10px;\nposition: absolute;\n}\n:root:not(.autohide) #scroll-marker {\npointer-events: none;\n}\n#header-bar #scroll-marker {\ndisplay: none;\n}\n.fixed #header-bar #scroll-marker {\ndisplay: block;\n}\n.fixed.top #header-bar #scroll-marker {\ntop: 100%;\n}\n.fixed.bottom #header-bar #scroll-marker {\nbottom: 100%;\n}\n#header-bar a:not(.entry):not(.close) {\ntext-decoration: none;\npadding: 1px;\n}\n#header-bar input {\nmargin: 0;\nvertical-align: bottom;\n}\n#shortcuts:empty {\ndisplay: none;\n}\n.brackets-wrap::before {\ncontent: \"\\00a0[\";\n}\n.brackets-wrap::after {\ncontent: \"]\\00a0\";\n}\n.disabled,\n.expand-all-shortcut {\nopacity: .45;\n}\n#shortcuts {\nfloat: right;\n}\n.shortcut {\nmargin-left: 3px;\n}\n#navbotright,\n#navtopright {\ndisplay: none;\n}\n#toggleMsgBtn {\ndisplay: none !important;\n}\n.current {\nfont-weight: bold;\n}\n/* 4chan X link brackets */\n.fourchanx-link::after {\ncontent: \"]\";\n}\n.fourchanx-link::before {\ncontent: \"[\";\n}\n/* Notifications */\n#notifications {\nposition: fixed;\ntop: 0;\nheight: 0;\ntext-align: center;\nright: 0;\nleft: 0;\ntransition: all .8s .6s cubic-bezier(.55, .055, .675, .19);\n}\n.fixed.top #header-bar #notifications {\nposition: absolute;\ntop: 100%;\n}\n.notification {\ncolor: #FFF;\nfont-weight: 700;\ntext-shadow: 0 1px 2px rgba(0, 0, 0, .5);\nbox-shadow: 0 1px 2px rgba(0, 0, 0, .15);\nborder-radius: 2px;\nmargin: 1px auto;\nwidth: 500px;\nmax-width: 100%;\nposition: relative;\ntransition: all .25s ease-in-out;\n}\n.notification.error {\nbackground-color: hsla(0, 100%, 38%, .9);\n}\n.notification.warning {\nbackground-color: hsla(36, 100%, 38%, .9);\n}\n.notification.info {\nbackground-color: hsla(200, 100%, 38%, .9);\n}\n.notification.success {\nbackground-color: hsla(104, 100%, 38%, .9);\n}\n.notification a {\ncolor: white;\n}\n.notification > .close {\npadding: 6px;\ntop: 0;\nright: 5px;\nposition: absolute;\n}\n.message {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\npadding: 6px 20px;\nmax-height: 200px;\nwidth: 100%;\noverflow: auto;\n}\n\n/* Settings */\n:root.fourchan-x body {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\n}\n#overlay {\nbackground-color: rgba(0, 0, 0, .5);\ntop: 0;\nleft: 0;\nheight: 100%;\nwidth: 100%;\n}\n#fourchanx-settings {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\nbox-shadow: 0 0 15px rgba(0, 0, 0, .15);\nheight: 600px;\nmin-height: 0;\nmax-height: 100%;\nwidth: 900px;\nmin-width: 0;\nmax-width: 100%;\nmargin: auto;\npadding: 3px;\ntop: 50%;\nleft: 50%;\n-moz-transform: translate(-50%, -50%);\n-webkit-transform: translate(-50%, -50%);\n-o-transform: translate(-50%, -50%);\ntransform: translate(-50%, -50%);\n}\n#fourchanx-settings > nav {\npadding: 2px 2px 0;\nheight: 15px;\n}\n#fourchanx-settings > nav a {\ntext-decoration: underline;\n}\n#fourchanx-settings > nav a.close {\ntext-decoration: none;\npadding: 2px;\n}\n.section-container {\noverflow: auto;\nposition: absolute;\ntop: 2.1em;\nright: 5px;\nbottom: 5px;\nleft: 5px;\npadding-right: 5px;\n}\n.sections-list {\npadding: 0 3px;\nfloat: left;\n}\n.credits {\nfloat: right;\n}\n.tab-selected {\nfont-weight: 700;\n}\n.section-sauce ul,\n.section-advanced ul {\nlist-style: none;\nmargin: 0;\n}\n.section-sauce ul {\npadding: 8px;\n}\n.section-advanced ul {\npadding: 0px;\n}\n.section-sauce li,\n.section-advanced li {\npadding-left: 4px;\n}\n.section-main label {\ntext-decoration: underline;\n}\n.section-filter ul {\npadding: 0;\n}\n.section-filter li {\nmargin: 10px 40px;\n}\n.section-filter textarea {\nheight: 500px;\n}\n.section-sauce textarea {\nheight: 350px;\n}\n.section-advanced .field[name=\"boardnav\"] {\nwidth: 100%;\n}\n.section-advanced textarea {\nheight: 150px;\n}\n.section-advanced .archive-cell {\nmin-width: 160px;\ntext-align: center;\n}\n.section-advanced #archive-board-select {\nposition: absolute;\n}\n.section-advanced .note {\nfont-size: 0.8em; \nfont-style: italic; \nmargin-left: 10px;\n}\n.section-advanced .note code {\nfont-style: normal;\nfont-size: 11px;\n}\n#fourchanx-settings fieldset {\nborder: 1px solid;\nborder-radius: 3px;\n}\n#fourchanx-settings legend {\nfont-weight: 700;\n}\n#fourchanx-settings textarea {\nfont-family: monospace;\nmin-width: 100%;\nmax-width: 100%;\n}\n#fourchanx-settings code {\ncolor: #000;\nbackground-color: #FFF;\npadding: 0 2px;\n}\n.unscroll {\noverflow: hidden;\n}\n\n/* Announcement Hiding */\n:root.hide-announcement #globalMessage {\ndisplay: none;\n}\na.hide-announcement {\nfloat: left;\n}\n\n/* Unread */\n#unread-line {\nmargin: 0;\nborder-color: rgb(255,0,0);\n}\n\n/* Thread Updater */\n#updater {\nbackground: none;\nborder: none;\nbox-shadow: none;\n}\n#updater > .move {\npadding: 5px 3px 0px;\nmargin-bottom: -3px;\n}\n#updater > div:last-child {\ntext-align: center;\n}\n#updater input[type=number] {\nwidth: 4em;\n}\n:root.float #updater {\npadding: 0px 3px;\n}\n.new {\ncolor: limegreen;\n}\n#update-status.new {\nmargin-right: 5px;\n}\n#update-timer {\ncursor: pointer;\n}\n\n/* Thread Watcher */\n#watcher {\nposition: absolute;\n}\n#watcher {\npadding-bottom: 3px;\noverflow: hidden;\nwhite-space: nowrap;\nmin-width: 120px;\nmax-height: 92%;\noverflow-y: auto;\n}\n:root.fixed-watcher #watcher {\nposition: fixed;\n}\n:root:not(.fixed-watcher) #watcher:not(:hover) {\nmax-height: 210px;\noverflow-y: hidden;\n}\n#watcher > .move {\npadding-top: 3px;\n}\n#watcher > div {\nmax-width: 250px;\noverflow: hidden;\npadding-left: 3px;\npadding-right: 3px;\ntext-overflow: ellipsis;\n}\n#watcher a {\ntext-decoration: none;\n}\n#watcher .move>.close {\nposition: absolute;\nright: 0px;\ntop: 0px;\npadding: 0px 4px;\n}\n.watch-thread-link {\npadding-top: 18px;\nwidth: 18px;\nheight: 0px;\ndisplay: inline-block;\nbackground-repeat: no-repeat;\nopacity: 0.2;\nposition: relative;\ntop: 1px;\n}\n.watch-thread-link.watched {\nopacity: 1;\n}\n\n/* Thread Stats */\n#thread-stats {\nbackground: none;\nborder: none;\nbox-shadow: none;\n}\n:root.float #post-count, :root.float #file-count {\npointer-events: none;\n}\n:root.float #thread-stats {\npadding: 0px 3px;\n}\n\n/* Quote */\n.deadlink {\ntext-decoration: none !important;\n}\n.backlink.deadlink:not(.forwardlink), .quotelink.deadlink:not(.forwardlink) {\ntext-decoration: underline !important;\n}\n.inlined {\nopacity: .5;\n}\n#qp input, .forwarded {\ndisplay: none;\n}\n.quotelink.forwardlink,\n.backlink.forwardlink {\ntext-decoration: none;\nborder-bottom: 1px dashed;\n}\n.filtered {\ntext-decoration: underline line-through;\n}\n:root.hide-backlinks .backlink.filtered {\ndisplay: none;\n}\n.inline {\nborder: 1px solid;\ndisplay: table;\nmargin: 2px 0;\n}\n.inline .post {\nborder: 0 !important;\nbackground-color: transparent !important;\ndisplay: table !important;\nmargin: 0 !important;\npadding: 1px 2px !important;\n}\n#qp > .opContainer::after {\ncontent: '';\nclear: both;\ndisplay: table;\n}\n#qp .post {\nborder: none;\nmargin: 0;\npadding: 2px 2px 5px;\n}\n#qp img {\nmax-height: 300px;\nmax-width: 500px;\nmax-height: 80vh;\nmax-width: 50vw;\n}\n.qphl {\noutline: 2px solid rgba(216, 94, 49, .7);\n}\n:root.highlight-own .yourPost>.reply,\n:root.highlight-you .quotesYou>.reply {\nborder-left: 2px solid rgba(221,0,0,.5);\n}\n/* Quote Threading */\n.threadContainer {\nmargin-left: 20px;\nborder-left: 1px solid rgba(128,128,128,.3);\n}\n.threadOP {\nclear: both;\n} \n\n/* File */\n.fileText:hover .fntrunc,\n.fileText:not(:hover) .fnfull,\n.expanded-image > .post > .file > .fileThumb > img[data-md5],\n:not(.expanded-image) > .post > .file > .fileThumb > .full-image {\ndisplay: none;\n}\n.expanding {\nopacity: .5;\n}\n:root.fit-height .full-image {\nmax-height: 100vh;\n}\n:root.fit-width .full-image {\nmax-width: 100%;\n}\n:root.gecko.fit-width .full-image,\n:root.presto.fit-width .full-image {\nwidth: 100%;\n}\n#ihover {\n-moz-box-sizing: border-box;\nbox-sizing: border-box;\nmax-height: 100%;\nmax-width: 75%;\npadding-bottom: 16px;\n}\n.fappeTyme .thread > .noFile,\n.fappeTyme .threadContainer > .noFile {\ndisplay: none;\n}\n\n/* Index/Reply Navigation */\n#navlinks {\nfont-size: 16px;\ntop: 25px;\nright: 10px;\n}\n\n/* Filter */\n.opContainer.filter-highlight {\nbox-shadow: inset 5px 0 rgba(255, 0, 0, .5);\n}\n.filter-highlight > .reply {\nbox-shadow: -5px 0 rgba(255, 0, 0, .5);\n}\n\n/* Spoiler text */\n:root.reveal-spoilers s {\ncolor: white !important;\n}\n\n/* Thread & Reply Hiding */\n.hide-thread-button,\n.hide-reply-button {\nfloat: left;\nmargin-right: 2px;\n}\n.stub ~ * {\ndisplay: none !important;\n}\n.stub input {\ndisplay: inline-block;\n}\n\n/* QR */\n:root.hide-original-post-form #postForm,\n:root.hide-original-post-form .postingMode,\n:root.hide-original-post-form #togglePostForm,\n#qr.autohide:not(.has-focus):not(:hover) > form,\n.postingMode ~ #qr select,\n#file-n-submit:not(.has-file) #qr-filerm {\ndisplay: none;\n}\n#qr select, #dump-button, .remove, .captcha-img {\ncursor: pointer;\n}\n#qr {\nz-index: 20;\nposition: fixed;\npadding: 1px;\nborder: 1px solid transparent;\nmin-width: 300px;\nborder-radius: 3px 3px 0 0;\n}\n#qrtab {\nborder-radius: 3px 3px 0 0;\n}\n#qrtab {\nmargin-bottom: 1px;\n}\n#qr .close {\nfloat: right;\npadding: 0 3px;\n}\n#qr .warning {\nmin-height: 1.6em;\nvertical-align: middle;\npadding: 0 1px;\nborder-width: 1px;\nborder-style: solid;\n}\n.qr-link-container {\ntext-align: center;\n}\n.persona {\nwidth: 248px;\nmax-width: 100%;\nmin-width: 100%;\n}\n#dump-button {\nwidth: 10%;\nmargin: 0;\nmargin-right: 4px;\nfont: 13px sans-serif;\npadding: 1px 0px 2px;\nopacity: 0.6;\n}\n.persona .field:not(#dump) {\nwidth: 95px;\nmin-width: 33.3%;\nmax-width: 33.3%;\n}\n#qr textarea.field {\nheight: 14.8em;\nmin-height: 9em;\n}\n#qr.has-captcha textarea.field {\nheight: 9em;\n}\ninput.field.tripped:not(:hover):not(:focus) {\ncolor: transparent !important; text-shadow: none !important;\n}\n#qr textarea {\nresize: both;\n}\n.captcha-img {\nmargin: 0px;\ntext-align: center;\nbackground-image: #fff;\nfont-size: 0px;\nmin-height: 59px;\nmin-width: 302px;\n}\n.captcha-input {\nwidth: 100%;\nmargin: 1px 0 0;\n}\n.captcha-input.error:focus {\nborder-color: rgb(255,0,0) !important;\n}\n.field {\n-moz-box-sizing: border-box;\nmargin: 0px;\npadding: 2px 4px 3px;\n}\n#qr textarea {\nmin-width: 100%;\n}\n#qr [type='submit'] {\nwidth: 25%;\nvertical-align: top;\n}\n:root.webkit #qr [type='submit'] {\nheight: 24px;\n}\n/* Fake File Input */\n#qr-filename,\n.has-file #qr-no-file {\ndisplay: none;\n}\n#qr-no-file,\n.has-file #qr-filename {\ndisplay: inline-block;\npadding: 0px 4px;\nmargin-bottom: 2px;\noverflow: hidden;\ntext-overflow: ellipsis;\nmax-width: 88%;\n}\n#qr-no-file {\ncolor: #AAA;\n}\n#qr-filename-container {\n-moz-box-sizing: border-box;\ndisplay: inline-block;\nposition: relative;\nwidth: 100px;\nmin-width: 74.6%;\nmax-width: 74.6%;\nmargin-right: 0.4%;\nmargin-top: 1px;\noverflow: hidden;\npadding: 2px 1px 0;\nheight: 22px;\n}\n#qr-filename-container:hover {\ncursor: text;\n}\n#qr-extras-container {\nposition: absolute;\nright: 0px;\n}\n#qr-filerm {\nmargin-right: 2px;\nz-index: 2;\n}\n#file-n-submit {\nheight: 23px;\n}\n#qr input[type=file] {\nvisibility: hidden;\nposition: absolute;\n}\n/* Thread Select / Spoiler Label */\n#qr select {\nfloat: right;\n}\n#qr.has-spoiler .has-file #qr-spoiler-label {\nwidth: 6.7%;\nmin-width: 6.7%;\nmax-width: 6.7%;\ndisplay: inline-block;\ntext-align: center;\nvertical-align: top;\n}\n#qr.has-spoiler #file-n-submit:not(.has-file) #qr-spoiler-label {\ndisplay: none;\n}\n#qr.has-spoiler .has-file #qr-filename-container {\nmax-width: 67.9%;\nmin-width: 67.9%;\n}\n#qr-spoiler-label input {\nposition: relative;\ntop: 3px;\n}\n/* Dumping UI */\n.dump #dump-list-container {\ndisplay: block;\n}\n#dump-list-container {\ndisplay: none;\nposition: relative;\noverflow-y: hidden;\nmargin-top: 1px;\n}\n#dump-list {\noverflow-x: auto;\noverflow-y: hidden;\nwhite-space: nowrap;\nwidth: 248px;\nmax-width: 100%;\nmin-width: 100%;\n}\n#dump-list:hover {\noverflow-x: auto;\n}\n.qr-preview {\n-moz-box-sizing: border-box;\ncounter-increment: thumbnails;\ncursor: move;\ndisplay: inline-block;\nheight: 90px;\nwidth: 90px;\npadding: 2px;\nopacity: .5;\noverflow: hidden;\nposition: relative;\ntext-shadow: 0 1px 1px #000;\n-moz-transition: opacity .25s ease-in-out;\nvertical-align: top;\nbackground-size: cover;\n}\n.qr-preview:hover,\n.qr-preview:focus {\nopacity: .9;\n}\n.qr-preview::before {\ncontent: counter(thumbnails);\ncolor: #fff;\nposition: absolute;\ntop: 3px;\nright: 3px;\ntext-shadow: 0 0 3px #000, 0 0 8px #000;\n}\n.qr-preview#selected {\nopacity: 1;\n}\n.qr-preview.drag {\nbox-shadow: 0 0 10px rgba(0,0,0,.5);\n}\n.qr-preview.over {\nborder-color: #fff;\n}\n.qr-preview > span {\ncolor: #fff;\n}\n.remove {\nbackground: none;\ncolor: #e00;\nfont-weight: 700;\npadding: 3px;\n}\na:only-of-type > .remove {\ndisplay: none;\n}\n.remove:hover::after {\ncontent: \" Remove\";\n}\n.qr-preview > label {\nbackground: rgba(0,0,0,.5);\ncolor: #fff;\nright: 0; bottom: 0; left: 0;\nposition: absolute;\ntext-align: center;\n}\n.qr-preview > label > input {\nmargin: 0;\n}\n#add-post {\ncursor: pointer;\nfont-size: 2em;\nposition: absolute;\ntop: 50%;\nright: 10px;\n-moz-transform: translateY(-50%);\n}\n.textarea {\nposition: relative;\n}\n:root.webkit .textarea {\nmargin-bottom: -2px;\n}\n#char-count {\ncolor: #000;\nbackground: hsla(0, 0%, 100%, .5);\nfont-size: 8pt;\nposition: absolute;\nbottom: 1px;\nright: 1px;\npointer-events: none;\n}\n\n/* Menu */\n.menu-button {\ndisplay: inline-block;\nposition: relative;\ncursor: pointer;\n}\n.menu-button i {\nborder-top: 6px solid;\nborder-right: 4px solid transparent;\nborder-left: 4px solid transparent;\ndisplay: inline-block;\nmargin: 2px;\nvertical-align: middle;\n}\n#menu {\nposition: fixed;\noutline: none;\n}\n.entry {\nborder-bottom: 1px solid rgba(0,0,0,.25);\ncursor: pointer;\ndisplay: block;\noutline: none;\npadding: 3px 7px;\nposition: relative;\ntext-decoration: none;\nwhite-space: nowrap;\n}\n.left>.entry.has-submenu {\npadding-right: 17px !important;\n}\n.entry:last-child {\nborder-bottom: 0;\n}\n.has-submenu::after {\ncontent: \"\";\nborder-left: .5em solid;\nborder-top: .3em solid transparent;\nborder-bottom: .3em solid transparent;\ndisplay: inline-block;\nmargin: .3em;\nposition: absolute;\nright: 3px;\n}\n.left .has-submenu::after {\nborder-left: 0;\nborder-right: .5em solid;\n}\n.submenu {\ndisplay: none;\nposition: absolute;\nleft: 100%;\ntop: -1px;\n}\n.focused .submenu {\ndisplay: block;\n}\n.imp-exp-result {\nposition: absolute;\ntext-align: center;\nmargin: auto;\nright: 0px;\nleft: 0px;\nwidth: 200px;\n}\n.export, .import {\ncursor: pointer;\ntext-decoration: none !important;\n}\n/* Link Title Favicons */\n.linkify.YouTube {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABIklEQVQoz53LvUrDUBjG8bOoOammSf1IoBSvoCB4JeIqOHgBLt6AIMRBBQelWurQ2kERnMRBsBUcIp5FJSBI5oQsJVkkUHh8W0o5nhaFHvjBgef/Mq+Q46RJBMkI/vE+aOus956tnEswIZe1LV0QyJ5sE2GzgZfVMtRNIdiDpccEssdlB1mW4bvTwdvWJtRdErM7U+8S/FJykCRJX5qm+KpVce8UMNLRLbulz4iSjTAMh6Iowsd5BeNadp3nUF0VlxAEwZBotXC0Usa4ll3meZdA1iguwvf9vpvDA2wvmKgYGtSud8suDB4TyGr2PF49D/vra9jRZ1BVdknMzgwuCGSnZEObwu6sBnVTCHZiaC7BhFx2PKdxUidiAH/4lLo9Mv0DELVs9qsOHXwAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.Vimeo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAASJJREFUOE9jYAAC7ln7/pODQXrBmq333PvPu/YaSRikB6QXbACpmmHqsRoAMll7+20UQ0H8tmuv/pdffPFfZtNNuByGASBFIPDh5x+4IV6HHoDFYGDJgw+YBoBMBUkgA5BtIKduuvvy//svX+FSB+88wTTAc+/t/83bj/0HScLA5BPXwc7lKJ36f+L6XXDxhUfOYxrAPWUnWKFp9UQUm3iWQxSDXAEDSX3zcIcB96wD/x+8eA1XDNKMHAYg20GW4Y0FkCIYAAUqzEBQOIBciRzlWKMxZelOlMCEcVxq+jHSC1YDJPs3YBgA8jey0/F6ARRwsFAHORukmat9NdbUijMpg/wKcrJodDFOzSBXwA3Alh9AToZFI7a8Asu98BxJbnYGAJb5vYLDANzSAAAAAElFTkSuQmCC') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.SoundCloud {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABsklEQVQ4y5WTy2pUQRCGv2rbzDjJeAlIBmOyipGIIJqFEBDElwh4yULGeRFXPoEIBl/AvQ/gC2RnxCAoxijiwks852S6+3dxzslcHJCpTXVX11/Xv0097gLPgVNMJxnQNfX4zsqleWbnpoMf/oa9d988MM9MC/rp+E0a+A0dsVobMNMCOO8B6McRoABJI+A6gJmN3D2A8jgEBCEkSEMBrcrsDAzDWWn3AjgKFaDMmgRqniGFgsaDp1jrLOngDf1XT1D+A1dFc4MKAkkiCVKjjVu7g9+4Rzx4i1u6hjXbuMWr0O5QPNvCu7IaCZwEKQukLGDrm5x8uI0tr6MkiGlkiv7yLfzN+6S5i6QsIMABkEfcxhbWWYMkVAOjxvYAjc3HNHrbKI9VBQBFwF25XQKSBjqIf1YBuAurEMrczgDygD6/x2LCpFLXLUyQ+PoldphhBhYfIX09XU1+Flaukz7uYqs3SHs7cG4BmTsmkBUF9mmXEwa28BNLPaQPLepuNcbGSWQquQC2/Kdcox1FUGkcB0ykck1nA2+wTzMs8stGnP4rbWGw74EuS/GFQWfK7/wF6P4F7fzIAYkdmdEAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.audio {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAitJREFUOE9jYCAWKJWwavr0KyXWb/FIbDtUFFyzJx6nVofE2Xo5nXsj0rqPNSR0nVkR2Hjmgmfd+U9Otdf+m5Vf/6+SfeU/R9ChVVgNYDRtlfJuuPA/rPfe/4QpD/6nznj0P27Kw/9unff/69Xf+69c/+C/SO7N/0z+OAxgMmmRCe++/r9i3ev/KWvf/vdY8PK/bt/9/wrNV3/IN5y/IVt1YqNg4pGTTP4HsbuA2bhZ2qvpyn+xjIObxAp3VwqlrgngLFyryVy5nhPmZJHANS2cwYexG8BmVC/pWn3hP4NZlzWuQDJI3dIiFnUUuwEsQAOcq87jNcC7fHeLUtJxHF4AGmBWeAavAWH1+1rUUk7giAWjOknllON4DXAs2NEiG4/DBQxAF/CFHfrPYI4jDFSLuJVjNrUJhB/B7gIGo1pJRt99GAZYJK7wLJ1z7Xzl4vu/7aqv/GRBj0bjqAX2qb0nJ7mXH17C4HcUxQA+hymWtSue/C5a9up/9Ozn/7Vr7v1nRY7GqMb91T3b3v6vWvPmf/S0p/9ZQk+DDLCBRSOz06Jqk+o7/21nvfqvsebDf7kZL/5zBaxphkezd+OFn7HzXvz3Wvjmv9a8N//5Ek//ZTBpVYUrMG2X5wjcdl68+uI/wa5Lr3hSNjczGFeywOVZ/bbcVGp//F9izfv/Ql03f3P4LC/HSEQquYwMFnUCDJ7dzBhyjGZNQpye89M5gpfnMvtNUyE2h4PUAQBovvT7lyNljwAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.LiveLeak {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAydJREFUOE9Nk1tIk2EYx79NyUNqTk0o6KYrnZeChodLDxfeZpCbJk4RXU5Nm7tYRYhiYXbQlaeGutyW2gxtpB1RIyKDEjKwA6Ti2dR5KNDn+fq/S6TBj/f93r3P732e53s/qfnkSdej4GB2SBLbwf+jmB+gUMgOheLg/z7EdCUnO6Ref392SpK8Hyh3I+gBwBo7lUp2xcbyQEoKD6alyQOpqd754/h4FjJXZCRJTl9ftmEzoK5/wdQJxPgkLY2WV1dpc2uLtnZ2eHNnhza3t2nd46GhjAzuValY6jx0iIfS03msoIDuQ9COQCtoUSjohU5HuwgaN5loeXycd3d3aW9vzwvW2K5SkdTi58fvzGb+3tdHFggA3QONEAzn59PvjQ1yqNX0zenkvX0B4ffWaGRraChJd/385JGqKvlzTw/fRqOaIGkEd1DjU52O/3g83BkTw5MOh7yJuUCUM2o0yi2hoSw1IIOhykr+YLNRHYKu4XQvyKA/N5c8yMCCDD7Z7bz26xcJ1rH2rKKCG0UJdRAMlJbyG6uVrkJQjWAB5tSbk0Nr2HwDgvcQiIYur6zQyvo6ucvLueHIEZKuQPBQr+dXra1kRuqXEOwFArtWSytra1QdFUVjNhvPLS3R3OIiLUDUD0F1WBhJJtwDW2Ehu5uaqBICI4IFlRB0QLCEzaboaHrd0cHzCBYsIIuesjK+LAQXkEFrXh676uupGCWcR6AeghLQptGQONUAwfOuLp6Zn6eZuTmaXVig7pISrhI90ENgQbdHhoep32JhFzLpu3WLio8epUYIfs7OUjF6UKJW88XERLqYkEBNej11oG8XhCAvMFAuOn5cNiclsTkhQTbhmpri4lgbEMANWi1DwC/xit3t7bK7rY0Fo4OD3G4wyEURESzloAdnceezlErK8vH5N4KzPj50PTOTfkxP0+THj/RlYoInJyZI8HVqim5qNFwQHk7SucBAPo2PKRMNPLM/4pnFszYkhJsNBu6uqWFHba1sr61lQSveQFZQkFx07BhJmhMnrLn4NLMPH/aSExR0QDbmWhwgyEapwDvXoDxdWBiXnjrV/Bdm2kYUxLwmEgAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.Vocaroo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAw9JREFUOE9jYMABuMwYmCyTJKUCGlSnFSy02TTzeOyCiQcDViX26qVz2TAyYtWmEMwuoZ3M7V40LcB79pHkc0svpvzY8jD//87nxf+3Pyn8v/ZO8v+VNyP/2mZJumI1QCWSI8232Hjumitlfw5+qPp/9l8TCt76JP//xkdx/wsXWCzjtWFkwTCkbWFe9plPk/+ga4Txz/xt/D/hkN//gMXif21a+NbyWjIwoRiy6GDT5rP/mlFsPfyp5n/NpOj/22+0gMUXXIz/H7hC/L/bFKFbPDZMrHAD5H35OPt2J9zacDv/f3V7xv9FhwrBGubsT/1//Pjx/1GJ/mD+/nfl/1v3Ovy3KRJNQbHdOlXCvOO03/+pm1P/v3v37n90hhtYw9HPtf8Xb2v937cmHswHeWPRxYj/LvkK3igGKARwicTO07118H3V/5kbi/4vPZMJtK3s/6YH2f+Pfq1B8VbjWrdnMu5s4nAD9CNFhKwz5DTUvLl419zKvAcLtG1P84BRl/b/5M/6/6f/NPzf/qzo84yj0Uus0xUU4Zor54bm9+4OfZG02OCuoAMTb9ZkC9ull1Nvrr2Z+XvRpaRfc65H/68F+jl9svEhzyLFWoccWVc+eyTHq/twydjlKRln7jX9bNMkMJnbhoFRL1xCqmKx6/yi2fYXa/c5/e846PV/5fW0/7OPx/yfcjzop34ulxdGGvDuU8mMXaX507lBuiN6ueadmQeT/p/93vf/1O+G//sP5fw/eL3o/5JLif8zVxs+Tlir9S26UyeFQQvJGBE7FvaFZ9LfN+1y+WjbItSb3GmXvXd15v8zroH/HxgE/D+aGPx/18vi/z07PeZNPRKxe/Kh0Ae8toxscCO4zBkYXArk9C1SxJUYjBkYPPIVtbbuTftz3cz//2O9wP/75iSAXdO72/dt2HL5F6YlfBW4MiJYXMiBiW3t7azHBx+V/t89N+H/8a+1//e9K/9attDp5LQjYX8SuvVL8RoAkmxa65299Erq1FnHo0qrl7t4BddriIs4MrM3rfWcFd+pGwVSAwBZ0bKP8yrZPAAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.pastebin {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAtZJREFUOE+NU91LWmEc7sJtQew/2MUY7INg7CLY3W5GMHazyzEQo9UmfYxZTbAiVlgRqLMSZ+XnDC3z2+Y0+8JGakKZTtR0Tl2wtgtLLQh29cz3ZZ3h3Q68vOc95zzP73l+z+/U1f292O09DRxubxOH23P//1bvtQts3dPnry7LZnXJhcUl5Avf8dHtwY+fv2AyW5DOfIXFakMm+w0G4wISyRRm55TQG0y/Wzv6mikJ52Xf9TmVBoFAAD6fDwqFAqFQCJubmzCbzZiensbp6SmkUikikQi0Wi0kEgm6ewVaStDCfXPDandifn6egoaGhrCzswO1Wg2Hw4HBwUGk02kIBAL4/X4IhUJMTk6ii8dfYggy2RwymQzOz88Rj8dRLpexv7+PSqWCYDCIQqGAra0tJBIJrK2t0XdVAjNDEIl+wfj4OEqlEq2wt7dHrchkMmrBYDCAz+fTIjweD7FYrJbgIJOlgLOzM8jlcip1eXmZ2rFarVAqlRCLxcjlchCJRFRljYJYPAG32418Pg+n04lsNouVlRUcHh7C4/FQIOlHNBqlezgcJgQWxkIgGMbExASVNjY2hvX1dVo9mUzS5wREFLhcLrqTcw2B//M2RkdHodPp4PV6oVKpqH+SCom3v7+fNnF4eJiJusbCJ6+PviSyScakiaR5RIHRaKQpmEwmbAdCeD8zB6vdhebHT8SMhcUlC83bbrdTJRsbG3RwiCVCRNJJpDIoVeNNJJJQzKryV+rrmxiCtyNCCmaz2VhdXQWXy6XDpNfrodFoYLXZUTw+pk222Z3lW3ca26rgSwzBwqIZAwMDlITMAVEwNTVFR5fEJpK8Qyp1AJvDVbrTeLenCmxgfiZ22+urCtWHyu7uLp2wVCpFKx0dHaFYLOLk5KT6Y9kgk89kb95ubK0BX7A8a+1qannRLeW0daj/rU51S3tn9dypfvDw0QiLxbpX/Z7FVK7e/AEj4Wf24/2f5AAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.gist {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk1JREFUeNqUkzuIE1EUhv955MnsbB6r4kYQLUQQFncV3SnCIqJsoWGDYOGjsIiCtY2Kla1sjLBIsFFcXJC1kaSwENQmXUQSRSUSjCQSTCbkbR4z47lXEgtBNwcu3DNzvvO8R8jlcj7LshKmaWqYQERRTAmCcEru9/sJr9er0QF92BJMAVGr1TQ6CeZAc7lcGAwGkyQAxpTLZU0eDoc8crfbRTgcRjAYRCQSYSmi1WpxY7fbjU6ng1gshmaziXg8zhnGIpVKWbquW9ls1mLZsaMoiqWq6lgnBxY55He/328Vi0XOMFZmqVMD4fF4QBAajcY48khY9JE4HA4enTGMFVkaTHmy+ZzD/5NSqYSNB484w1h55ODO3TVu4FXcWDywl24Cmp0e1WBhyuWELAtIf/qKUrWOONmev3Lpt4NRCXq1gplpBS/v3cDc0nGg9h1o1ZkfwO4Atu1B8cM7HLt8k37V/y5B2b4bJxf2Y+7oEbyJrkMvUjki0YYJ03LidfQxAt4dOHdCw5RdGZcgGobBlQtnV/BDr1GfDai7ZiHZZRi9PoY/e5SCCTUwC9gk1GmMh5YWOcNYkR4Sv1y9uAJbYB82N57h4OnDmN7phjQ0qUkWRJuB+TMaPn/5iFfvv+Ha7eucYey4iWw8q6tRJJNJ3Fp7ClUawEkViBTfkCR0YUNTVHD/4Tpm/P4/U2CeKpUKfD4fJDIMhUKEhP45St50XedZyLQY6Xw+v8AUemVb2oNqtYpCocCWKi2TLLfb7ReZTGZ+kmUi7i2VvfxLgAEAZChMriPcl+IAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.image {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAs5JREFUOE+lk/tvi1EYx98/xT8gW4REIpGFMEQWl2FiM9ZMZhm2xRAyOsmujFFmdFRHu0tWm87UypxStr69zPauN5e5rHVp3IYhbOvHy+wHEQlxkm+ek+d8nm9OznkeSfrfldmgJC7QyUlTymsJTfuTZ25z4HdWYwyLreYhtpgekGPw0+kKvo1Eo+IXRSIiEhkWZuc9tqnsJD9EqTUopCxjSGTpB0iueczSo1HyW8cpsExQ1DbxI2pt45j9cXpexul4FEd79RnZphAa/SD7WvuFtO6UItbU9LC+YQxNI2w0wwYT5LRAdhOU3oBTIXC9gXP3oUSGgz2vST3gYHejR0jptT1C332f8yrUEYHrz8CgxDnpm6DKCUfc0KnmXa/AEVPPwnDcD0cvetA2uYRk67Ive/lpjO7YBO1PPuF8Df3vwf4cbNE4tqdw7YVq8HYyHx6FvhE1hkMEg8HDUqvFkjT4aIjMqkqyqkswDSrcfBfH+Q561YLAZ/B+BLda6FXlU/cPv0AoEPhuoP1h4Av7Wbh9E/Py15NWWUjeSR3nZDfeN+N0DY9hG/7K1eGP3P0S5/EYRFUF/IOTBrUXHPm9fT6mr1xEwupkZqxbzLyiDJYUZ5NSnkdqdSHpxyrYdFpPgdmAsdfJwPMI/Yr65bf7tZLGGBQ7DNdJWFtIYvoOZmbuZE7OXpIKKli86zAr9p9gTVktWTVnKTI2U95uRWe3U2IJUDbVB5p6hVm5x5m9Vc/cnedZUNzC8lILaQesZBy6hEZ3maKzgvJWFzVWD9XtXvVGQbSWASFtMATVRlJIKbOTWtlJXaeXepuPM1f6MNp9GLt8mLvvYLmp0OhQ2Fwvk6m7xaqDTvY0eYWUVtcnllXfYlGpnfklVuraHHg8HjxuN+6fktUHlWWZPaZeUo/ILK0UKttBcbNbSB9GP0yLxWJJUxoZGUn80zD9C/vXQ/4NHY10h3M1zmQAAAAASUVORK5CYII=') center left no-repeat!important;\npadding-left: 18px;\n}\n.linkify.InstallGentoo {\nbackground: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAklJREFUOE9jYEAAASBTCorZkcSRmTjVCDLziCwG4hfM3EIvGNm44oC6WNEM4WXi5FsEkmfhFX3BxMmfAJSHW9Qr55Px3aZp3X/btq3/hQydPzKysMcCFbBBDeFj4uBdqBJR/gskb1W34j+PmulLoJwbzBJJoMm7dNO7/ntMP/XfpW/v//SKvk+7tl7fvXfTpx5pCdWVSiHFv1wnHQbLi9sE/Wdk5SwBauaCGQB3gUPb5v+7Lr/8/+fvr/9fv/z+f+Pyr/9bV735l9Wy/79Dx/b/Nk0bsLoAHgbeAVHv/v77/f8f0IB7N7+cu3DuecK54z9+7lzz639e9pK/7HwSWMMA5BJwCJeXtOm/fvVj1fcfv369f//92cN7X6ZcPvf9x6Htv//vXP3r/+T245UEYgpskPTNq08LgN749/PH7/93rv/6f/rw7//nj//4f+bU0zQcUQwWBkdVbGz62y+fv3wHeeXrlz//H9798//qpY//M3KqfzGxc8djiWKwZnBUuWQ2/fr46fv/P39+///x/ff/d69//z97+s7fyMb5/+y7d2GLYriDZikFF/1qXXXj/4Pbv/8/f/jn/5MH316/eP6jVlBAaIt6VO1/jxmn/zv27P7Pp2HxEajLD90ra9Sj6/979O37X73w0n+vqOL/0lJyMVBFq0EGgDSD0oKAlu1/oHg4ugGzVCKqfouYuL1Xj676Iajr8AnJFricGqYc3Bw+Zi6BVUxsXLHAdL6QiYMPFNrwpIxHDsUhgtAMAopKDjQn4pPDF7P45QC4hSmc1eX8WgAAAABJRU5ErkJggg==') center left no-repeat!important;\npadding-left: 18px;\n}\n\n/* General */\n:root.yotsuba .dialog {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.yotsuba .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.yotsuba #header-bar, :root.yotsuba #notifications {\nfont-size: 9pt;\ncolor: #B86;\n}\n:root.yotsuba #header-bar a, :root.yotsuba #notifications a {\ncolor: #800000;\n}\n\n/* Settings */\n:root.yotsuba #fourchanx-settings fieldset {\nborder-color: #D9BFB7;\n}\n\n/* Quote */\n:root.yotsuba .backlink.deadlink {\ncolor: #00E !important;\n}\n:root.yotsuba .inline {\nborder-color: #D9BFB7;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.yotsuba #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.yotsuba .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.yotsuba #menu {\ncolor: #800000;\n}\n:root.yotsuba .entry {\nborder-bottom: 1px solid #D9BFB7;\nfont-size: 10pt;\n}\n:root.yotsuba .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.yotsuba .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.yotsuba-b .dialog {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.yotsuba-b .field:focus {\nborder-color: #98E;\n}\n\n/* Header */\n:root.yotsuba-b #header-bar, :root.yotsuba-b #notifications {\nfont-size: 9pt;\ncolor: #89A;\n}\n:root.yotsuba-b #header-bar a, :root.yotsuba-b #notifications a {\ncolor: #34345C;\n}\n\n/* Settings */\n:root.yotsuba-b #fourchanx-settings fieldset {\nborder-color: #B7C5D9;\n}\n\n/* Quote */\n:root.yotsuba-b .backlink.deadlink {\ncolor: #34345C !important;\n}\n:root.yotsuba-b .inline {\nborder-color: #B7C5D9;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.yotsuba-b #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.yotsuba-b .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.yotsuba-b #menu {\ncolor: #000;\n}\n:root.yotsuba-b .entry {\nborder-bottom: 1px solid #B7C5D9;\nfont-size: 10pt;\n}\n:root.yotsuba-b .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.yotsuba-b .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.futaba .dialog {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.futaba .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.futaba #header-bar, :root.futaba #notifications {\nfont-size: 11pt;\ncolor: #B86;\n}\n:root.futaba #header-bar a, :root.futaba #notifications a {\ncolor: #800000;\n}\n\n/* Settings */\n:root.futaba #fourchanx-settings fieldset {\nborder-color: #D9BFB7;\n}\n\n/* Quote */\n:root.futaba .backlink.deadlink {\ncolor: #00E !important;\n}\n:root.futaba .inline {\nborder-color: #D9BFB7;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.futaba #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #F0E0D6;\nborder-color: #D9BFB7;\n}\n:root.futaba .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.futaba #menu {\ncolor: #800000;\n}\n:root.futaba .entry {\nborder-bottom: 1px solid #D9BFB7;\nfont-size: 12pt;\n}\n:root.futaba .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.futaba .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.burichan .dialog {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.burichan .field:focus {\nborder-color: #98E;\n}\n\n/* Header */\n:root.burichan #header-bar, :root.burichan #header-bar #notifications {\nfont-size: 11pt;\ncolor: #89A;\n}\n:root.burichan #header-bar a, :root.burichan #header-bar #notifications a {\ncolor: #34345C;\n}\n\n/* Settings */\n:root.burichan #fourchanx-settings fieldset {\nborder-color: #B7C5D9;\n}\n\n/* Quote */\n:root.burichan .backlink.deadlink {\ncolor: #34345C !important;\n}\n:root.burichan .inline {\nborder-color: #B7C5D9;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.burichan #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #D6DAF0;\nborder-color: #B7C5D9;\n}\n:root.burichan .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.burichan #menu {\ncolor: #000000;\n}\n:root.burichan .entry {\nborder-bottom: 1px solid #B7C5D9;\nfont-size: 12pt;\n}\n:root.burichan .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.burichan .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.tomorrow .dialog {\nbackground-color: #282A2E;\nborder-color: #111;\n}\n\n/* Header */\n:root.tomorrow #header-bar, :root.tomorrow #notifications {\nfont-size: 9pt;\ncolor: #C5C8C6;\n}\n:root.tomorrow #header-bar a, :root.tomorrow #notifications a {\ncolor: #81A2BE;\n}\n\n/* Settings */\n:root.tomorrow #fourchanx-settings fieldset {\nborder-color: #111;\n}\n\n/* Quote */\n:root.tomorrow .backlink.deadlink {\ncolor: #81A2BE !important;\n}\n:root.tomorrow .inline {\nborder-color: #111;\nbackground-color: rgba(0, 0, 0, .14);\n}\n\n/* QR */\n.tomorrow #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #282A2E;\nborder-color: #111;\n}\n:root.tomorrow .qr-preview {\nbackground-color: rgba(255, 255, 255, .15);\n}\n:root.tomorrow #qr .field {\nbackground-color: rgb(26, 27, 29);\ncolor: rgb(197,200,198);\nborder-color: rgb(40, 41, 42);\n}\n:root.tomorrow #qr .field:focus {\nborder-color: rgb(129, 162, 190) !important;\nbackground-color: rgb(30,32,36);\n}\n\n/* Menu */\n:root.tomorrow #menu {\ncolor: #C5C8C6;\n}\n:root.tomorrow .entry {\nborder-bottom: 1px solid #111;\nfont-size: 10pt;\n}\n:root.tomorrow .focused.entry {\nbackground: rgba(0, 0, 0, .33);\n}\n\n/* Watcher Favicon */\n:root.tomorrow .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n\n/* General */\n:root.photon .dialog {\nbackground-color: #DDD;\nborder-color: #CCC;\n}\n:root.photon .field:focus {\nborder-color: #EA8;\n}\n\n/* Header */\n:root.photon #header-bar, :root.photon #notifications {\nfont-size: 9pt;\ncolor: #333;\n}\n:root.photon #header-bar a, :root.photon #notifications a {\ncolor: #FF6600;\n}\n\n/* Settings */\n:root.photon #fourchanx-settings fieldset {\nborder-color: #CCC;\n}\n\n/* Quote */\n:root.photon .backlink.deadlink {\ncolor: #F60 !important;\n}\n:root.photon .inline {\nborder-color: #CCC;\nbackground-color: rgba(255, 255, 255, .14);\n}\n\n/* QR */\n.photon #dump-list::-webkit-scrollbar-thumb {\nbackground-color: #DDD;\nborder-color: #CCC;\n}\n:root.photon .qr-preview {\nbackground-color: rgba(0, 0, 0, .15);\n}\n\n/* Menu */\n:root.photon #menu {\ncolor: #333;\n}\n:root.photon .entry {\nborder-bottom: 1px solid #CCC;\nfont-size: 10pt;\n}\n:root.photon .focused.entry {\nbackground: rgba(255, 255, 255, .33);\n}\n\n/* Watcher Favicon */\n:root.photon .watch-thread-link\n{\nbackground-image: url(\"data:image/svg+xml,\");\n}\n" - }; - - Main.init(); - -}).call(this); diff --git a/builds/xpi/4chanx.xpi b/builds/xpi/4chanx.xpi deleted file mode 100644 index 896dfe79e530779e59da4ea0eb13b763ff08a231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208535 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%0A-hU01z5~h0ieS%)4`l75mdWo-P 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 uO0*A|Dd>u7 zjID6s9Zej_S;%Cj$h>YT-jWFU`5t9@KBzMjxY%2oF{F36xoWc4lL&%1c z+vKhr`IgQIbnUQ-3)6T0!mqD74U}h<-?cmKbM@H=*bXUqZ+!{zamO9Z7&ui1feR0$ zOLh)P+aLMN_InR*SJ!#M{GGiI$PlyEc3k*1w{H8_GjhiV<+opy?5I_$bL$(^qxKwL0W3F0Bna|a}#5@zPZ#1}M&L5|4pNu70 z<0P@P${diy+Y8=Qfs}y4RNlrDszg?E4TjpxC$Y>Ict-Cn41AKtGM!cALn*7YsfqW3 zZsjJY!1(>S{m_~i(p;=$e5BN6<&uR8UB<1#cA*zdxy{9h>P7-EjZ2d>QCI$3Ux!wQ z5xNPl9>u|gTh7HMxoykvpdF18TIrb1c#Uy1PvBjKl%83%#wk%zK&u0L{Y0-+){vZp zrB(yMRS0uNX~Wzgg37}8JpQuEsl!t46_dQ)d~+;@vkm1P2bX!X#?t7+c>JlKE5S&< z%4FymnG;og7EAWL?i0=L?oeg~>$-kw))r^o&Mz#lnpCLI)@RaNnx~bc%kncwcNxtA z*);uwIQt1R(i+Sd^ClenK^=af_P0WABV`8+L{=bGV@<>R*{1y3g$~K3N&-#drinO` z%|beLgXu-=>m(9vUi(wd{v^zM^~#^+fcRuWZs|FZdyc(%_oF5T8atjIByCH*Y*j|L zg4(gXWwpGd0!^TgEC^FCPetl;UfCk<>QBwY>@#jm(8 z1EjNhaqpAK)TTv+gz^`=G6J1uui_$D&g1E{GUcZO zc)GG)Bu!cHY+eq<3N-5b(;Qav@|m2%n;gFHU-&pG%lMu*>uXI+DI-q*G(wY>cZ)W^ zh=aEVf=2`jXaV|P#6;d&5BF(Zd%Pc*Z>g|QpD?&86MNco8@SB43-F>p7pqovgP?yj4Rr^`d(#hl(-7 zK(uOeezfF6%msaOQ?ESfu%Zuq{DCBq%HdCv!-wJ5lpqCvesXTg5?)A@pDt)!@K`LG8` zk>ViotD|CiV-aD7zEt3L;u4FlF2c+?R@h?%=f#=YxEzKcU-vFX`8NJxu9wgU6Z>2G z2EhTf83L6(>A_OjkbD(>J9tHmp}DCf zmu^9K532a>=IWI1BZB#{6ZUW~RvXo>w5(o)x4$-8QRR73NF7g=eoQ;&xv2T>s+rk+ zz1@eQ>tK6Y#vj1^iJjdRoR07DPT{_5y?5R5QZM^iv(9U4aTRN99UeBznd5yhYQj0~9+4On@aD6jb$$L4mMPN2b1AExCm=j#Emax>2nvm9 zOcQlk#_7nBI2q=}7#a_d#ClZ!l5XTjr{Lvm>T^i$bqIgCXgMwmUTbIEvuR5sk3VKZ zP!PV-0%cnkEoOL*L%3QXOtG26FwUa|=5 z9zrtfP!x&D43g#GJ-xc~ko~rNnj^hJuQL21=oz(PkJ~@k+w8c`5PERDSQxqEV8izW z@8-th*^P_}&(8(VV}Gsp@9&x@=diE;=0hkqr@`mhw~WSePJX(rzP4rr!SRlZORix zqW{x{+Ulr9pwHpu&Ow+SfKPBn!S;HMlx%N&XUxtC-uSxRvd&Rm|8PP8#6rORxS7?z zVz-#oaXtel;Z|>B8{yZnGFVe5e+om{A)+Ta8~U94;PIi}yA}D&CSBouJ-(ILyN869o$M?6B>G{yA&+9~pYkH=9AiI_K40kN z(swf{xBkp_{?bPG@jO@*Jc#21a}LvteV8Mc2m3;BpYBn{9F~pow5^S<=^<4tOL<%( zQf2icbx|$wH5poye=o!BS`n*<*(yf8Zofy`ns{OkPhN(T-3#qUc2L;R+3j$46dcy; zM>*G8x6{22`S^`wZ_Q@C_oc^ga1q!#;!d~jHeU`m80i@|-NrrVG;AL|6tB>B^Wr;6 zwYbEz7vv8Bi+Rw$lX`_f;SqiPn73lJT2_Q52a!)&)n-772(8b8t@Xk7eCa)wOeBvp zC*seXyRu?RN)78aWST>9taMucgs!)cxS7mPlzO6IB;m)|RkSn_{E5w}8+5-FLND>o z#?`;5^C2WG`v%toX@s{7W=)dfeu=G4$#lN{PE6XzgN^1;en2Lv@?GoTD!ScW+)(#B zUqV8!Hb_Qw28%0{dJ&&2d#5LrVBYN@V8mY+Ui(&u)t$I$Ku zy^rPp`Jyef<#5B1_EWv*Q;Tni5=tn!0;Q72QWXZ6_94m8SdKk)X(DEl(nw=+!E-b{&DnU+abZB95lQtUXV= z$mp{)nmo|&bD;0ScgPfc7YHBa6D#s~nT&|0E%ZS(N>Ahsix*vITO_f_rmvm|W_K&8 z*f-V;-b{((qIJ@MkBfS@(H@3hUsQL-omvt*VJP@2*d?bdZO5FF>aZ{tU6ZQNJ~S0G zN#fTxja!~zutqi8r!M2WUj*K6d(UGrzBg znn*yiJ5}pPf3HX);$poe#kHb&h@>v-B;!C`7|=cYyMwYtT@P=mhY}8XYPTBCn+DW|er1XmoS0`6tH#L?-QDS4Ll#!rjaJXMCCuGjCTxZS-F za`wFW{R0zWJ>TDQo+{3KJli0=Mk&3rbN>ut8`zYdUZR}32;dQ!ytL2M1uG4e3z208 zH+rV;8^|u@9SRv-pFINc{YRyy3>%FjO z+O1fQXJF5uG&1VDAP-yLWw31|<%+BG=^>J`d9R_z*Pw@Q@kuvB1~#p_DhFv#)Vc6d zk$U=UhLk+HZZAHm=$;u4ph;wc;%{$iHfj2d{H*2&?0ueNGjP4Rqh@$!HVAv8u!R%6;N0#2?rEm5uvpiG_$cmpFxX#;#J6f^kyL)77r-dTH}0){-7oF0S2r zjea}{)t<;@jbYKD+;bUSV^sRb3V)OI`U&qLbMKC=bUC9~Ixen>`B&wy<2gCX&idm7K!zXDgfYG`j zNnJ7yAM2Y5*llel5v)W~S8`f9kuaF?Jx7iTRq5&+s)!~cF08<(@GW^<))m&Zn@s4WFsW3dc zrBJH37o|{M@5Y6UGMR|LhqDB6$k$6f<%j2={TDqSDqDAcXaSTq z`R$RHa$LjiV;;NAEy{@Z{T$&68`RvNmQjxdt5LJp1Dj`2gi$S>+kGf6(J0|X3C8{E z4;ZPC5m?`l$!e4c1^&`*Ij_t^4Wi=diU2rCrlV)OXryyM;+M0Uix~V^J`{dWS0wC&1g1FO z$74EwJ;n~M8g)Nm5M zY2|L2$K_y-fZPo8T6i4A zlO}2>UW|N^Z@9B&dY@p158gbY%l!n}=5rX~WQub)@L8 zyYIaE++dxqj(NfXk9R!fDy>zEvbMN1q({76p5MN#NRAb!y&{-Lvb$tL4(ncwzOqXd z<2xR1de4>>M%B_Z^4Tba^GAiD#>N7T9xJ*}KV68`E#cynujsLvhJa}5|=!O(Xd zQ*7eH4T)RaFz>C`8g>KJ0d3tBRhG?#YWw5%1w=9?yyAJ@4*2;X3c(9XUVWJz*(G!@)lT0078av7Q#fSg#34D1Y8O>K=0AjS|gb0CWa#9g@s zM8b~UaHOVAhD)7M*PBY`%a?9}uad3wK3*KZAXo^EMc38R^@GBg=aCaopEsOL=xlSq z6^xXt3SkYQUE0hr7hT$QtxPwzoQS<2K(L@4$TefynJM#KEXuX1qMkL7EC<F-u9T7$KsctAFnP6c?omP ziz0;vOP(N*pd~nCi~E^K_K_r@%?W%0m2;w=ifvIxvQ}uiF3q=4p6|TM+>TRbDaG$- zlRD^*KN$#~XUFu`>t++6hV+jfeub@!qpIZ6B&Kbpq6rmLZN0?Z@=5jJh33RHqFoXl z@=Yb$E}XO-WDy_DpS`E^>x(SR%+-i+QX1q*&hk3)Dz@XKZ4+y}H|$gd9$Clh)sQ2P zc_D^tWWJZZrOajCV!OS|CKy9IrSz2_g_eBm4aTChb+@LHS;NS?3aswaly_5coQRQ6 zc5A3U*bY%BD9|3-Zw-Ji;lJaH#M0bH&ucn z>EPYpF{|^o$I-tvL;GshrRIQq!NDKma%VxVOr0gR%Wf-M>h#IJXF>Bv;Jt&xTUu?D zw2WAp9uYdaXPz=I^XNPR;UROEB6}tRP?Lo?!}D&%dfa0)8#tB(0vL zPA5!OSGd5oFyoTF9RNP*7?Lq-be>gM%yI zAM-_wM(3^cK!>?u%d}_!JK~dW!U*>5j$Z$sIC5-J7K*1ynfw%1E#id+^Noc>Sfe?r z=q3w&KZp1*2OgYIt#Q#z;Ydar2hx0X9D9v7!oPHre0@RJJzh~DA}v1)Ey zzPDgi(cn|7N`o-fxGTpe0lJLM?}}x4GfresW)CNh+lzRs&dy zc}FAm_q9}7N2CbI&jDlP4PTkvYTXLF7pc!eiw}UTl#!SRl{zX|eh02j{lWPuw#>_y zcUx#W6Pl^kOPkMsc)%K_ds%9DUnQ|&seD)#pWvyvY7Er8c`s$XSYD?DN03%ltan9k zXqn^W?7Dx6yL{M%TgR4Pta?~i>c0jE?`MTBX%%rssBU&S_a=D0-oj5kfvAC(cjddv z-#RsXS%|dY`s_w)M6#79@H+RP;L21$UdYXrUXeu?OokuFl3}4<$kF2w;i%mK=*+ZyArA>q?X(TLS@CRx%Qx_AN_V;D^nU~viV+fb_ zUE-g^Yxs`wMC3Wqjck!$M#DlX>K|9XdGKLxo9Y7&=kL%A>N}58tLcqim5P3TbgUrt zd{IT`bWQl%L4UdOpM9F}uN>6Q7-9$cw^#pP(68L{M<6gTG6I8`Ax4(}13~mRh(AXU z-)IAgw-%=^63}dR2@e4Lx{jHFEyx%GVFp{s?q|dP< zhChncSK9e_ z9A{0B?(rg26vf$_l}L5~KuF7FMYtJlgis1oAz6o1>sk*n3m-gG#nP~)WQnvQemn9Y z*gu))e2rZc3608jwc4IF67cp;sa~mN6nuzJ4>@@3_0{A!9KZxY_2At>)nE2uM^kZF}fYZp(w$rZ|0z0QQ6hk6e~gNeC9 z#EM?;pgd+KZE>%K5<(+oIotSQIr^vH^cHG4NlB+og|NeZ&|_j8Rqy)_Kc2XW2H$QsvFft=16>*r}zY zD&Vm*U3EtO4q}qrj>W9Y{Xlkc%oM*|^cCdFQM0cq>4UtWG*mIg_}XtrVIp-q3oOZP z>;7;8DLgTOBYYI^E)*>eYY(On?u$AUKC~Wt`OV(NMULtq`RL2(d=?OFcr{R;&_wE8 zW$i^PpY^&|jjDumuUGBVYyn3S>$R$1VY*#RsbsYle_?21qUD7N*-?QA<@<~Ckp9jw zE%QRUL#%VSm3f+B#0POMCo}E!qQ<0=pC>#7`6-MKno9w+d3eHVnL(6^PcRD7FtE?y z{#ix+vO56G^Y1{Y-913<4h?E|za`!KSIZm(u`{r;VzD(c`A?uw88qEd+7VSihtxn1 za|B?sQ$p>*bkU=WKn$n-x^n9w9?aHv~64;{G;Jy3r`pyvZ`8))kMh2r7*Z`?oB zgpPsI{zJ(Bb^diq_qK;BZe(m?U~dKWU29uo6JuLr(61`+SNoUW{Gq}xz@Nha(yy+6 z$$?lYl*$ThXkcXwb?M*J^y^nDfZ2Iw4>q**>p=h2^)E?>nff>ApHBJ*5*bjO3KCb% zsEg>q0RY6<{tM}i11(%Xfx&hVJ6i+m|Bs@7nkzAQX!!ag5dCq*UrPP?2B8=Jw;YHu z{R#K4GWmbO3H}X+J|Z!#zk>gx%Kn1`86Xd}s(Q0$;uFYlfD9KD0L_1JqSV^ECY`@qWvJ7(De~5dJe{|F(+1 zF8O{_q_byg_LUu8B0X#~Vyqi~_0?@))@dj*XKfd2=Ya%M{a diff --git a/builds/xpi/data/4chan-X.user.js b/builds/xpi/data/4chan-X.user.js deleted file mode 100644 index 257f532b1..000000000 --- a/builds/xpi/data/4chan-X.user.js +++ /dev/null @@ -1,13534 +0,0 @@ -// Generated by CoffeeScript -// ==UserScript== -// @name 4chan X -// @version 1.4.1 -// @minGMVer 1.14 -// @minFFVer 26 -// @namespace 4chan-X -// @description Cross-browser userscript for maximum lurking on 4chan. -// @license MIT; https://github.com/Spittie/4chan-x/blob/master/LICENSE -// @match *://boards.4chan.org/* -// @match *://sys.4chan.org/* -// @match *://a.4cdn.org/* -// @match *://i.4cdn.org/* -// @grant GM_getValue -// @grant GM_setValue -// @grant GM_deleteValue -// @grant GM_listValues -// @grant GM_openInTab -// @grant GM_xmlhttpRequest -// @run-at document-start -// @updateURL https://github.com/Spittie/4chan-x/raw/stable/builds/4chan-X.meta.js -// @downloadURL https://github.com/Spittie/4chan-x/raw/stable/builds/4chan-X.user.js -// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAACVBMVEUAAGcAAABmzDNZt9VtAAAAAXRSTlMAQObYZgAAAF5JREFUeNrtkTESABAQxPD/R6tsE2dUGYUtFJvLDKf93KevHJAjpBorAQWSBIKqFASC4G0pCAkm4GfaEvgYXl0T6HBaE97f0vmnfYHbZOMLZCx9ISdKWwjOWZSC8GYm4SUGwfYgqI4AAAAASUVORK5CYII= -// ==/UserScript== - -/* -* 4chan X - Version 1.4.1 - 2014-03-01 -* -* Licensed under the MIT license. -* https://github.com/Spittie/4chan-x/blob/master/LICENSE -* -* Appchan X Copyright © 2013-2013 Zixaphir -* http://zixaphir.github.io/appchan-x/ -* 4chan x Copyright © 2009-2011 James Campos -* https://github.com/aeosynth/4chan-x -* 4chan x Copyright © 2012-2014 Nicolas Stepien -* https://4chan-x.just-believe.in/ -* 4chan x Copyright © 2013-2014 Jordan Bates -* http://seaweedchan.github.io/4chan-x/ -* 4chan x Copyright © 2012-2014 ihavenoface -* http://ihavenoface.github.io/4chan-x/ -* 4chan SS Copyright © 2011-2013 Ahodesuka -* https://github.com/ahodesuka/4chan-Style-Script/ -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, -* copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following -* conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -* OTHER DEALINGS IN THE SOFTWARE. -* -* Contributors: -* aeosynth -* mayhemydg -* noface -* !K.WeEabo0o -* blaise -* that4chanwolf -* desuwa -* seaweed -* e000 -* ahodesuka -* Shou -* ferongr -* xat -* Ongpot -* thisisanon -* Anonymous -* Seiba -* herpaderpderp -* WakiMiko -* btmcsweeney -* AppleBloom -* detharonil -* -* All the people who've taken the time to write bug reports. -* -* Thank you. -*/ - -/* -* Contains data from external sources: -* -* audio/beep.wav from http://freesound.org/people/pierrecartoons1979/sounds/90112/ -* cc-by-nc-3.0 -* -* 4chan/4chan-JS (https://github.com/4chan/4chan-JS) -* Copyright (c) 2012-2013, 4chan LLC -* All rights reserved. -* -* license: https://github.com/4chan/4chan-JS/blob/master/LICENSE -*/ -'use strict'; - -(function() { - var $, $$, Anonymize, ArchiveLink, AutoGIF, Banner, Board, Build, Callbacks, CatalogLinks, Clone, Conf, Config, CustomCSS, DataBoard, DeleteLink, Dice, DownloadLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Fourchan, Gallery, Get, Header, IDColor, ImageExpand, ImageHover, ImageLoader, Index, InfiniScroll, Keybinds, Linkify, Main, Menu, Nav, Navigate, Notice, PSAHiding, Polyfill, Post, PostHiding, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, c, d, doc, g, - __slice = [].slice, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - - Array.prototype.indexOf = function(val, i) { - var len; - i || (i = 0); - len = this.length; - while (i < len) { - if (this[i] === val) { - return i; - } - i++; - } - return -1; - }; - - __indexOf = [].indexOf; - - Config = { - main: { - 'Miscellaneous': { - 'JSON Navigation': [true, 'Use JSON for loading the Board Index and Threads. Also allows searching and sorting the board index and infinite scolling.'], - 'Catalog Links': [true, 'Add toggle link in header menu to turn Navigation links into links to each board\'s catalog.'], - 'External Catalog': [false, 'Link to external catalog instead of the internal one.'], - 'QR Shortcut': [false, 'Adds a small [QR] link in the header.'], - 'Announcement Hiding': [true, 'Add button to hide 4chan announcements.'], - 'Desktop Notifications': [false, 'Enables desktop notifications across various 4chan X features.'], - '404 Redirect': [true, 'Redirect dead threads and images.'], - 'Keybinds': [true, 'Bind actions to keyboard shortcuts.'], - 'Time Formatting': [true, 'Localize and format timestamps.'], - 'Relative Post Dates': [true, 'Display dates like "3 minutes ago". Tooltip shows the timestamp.'], - 'File Info Formatting': [true, 'Reformat the file information.'], - 'Thread Expansion': [true, 'Add buttons to expand threads.'], - 'Index Navigation': [false, 'Add buttons to navigate between threads.'], - 'Reply Navigation': [false, 'Add buttons to navigate to top / bottom of thread.'], - 'Show Dice Roll': [true, 'Show dice that were entered into the email field.'], - 'Custom Board Titles': [true, 'Allow editing of the board title and subtitle by ctrl+clicking them'], - 'Persistent Custom Board Titles': [false, 'Force custom board titles to be persistent, even if moot updates the board titles.'], - 'Show Updated Notifications': [true, 'Show notifications when 4chan X is successfully updated.'], - 'Emoji': [false, 'Adds icons next to names for different emails'], - 'Color User IDs': [false, 'Assign unique colors to user IDs on boards that use them'], - 'Remove Spoilers': [false, 'Remove all spoilers in text.'], - 'Reveal Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled, or make the text appear hovered if Remove Spoiler is disabled.'] - }, - 'Linkification': { - 'Linkify': [true, 'Convert text into links where applicable.'], - 'Embedding': [true, 'Embed supported services.'], - 'Auto-embed': [false, 'Auto-embed Linkify Embeds.'], - 'Link Title': [true, 'Replace the link of a supported site with its actual title. Currently Supported: YouTube, Vimeo, SoundCloud, and Github gists'] - }, - 'Filtering': { - 'Anonymize': [false, 'Make everyone Anonymous.'], - 'Filter': [true, 'Self-moderation placebo.'], - 'Recursive Hiding': [true, 'Hide replies of hidden posts, recursively.'], - 'Thread Hiding Buttons': [false, 'Add buttons to hide entire threads.'], - 'Reply Hiding Buttons': [false, 'Add buttons to hide single replies.'], - 'Filtered Backlinks': [true, 'When enabled, shows backlinks to filtered posts with a line-through decoration. Otherwise, hides the backlinks.'], - 'Stubs': [true, 'Show stubs of hidden threads / replies.'] - }, - 'Images': { - 'Image Expansion': [true, 'Expand images.'], - 'Image Hover': [true, 'Show full image on mouseover.'], - 'Gallery': [true, 'Adds a simple and cute image gallery.'], - 'Sauce': [true, 'Add sauce links to images.'], - 'Reveal Spoiler Thumbnails': [false, 'Replace spoiler thumbnails with the original image.'], - 'Replace GIF': [false, 'Replace thumbnail of gifs with its actual image.'], - 'Replace PNG': [false, 'Replace pngs.'], - 'Replace JPG': [false, 'Replace jpgs.'], - 'Image Prefetching': [false, 'Preload images'], - 'Fappe Tyme': [false, 'Hide posts without images. *hint* *hint*'], - 'Werk Tyme': [false, 'Hide all post images.'] - }, - 'Menu': { - 'Menu': [true, 'Add a drop-down menu to posts.'], - 'Report Link': [true, 'Add a report link to the menu.'], - 'Thread Hiding Link': [true, 'Add a link to hide entire threads.'], - 'Reply Hiding Link': [true, 'Add a link to hide single replies.'], - 'Delete Link': [true, 'Add post and image deletion links to the menu.'], - 'Archive Link': [true, 'Add an archive link to the menu.'] - }, - 'Monitoring': { - 'Thread Updater': [true, 'Fetch and insert new replies. Has more options in its own dialog.'], - 'Unread Count': [true, 'Show the unread posts count in the tab title.'], - 'Hide Unread Count at (0)': [false, 'Hide the unread posts count in the tab title when it reaches 0.'], - 'Unread Favicon': [true, 'Show a different favicon when there are unread posts.'], - 'Unread Line': [true, 'Show a line to distinguish read posts from unread ones.'], - 'Scroll to Last Read Post': [true, 'Scroll back to the last read post when reopening a thread.'], - 'Thread Excerpt': [true, 'Show an excerpt of the thread in the tab title.'], - 'Thread Stats': [true, 'Display reply and image count.'], - 'Page Count in Stats': [false, 'Display the page count in the thread stats as well.'], - 'Updater and Stats in Header': [true, 'Places the thread updater and thread stats in the header instead of floating them.'], - 'Thread Watcher': [true, 'Bookmark threads.'], - 'Toggleable Thread Watcher': [true, 'Adds a shortcut for the thread watcher, hides the watcher by default, and makes it scroll with the page.'] - }, - 'Posting': { - 'Quick Reply': [true, 'All-in-one form to reply, create threads, automate dumping and more.'], - 'Persistent QR': [true, 'The Quick reply won\'t disappear after posting.'], - 'Auto Hide QR': [true, 'Automatically hide the quick reply when posting.'], - 'Open Post in New Tab': [true, 'Open new threads or replies to a thread from the index in a new tab.'], - 'Remember Subject': [false, 'Remember the subject field, instead of resetting after posting.'], - 'Remember QR Size': [false, 'Remember the size of the Quick reply.'], - 'Remember Spoiler': [false, 'Remember the spoiler state, instead of resetting after posting.'], - 'Hide Original Post Form': [true, 'Hide the normal post form.'], - 'Cooldown': [true, 'Indicate the remaining time before posting again.'], - 'Cooldown Prediction': [true, 'Decrease the cooldown time by taking into account upload speed. Disable it if it\'s inaccurate for you.'], - 'Posting Success Notifications': [true, 'Show notifications on successful post creation or file uploading.'], - 'Captcha Warning Notifications': [true, 'When disabled, shows a red border on the CAPTCHA input until a key is pressed instead of a notification.'], - 'Auto-load captcha': [false, 'Automatically load the captcha when you open a thread'] - }, - 'Quote Links': { - 'Quote Backlinks': [true, 'Add quote backlinks.'], - 'OP Backlinks': [true, 'Add backlinks to the OP.'], - 'Quote Inlining': [true, 'Inline quoted post on click.'], - 'Quote Hash Navigation': [false, 'Include an extra link after quotes for autoscrolling to quoted posts.'], - 'Forward Hiding': [true, 'Hide original posts of inlined backlinks.'], - 'Quote Previewing': [true, 'Show quoted post on hover.'], - 'Quote Highlighting': [true, 'Highlight the previewed post.'], - 'Resurrect Quotes': [true, 'Link dead quotes to the archives.'], - 'Mark Quotes of You': [true, 'Add \'(You)\' to quotes linking to your posts.'], - 'Quoted Title': [false, 'Change the page title to reflect you\'ve been quoted.'], - 'Highlight Posts Quoting You': [false, 'Highlights any posts that contain a quote to your post.'], - 'Highlight Own Posts': [false, 'Highlights own posts if Mark Quotes of You is enabled.'], - 'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'], - 'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'], - 'Quote Threading': [true, 'Thread conversations'] - } - }, - imageExpansion: { - 'Fit width': [false, ''], - 'Fit height': [false, ''], - 'Expand spoilers': [true, 'Expand all images along with spoilers.'], - 'Expand from here': [false, 'Expand all images only from current position to thread end.'], - 'Advance on contract': [false, 'Advance to next post when contracting an expanded image.'] - }, - gallery: { - 'Hide Thumbnails': [false], - 'Fit Width': [true], - 'Fit Height': [true] - }, - threadWatcher: { - 'Current Board': [false, 'Only show watched threads from the current board.'], - 'Auto Watch': [true, 'Automatically watch threads you start.'], - 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'], - 'Auto Prune': [false, 'Automatically prune 404\'d threads.'] - }, - filter: { - name: "# Filter any namefags:\n#/^(?!Anonymous$)/", - uniqueID: "# Filter a specific ID:\n#/Txhvk1Tl/", - tripcode: "# Filter any tripfag\n#/^!/", - capcode: "# Set a custom class for mods:\n#/Mod$/;highlight:mod;op:yes\n# Set a custom class for moot:\n#/Admin$/;highlight:moot;op:yes", - email: "", - subject: "# Filter Generals on /v/:\n#/general/i;boards:v;op:only", - comment: "# Filter Stallman copypasta on /g/:\n#/what you\'re refer+ing to as linux/i;boards:g", - flag: '', - filename: '', - dimensions: "# Highlight potential wallpapers:\n#/1920x1080/;op:yes;highlight;top:no;boards:w,wg", - filesize: '', - MD5: '' - }, - sauces: "https://www.google.com/searchbyimage?image_url=%TURL\nhttp://iqdb.org/?url=%TURL\n#//tineye.com/search?url=%TURL\n#http://saucenao.com/search.php?url=%TURL\n#http://3d.iqdb.org/?url=%TURL\n#http://regex.info/exif.cgi?imgurl=%URL\n# uploaders:\n#http://imgur.com/upload?url=%URL;text:Upload to imgur\n#http://ompldr.org/upload?url1=%URL;text:Upload to ompldr\n# \"View Same\" in archives:\n#//archive.foolz.us/_/search/image/%MD5/;text:View same on foolz\n#//archive.foolz.us/%board/search/image/%MD5/;text:View same on foolz /%board/\n#//archive.installgentoo.net/%board/image/%MD5;text:View same on installgentoo /%board/", - FappeT: { - fappe: false, - werk: false - }, - 'sageEmoji': '4chan SS', - 'emojiPos': 'before', - 'Custom CSS': false, - Index: { - 'Index Mode': 'paged', - 'Index Sort': 'bump', - 'Show Replies': true, - 'Anchor Hidden Threads': true, - 'Refreshed Navigation': false - }, - Header: { - 'Fixed Header': true, - 'Header auto-hide': false, - 'Header auto-hide on scroll': false, - 'Bottom Header': false, - 'Centered links': false, - 'Header catalog links': false, - 'Bottom Board List': true, - 'Shortcut Icons': true, - 'Custom Board Navigation': true - }, - boardnav: "[ toggle-all ]\na-replace\nc-replace\ng-replace\nk-replace\nv-replace\nvg-replace\nvr-replace\nck-replace\nco-replace\nfit-replace\njp-replace\nmu-replace\nsp-replace\ntv-replace\nvp-replace\n[external-text:\"FAQ\",\"https://github.com/seaweedchan/4chan-x/wiki/Frequently-Asked-Questions\"]", - QR: { - 'QR.personas': "#email:\"sage\";boards:jp;always" - }, - time: '%m/%d/%y(%a)%H:%M:%S', - backlink: '>>%id', - fileInfo: '%L (%p%s, %r)', - favicon: 'ferongr', - usercss: '', - 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': ['i', 'Open QR without post number inserted.'], - 'Open QR': ['Shift+i', 'Open QR with post number inserted.'], - 'Open settings': ['Alt+o', 'Open Settings.'], - 'Close': ['Esc', 'Close Settings, Notifications or QR.'], - '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.'], - 'Toggle sage': ['Alt+s', 'Toggle sage in email field'], - 'Submit QR': ['Ctrl+Enter', 'Submit post.'], - 'Watch': ['w', 'Watch thread.'], - 'Update': ['r', 'Update the thread now.'], - 'Expand image': ['Shift+e', 'Expand selected image.'], - 'Expand images': ['e', 'Expand all images.'], - 'Open Gallery': ['g', 'Opens the gallery.'], - 'fappeTyme': ['f', 'Fappe Tyme.'], - 'werkTyme': ['Shift+w', 'Werk Tyme'], - 'Front page': ['0', 'Jump to page 0.'], - 'Open front page': ['Shift+0', 'Open page 0 in a new tab.'], - 'Next page': ['Shift+Right', 'Jump to the next page.'], - 'Previous page': ['Shift+Left', 'Jump to the previous page.'], - 'Open catalog': ['Shift+c', 'Open the catalog of the current board'], - 'Search form': ['Ctrl+Alt+s', 'Focus the search field on the board index.'], - 'Next thread': ['Shift+Down', 'See next thread.'], - 'Previous thread': ['Shift+Up', 'See previous thread.'], - 'Expand thread': ['Ctrl+e', 'Expand thread.'], - 'Open thread': ['o', 'Open thread in current tab.'], - 'Open thread tab': ['Shift+o', 'Open thread in new tab.'], - 'Next reply': ['j', 'Select next reply.'], - 'Previous reply': ['k', 'Select previous reply.'], - 'Deselect reply': ['Shift+d', 'Deselect reply.'], - 'Hide': ['x', 'Hide thread.'], - 'Previous Post Quoting You': ['Alt+Up', 'Scroll to the previous post that quotes you.'], - 'Next Post Quoting You': ['Alt+Down', 'Scroll to the next post that quotes you.'] - }, - updater: { - checkbox: { - 'Beep': [false, 'Beep on new post to completely read thread.'], - 'Auto Scroll': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'], - 'Bottom Scroll': [false, 'Always scroll to the bottom, not the first new post. Useful for event threads.'], - 'Scroll BG': [false, 'Auto-scroll background tabs.'], - 'Auto Update': [true, 'Automatically fetch new posts.'], - 'Optional Increase': [false, 'Increase the intervals between updates on threads without new posts.'] - }, - 'Interval': 30 - } - }; - - Conf = {}; - - c = console; - - d = document; - - doc = d.documentElement; - - g = { - VERSION: '1.4.1', - NAMESPACE: '4chan X.', - boards: {} - }; - - $ = function(selector, root) { - if (root == null) { - root = d.body; - } - return root.querySelector(selector); - }; - - $.extend = function(obj, prop) { - var key, val; - for (key in prop) { - val = prop[key]; - if (prop.hasOwnProperty(key)) { - obj[key] = val; - } - } - }; - - $.DAY = 24 * ($.HOUR = 60 * ($.MINUTE = 60 * ($.SECOND = 1000))); - - $.id = function(id) { - return d.getElementById(id); - }; - - $.ready = function(fc) { - var cb; - if (d.readyState !== 'loading') { - $.queueTask(fc); - return; - } - cb = function() { - $.off(d, 'DOMContentLoaded', cb); - return fc(); - }; - return $.on(d, 'DOMContentLoaded', cb); - }; - - $.formData = function(form) { - var fd, key, val; - if (form instanceof HTMLFormElement) { - return new FormData(form); - } - fd = new FormData(); - for (key in form) { - val = form[key]; - if (val) { - if (typeof val === 'object' && 'newName' in val) { - fd.append(key, val, val.newName); - } else { - fd.append(key, val); - } - } - } - return fd; - }; - - $.extend = function(object, properties) { - var key, val; - for (key in properties) { - val = properties[key]; - object[key] = val; - } - }; - - $.ajax = (function() { - var lastModified; - lastModified = {}; - return function(url, options, extra) { - var form, r, sync, type, upCallbacks, whenModified; - if (extra == null) { - extra = {}; - } - type = extra.type, whenModified = extra.whenModified, upCallbacks = extra.upCallbacks, form = extra.form, sync = extra.sync; - r = new XMLHttpRequest(); - type || (type = form && 'post' || 'get'); - r.open(type, url, !sync); - if (whenModified) { - if (url in lastModified) { - r.setRequestHeader('If-Modified-Since', lastModified[url]); - } - $.on(r, 'load', function() { - return lastModified[url] = r.getResponseHeader('Last-Modified'); - }); - } - if (/\.json$/.test(url)) { - r.responseType = 'json'; - } - $.extend(r, options); - $.extend(r.upload, upCallbacks); - r.send(form); - return r; - }; - })(); - - $.cache = (function() { - var reqs; - reqs = {}; - return function(url, cb, options) { - var err, req, rm; - if (req = reqs[url]) { - if (req.readyState === 4) { - cb.call(req, req.evt); - } else { - req.callbacks.push(cb); - } - return; - } - rm = function() { - return delete reqs[url]; - }; - try { - req = $.ajax(url, options); - } catch (_error) { - err = _error; - return; - } - $.on(req, 'load', function(e) { - var _i, _len, _ref; - _ref = this.callbacks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - cb = _ref[_i]; - cb.call(this, e); - } - this.evt = e; - return delete this.callbacks; - }); - $.on(req, 'abort error', rm); - req.callbacks = [cb]; - return reqs[url] = req; - }; - })(); - - $.cb = { - checked: function() { - $.set(this.name, this.checked); - return Conf[this.name] = this.checked; - }, - value: function() { - $.set(this.name, this.value.trim()); - return Conf[this.name] = this.value; - } - }; - - $.asap = function(test, cb) { - if (test()) { - return cb(); - } else { - return setTimeout($.asap, 25, test, cb); - } - }; - - $.addStyle = function(css, id) { - var style; - style = $.el('style', { - id: id, - textContent: css - }); - $.asap((function() { - return d.head; - }), function() { - return $.add(d.head, style); - }); - return style; - }; - - $.x = function(path, root) { - root || (root = d.body); - return d.evaluate(path, root, null, 8, null).singleNodeValue; - }; - - $.X = function(path, root) { - root || (root = d.body); - return d.evaluate(path, root, null, 7, null); - }; - - $.addClass = function() { - var className, el, _ref; - el = arguments[0], className = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - return (_ref = el.classList).add.apply(_ref, className); - }; - - $.rmClass = function() { - var className, el, _ref; - el = arguments[0], className = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - return (_ref = el.classList).remove.apply(_ref, className); - }; - - $.toggleClass = function(el, className) { - return el.classList.toggle(className); - }; - - $.hasClass = function(el, className) { - return __indexOf.call(el.classList, className) >= 0; - }; - - $.rm = function(el) { - return el.remove(); - }; - - $.rmAll = function(root) { - return root.textContent = null; - }; - - $.tn = function(s) { - return d.createTextNode(s); - }; - - $.frag = function() { - return d.createDocumentFragment(); - }; - - $.nodes = function(nodes) { - var frag, node, _i, _len; - if (!(nodes instanceof Array)) { - return nodes; - } - frag = $.frag(); - for (_i = 0, _len = nodes.length; _i < _len; _i++) { - node = nodes[_i]; - frag.appendChild(node); - } - return frag; - }; - - $.add = function(parent, el) { - return parent.appendChild($.nodes(el)); - }; - - $.prepend = function(parent, el) { - return parent.insertBefore($.nodes(el), parent.firstChild); - }; - - $.after = function(root, el) { - return root.parentNode.insertBefore($.nodes(el), root.nextSibling); - }; - - $.before = function(root, el) { - return root.parentNode.insertBefore($.nodes(el), root); - }; - - $.replace = function(root, el) { - return root.parentNode.replaceChild($.nodes(el), root); - }; - - $.el = function(tag, properties) { - var el; - el = d.createElement(tag); - if (properties) { - $.extend(el, properties); - } - return el; - }; - - $.on = function(el, events, handler) { - var event, _i, _len, _ref; - _ref = events.split(' '); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - event = _ref[_i]; - el.addEventListener(event, handler, false); - } - }; - - $.off = function(el, events, handler) { - var event, _i, _len, _ref; - _ref = events.split(' '); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - event = _ref[_i]; - el.removeEventListener(event, handler, false); - } - }; - - $.event = function(event, detail, root) { - if (root == null) { - root = d; - } - return root.dispatchEvent(new CustomEvent(event, { - bubbles: true, - detail: detail - })); - }; - - $.open = GM_openInTab; - - $.debounce = function(wait, fn) { - var args, exec, lastCall, that, timeout; - lastCall = 0; - timeout = null; - that = null; - args = null; - exec = function() { - lastCall = Date.now(); - return fn.apply(that, args); - }; - return function() { - args = arguments; - that = this; - if (lastCall < Date.now() - wait) { - return exec(); - } - clearTimeout(timeout); - return timeout = setTimeout(exec, wait); - }; - }; - - $.queueTask = (function() { - var execTask, taskChannel, taskQueue; - taskQueue = []; - execTask = function() { - var args, func, task; - task = taskQueue.shift(); - func = task[0]; - args = Array.prototype.slice.call(task, 1); - return func.apply(func, args); - }; - if (window.MessageChannel) { - taskChannel = new MessageChannel(); - taskChannel.port1.onmessage = execTask; - return function() { - taskQueue.push(arguments); - return taskChannel.port2.postMessage(null); - }; - } else { - return function() { - taskQueue.push(arguments); - return setTimeout(execTask, 0); - }; - } - })(); - - $.globalEval = function(code) { - var script; - script = $.el('script', { - textContent: code - }); - $.add(d.head || doc, script); - return $.rm(script); - }; - - $.bytesToString = function(size) { - var unit; - unit = 0; - while (size >= 1024) { - size /= 1024; - unit++; - } - size = unit > 1 ? Math.round(size * 100) / 100 : Math.round(size); - return "" + size + " " + ['B', 'KB', 'MB', 'GB'][unit]; - }; - - $.minmax = function(value, min, max) { - return (value < min ? min : value > max ? max : value); - }; - - $.item = function(key, val) { - var item; - item = {}; - item[key] = val; - return item; - }; - - $.syncing = {}; - - $.sync = (function() { - $.on(window, 'storage', function(_arg) { - var cb, key, newValue; - key = _arg.key, newValue = _arg.newValue; - if (cb = $.syncing[key]) { - return cb(JSON.parse(newValue), key); - } - }); - return function(key, cb) { - return $.syncing[g.NAMESPACE + key] = cb; - }; - })(); - - $.desync = function(key) { - return delete $.syncing[g.NAMESPACE + key]; - }; - - $["delete"] = function(keys) { - var key, _i, _len; - if (!(keys instanceof Array)) { - keys = [keys]; - } - for (_i = 0, _len = keys.length; _i < _len; _i++) { - key = keys[_i]; - key = g.NAMESPACE + key; - localStorage.removeItem(key); - GM_deleteValue(key); - } - }; - - $.get = function(key, val, cb) { - var items; - if (typeof cb === 'function') { - items = $.item(key, val); - } else { - items = key; - cb = val; - } - return $.queueTask(function() { - for (key in items) { - if (val = GM_getValue(g.NAMESPACE + key)) { - items[key] = JSON.parse(val); - } - } - return cb(items); - }); - }; - - $.set = (function() { - var set; - set = function(key, val) { - key = g.NAMESPACE + key; - val = JSON.stringify(val); - if (key in $.syncing) { - localStorage.setItem(key, val); - } - return GM_setValue(key, val); - }; - return function(keys, val) { - var key; - if (typeof keys === 'string') { - set(keys, val); - return; - } - for (key in keys) { - val = keys[key]; - set(key, val); - } - }; - })(); - - $.clear = function(cb) { - $["delete"](GM_listValues().map(function(key) { - return key.replace(g.NAMESPACE, ''); - })); - return typeof cb === "function" ? cb() : void 0; - }; - - $$ = function(selector, root) { - if (root == null) { - root = d.body; - } - return __slice.call(root.querySelectorAll(selector)); - }; - - Callbacks = (function() { - function Callbacks(type) { - this.type = type; - this.keys = []; - } - - Callbacks.prototype.push = function(_arg) { - var cb, name; - name = _arg.name, cb = _arg.cb; - if (this[name]) { - this.connect(name); - } - if (!this[name]) { - this.keys.push(name); - } - return this[name] = cb; - }; - - Callbacks.prototype.connect = function(name) { - if (this[name].disconnected) { - return delete this[name].disconnected; - } - }; - - Callbacks.prototype.disconnect = function(name) { - if (this[name]) { - return this[name].disconnected = true; - } - }; - - Callbacks.prototype.execute = function(node) { - var err, errors, name, _i, _len, _ref; - _ref = this.keys; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - try { - if (!this[name].disconnected) { - this[name].call(node); - } - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: ['"', name, '" crashed on node ', this.type, ' No.', node.ID, ' (', node.board, ').'].join(''), - error: err - }); - } - } - if (errors) { - return Main.handleErrors(errors); - } - }; - - return Callbacks; - - })(); - - Board = (function() { - Board.prototype.toString = function() { - return this.ID; - }; - - function Board(ID) { - this.ID = ID; - this.threads = new SimpleDict; - this.posts = new SimpleDict; - g.boards[this] = this; - } - - return Board; - - })(); - - Thread = (function() { - Thread.callbacks = new Callbacks('Thread'); - - Thread.prototype.toString = function() { - return this.ID; - }; - - function Thread(ID, board) { - this.ID = ID; - this.board = board; - this.fullID = "" + this.board + "." + this.ID; - this.posts = new SimpleDict; - this.isSticky = false; - this.isClosed = false; - this.postLimit = false; - this.fileLimit = false; - g.threads.push(this.fullID, board.threads.push(this, this)); - } - - Thread.prototype.setPage = function(pageNum) { - var icon, key, _i, _len, _ref; - icon = $('.page-num', this.OP.nodes.post); - _ref = ['title', 'textContent']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - icon[key] = icon[key].replace(/\d+/, pageNum); - } - }; - - Thread.prototype.setStatus = function(type, status) { - var icon, name, root, typeLC; - name = "is" + type; - if (this[name] === status) { - return; - } - this[name] = status; - if (!this.OP) { - return; - } - typeLC = type.toLowerCase(); - if (!status) { - $.rm($("." + typeLC + "Icon", this.OP.nodes.info)); - return; - } - icon = $.el('img', { - src: "//s.4cdn.org/image/" + typeLC + (window.devicePixelRatio >= 2 ? '@2x' : '') + ".gif", - alt: type, - title: type, - className: "" + typeLC + "Icon" - }); - root = type === 'Closed' && this.isSticky ? $('.stickyIcon', this.OP.nodes.info) : g.VIEW === 'index' ? $('.page-num', this.OP.nodes.info) : $('[title="Quote this post"]', this.OP.nodes.info); - return $.after(root, [$.tn(' '), icon]); - }; - - Thread.prototype.kill = function() { - this.isDead = true; - return this.timeOfDeath = Date.now(); - }; - - Thread.prototype.collect = function() { - this.posts.forEach(function(post) { - return post.collect(); - }); - g.threads.rm(this.fullID); - return this.board.threads.rm(this); - }; - - return Thread; - - })(); - - Post = (function() { - Post.callbacks = new Callbacks('Post'); - - Post.prototype.toString = function() { - return this.ID; - }; - - function Post(root, thread, board, that) { - var capcode, date, email, flag, info, name, post, subject, tripcode, uniqueID; - this.thread = thread; - this.board = board; - if (that == null) { - that = {}; - } - this.ID = +root.id.slice(2); - this.fullID = "" + this.board + "." + this.ID; - if (that.isOriginalMarkup) { - this.cleanup(root); - } - post = $('.post', root); - info = $('.postInfo', post); - this.nodes = { - root: root, - post: post, - info: info, - comment: $('.postMessage', post), - links: [], - quotelinks: [], - backlinks: info.getElementsByClassName('backlink') - }; - if (!(this.isReply = $.hasClass(post, 'reply'))) { - this.thread.OP = this; - this.thread.isSticky = !!$('.stickyIcon', info); - this.thread.isClosed = !!$('.closedIcon', info); - } - this.info = {}; - if (subject = $('.subject', info)) { - this.nodes.subject = subject; - this.info.subject = subject.textContent; - } - if (name = $('.name', info)) { - this.nodes.name = name; - this.info.name = name.textContent; - } - if (email = $('.useremail', info)) { - this.nodes.email = email; - this.info.email = decodeURIComponent(email.href.slice(7)); - } - if (tripcode = $('.postertrip', info)) { - this.nodes.tripcode = tripcode; - this.info.tripcode = tripcode.textContent; - } - if (uniqueID = $('.posteruid', info)) { - this.nodes.uniqueID = uniqueID; - this.info.uniqueID = uniqueID.firstElementChild.textContent; - } - if (capcode = $('.capcode.hand', info)) { - this.nodes.capcode = capcode; - this.info.capcode = capcode.textContent.replace('## ', ''); - } - if (flag = $('.flag, .countryFlag', info)) { - this.nodes.flag = flag; - this.info.flag = flag.title; - } - if (date = $('.dateTime', info)) { - this.nodes.date = date; - this.info.date = new Date(date.dataset.utc * 1000); - } - this.parseComment(); - this.parseQuotes(); - this.parseFile(that); - this.clones = []; - g.posts.push(this.fullID, thread.posts.push(this, board.posts.push(this, this))); - if (that.isArchived) { - this.kill(); - } - } - - Post.prototype.parseComment = function() { - var bq, i, node, nodes, text; - this.nodes.comment.normalize(); - bq = this.nodes.comment.cloneNode(true); - nodes = $$('.abbr, .exif, b', bq); - i = 0; - while (node = nodes[i++]) { - $.rm(node); - } - text = ""; - nodes = $.X('.//br|.//text()', bq); - i = 0; - while (node = nodes.snapshotItem(i++)) { - text += node.data || '\n'; - } - return this.info.comment = text.trim().replace(/\s+$/gm, ''); - }; - - Post.prototype.parseQuotes = function() { - var quotelink, _i, _len, _ref; - this.quotes = []; - _ref = $$('.quotelink', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - this.parseQuote(quotelink); - } - }; - - Post.prototype.parseQuote = function(quotelink) { - var fullID, match; - if (!(match = quotelink.href.match(/boards\.4chan\.org\/([^\/]+)\/res\/\d+#p(\d+)$/))) { - return; - } - this.nodes.quotelinks.push(quotelink); - if (this.isClone) { - return; - } - fullID = "" + match[1] + "." + match[2]; - if (__indexOf.call(this.quotes, fullID) < 0) { - return this.quotes.push(fullID); - } - }; - - Post.prototype.parseFile = function(that) { - var anchor, fileEl, fileText, nameNode, size, thumb, unit; - if (!((fileEl = $('.file', this.nodes.post)) && (thumb = $('img[data-md5]', fileEl)))) { - return; - } - anchor = thumb.parentNode; - fileText = fileEl.firstElementChild; - this.file = { - text: fileText, - thumb: thumb, - URL: anchor.href, - size: thumb.alt.match(/[\d.]+\s\w+/)[0], - MD5: thumb.dataset.md5, - isSpoiler: $.hasClass(anchor, 'imgspoiler') - }; - size = +this.file.size.match(/[\d.]+/)[0]; - unit = ['B', 'KB', 'MB', 'GB'].indexOf(this.file.size.match(/\w+$/)[0]); - while (unit-- > 0) { - size *= 1024; - } - this.file.sizeInBytes = size; - this.file.thumbURL = that.isArchived ? thumb.src : "" + location.protocol + "//t.4cdn.org/" + this.board + "/thumb/" + (this.file.URL.match(/(\d+)\./)[1]) + "s.jpg"; - this.file.name = (nameNode = $('span', fileText)) ? nameNode.title || nameNode.textContent : fileText.title; - if (this.file.isImage = /(jpg|png|gif)$/i.test(this.file.name)) { - return this.file.dimensions = fileText.textContent.match(/\d+x\d+/)[0]; - } - }; - - Post.prototype.cleanup = function(root) { - var node, _i, _j, _len, _len1, _ref, _ref1; - _ref = $$('.mobile', root); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - $.rm(node); - } - _ref1 = $$('.desktop', root); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - node = _ref1[_j]; - $.rmClass(node, 'desktop'); - } - }; - - Post.prototype.kill = function(file, now) { - var clone, quotelink, strong, _i, _j, _len, _len1, _ref, _ref1; - now || (now = new Date()); - if (file) { - if (this.file.isDead) { - return; - } - this.file.isDead = true; - this.file.timeOfDeath = now; - $.addClass(this.nodes.root, 'deleted-file'); - } else { - if (this.isDead) { - return; - } - this.isDead = true; - this.timeOfDeath = now; - $.addClass(this.nodes.root, 'deleted-post'); - } - if (!(strong = $('strong.warning', this.nodes.info))) { - strong = $.el('strong', { - className: 'warning', - textContent: this.isReply ? '[Deleted]' : '[Dead]' - }); - $.after($('input', this.nodes.info), strong); - } - strong.textContent = file ? '[File deleted]' : '[Deleted]'; - if (this.isClone) { - return; - } - _ref = this.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - clone.kill(file, now); - } - if (file) { - return; - } - _ref1 = Get.allQuotelinksLinkingTo(this); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - quotelink = _ref1[_j]; - if (!(!$.hasClass(quotelink, 'deadlink'))) { - continue; - } - quotelink.textContent = quotelink.textContent + '\u00A0(Dead)'; - $.addClass(quotelink, 'deadlink'); - } - }; - - Post.prototype.resurrect = function() { - var clone, quotelink, strong, _i, _j, _len, _len1, _ref, _ref1; - delete this.isDead; - delete this.timeOfDeath; - $.rmClass(this.nodes.root, 'deleted-post'); - strong = $('strong.warning', this.nodes.info); - if (this.file && this.file.isDead) { - strong.textContent = '[File deleted]'; - } else { - $.rm(strong); - } - if (this.isClone) { - return; - } - _ref = this.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - clone.resurrect(); - } - _ref1 = Get.allQuotelinksLinkingTo(this); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - quotelink = _ref1[_j]; - if ($.hasClass(quotelink, 'deadlink')) { - quotelink.textContent = quotelink.textContent.replace('\u00A0(Dead)', ''); - $.rmClass(quotelink, 'deadlink'); - } - } - }; - - Post.prototype.collect = function() { - this.kill(); - g.posts.rm(this.fullID); - this.thread.posts.rm(this); - return this.board.posts.rm(this); - }; - - Post.prototype.addClone = function(context) { - return new Clone(this, context); - }; - - Post.prototype.rmClone = function(index) { - var clone, _i, _len, _ref; - this.clones.splice(index, 1); - _ref = this.clones.slice(index); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - clone.nodes.root.dataset.clone = index++; - } - }; - - return Post; - - })(); - - Clone = (function(_super) { - __extends(Clone, _super); - - function Clone(origin, context) { - var file, info, inline, inlined, key, nodes, post, root, val, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3; - this.origin = origin; - this.context = context; - _ref = ['ID', 'fullID', 'board', 'thread', 'info', 'quotes', 'isReply']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - this[key] = origin[key]; - } - nodes = origin.nodes; - root = nodes.root.cloneNode(true); - post = $('.post', root); - info = $('.postInfo', post); - this.nodes = { - root: root, - post: post, - info: info, - comment: $('.postMessage', post), - quotelinks: [], - backlinks: info.getElementsByClassName('backlink') - }; - _ref1 = $$('.inline', post); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - inline = _ref1[_j]; - $.rm(inline); - } - _ref2 = $$('.inlined', post); - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - inlined = _ref2[_k]; - $.rmClass(inlined, 'inlined'); - } - root.hidden = false; - $.rmClass(root, 'forwarded'); - $.rmClass(post, 'highlight'); - if (nodes.subject) { - this.nodes.subject = $('.subject', info); - } - if (nodes.name) { - this.nodes.name = $('.name', info); - } - if (nodes.email) { - this.nodes.email = $('.useremail', info); - } - if (nodes.tripcode) { - this.nodes.tripcode = $('.postertrip', info); - } - if (nodes.uniqueID) { - this.nodes.uniqueID = $('.posteruid', info); - } - if (nodes.capcode) { - this.nodes.capcode = $('.capcode', info); - } - if (nodes.flag) { - this.nodes.flag = $('.countryFlag', info); - } - if (nodes.date) { - this.nodes.date = $('.dateTime', info); - } - this.parseQuotes(); - if (origin.file) { - this.file = {}; - _ref3 = origin.file; - for (key in _ref3) { - val = _ref3[key]; - this.file[key] = val; - } - file = $('.file', post); - this.file.text = file.firstElementChild; - this.file.thumb = $('img[data-md5]', file); - this.file.fullImage = $('.full-image', file); - } - if (origin.isDead) { - this.isDead = true; - } - this.isClone = true; - root.dataset.clone = origin.clones.push(this) - 1; - } - - return Clone; - - })(Post); - - DataBoard = (function() { - DataBoard.keys = ['hiddenThreads', 'hiddenPosts', 'lastReadPosts', 'yourPosts', 'watchedThreads']; - - function DataBoard(key, sync, dontClean) { - var init, - _this = this; - this.key = key; - this.onSync = __bind(this.onSync, this); - this.data = Conf[key]; - $.sync(key, this.onSync); - if (!dontClean) { - this.clean(); - } - if (!sync) { - return; - } - init = function() { - $.off(d, '4chanXInitFinished', init); - return _this.sync = sync; - }; - $.on(d, '4chanXInitFinished', init); - } - - DataBoard.prototype.save = function() { - return $.set(this.key, this.data); - }; - - DataBoard.prototype["delete"] = function(_arg) { - var boardID, postID, threadID; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID; - if (postID) { - delete this.data.boards[boardID][threadID][postID]; - this.deleteIfEmpty({ - boardID: boardID, - threadID: threadID - }); - } else if (threadID) { - delete this.data.boards[boardID][threadID]; - this.deleteIfEmpty({ - boardID: boardID - }); - } else { - delete this.data.boards[boardID]; - } - return this.save(); - }; - - DataBoard.prototype.deleteIfEmpty = function(_arg) { - var boardID, threadID; - boardID = _arg.boardID, threadID = _arg.threadID; - if (threadID) { - if (!Object.keys(this.data.boards[boardID][threadID]).length) { - delete this.data.boards[boardID][threadID]; - return this.deleteIfEmpty({ - boardID: boardID - }); - } - } else if (!Object.keys(this.data.boards[boardID]).length) { - return delete this.data.boards[boardID]; - } - }; - - DataBoard.prototype.set = function(_arg) { - var boardID, postID, threadID, val, _base, _base1, _base2; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID, val = _arg.val; - if (postID !== void 0) { - ((_base = ((_base1 = this.data.boards)[boardID] || (_base1[boardID] = {})))[threadID] || (_base[threadID] = {}))[postID] = val; - } else if (threadID !== void 0) { - ((_base2 = this.data.boards)[boardID] || (_base2[boardID] = {}))[threadID] = val; - } else { - this.data.boards[boardID] = val; - } - return this.save(); - }; - - DataBoard.prototype.get = function(_arg) { - var ID, board, boardID, defaultValue, postID, thread, threadID, val, _i, _len; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID, defaultValue = _arg.defaultValue; - if (board = this.data.boards[boardID]) { - if (!threadID) { - if (postID) { - for (thread = _i = 0, _len = board.length; _i < _len; thread = ++_i) { - ID = board[thread]; - if (postID in thread) { - val = thread[postID]; - break; - } - } - } else { - val = board; - } - } else if (thread = board[threadID]) { - val = postID ? thread[postID] : thread; - } - } - return val || defaultValue; - }; - - DataBoard.prototype.clean = function() { - var boardID, now, val, _ref; - _ref = this.data.boards; - for (boardID in _ref) { - val = _ref[boardID]; - this.deleteIfEmpty({ - boardID: boardID - }); - } - now = Date.now(); - if ((this.data.lastChecked || 0) < now - 2 * $.HOUR) { - this.data.lastChecked = now; - for (boardID in this.data.boards) { - this.ajaxClean(boardID); - } - } - return this.save(); - }; - - DataBoard.prototype.ajaxClean = function(boardID) { - var _this = this; - return $.cache("//a.4cdn.org/" + boardID + "/threads.json", function(e) { - var board, page, thread, threads, _i, _j, _len, _len1, _ref, _ref1; - if (e.target.status !== 200) { - if (e.target.status === 404) { - _this["delete"](boardID); - } - return; - } - board = _this.data.boards[boardID]; - threads = {}; - _ref = e.target.response; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - page = _ref[_i]; - _ref1 = page.threads; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - thread = _ref1[_j]; - if (thread.no in board) { - threads[thread.no] = board[thread.no]; - } - } - } - _this.data.boards[boardID] = threads; - _this.deleteIfEmpty({ - boardID: boardID - }); - return _this.save(); - }); - }; - - DataBoard.prototype.onSync = function(data) { - this.data = data || { - boards: {} - }; - return typeof this.sync === "function" ? this.sync() : void 0; - }; - - DataBoard.prototype.disconnect = function() { - $.desync(this.key); - delete this.sync; - return delete this.data; - }; - - return DataBoard; - - })(); - - Notice = (function() { - function Notice(type, content, timeout) { - this.timeout = timeout; - this.close = __bind(this.close, this); - this.add = __bind(this.add, this); - this.el = $.el('div', { - innerHTML: '
' - }); - this.el.style.opacity = 0; - this.setType(type); - $.on(this.el.firstElementChild, 'click', this.close); - if (typeof content === 'string') { - content = $.tn(content); - } - $.add(this.el.lastElementChild, content); - $.ready(this.add); - } - - Notice.prototype.setType = function(type) { - return this.el.className = "notification " + type; - }; - - Notice.prototype.add = function() { - if (d.hidden) { - $.on(d, 'visibilitychange', this.add); - return; - } - $.off(d, 'visibilitychange', this.add); - $.add(Header.noticesRoot, this.el); - this.el.clientHeight; - this.el.style.opacity = 1; - if (this.timeout) { - return setTimeout(this.close, this.timeout * $.SECOND); - } - }; - - Notice.prototype.close = function() { - $.off(d, 'visibilitychange', this.add); - return $.rm(this.el); - }; - - return Notice; - - })(); - - RandomAccessList = (function() { - function RandomAccessList(items) { - var item, _i, _len; - this.length = 0; - if (items) { - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - this.push(item); - } - } - } - - RandomAccessList.prototype.push = function(data) { - var ID, item, last; - ID = data.ID; - ID || (ID = data.id); - if (this[ID]) { - return; - } - last = this.last; - this[ID] = item = { - prev: last, - next: null, - data: data, - ID: ID - }; - item.prev = last; - this.last = last ? last.next = item : this.first = item; - return this.length++; - }; - - RandomAccessList.prototype.before = function(root, item) { - var prev; - if (item.next === root) { - return; - } - this.rmi(item); - prev = root.prev; - root.prev = item; - item.next = root; - item.prev = prev; - if (prev) { - return prev.next = item; - } - }; - - RandomAccessList.prototype.after = function(root, item) { - var next; - if (item.prev === root) { - return; - } - this.rmi(item); - next = root.next; - root.next = item; - item.prev = root; - item.next = next; - if (next) { - return next.prev = item; - } - }; - - RandomAccessList.prototype.prepend = function(item) { - var first; - first = this.first; - if (item === first || !this[item.ID]) { - return; - } - this.rmi(item); - item.next = first; - first.prev = item; - this.first = item; - return delete item.prev; - }; - - RandomAccessList.prototype.shift = function() { - return this.rm(this.first.ID); - }; - - RandomAccessList.prototype.order = function() { - var item, order; - order = [item = this.first]; - while (item = item.next) { - order.push(item); - } - return order; - }; - - RandomAccessList.prototype.rm = function(ID) { - var item; - item = this[ID]; - if (!item) { - return; - } - delete this[ID]; - this.length--; - this.rmi(item); - delete item.next; - return delete item.prev; - }; - - RandomAccessList.prototype.rmi = function(item) { - var next, prev; - prev = item.prev, next = item.next; - if (prev) { - prev.next = next; - } else { - this.first = next; - } - if (next) { - return next.prev = prev; - } else { - return this.last = prev; - } - }; - - return RandomAccessList; - - })(); - - SimpleDict = (function() { - function SimpleDict() { - this.keys = []; - } - - SimpleDict.prototype.push = function(key, data) { - key = "" + key; - if (!this[key]) { - this.keys.push(key); - } - return this[key] = data; - }; - - SimpleDict.prototype.rm = function(key) { - var i; - key = "" + key; - if ((i = this.keys.indexOf(key)) !== -1) { - this.keys.splice(i, 1); - return delete this[key]; - } - }; - - SimpleDict.prototype.forEach = function(fn) { - var key, _i, _len, _ref, _results; - _ref = __slice.call(this.keys); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - _results.push(fn(this[key])); - } - return _results; - }; - - return SimpleDict; - - })(); - - Polyfill = { - init: function() {}, - notificationPermission: function() { - if (!window.Notification || 'permission' in Notification || !window.webkitNotifications) { - return; - } - return Object.defineProperty(Notification, 'permission', { - get: function() { - switch (webkitNotifications.checkPermission()) { - case 0: - return 'granted'; - case 1: - return 'default'; - case 2: - return 'denied'; - } - } - }); - }, - toBlob: function() { - var _base; - return (_base = HTMLCanvasElement.prototype).toBlob || (_base.toBlob = function(cb) { - var data, i, l, ui8a, _i; - data = atob(this.toDataURL().slice(22)); - l = data.length; - ui8a = new Uint8Array(l); - for (i = _i = 0; _i < l; i = _i += 1) { - ui8a[i] = data.charCodeAt(i); - } - return cb(new Blob([ui8a], { - type: 'image/png' - })); - }); - }, - visibility: function() { - if ('visibilityState' in d) { - return; - } - Object.defineProperties(HTMLDocument.prototype, { - visibilityState: { - get: function() { - return this.webkitVisibilityState; - } - }, - hidden: { - get: function() { - return this.webkitHidden; - } - } - }); - return $.on(d, 'webkitvisibilitychange', function() { - return $.event('visibilitychange'); - }); - } - }; - - Header = { - init: function() { - var barFixedToggler, barPositionToggler, customNavToggler, editCustomNav, footerToggler, headerToggler, linkJustifyToggler, menuButton, scrollHeaderToggler, shortcutToggler, - _this = this; - this.menu = new UI.Menu('header'); - menuButton = $.el('span', { - className: 'menu-button', - innerHTML: '' - }); - barFixedToggler = $.el('label', { - innerHTML: ' Fixed Header' - }); - headerToggler = $.el('label', { - innerHTML: ' Auto-hide header' - }); - scrollHeaderToggler = $.el('label', { - innerHTML: ' Auto-hide header on scroll' - }); - barPositionToggler = $.el('label', { - innerHTML: ' Bottom header' - }); - linkJustifyToggler = $.el('label', { - innerHTML: " Centered links" - }); - customNavToggler = $.el('label', { - innerHTML: ' Custom board navigation' - }); - footerToggler = $.el('label', { - innerHTML: " Hide bottom board list" - }); - shortcutToggler = $.el('label', { - innerHTML: " Shortcut Icons" - }); - editCustomNav = $.el('a', { - textContent: 'Edit custom board navigation', - href: 'javascript:;' - }); - this.barFixedToggler = barFixedToggler.firstElementChild; - this.scrollHeaderToggler = scrollHeaderToggler.firstElementChild; - this.barPositionToggler = barPositionToggler.firstElementChild; - this.linkJustifyToggler = linkJustifyToggler.firstElementChild; - this.headerToggler = headerToggler.firstElementChild; - this.footerToggler = footerToggler.firstElementChild; - this.shortcutToggler = shortcutToggler.firstElementChild; - this.customNavToggler = customNavToggler.firstElementChild; - $.on(menuButton, 'click', this.menuToggle); - $.on(this.headerToggler, 'change', this.toggleBarVisibility); - $.on(this.barFixedToggler, 'change', this.toggleBarFixed); - $.on(this.barPositionToggler, 'change', this.toggleBarPosition); - $.on(this.scrollHeaderToggler, 'change', this.toggleHideBarOnScroll); - $.on(this.linkJustifyToggler, 'change', this.toggleLinkJustify); - $.on(this.headerToggler, 'change', this.toggleBarVisibility); - $.on(this.footerToggler, 'change', this.toggleFooterVisibility); - $.on(this.shortcutToggler, 'change', this.toggleShortcutIcons); - $.on(this.customNavToggler, 'change', this.toggleCustomNav); - $.on(editCustomNav, 'click', this.editCustomNav); - this.setBarFixed(Conf['Fixed Header']); - this.setHideBarOnScroll(Conf['Header auto-hide on scroll']); - this.setBarVisibility(Conf['Header auto-hide']); - this.setLinkJustify(Conf['Centered links']); - this.setShortcutIcons(Conf['Shortcut Icons']); - $.sync('Fixed Header', this.setBarFixed); - $.sync('Header auto-hide on scroll', this.setHideBarOnScroll); - $.sync('Bottom Header', this.setBarPosition); - $.sync('Shortcut Icons', this.setShortcutIcons); - $.sync('Header auto-hide', this.setBarVisibility); - $.sync('Centered links', this.setLinkJustify); - this.addShortcut(menuButton); - $.event('AddMenuEntry', { - type: 'header', - el: $.el('span', { - textContent: 'Header' - }), - order: 107, - subEntries: [ - { - el: barFixedToggler - }, { - el: headerToggler - }, { - el: scrollHeaderToggler - }, { - el: barPositionToggler - }, { - el: linkJustifyToggler - }, { - el: footerToggler - }, { - el: shortcutToggler - }, { - el: customNavToggler - }, { - el: editCustomNav - } - ] - }); - $.on(window, 'load hashchange', Header.hashScroll); - $.on(d, 'CreateNotification', this.createNotification); - $.asap((function() { - return d.body; - }), function() { - if (!Main.isThisPageLegit()) { - return; - } - $.asap((function() { - return $.id('boardNavMobile') || d.readyState !== 'loading'; - }), Header.setBoardList); - $.prepend(d.body, _this.bar); - $.add(d.body, Header.hover); - _this.setBarPosition(Conf['Bottom Header']); - return _this; - }); - $.ready(function() { - var a, cs, footer, _i, _len, _ref; - _this.footer = footer = $.id('boardNavDesktopFoot'); - if (Conf['JSON Navigation']) { - _ref = $$('a', footer); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - $.on(a, 'click', Navigate.navigate); - } - } - if (a = $("a[href*='/" + g.BOARD + "/']", footer)) { - a.className = 'current'; - } - cs = $.el('a', { - id: 'settingsWindowLink', - href: 'javascript:;', - textContent: 'Catalog Settings' - }); - if (g.VIEW === 'catalog') { - _this.addShortcut(cs); - } - Header.setFooterVisibility(Conf['Bottom Board List']); - return $.sync('Bottom Board List', Header.setFooterVisibility); - }); - return this.enableDesktopNotifications(); - }, - bar: $.el('div', { - id: 'header-bar' - }), - noticesRoot: $.el('div', { - id: 'notifications' - }), - shortcuts: $.el('span', { - id: 'shortcuts' - }), - hover: $.el('div', { - id: 'hoverUI' - }), - toggle: $.el('div', { - id: 'scroll-marker' - }), - initReady: function() { - Header.setBoardList(); - return Header.addNav(); - }, - setBoardList: function() { - var a, boardList, btn, fourchannav, fullBoardList, _i, _len, _ref; - fourchannav = $.id('boardNavDesktop'); - Header.boardList = boardList = $.el('span', { - id: 'board-list', - innerHTML: "" - }); - _ref = $$('a', boardList); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - if (Conf['JSON Navigation']) { - $.on(a, 'click', Navigate.navigate); - } - if (a.pathname.split('/')[1] === g.BOARD.ID) { - a.className = 'current'; - } - } - fullBoardList = $('#full-board-list', boardList); - btn = $('.hide-board-list-button', fullBoardList); - $.on(btn, 'click', Header.toggleBoardList); - $.rm($('#navtopright', fullBoardList)); - $.add(boardList, fullBoardList); - $.add(Header.bar, [Header.boardList, Header.shortcuts, Header.noticesRoot, Header.toggle]); - Header.setCustomNav(Conf['Custom Board Navigation']); - Header.generateBoardList(Conf['boardnav'].replace(/(\r\n|\n|\r)/g, ' ')); - $.sync('Custom Board Navigation', Header.setCustomNav); - return $.sync('boardnav', Header.generateBoardList); - }, - generateBoardList: function(text) { - var as, list, nodes; - list = $('#custom-board-list', Header.boardList); - $.rmAll(list); - if (!text) { - return; - } - as = $$('#full-board-list a[title]', Header.boardList); - nodes = text.match(/[\w@]+((-(all|title|replace|full|index|catalog|url:"[^"]+[^"]"|text:"[^"]+")|\,"[^"]+[^"]"))*|[^\w@]+/g).map(function(t) { - var a, board, m, _i, _len; - if (/^[^\w@]/.test(t)) { - return $.tn(t); - } - if (/^toggle-all/.test(t)) { - a = $.el('a', { - className: 'show-board-list-button', - textContent: (t.match(/-text:"(.+)"/) || [null, '+'])[1], - href: 'javascript:;' - }); - $.on(a, 'click', Header.toggleBoardList); - return a; - } - if (/^external/.test(t)) { - a = $.el('a', { - href: (t.match(/\,"(.+)"/) || [null, '+'])[1], - textContent: (t.match(/-text:"(.+)"\,/) || [null, '+'])[1], - className: 'external' - }); - return a; - } - board = /^current/.test(t) ? g.BOARD.ID : t.match(/^[^-]+/)[0]; - for (_i = 0, _len = as.length; _i < _len; _i++) { - a = as[_i]; - if (a.textContent === board) { - a = a.cloneNode(true); - if (Conf['JSON Navigation']) { - $.on(a, 'click', Navigate.navigate); - } - a.textContent = /-title/.test(t) || /-replace/.test(t) && $.hasClass(a, 'current') ? a.title : /-full/.test(t) ? "/" + board + "/ - " + a.title : (m = t.match(/-text:"(.+)"/)) ? m[1] : a.textContent; - if (m = t.match(/-(index|catalog)/)) { - a.dataset.only = m[1]; - a.href = "//boards.4chan.org/" + board + "/"; - if (m[1] === 'catalog') { - if (Conf['External Catalog']) { - a.href = CatalogLinks.external(board); - } else { - a.href += 'catalog'; - } - $.addClass(a, 'catalog'); - } - } - if (board === '@') { - $.addClass(a, 'navSmall'); - } - return a; - } - } - return $.tn(t); - }); - return $.add(list, nodes); - }, - toggleBoardList: function() { - var bar, custom, full, showBoardList; - bar = Header.bar; - custom = $('#custom-board-list', bar); - full = $('#full-board-list', bar); - showBoardList = !full.hidden; - custom.hidden = !showBoardList; - return full.hidden = showBoardList; - }, - setLinkJustify: function(centered) { - Header.linkJustifyToggler.checked = centered; - if (centered) { - return $.addClass(doc, 'centered-links'); - } else { - return $.rmClass(doc, 'centered-links'); - } - }, - toggleLinkJustify: function() { - var centered; - $.event('CloseMenu'); - centered = this.nodeName === 'INPUT' ? this.checked : void 0; - Header.setLinkJustify(centered); - return $.set('Centered links', centered); - }, - setBarFixed: function(fixed) { - Header.barFixedToggler.checked = fixed; - if (fixed) { - $.addClass(doc, 'fixed'); - return $.addClass(Header.bar, 'dialog'); - } else { - $.rmClass(doc, 'fixed'); - return $.rmClass(Header.bar, 'dialog'); - } - }, - toggleBarFixed: function() { - $.event('CloseMenu'); - Header.setBarFixed(this.checked); - Conf['Fixed Header'] = this.checked; - return $.set('Fixed Header', this.checked); - }, - setShortcutIcons: function(show) { - Header.shortcutToggler.checked = show; - if (show) { - return $.addClass(doc, 'shortcut-icons'); - } else { - return $.rmClass(doc, 'shortcut-icons'); - } - }, - toggleShortcutIcons: function() { - $.event('CloseMenu'); - Header.setShortcutIcons(this.checked); - Conf['Shortcut Icons'] = this.checked; - return $.set('Shortcut Icons', this.checked); - }, - setBarVisibility: function(hide) { - Header.headerToggler.checked = hide; - $.event('CloseMenu'); - (hide ? $.addClass : $.rmClass)(Header.bar, 'autohide'); - return (hide ? $.addClass : $.rmClass)(doc, 'autohide'); - }, - toggleBarVisibility: function() { - var hide, message; - hide = this.nodeName === 'INPUT' ? this.checked : !$.hasClass(Header.bar, 'autohide'); - this.checked = hide; - $.set('Header auto-hide', Conf['Header auto-hide'] = hide); - Header.setBarVisibility(hide); - message = "The header bar will " + (hide ? 'automatically hide itself.' : 'remain visible.'); - return new Notice('info', message, 2); - }, - setHideBarOnScroll: function(hide) { - Header.scrollHeaderToggler.checked = hide; - if (hide) { - $.on(window, 'scroll', Header.hideBarOnScroll); - return; - } - $.off(window, 'scroll', Header.hideBarOnScroll); - $.rmClass(Header.bar, 'scroll'); - if (!Conf['Header auto-hide']) { - return $.rmClass(Header.bar, 'autohide'); - } - }, - toggleHideBarOnScroll: function(e) { - var hide; - hide = this.checked; - $.cb.checked.call(this); - return Header.setHideBarOnScroll(hide); - }, - hideBarOnScroll: function() { - var offsetY; - offsetY = window.pageYOffset; - if (offsetY > (Header.previousOffset || 0)) { - $.addClass(Header.bar, 'autohide', 'scroll'); - } else { - $.rmClass(Header.bar, 'autohide', 'scroll'); - } - return Header.previousOffset = offsetY; - }, - setBarPosition: function(bottom) { - var args; - Header.barPositionToggler.checked = bottom; - $.event('CloseMenu'); - args = bottom ? ['bottom-header', 'top-header', 'bottom', 'after'] : ['top-header', 'bottom-header', 'top', 'add']; - $.addClass(doc, args[0]); - $.rmClass(doc, args[1]); - Header.bar.parentNode.className = args[2]; - return $[args[3]](Header.bar, Header.noticesRoot); - }, - toggleBarPosition: function() { - $.cb.checked.call(this); - return Header.setBarPosition(this.checked); - }, - setFooterVisibility: function(hide) { - Header.footerToggler.checked = hide; - return Header.footer.hidden = hide; - }, - toggleFooterVisibility: function() { - var hide, message; - $.event('CloseMenu'); - hide = this.nodeName === 'INPUT' ? this.checked : !!Header.footer.hidden; - Header.setFooterVisibility(hide); - $.set('Bottom Board List', hide); - message = hide ? 'The bottom navigation will now be hidden.' : 'The bottom navigation will remain visible.'; - return new Notice('info', message, 2); - }, - setCustomNav: function(show) { - var btn, cust, full, _ref; - Header.customNavToggler.checked = show; - cust = $('#custom-board-list', Header.bar); - full = $('#full-board-list', Header.bar); - btn = $('.hide-board-list-button', full); - return _ref = show ? [false, true] : [true, false], cust.hidden = _ref[0], full.hidden = _ref[1], _ref; - }, - toggleCustomNav: function() { - $.cb.checked.call(this); - return Header.setCustomNav(this.checked); - }, - editCustomNav: function() { - var settings; - Settings.open('Advanced'); - settings = $.id('fourchanx-settings'); - return $('input[name=boardnav]', settings).focus(); - }, - hashScroll: function() { - var hash, post; - hash = this.location.hash.slice(1); - if (!(/^p\d+$/.test(hash) && (post = $.id(hash)))) { - return; - } - if ((Get.postFromRoot(post)).isHidden) { - return; - } - return Header.scrollTo(post); - }, - scrollTo: function(root, down, needed) { - var height, x; - if (down) { - x = Header.getBottomOf(root); - if (Conf['Header auto-hide on scroll'] && Conf['Bottom header']) { - height = Header.bar.getBoundingClientRect().height; - if (x <= 0) { - if (!Header.isHidden()) { - x += height; - } - } else { - if (Header.isHidden()) { - x -= height; - } - } - } - if (!(needed && x >= 0)) { - return window.scrollBy(0, -x); - } - } else { - x = Header.getTopOf(root); - if (Conf['Header auto-hide on scroll'] && !Conf['Bottom header']) { - height = Header.bar.getBoundingClientRect().height; - if (x >= 0) { - if (!Header.isHidden()) { - x += height; - } - } else { - if (Header.isHidden()) { - x -= height; - } - } - } - if (!(needed && x >= 0)) { - return window.scrollBy(0, x); - } - } - }, - scrollToIfNeeded: function(root, down) { - return Header.scrollTo(root, down, true); - }, - getTopOf: function(root) { - var headRect, top; - top = root.getBoundingClientRect().top; - if (Conf['Fixed Header'] && !Conf['Bottom Header']) { - headRect = Header.toggle.getBoundingClientRect(); - top -= headRect.top + headRect.height; - } - return top; - }, - getBottomOf: function(root) { - var bottom, clientHeight, headRect; - clientHeight = doc.clientHeight; - bottom = clientHeight - root.getBoundingClientRect().bottom; - if (Conf['Bottom Header']) { - headRect = Header.toggle.getBoundingClientRect(); - bottom -= clientHeight - headRect.bottom + headRect.height; - } - return bottom; - }, - isHidden: function() { - var top; - top = Header.bar.getBoundingClientRect().top; - if (Conf['Bottom header']) { - return top === doc.clientHeight; - } else { - return top < 0; - } - }, - addShortcut: function(el) { - var shortcut; - shortcut = $.el('span', { - className: 'shortcut brackets-wrap' - }); - $.add(shortcut, el); - return $.prepend(Header.shortcuts, shortcut); - }, - rmShortcut: function(el) { - return $.rm(el.parentElement); - }, - menuToggle: function(e) { - return Header.menu.toggle(e, this, g); - }, - createNotification: function(e) { - var cb, content, lifetime, notice, type, _ref; - _ref = e.detail, type = _ref.type, content = _ref.content, lifetime = _ref.lifetime, cb = _ref.cb; - notice = new Notice(type, content, lifetime); - if (cb) { - return cb(notice); - } - }, - areNotificationsEnabled: false, - enableDesktopNotifications: function() { - var authorize, disable, el, notice, _ref; - if (!(window.Notification && Conf['Desktop Notifications'])) { - return; - } - switch (Notification.permission) { - case 'granted': - Header.areNotificationsEnabled = true; - return; - case 'denied': - return; - } - el = $.el('span', { - innerHTML: "Desktop notification permissions are not granted.\n[FAQ]
\n or " - }); - _ref = $$('button', el), authorize = _ref[0], disable = _ref[1]; - $.on(authorize, 'click', function() { - return Notification.requestPermission(function(status) { - Header.areNotificationsEnabled = status === 'granted'; - if (status === 'default') { - return; - } - return notice.close(); - }); - }); - $.on(disable, 'click', function() { - $.set('Desktop Notifications', false); - return notice.close(); - }); - return notice = new Notice('info', el); - } - }; - - Index = { - init: function() { - var anchorEntry, input, label, modeEntry, name, refNavEntry, repliesEntry, sortEntry, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; - if (g.BOARD.ID === 'f' || g.VIEW === 'catalog' || !Conf['JSON Navigation']) { - return; - } - this.board = "" + g.BOARD; - this.button = $.el('a', { - className: 'index-refresh-shortcut fa fa-refresh', - title: 'Refresh', - href: 'javascript:;', - textContent: 'Refresh Index' - }); - $.on(this.button, 'click', this.update); - Header.addShortcut(this.button, 1); - modeEntry = { - el: $.el('span', { - textContent: 'Index mode' - }), - subEntries: [ - { - el: $.el('label', { - innerHTML: ' Paged' - }) - }, { - el: $.el('label', { - innerHTML: ' Infinite scrolling' - }) - }, { - el: $.el('label', { - innerHTML: ' All threads' - }) - } - ] - }; - _ref = modeEntry.subEntries; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - label = _ref[_i]; - input = label.el.firstChild; - input.checked = Conf['Index Mode'] === input.value; - $.on(input, 'change', $.cb.value); - $.on(input, 'change', this.cb.mode); - } - sortEntry = { - el: $.el('span', { - textContent: 'Sort by' - }), - subEntries: [ - { - el: $.el('label', { - innerHTML: ' Bump order' - }) - }, { - el: $.el('label', { - innerHTML: ' Last reply' - }) - }, { - el: $.el('label', { - innerHTML: ' Creation date' - }) - }, { - el: $.el('label', { - innerHTML: ' Reply count' - }) - }, { - el: $.el('label', { - innerHTML: ' File count' - }) - } - ] - }; - _ref1 = sortEntry.subEntries; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - label = _ref1[_j]; - input = label.el.firstChild; - input.checked = Conf['Index Sort'] === input.value; - $.on(input, 'change', $.cb.value); - $.on(input, 'change', this.cb.sort); - } - repliesEntry = { - el: $.el('label', { - innerHTML: ' Show replies' - }) - }; - anchorEntry = { - el: $.el('label', { - innerHTML: ' Anchor hidden threads', - title: 'Move hidden threads at the end of the index.' - }) - }; - refNavEntry = { - el: $.el('label', { - innerHTML: ' Refreshed navigation', - title: 'Refresh index when navigating through pages.' - }) - }; - _ref2 = [repliesEntry, anchorEntry, refNavEntry]; - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - label = _ref2[_k]; - input = label.el.firstChild; - name = input.name; - input.checked = Conf[name]; - $.on(input, 'change', $.cb.checked); - switch (name) { - case 'Show Replies': - $.on(input, 'change', this.cb.replies); - break; - case 'Anchor Hidden Threads': - $.on(input, 'change', this.cb.sort); - } - } - $.event('AddMenuEntry', { - type: 'header', - el: $.el('span', { - textContent: 'Index Navigation' - }), - order: 98, - subEntries: [repliesEntry, anchorEntry, refNavEntry, modeEntry, sortEntry] - }); - $.addClass(doc, 'index-loading'); - this.root = $.el('div', { - className: 'board' - }); - this.pagelist = $.el('div', { - className: 'pagelist', - hidden: true, - innerHTML: "
" - }); - this.navLinks = $.el('div', { - className: 'navLinks', - innerHTML: "Return Catalog Bottom ×" - }); - this.searchInput = $('#index-search', this.navLinks); - this.currentPage = this.getCurrentPage(); - $.on(d, 'scroll', Index.scroll); - $.on(this.pagelist, 'click', this.cb.pageNav); - $.on(this.searchInput, 'input', this.onSearchInput); - $.on($('#index-search-clear', this.navLinks), 'click', this.clearSearch); - $.on($('#returnlink a', this.navLinks), 'click', Navigate.navigate); - $.on($('#cataloglink a', this.navLinks), 'click', function() { - return window.location = "//boards.4chan.org/" + g.BOARD + "/catalog"; - }); - if (g.VIEW === 'index') { - this.update(); - } - $.asap((function() { - return $('.board', doc) || d.readyState !== 'loading'; - }), function() { - var board, navLink, _l, _len3, _ref3; - if (g.VIEW === 'index') { - board = $('.board'); - $.replace(board, Index.root); - d.implementation.createDocument(null, null, null).appendChild(board); - } - _ref3 = $$('.navLinks'); - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - navLink = _ref3[_l]; - $.rm(navLink); - } - $.after($.x('child::form/preceding-sibling::hr[1]'), Index.navLinks); - return $.rmClass(doc, 'index-loading'); - }); - return $.asap((function() { - return $('.pagelist', doc) || d.readyState !== 'loading'; - }), function() { - var pagelist; - if (pagelist = $('.pagelist')) { - return $.replace(pagelist, Index.pagelist); - } else { - return $.after($.id('delform'), Index.pagelist); - } - }); - }, - scroll: $.debounce(100, function() { - var nodes, pageNum; - if (Index.req || Conf['Index Mode'] !== 'infinite' || (doc.scrollTop <= doc.scrollHeight - (300 + window.innerHeight)) || g.VIEW === 'thread') { - return; - } - if (Index.pageNum == null) { - Index.pageNum = Index.getCurrentPage(); - } - pageNum = Index.pageNum++; - if (pageNum >= Index.pagesNum) { - return Index.endNotice(); - } - nodes = Index.buildSinglePage(pageNum); - if (Conf['Show Replies']) { - Index.buildReplies(nodes); - } - Index.buildStructure(nodes); - return Index.setPage(pageNum); - }), - endNotice: (function() { - var notify, reset; - notify = false; - reset = function() { - return notify = false; - }; - return function() { - if (notify) { - return; - } - notify = true; - new Notice('info', "Last page reached.", 2); - return setTimeout(reset, 3 * $.SECOND); - }; - })(), - cb: { - mode: function() { - Index.togglePagelist(); - return Index.buildIndex(); - }, - sort: function() { - Index.sort(); - return Index.buildIndex(); - }, - replies: function() { - Index.buildThreads(); - Index.sort(); - return Index.buildIndex(); - }, - pageNav: function(e) { - var a; - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - switch (e.target.nodeName) { - case 'BUTTON': - a = e.target.parentNode; - break; - case 'A': - a = e.target; - break; - default: - return; - } - if (a.textContent === 'Catalog') { - return; - } - e.preventDefault(); - return Index.userPageNav(+a.pathname.split('/')[2]); - } - }, - scrollToIndex: function() { - return Header.scrollToIfNeeded(Index.root); - }, - getCurrentPage: function() { - return +window.location.pathname.split('/')[2]; - }, - userPageNav: function(pageNum) { - if (Conf['Refreshed Navigation'] && Conf['Index Mode'] !== 'all pages') { - return Index.update(pageNum); - } else { - return Index.pageNav(pageNum); - } - }, - pageNav: function(pageNum) { - if (Index.currentPage === pageNum) { - return; - } - history.pushState(null, '', pageNum === 0 ? './' : pageNum); - return Index.pageLoad(pageNum); - }, - pageLoad: function(pageNum) { - Index.currentPage = pageNum; - if (Conf['Index Mode'] === 'all pages') { - return; - } - Index.buildIndex(); - Index.setPage(); - return Index.scrollToIndex(); - }, - getPagesNum: function() { - if (Index.isSearching) { - return Math.ceil((Index.sortedNodes.length / 2) / Index.threadsNumPerPage); - } else { - return Index.pagesNum; - } - }, - getMaxPageNum: function() { - return Math.max(0, Index.getPagesNum() - 1); - }, - togglePagelist: function() { - return Index.pagelist.hidden = Conf['Index Mode'] !== 'paged'; - }, - buildPagelist: function() { - var a, i, maxPageNum, nodes, pagesRoot, _i; - pagesRoot = $('.pages', Index.pagelist); - maxPageNum = Index.getMaxPageNum(); - if (pagesRoot.childElementCount !== maxPageNum + 1) { - nodes = []; - for (i = _i = 0; _i <= maxPageNum; i = _i += 1) { - a = $.el('a', { - textContent: i, - href: i ? i : './' - }); - nodes.push($.tn('['), a, $.tn('] ')); - } - $.rmAll(pagesRoot); - $.add(pagesRoot, nodes); - } - return Index.togglePagelist(); - }, - setPage: function(pageNum) { - var a, href, maxPageNum, next, pagesRoot, prev, strong; - pageNum || (pageNum = Index.getCurrentPage()); - maxPageNum = Index.getMaxPageNum(); - pagesRoot = $('.pages', Index.pagelist); - prev = pagesRoot.previousSibling.firstChild; - next = pagesRoot.nextSibling.firstChild; - href = Math.max(pageNum - 1, 0); - prev.href = href === 0 ? './' : href; - prev.firstChild.disabled = href === pageNum; - href = Math.min(pageNum + 1, maxPageNum); - next.href = href === 0 ? './' : href; - next.firstChild.disabled = href === pageNum; - if (strong = $('strong', pagesRoot)) { - if (+strong.textContent === pageNum) { - return; - } - $.replace(strong, strong.firstChild); - } else { - strong = $.el('strong'); - } - a = pagesRoot.children[pageNum]; - $.before(a, strong); - return $.add(strong, a); - }, - update: function(pageNum) { - var now, onload, _ref, _ref1; - if (!navigator.onLine) { - return; - } - if (g.VIEW === 'thread') { - if (Conf['Thread Updater']) { - return ThreadUpdater.update(); - } - return; - } - if (!(d.readyState === 'loading' || Index.root.parentElement)) { - $.replace($('.board'), Index.root); - } - delete Index.pageNum; - if ((_ref = Index.req) != null) { - _ref.abort(); - } - if ((_ref1 = Index.notice) != null) { - _ref1.close(); - } - now = Date.now(); - $.ready(function() { - return Index.nTimeout = setTimeout((function() { - if (Index.req && !Index.notice) { - return Index.notice = new Notice('info', 'Refreshing index...', 2); - } - }), 3 * $.SECOND - (Date.now() - now)); - }); - if (typeof pageNum !== 'number') { - pageNum = null; - } - onload = function(e) { - return Index.load(e, pageNum); - }; - Index.req = $.ajax("//a.4cdn.org/" + g.BOARD + "/catalog.json", { - onabort: onload, - onloadend: onload - }, { - whenModified: Index.board === ("" + g.BOARD) - }); - return $.addClass(Index.button, 'fa-spin'); - }, - load: function(e, pageNum) { - var err, nTimeout, notice, req, timeEl, _ref; - $.rmClass(Index.button, 'fa-spin'); - req = Index.req, notice = Index.notice, nTimeout = Index.nTimeout; - if (nTimeout) { - clearTimeout(nTimeout); - } - delete Index.nTimeout; - delete Index.req; - delete Index.notice; - if (e.type === 'abort') { - req.onloadend = null; - notice.close(); - return; - } - if ((_ref = req.status) !== 200 && _ref !== 304) { - err = "Index refresh failed. Error " + req.statusText + " (" + req.status + ")"; - if (notice) { - notice.setType('warning'); - notice.el.lastElementChild.textContent = err; - setTimeout(notice.close, $.SECOND); - } else { - new Notice('warning', err, 1); - } - return; - } - Navigate.title(); - Index.board = "" + g.BOARD; - try { - if (req.status === 200) { - Index.parse(req.response, pageNum); - } else if (req.status === 304 && (pageNum != null)) { - Index.pageNav(pageNum); - } - } catch (_error) { - err = _error; - c.error("Index failure: " + err.message, err.stack); - if (notice) { - notice.setType('error'); - notice.el.lastElementChild.textContent = 'Index refresh failed.'; - setTimeout(notice.close, $.SECOND); - } else { - new Notice('error', 'Index refresh failed.', 1); - } - return; - } - timeEl = $('#index-last-refresh time', Index.navLinks); - timeEl.dataset.utc = Date.parse(req.getResponseHeader('Last-Modified')); - RelativeDates.update(timeEl); - return Index.scrollToIndex(); - }, - parse: function(pages, pageNum) { - Index.parseThreadList(pages); - Index.buildThreads(); - Index.sort(); - Index.buildPagelist(); - if (pageNum != null) { - Index.pageNav(pageNum); - return; - } - Index.buildIndex(); - return Index.setPage(); - }, - parseThreadList: function(pages) { - Index.pagesNum = pages.length; - Index.threadsNumPerPage = pages[0].threads.length; - Index.liveThreadData = pages.reduce((function(arr, next) { - return arr.concat(next.threads); - }), []); - Index.liveThreadIDs = Index.liveThreadData.map(function(data) { - return data.no; - }); - g.BOARD.threads.forEach(function(thread) { - var _ref; - if (_ref = thread.ID, __indexOf.call(Index.liveThreadIDs, _ref) < 0) { - return thread.collect(); - } - }); - }, - buildThreads: function() { - var err, errors, i, posts, thread, threadData, threadRoot, threads, _i, _len, _ref; - Index.nodes = []; - threads = []; - posts = []; - _ref = Index.liveThreadData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - threadData = _ref[i]; - try { - threadRoot = Build.thread(g.BOARD, threadData); - if (thread = g.BOARD.threads[threadData.no]) { - thread.setPage(Math.floor(i / Index.threadsNumPerPage)); - thread.setStatus('Sticky', !!threadData.sticky); - thread.setStatus('Closed', !!threadData.closed); - } else { - thread = new Thread(threadData.no, g.BOARD); - threads.push(thread); - } - Index.nodes.push(threadRoot); - if (thread.ID in thread.posts) { - continue; - } - posts.push(new Post($('.opContainer', threadRoot), thread, g.BOARD)); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Parsing of Thread No." + thread + " failed. Thread will be skipped.", - error: err - }); - } - } - if (errors) { - Main.handleErrors(errors); - } - $.nodes(Index.nodes); - Main.callbackNodes(Thread, threads); - Main.callbackNodes(Post, posts); - return $.event('IndexRefresh'); - }, - buildReplies: function(threadRoots) { - var data, err, errors, i, lastReplies, node, nodes, post, posts, thread, threadRoot, _i, _j, _len, _len1; - posts = []; - for (_i = 0, _len = threadRoots.length; _i < _len; _i++) { - threadRoot = threadRoots[_i]; - thread = Get.threadFromRoot(threadRoot); - i = Index.liveThreadIDs.indexOf(thread.ID); - if (!(lastReplies = Index.liveThreadData[i].last_replies)) { - continue; - } - nodes = []; - for (_j = 0, _len1 = lastReplies.length; _j < _len1; _j++) { - data = lastReplies[_j]; - if (post = thread.posts[data.no]) { - nodes.push(post.nodes.root); - continue; - } - nodes.push(node = Build.postFromObject(data, thread.board.ID)); - try { - posts.push(new Post(node, thread, thread.board)); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Parsing of Post No." + data.no + " failed. Post will be skipped.", - error: err - }); - } - } - $.add(threadRoot, nodes); - } - if (errors) { - Main.handleErrors(errors); - } - return Main.callbackNodes(Post, posts); - }, - sort: function() { - var cnd, fn, i, item, items, liveThreadData, liveThreadIDs, nodes, sortedNodes, sortedThreadIDs, threadID, _i, _len; - liveThreadIDs = Index.liveThreadIDs, liveThreadData = Index.liveThreadData; - sortedThreadIDs = { - lastreply: __slice.call(liveThreadData).sort(function(a, b) { - var num; - if ((num = a.last_replies)) { - a = num[num.length - 1]; - } - if ((num = b.last_replies)) { - b = num[num.length - 1]; - } - return b.no - a.no; - }).map(function(post) { - return post.no; - }), - bump: liveThreadIDs, - birth: __slice.call(liveThreadIDs).sort(function(a, b) { - return b - a; - }), - replycount: __slice.call(liveThreadData).sort(function(a, b) { - return b.replies - a.replies; - }).map(function(post) { - return post.no; - }), - filecount: __slice.call(liveThreadData).sort(function(a, b) { - return b.images - a.images; - }).map(function(post) { - return post.no; - }) - }[Conf['Index Sort']]; - Index.sortedNodes = sortedNodes = new RandomAccessList; - nodes = Index.nodes; - for (_i = 0, _len = sortedThreadIDs.length; _i < _len; _i++) { - threadID = sortedThreadIDs[_i]; - sortedNodes.push(nodes[Index.liveThreadIDs.indexOf(threadID)]); - } - if (Index.isSearching && (nodes = Index.querySearch(Index.searchInput.value))) { - Index.sortedNodes = new RandomAccessList(nodes); - } - items = [ - { - fn: function(thread) { - return thread.isSticky; - }, - cnd: true - }, { - fn: function(thread) { - return thread.isOnTop; - }, - cnd: Conf['Filter'] - }, { - fn: function(thread) { - return !thread.isHidden; - }, - cnd: Conf['Anchor Hidden Threads'] - } - ]; - i = 0; - while (item = items[i++]) { - fn = item.fn, cnd = item.cnd; - if (cnd) { - Index.sortOnTop(fn); - } - } - }, - sortOnTop: function(match) { - var j, offset, sortedNodes, target, threadRoot; - offset = 0; - sortedNodes = Index.sortedNodes; - threadRoot = sortedNodes.first; - while (threadRoot) { - if (match(Get.threadFromRoot(threadRoot.data))) { - target = sortedNodes.first; - j = 0; - while (j++ < offset) { - target = target.next; - } - if (threadRoot !== target) { - offset++; - sortedNodes.before(target, threadRoot); - } - } - threadRoot = threadRoot.next; - } - }, - buildIndex: function() { - var nodes, target; - if (Conf['Index Mode'] !== 'all pages') { - nodes = Index.buildSinglePage(Index.getCurrentPage()); - } else { - nodes = [(target = Index.sortedNodes.first).data]; - while (target = target.next) { - nodes.push(target.data); - } - } - $.rmAll(Index.root); - $.rmAll(Header.hover); - if (Conf['Show Replies']) { - Index.buildReplies(nodes); - } - return Index.buildStructure(nodes); - }, - buildSinglePage: function(pageNum) { - var end, nodes, nodesPerPage, offset, target; - nodes = []; - nodesPerPage = Index.threadsNumPerPage; - offset = nodesPerPage * pageNum; - end = offset + nodesPerPage; - target = Index.sortedNodes.order()[offset]; - Index.sortedNodes; - while ((offset++ <= end) && target) { - nodes.push(target.data); - target = target.next; - } - return nodes; - }, - buildStructure: function(nodes) { - var hr, i, node, result, _i, _len, _ref; - result = $.frag(); - i = 0; - while (node = nodes[i++]) { - $.add(result, [node, $.el('hr')]); - } - $.add(Index.root, result); - _ref = $$('hr + hr', Index.root); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - hr = _ref[_i]; - $.rm(hr); - } - return $.event('IndexBuild', result); - }, - isSearching: false, - clearSearch: function() { - Index.searchInput.value = null; - Index.onSearchInput(); - return Index.searchInput.focus(); - }, - onSearchInput: function() { - var pageNum; - if (Index.isSearching = !!Index.searchInput.value.trim()) { - if (!Index.searchInput.dataset.searching) { - Index.searchInput.dataset.searching = 1; - Index.pageBeforeSearch = Index.getCurrentPage(); - pageNum = 0; - } else { - pageNum = Index.getCurrentPage(); - } - } else { - if (!Index.searchInput.dataset.searching) { - return; - } - pageNum = Index.pageBeforeSearch; - delete Index.pageBeforeSearch; - Index.searchInput.removeAttribute('data-searching'); - } - Index.sort(); - if (Conf['Index Mode'] !== 'all pages') { - pageNum = Math.min(pageNum, Index.getMaxPageNum()); - } - Index.buildPagelist(); - if (Index.currentPage === pageNum) { - Index.buildIndex(); - return Index.setPage(); - } else { - return Index.pageNav(pageNum); - } - }, - querySearch: function(query) { - var keywords; - if (!(keywords = query.toLowerCase().match(/\S+/g))) { - return; - } - return Index.search(keywords); - }, - search: function(keywords) { - var data, found, target; - found = []; - target = Index.sortedNodes.first; - while (target) { - data = target.data; - if (Index.searchMatch(Get.threadFromRoot(data), keywords)) { - found.push(data); - } - target = target.next; - } - return found; - }, - searchMatch: function(thread, keywords) { - var file, info, key, keyword, text, _i, _j, _len, _len1, _ref, _ref1; - _ref = thread.OP, info = _ref.info, file = _ref.file; - text = []; - _ref1 = ['comment', 'subject', 'name', 'tripcode', 'email']; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - key = _ref1[_i]; - if (key in info) { - text.push(info[key]); - } - } - if (file) { - text.push(file.name); - } - text = text.join(' ').toLowerCase(); - for (_j = 0, _len1 = keywords.length; _j < _len1; _j++) { - keyword = keywords[_j]; - if (-1 === text.indexOf(keyword)) { - return false; - } - } - return true; - } - }; - - Build = { - staticPath: '//s.4cdn.org/image/', - gifIcon: window.devicePixelRatio >= 2 ? '@2x.gif' : '.gif', - spoilerRange: {}, - shortFilename: function(filename, isReply) { - var threshold; - threshold = isReply ? 30 : 40; - if (filename.length - 4 > threshold) { - return "" + filename.slice(0, threshold - 5) + "(...)." + filename.slice(-3); - } else { - return filename; - } - }, - thumbRotate: (function() { - var n; - n = 0; - return function() { - return n = (n + 1) % 3; - }; - })(), - postFromObject: function(data, boardID) { - var o; - o = { - postID: data.no, - threadID: data.resto || data.no, - boardID: boardID, - name: data.name, - capcode: data.capcode, - tripcode: data.trip, - uniqueID: data.id, - email: data.email ? encodeURI(data.email.replace(/"/g, '"')) : '', - subject: data.sub, - flagCode: data.country, - flagName: data.country_name, - date: data.now, - dateUTC: data.time, - comment: data.com, - isSticky: !!data.sticky, - isClosed: !!data.closed - }; - if (data.ext || data.filedeleted) { - o.file = { - name: data.filename + data.ext, - timestamp: "" + data.tim + data.ext, - url: boardID === 'f' ? "//i.4cdn.org/" + boardID + "/src/" + data.filename + data.ext : "//i.4cdn.org/" + boardID + "/src/" + data.tim + data.ext, - height: data.h, - width: data.w, - MD5: data.md5, - size: data.fsize, - turl: "//" + (Build.thumbRotate()) + ".t.4cdn.org/" + boardID + "/thumb/" + data.tim + "s.jpg", - theight: data.tn_h, - twidth: data.tn_w, - isSpoiler: !!data.spoiler, - isDeleted: !!data.filedeleted - }; - } - return Build.post(o); - }, - post: function(o, isArchived) { - /* - This function contains code from 4chan-JS (https://github.com/4chan/4chan-JS). - @license: https://github.com/4chan/4chan-JS/blob/master/LICENSE - */ - - var a, boardID, capcode, capcodeClass, capcodeIcon, capcodeStart, closed, comment, container, date, dateUTC, email, emailEnd, emailStart, file, fileDims, fileHTML, fileInfo, fileSize, fileThumb, filename, flag, flagCode, flagName, gifIcon, href, imgSrc, isClosed, isOP, isSticky, name, pageIcon, pageNum, postID, quote, replyLink, shortFilename, spoilerRange, staticPath, sticky, subject, threadID, tripcode, uniqueID, userID, _i, _len, _ref; - postID = o.postID, threadID = o.threadID, boardID = o.boardID, name = o.name, capcode = o.capcode, tripcode = o.tripcode, uniqueID = o.uniqueID, email = o.email, subject = o.subject, flagCode = o.flagCode, flagName = o.flagName, date = o.date, dateUTC = o.dateUTC, isSticky = o.isSticky, isClosed = o.isClosed, comment = o.comment, file = o.file; - isOP = postID === threadID; - staticPath = Build.staticPath, gifIcon = Build.gifIcon; - tripcode = tripcode ? " " + tripcode + "" : ''; - if (email) { - emailStart = ''; - emailEnd = ''; - } else { - emailStart = ''; - emailEnd = ''; - } - switch (capcode) { - case 'admin': - case 'admin_highlight': - capcodeClass = " capcodeAdmin"; - capcodeStart = " ## Admin"; - capcodeIcon = (" "; - break; - case 'mod': - capcodeClass = " capcodeMod"; - capcodeStart = " ## Mod"; - capcodeIcon = (" "; - break; - case 'developer': - capcodeClass = " capcodeDeveloper"; - capcodeStart = " ## Developer"; - capcodeIcon = (" "; - break; - default: - capcodeClass = ''; - capcodeStart = ''; - capcodeIcon = ''; - } - userID = !capcode && uniqueID ? (" (ID: ") + ("" + uniqueID + ") ") : ''; - flag = !flagCode ? '' : boardID === 'pol' ? "  + flagCode + " : " "; - if (file != null ? file.isDeleted : void 0) { - fileHTML = isOP ? ("
") + ("File deleted.") + "
" : ("
") + ("File deleted.") + "
"; - } else if (file) { - fileSize = $.bytesToString(file.size); - fileThumb = file.turl; - if (file.isSpoiler) { - fileSize = "Spoiler Image, " + fileSize; - if (!isArchived) { - fileThumb = "" + staticPath + "spoiler"; - if (spoilerRange = Build.spoilerRange[boardID]) { - fileThumb += ("-" + boardID) + Math.floor(1 + spoilerRange * Math.random()); - } - fileThumb += '.png'; - file.twidth = file.theight = 100; - } - } - imgSrc = boardID === 'f' ? '' : ("") + ("" + fileSize + "") + ""; - a = $.el('a', { - innerHTML: file.name - }); - filename = a.textContent.replace(/%22/g, '"'); - a.textContent = Build.shortFilename(filename); - shortFilename = a.innerHTML; - a.textContent = filename; - filename = a.innerHTML.replace(/'/g, '''); - fileDims = file.name.slice(-3) === 'pdf' ? 'PDF' : "" + file.width + "x" + file.height; - fileInfo = ("
File: " + file.timestamp + "") + ("-(" + fileSize + ", " + fileDims + (file.isSpoiler ? '' : ", " + shortFilename + "")) + ")
"; - fileHTML = "
" + fileInfo + imgSrc + "
"; - } else { - fileHTML = ''; - } - sticky = isSticky ? " Sticky" : ''; - closed = isClosed ? " Closed" : ''; - if (isOP && g.VIEW === 'index') { - pageNum = Math.floor(Index.liveThreadIDs.indexOf(postID) / Index.threadsNumPerPage); - pageIcon = " [" + pageNum + "]"; - replyLink = "   [Reply]"; - } else { - pageIcon = replyLink = ''; - } - container = $.el('div', { - id: "pc" + postID, - className: "postContainer " + (isOP ? 'op' : 'reply') + "Container", - innerHTML: "" + (isOP ? '' : "
>>
") + "
" + (isOP ? fileHTML : '') + "" + (isOP ? '' : fileHTML) + "
" + (comment || '') + "
" + ' ' + "
" - }); - _ref = $$('.quotelink', container); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - href = quote.getAttribute('href'); - if (href[0] === '/') { - continue; - } - quote.href = "/" + boardID + "/res/" + href; - } - return container; - }, - summary: function(boardID, threadID, posts, files) { - var text; - text = []; - text.push("" + posts + " post" + (posts > 1 ? 's' : '')); - if (files) { - text.push("and " + files + " image repl" + (files > 1 ? 'ies' : 'y')); - } - text.push('omitted.'); - return $.el('a', { - className: 'summary', - textContent: text.join(' '), - href: "/" + boardID + "/res/" + threadID - }); - }, - thread: function(board, data, full) { - var OP, root; - Build.spoilerRange[board] = data.custom_spoiler; - if ((OP = board.posts[data.no]) && (root = OP.nodes.root.parentNode)) { - $.rmAll(root); - } else { - root = $.el('div', { - className: 'thread', - id: "t" + data.no - }); - } - $.add(root, Build[full ? 'fullThread' : 'excerptThread'](board, data, OP)); - return root; - }, - excerptThread: function(board, data, OP) { - var files, nodes, posts, _ref; - nodes = [OP ? OP.nodes.root : Build.postFromObject(data, board.ID)]; - if (data.omitted_posts || !Conf['Show Replies'] && data.replies) { - _ref = Conf['Show Replies'] ? [data.omitted_posts, data.omitted_images] : [ - data.replies, data.omitted_images + data.last_replies.filter(function(data) { - return !!data.ext; - }).length - ], posts = _ref[0], files = _ref[1]; - nodes.push(Build.summary(board.ID, data.no, posts, files)); - } - return nodes; - }, - fullThread: function(board, data) { - return Build.postFromObject(data, board.ID); - } - }; - - Get = { - threadExcerpt: function(thread) { - var OP, excerpt, _ref; - OP = thread.OP; - excerpt = ("/" + thread.board + "/ - ") + (((_ref = OP.info.subject) != null ? _ref.trim() : void 0) || OP.info.comment.replace(/\n+/g, ' // ') || Conf['Anonymize'] && 'Anonymous' || $('.nameBlock', OP.nodes.info).textContent.trim()); - if (excerpt.length > 73) { - return "" + excerpt.slice(0, 70) + "..."; - } - return excerpt; - }, - threadFromRoot: function(root) { - return g.threads["" + g.BOARD + "." + root.id.slice(1)]; - }, - threadFromNode: function(node) { - return Get.threadFromRoot($.x('ancestor::div[@class="thread"]', node)); - }, - postFromRoot: function(root) { - var boardID, index, link, post, postID; - link = $('a[title="Highlight this post"]', root); - boardID = link.pathname.split('/')[1]; - postID = link.hash.slice(2); - index = root.dataset.clone; - post = g.posts["" + boardID + "." + postID]; - if (index) { - return post.clones[index]; - } else { - return post; - } - }, - postFromNode: function(root) { - return Get.postFromRoot($.x('(ancestor::div[contains(@class,"postContainer")][1]|following::div[contains(@class,"postContainer")][1])', root)); - }, - contextFromNode: function(node) { - return Get.postFromRoot($.x('ancestor::div[parent::div[@class="thread"]][1]', node)); - }, - postDataFromLink: function(link) { - var boardID, path, postID, threadID, _ref; - if (link.hostname === 'boards.4chan.org') { - path = link.pathname.split('/'); - boardID = path[1]; - threadID = path[3]; - postID = link.hash.slice(2); - } else { - _ref = link.dataset, boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - threadID || (threadID = 0); - } - return { - boardID: boardID, - threadID: +threadID, - postID: +postID - }; - }, - allQuotelinksLinkingTo: function(post) { - var fullID, handleQuotes, posts, qPost, quote, quotelinks, _i, _len, _ref; - quotelinks = []; - posts = g.posts; - fullID = { - post: post - }; - handleQuotes = function(qPost, type) { - var clone, _i, _len, _ref; - quotelinks.push.apply(quotelinks, qPost.nodes[type]); - _ref = qPost.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - clone = _ref[_i]; - quotelinks.push.apply(quotelinks, clone.nodes[type]); - } - }; - posts.forEach(function(qPost) { - if (__indexOf.call(qPost.quotes, fullID) >= 0) { - return handleQuotes(qPost, 'quotelinks'); - } - }); - if (Conf['Quote Backlinks']) { - _ref = post.quotes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - if (qPost = posts[quote]) { - handleQuotes(qPost, 'backlinks'); - } - } - } - return quotelinks.filter(function(quotelink) { - var boardID, postID, _ref1; - _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, postID = _ref1.postID; - return boardID === post.board.ID && postID === post.ID; - }); - }, - postClone: function(boardID, threadID, postID, root, context) { - var post, url; - if (post = g.posts["" + boardID + "." + postID]) { - Get.insert(post, root, context); - return; - } - root.textContent = "Loading post No." + postID + "..."; - if (threadID) { - return $.cache("//a.4cdn.org/" + boardID + "/res/" + threadID + ".json", function() { - return Get.fetchedPost(this, boardID, threadID, postID, root, context); - }); - } else if (url = Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - return $.cache(url, function() { - return Get.archivedPost(this, boardID, postID, root, context); - }, { - responseType: 'json', - withCredentials: url.archive.withCredentials - }); - } - }, - insert: function(post, root, context) { - var clone, nodes; - if (!root.parentNode) { - return; - } - clone = post.addClone(context); - Main.callbackNodes(Clone, [clone]); - nodes = clone.nodes; - $.rmAll(nodes.root); - $.add(nodes.root, nodes.post); - $.rmAll(root); - return $.add(root, nodes.root); - }, - fetchedPost: function(req, boardID, threadID, postID, root, context) { - var board, post, posts, status, thread, url, _i, _len; - if (post = g.posts["" + boardID + "." + postID]) { - Get.insert(post, root, context); - return; - } - status = req.status; - if (status !== 200 && status !== 304) { - if (url = Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - $.cache(url, function() { - return Get.archivedPost(this, boardID, postID, root, context); - }, { - withCredentials: url.archive.withCredentials - }); - } else { - $.addClass(root, 'warning'); - root.textContent = status === 404 ? "Thread No." + threadID + " 404'd." : "Error " + req.statusText + " (" + req.status + ")."; - } - return; - } - posts = req.response.posts; - Build.spoilerRange[boardID] = posts[0].custom_spoiler; - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - if (post.no === postID) { - break; - } - } - if (post.no !== postID) { - if (url = Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - $.cache(url, function() { - return Get.archivedPost(this, boardID, postID, root, context); - }, { - withCredentials: url.archive.withCredentials - }); - } else { - $.addClass(root, 'warning'); - root.textContent = "Post No." + postID + " was not found."; - } - return; - } - board = g.boards[boardID] || new Board(boardID); - thread = g.threads["" + boardID + "." + threadID] || new Thread(threadID, board); - post = new Post(Build.postFromObject(post, boardID), thread, board); - Main.callbackNodes(Post, [post]); - return Get.insert(post, root, context); - }, - archivedPost: function(req, boardID, postID, root, context) { - var board, bq, comment, data, o, post, thread, threadID, _ref; - if (post = g.posts["" + boardID + "." + postID]) { - Get.insert(post, root, context); - return; - } - data = req.response; - if (data.error) { - $.addClass(root, 'warning'); - root.textContent = data.error; - return; - } - bq = $.el('blockquote', { - textContent: data.comment - }); - bq.innerHTML = bq.innerHTML.replace(/\n|\[\/?[a-z]+(:lit)?\]/g, Get.parseMarkup); - comment = bq.innerHTML.replace(/(^|>)(>[^<$]*)(<|$)/g, '$1$2$3').replace(/((>){2}(>\/[a-z\d]+\/)?\d+)/g, '$1'); - threadID = +data.thread_num; - o = { - postID: postID, - threadID: threadID, - boardID: boardID, - name: data.name_processed, - capcode: (function() { - switch (data.capcode) { - case 'M': - return 'mod'; - case 'A': - return 'admin'; - case 'D': - return 'developer'; - } - })(), - tripcode: data.trip, - uniqueID: data.poster_hash, - email: data.email ? encodeURI(data.email) : '', - subject: data.title_processed, - flagCode: data.poster_country, - flagName: data.poster_country_name_processed, - date: data.fourchan_date, - dateUTC: data.timestamp, - comment: comment - }; - if ((_ref = data.media) != null ? _ref.media_filename : void 0) { - o.file = { - name: data.media.media_filename_processed, - timestamp: data.media.media_orig, - url: data.media.media_link || data.media.remote_media_link, - height: data.media.media_h, - width: data.media.media_w, - MD5: data.media.media_hash, - size: data.media.media_size, - turl: data.media.thumb_link || ("//t.4cdn.org/" + boardID + "/thumb/" + data.media.preview_orig), - theight: data.media.preview_h, - twidth: data.media.preview_w, - isSpoiler: data.media.spoiler === '1' - }; - } - board = g.boards[boardID] || new Board(boardID); - thread = g.threads["" + boardID + "." + threadID] || new Thread(threadID, board); - post = new Post(Build.post(o, true), thread, board, { - isArchived: true - }); - Main.callbackNodes(Post, [post]); - return Get.insert(post, root, context); - }, - parseMarkup: function(text) { - return { - '\n': '
', - '[b]': '', - '[/b]': '', - '[spoiler]': '', - '[/spoiler]': '', - '[code]': '
',
-        '[/code]': '
', - '[moot]': '
', - '[/moot]': '
', - '[banned]': '', - '[/banned]': '' - }[text] || text.replace(':lit', ''); - } - }; - - UI = (function() { - var Menu, dialog, drag, dragend, dragstart, hover, hoverend, hoverstart, touchend, touchmove; - dialog = function(id, position, html) { - var child, el, move, _i, _len, _ref; - el = $.el('div', { - className: 'dialog', - innerHTML: html, - id: id - }); - el.style.cssText = position; - $.get("" + id + ".position", position, function(item) { - return el.style.cssText = item["" + id + ".position"]; - }); - move = $('.move', el); - $.on(move, 'touchstart mousedown', dragstart); - _ref = move.children; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - if (!child.tagName) { - continue; - } - $.on(child, 'touchstart mousedown', function(e) { - return e.stopPropagation(); - }); - } - return el; - }; - Menu = (function() { - var currentMenu, lastToggledButton; - - currentMenu = null; - - lastToggledButton = null; - - function Menu(type) { - this.type = type; - this.rmEntry = __bind(this.rmEntry, this); - this.addEntry = __bind(this.addEntry, this); - this.onFocus = __bind(this.onFocus, this); - this.keybinds = __bind(this.keybinds, this); - this.close = __bind(this.close, this); - $.on(d, 'AddMenuEntry', this.addEntry); - $.on(d, 'rmMenuEntry', this.rmEntry); - this.entries = []; - } - - Menu.prototype.makeMenu = function() { - var menu; - menu = $.el('div', { - className: 'dialog', - id: 'menu', - tabIndex: 0 - }); - $.on(menu, 'click', function(e) { - return e.stopPropagation(); - }); - $.on(menu, 'keydown', this.keybinds); - return menu; - }; - - Menu.prototype.toggle = function(e, button, data) { - var previousButton; - e.preventDefault(); - e.stopPropagation(); - if (currentMenu) { - previousButton = lastToggledButton; - this.close(); - if (previousButton === button) { - return; - } - } - if (!this.entries.length) { - return; - } - return this.open(button, data); - }; - - Menu.prototype.open = function(button, data) { - var bLeft, bRect, bTop, bottom, cHeight, cWidth, entry, left, mRect, menu, right, style, top, _i, _len, _ref, _ref1, _ref2; - menu = this.makeMenu(); - currentMenu = menu; - lastToggledButton = button; - this.entries.sort(function(first, second) { - return first.order - second.order; - }); - _ref = this.entries; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - entry = _ref[_i]; - this.insertEntry(entry, menu, data); - } - $.addClass(lastToggledButton, 'active'); - $.on(d, 'click', this.close); - $.on(d, 'CloseMenu', this.close); - $.add(Header.hover, menu); - mRect = menu.getBoundingClientRect(); - bRect = button.getBoundingClientRect(); - bTop = window.scrollY + bRect.top; - bLeft = window.scrollX + bRect.left; - cHeight = doc.clientHeight; - cWidth = doc.clientWidth; - _ref1 = bRect.top + bRect.height + mRect.height < cHeight ? [bRect.bottom, null] : [null, cHeight - bRect.top], top = _ref1[0], bottom = _ref1[1]; - _ref2 = bRect.left + mRect.width < cWidth ? [bRect.left, null] : [null, cWidth - bRect.right], left = _ref2[0], right = _ref2[1]; - style = menu.style; - style.top = "" + top + "px"; - style.right = "" + right + "px"; - style.bottom = "" + bottom + "px"; - style.left = "" + left + "px"; - if (right) { - $.addClass(menu, 'left'); - } - entry = $('.entry', menu); - this.focus(entry); - return menu.focus(); - }; - - Menu.prototype.insertEntry = function(entry, parent, data) { - var subEntry, submenu, _i, _len, _ref; - if (typeof entry.open === 'function') { - if (!entry.open(data)) { - return; - } - } - $.add(parent, entry.el); - if (!entry.subEntries) { - return; - } - if (submenu = $('.submenu', entry.el)) { - $.rm(submenu); - } - submenu = $.el('div', { - className: 'dialog submenu' - }); - _ref = entry.subEntries; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - subEntry = _ref[_i]; - this.insertEntry(subEntry, submenu, data); - } - $.add(entry.el, submenu); - }; - - Menu.prototype.close = function() { - $.rm(currentMenu); - $.rmClass(lastToggledButton, 'active'); - currentMenu = null; - lastToggledButton = null; - return $.off(d, 'click CloseMenu', this.close); - }; - - Menu.prototype.findNextEntry = function(entry, direction) { - var entries; - entries = __slice.call(entry.parentNode.children); - entries.sort(function(first, second) { - return first.style.order - second.style.order; - }); - return entries[entries.indexOf(entry) + direction]; - }; - - Menu.prototype.keybinds = function(e) { - var entry, next, nextPrev, subEntry, submenu; - entry = $('.focused', currentMenu); - while (subEntry = $('.focused', entry)) { - entry = subEntry; - } - switch (e.keyCode) { - case 27: - lastToggledButton.focus(); - this.close(); - break; - case 13: - case 32: - entry.click(); - break; - case 38: - if (next = this.findNextEntry(entry, -1)) { - this.focus(next); - } - break; - case 40: - if (next = this.findNextEntry(entry, +1)) { - this.focus(next); - } - break; - case 39: - if ((submenu = $('.submenu', entry)) && (next = submenu.firstElementChild)) { - while (nextPrev = this.findNextEntry(next, -1)) { - next = nextPrev; - } - this.focus(next); - } - break; - case 37: - if (next = $.x('parent::*[contains(@class,"submenu")]/parent::*', entry)) { - this.focus(next); - } - break; - default: - return; - } - e.preventDefault(); - return e.stopPropagation(); - }; - - Menu.prototype.onFocus = function(e) { - e.stopPropagation(); - return this.focus(e.target); - }; - - Menu.prototype.focus = function(entry) { - var bottom, cHeight, cWidth, eRect, focused, left, right, sRect, style, submenu, top, _i, _len, _ref, _ref1, _ref2; - while (focused = $.x('parent::*/child::*[contains(@class,"focused")]', entry)) { - $.rmClass(focused, 'focused'); - } - _ref = $$('.focused', entry); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - focused = _ref[_i]; - $.rmClass(focused, 'focused'); - } - $.addClass(entry, 'focused'); - if (!(submenu = $('.submenu', entry))) { - return; - } - sRect = submenu.getBoundingClientRect(); - eRect = entry.getBoundingClientRect(); - cHeight = doc.clientHeight; - cWidth = doc.clientWidth; - _ref1 = eRect.top + sRect.height < cHeight ? ['0px', 'auto'] : ['auto', '0px'], top = _ref1[0], bottom = _ref1[1]; - _ref2 = eRect.right + sRect.width < cWidth - 150 ? ['100%', 'auto'] : ['auto', '100%'], left = _ref2[0], right = _ref2[1]; - style = submenu.style; - style.top = top; - style.bottom = bottom; - style.left = left; - return style.right = right; - }; - - Menu.prototype.addEntry = function(e) { - var entry; - entry = e.detail; - if (entry.type !== this.type) { - return; - } - this.parseEntry(entry); - return this.entries.push(entry); - }; - - Menu.prototype.rmEntry = function(e) { - var entry, index; - entry = e.detail; - if (entry.type !== this.type) { - return; - } - index = this.entries.indexOf(entry); - return this.entries.splice(index, 1); - }; - - Menu.prototype.parseEntry = function(entry) { - var el, subEntries, subEntry, _i, _len; - el = entry.el, subEntries = entry.subEntries; - $.addClass(el, 'entry'); - $.on(el, 'focus mouseover', this.onFocus); - el.style.order = entry.order || 100; - if (!subEntries) { - return; - } - $.addClass(el, 'has-submenu'); - for (_i = 0, _len = subEntries.length; _i < _len; _i++) { - subEntry = subEntries[_i]; - this.parseEntry(subEntry); - } - }; - - return Menu; - - })(); - dragstart = function(e) { - var el, isTouching, o, rect, screenHeight, screenWidth, _ref; - if (e.type === 'mousedown' && e.button !== 0) { - return; - } - e.preventDefault(); - if (isTouching = e.type === 'touchstart') { - e = e.changedTouches[e.changedTouches.length - 1]; - } - el = $.x('ancestor::div[contains(@class,"dialog")][1]', this); - rect = el.getBoundingClientRect(); - screenHeight = doc.clientHeight; - screenWidth = doc.clientWidth; - o = { - id: el.id, - style: el.style, - dx: e.clientX - rect.left, - dy: e.clientY - rect.top, - height: screenHeight - rect.height, - width: screenWidth - rect.width, - screenHeight: screenHeight, - screenWidth: screenWidth, - isTouching: isTouching - }; - _ref = Conf['Header auto-hide'] || !Conf['Fixed Header'] ? [0, 0] : Conf['Bottom Header'] ? [0, Header.bar.getBoundingClientRect().height] : [Header.bar.getBoundingClientRect().height, 0], o.topBorder = _ref[0], o.bottomBorder = _ref[1]; - if (isTouching) { - o.identifier = e.identifier; - o.move = touchmove.bind(o); - o.up = touchend.bind(o); - $.on(d, 'touchmove', o.move); - return $.on(d, 'touchend touchcancel', o.up); - } else { - o.move = drag.bind(o); - o.up = dragend.bind(o); - $.on(d, 'mousemove', o.move); - return $.on(d, 'mouseup', o.up); - } - }; - touchmove = function(e) { - var touch, _i, _len, _ref; - _ref = e.changedTouches; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - touch = _ref[_i]; - if (touch.identifier === this.identifier) { - drag.call(this, touch); - return; - } - } - }; - drag = function(e) { - var bottom, clientX, clientY, left, right, style, top; - clientX = e.clientX, clientY = e.clientY; - left = clientX - this.dx; - left = left < 10 ? 0 : this.width - left < 10 ? null : left / this.screenWidth * 100 + '%'; - top = clientY - this.dy; - top = top < (10 + this.topBorder) ? this.topBorder + 'px' : this.height - top < (10 + this.bottomBorder) ? null : top / this.screenHeight * 100 + '%'; - right = left === null ? 0 : null; - bottom = top === null ? this.bottomBorder + 'px' : null; - style = this.style; - style.left = left; - style.right = right; - style.top = top; - return style.bottom = bottom; - }; - touchend = function(e) { - var touch, _i, _len, _ref; - _ref = e.changedTouches; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - touch = _ref[_i]; - if (touch.identifier === this.identifier) { - dragend.call(this); - return; - } - } - }; - dragend = function() { - if (this.isTouching) { - $.off(d, 'touchmove', this.move); - $.off(d, 'touchend touchcancel', this.up); - } else { - $.off(d, 'mousemove', this.move); - $.off(d, 'mouseup', this.up); - } - return $.set("" + this.id + ".position", this.style.cssText); - }; - hoverstart = function(_arg) { - var asapTest, cb, el, endEvents, latestEvent, o, root; - root = _arg.root, el = _arg.el, latestEvent = _arg.latestEvent, endEvents = _arg.endEvents, asapTest = _arg.asapTest, cb = _arg.cb; - o = { - root: root, - el: el, - style: el.style, - cb: cb, - endEvents: endEvents, - latestEvent: latestEvent, - clientHeight: doc.clientHeight, - clientWidth: doc.clientWidth - }; - o.hover = hover.bind(o); - o.hoverend = hoverend.bind(o); - $.asap(function() { - return !el.parentNode || asapTest(); - }, function() { - if (el.parentNode) { - return o.hover(o.latestEvent); - } - }); - $.on(root, endEvents, o.hoverend); - if ($.x('ancestor::div[contains(@class,"inline")][1]', root)) { - $.on(d, 'keydown', o.hoverend); - } - $.on(root, 'mousemove', o.hover); - o.workaround = function(e) { - if (!root.contains(e.target)) { - return o.hoverend(); - } - }; - return $.on(doc, 'mousemove', o.workaround); - }; - hover = function(e) { - var clientX, clientY, height, left, right, style, top, _ref; - this.latestEvent = e; - height = this.el.offsetHeight; - clientX = e.clientX, clientY = e.clientY; - top = clientY - 120; - top = this.clientHeight <= height || top <= 0 ? 0 : top + height >= this.clientHeight ? this.clientHeight - height : top; - _ref = clientX <= this.clientWidth - 400 ? [clientX + 45 + 'px', null] : [null, this.clientWidth - clientX + 45 + 'px'], left = _ref[0], right = _ref[1]; - style = this.style; - style.top = top + 'px'; - style.left = left; - return style.right = right; - }; - hoverend = function(e) { - if (e.type === 'keydown' && e.keyCode !== 13 || e.target.nodeName === "TEXTAREA") { - return; - } - $.rm(this.el); - $.off(this.root, this.endEvents, this.hoverend); - $.off(d, 'keydown', this.hoverend); - $.off(this.root, 'mousemove', this.hover); - $.off(doc, 'mousemove', this.workaround); - if (this.cb) { - return this.cb.call(this); - } - }; - return { - dialog: dialog, - Menu: Menu, - hover: hoverstart - }; - })(); - - Anonymize = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Anonymize']) { - return; - } - return Post.callbacks.push({ - name: 'Anonymize', - cb: this.node - }); - }, - node: function() { - var email, name, tripcode, _ref; - if (this.info.capcode || this.isClone) { - return; - } - _ref = this.nodes, name = _ref.name, tripcode = _ref.tripcode, email = _ref.email; - if (this.info.name !== 'Anonymous') { - name.textContent = 'Anonymous'; - } - if (tripcode) { - $.rm(tripcode); - delete this.nodes.tripcode; - } - if (this.info.email) { - $.replace(email, name); - return delete this.nodes.email; - } - } - }; - - Filter = { - filters: {}, - init: function() { - var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; - if (g.VIEW === 'catalog' || !Conf['Filter']) { - return; - } - if (!Conf['Filtered Backlinks']) { - $.addClass(doc, 'hide-backlinks'); - } - for (key in Config.filter) { - this.filters[key] = []; - _ref = Conf[key].split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - filter = _ref[_i]; - if (filter[0] === '#') { - continue; - } - if (!(regexp = filter.match(/\/(.+)\/(\w*)/))) { - continue; - } - filter = filter.replace(regexp[0], ''); - boards = ((_ref1 = filter.match(/boards:([^;]+)/)) != null ? _ref1[1].toLowerCase() : void 0) || 'global'; - if (boards !== 'global' && (_ref2 = g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) < 0)) { - continue; - } - if (key === 'uniqueID' || key === 'MD5') { - regexp = regexp[1]; - } else { - try { - regexp = RegExp(regexp[1], regexp[2]); - } catch (_error) { - err = _error; - new Notice('warning', err.message, 60); - continue; - } - } - op = ((_ref3 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref3[1] : void 0) || 'yes'; - stub = (function() { - var _ref4; - switch ((_ref4 = filter.match(/stub:(yes|no)/)) != null ? _ref4[1] : void 0) { - case 'yes': - return true; - case 'no': - return false; - default: - return Conf['Stubs']; - } - })(); - if (hl = /highlight/.test(filter)) { - hl = ((_ref4 = filter.match(/highlight:(\w+)/)) != null ? _ref4[1] : void 0) || 'filter-highlight'; - top = ((_ref5 = filter.match(/top:(yes|no)/)) != null ? _ref5[1] : void 0) || 'yes'; - top = top === 'yes'; - } - this.filters[key].push(this.createFilter(regexp, op, stub, hl, top)); - } - if (!this.filters[key].length) { - delete this.filters[key]; - } - } - if (!Object.keys(this.filters).length) { - return; - } - return Post.callbacks.push({ - name: 'Filter', - cb: this.node - }); - }, - createFilter: function(regexp, op, stub, hl, top) { - var settings, test; - test = typeof regexp === 'string' ? function(value) { - return regexp === value; - } : function(value) { - return regexp.test(value); - }; - settings = { - hide: !hl, - stub: stub, - "class": hl, - top: top - }; - return function(value, isReply) { - if (isReply && op === 'only' || !isReply && op === 'no') { - return false; - } - if (!test(value)) { - return false; - } - return settings; - }; - }, - node: function() { - var filter, key, result, value, _i, _len, _ref; - if (this.isClone) { - return; - } - for (key in Filter.filters) { - value = Filter[key](this); - if (value === false) { - continue; - } - _ref = Filter.filters[key]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - filter = _ref[_i]; - if (!(result = filter(value, this.isReply))) { - continue; - } - if (result.hide) { - if (this.isReply) { - PostHiding.hide(this, result.stub); - } else if (g.VIEW === 'index') { - ThreadHiding.hide(this.thread, result.stub); - } else { - continue; - } - return; - } - $.addClass(this.nodes.root, result["class"]); - if (!this.isReply && result.top) { - this.thread.isOnTop = true; - } - } - } - }, - name: function(post) { - if ('name' in post.info) { - return post.info.name; - } - return false; - }, - uniqueID: function(post) { - if ('uniqueID' in post.info) { - return post.info.uniqueID; - } - return false; - }, - tripcode: function(post) { - if ('tripcode' in post.info) { - return post.info.tripcode; - } - return false; - }, - capcode: function(post) { - if ('capcode' in post.info) { - return post.info.capcode; - } - return false; - }, - email: function(post) { - if ('email' in post.info) { - return post.info.email; - } - return false; - }, - subject: function(post) { - if ('subject' in post.info) { - return post.info.subject || false; - } - return false; - }, - comment: function(post) { - if ('comment' in post.info) { - return post.info.comment; - } - return false; - }, - flag: function(post) { - if ('flag' in post.info) { - return post.info.flag; - } - return false; - }, - filename: function(post) { - if (post.file) { - return post.file.name; - } - return false; - }, - dimensions: function(post) { - if (post.file && post.file.isImage) { - return post.file.dimensions; - } - return false; - }, - filesize: function(post) { - if (post.file) { - return post.file.size; - } - return false; - }, - MD5: function(post) { - if (post.file) { - return post.file.MD5; - } - return false; - }, - menu: { - init: function() { - var div, entry, type, _i, _len, _ref; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Filter']) { - return; - } - div = $.el('div', { - textContent: 'Filter' - }); - entry = { - type: 'post', - el: div, - order: 50, - open: function(post) { - Filter.menu.post = post; - return true; - }, - subEntries: [] - }; - _ref = [['Name', 'name'], ['Unique ID', 'uniqueID'], ['Tripcode', 'tripcode'], ['Capcode', 'capcode'], ['E-mail', 'email'], ['Subject', 'subject'], ['Comment', 'comment'], ['Flag', 'flag'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'MD5']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - entry.subEntries.push(Filter.menu.createSubEntry(type[0], type[1])); - } - return $.event('AddMenuEntry', entry); - }, - createSubEntry: function(text, type) { - var el; - el = $.el('a', { - href: 'javascript:;', - textContent: text - }); - el.dataset.type = type; - $.on(el, 'click', Filter.menu.makeFilter); - return { - el: el, - open: function(post) { - var value; - value = Filter[type](post); - return value !== false; - } - }; - }, - makeFilter: function() { - var re, type, value; - type = this.dataset.type; - value = Filter[type](Filter.menu.post); - re = type === 'uniqueID' || type === 'MD5' ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) { - if (c === '\n') { - return '\\n'; - } else if (c === '\\') { - return '\\\\'; - } else { - return "\\" + c; - } - }); - re = type === 'uniqueID' || type === 'MD5' ? "/" + re + "/" : "/^" + re + "$/"; - return $.get(type, Conf[type], function(item) { - var save, section, select, ta, tl; - save = item[type]; - save = save ? "" + save + "\n" + re : re; - $.set(type, save); - Settings.open('Filter'); - section = $('.section-container'); - select = $('select[name=filter]', section); - select.value = type; - Settings.selectFilter.call(select); - ta = $('textarea', section); - tl = ta.textLength; - ta.setSelectionRange(tl, tl); - return ta.focus(); - }); - } - } - }; - - PostHiding = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Reply Hiding Buttons'] && !Conf['Reply Hiding Link']) { - return; - } - if (Conf['Reply Hiding Buttons']) { - $.addClass(doc, "reply-hide"); - } - this.db = new DataBoard('hiddenPosts'); - return Post.callbacks.push({ - name: 'Reply Hiding', - cb: this.node - }); - }, - node: function() { - var data; - if (!this.isReply || this.isClone) { - return; - } - if (data = PostHiding.db.get({ - boardID: this.board.ID, - threadID: this.thread.ID, - postID: this.ID - })) { - if (data.thisPost) { - PostHiding.hide(this, data.makeStub, data.hideRecursively); - } else { - Recursive.apply(PostHiding.hide, this, data.makeStub, true); - Recursive.add(PostHiding.hide, this, data.makeStub, true); - } - } - if (!Conf['Reply Hiding Buttons']) { - return; - } - return $.replace($('.sideArrows', this.nodes.root), PostHiding.makeButton(this, 'hide')); - }, - menu: { - init: function() { - var apply, div, hideStubLink, makeStub, replies, thisPost; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Reply Hiding Link']) { - return; - } - div = $.el('div', { - className: 'hide-reply-link', - textContent: 'Hide reply' - }); - apply = $.el('a', { - textContent: 'Apply', - href: 'javascript:;' - }); - $.on(apply, 'click', PostHiding.menu.hide); - thisPost = $.el('label', { - innerHTML: ' This post' - }); - replies = $.el('label', { - innerHTML: " Hide replies" - }); - makeStub = $.el('label', { - innerHTML: " Make stub" - }); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(post) { - if (!post.isReply || post.isClone || post.isHidden) { - return false; - } - PostHiding.menu.post = post; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: thisPost - }, { - el: replies - }, { - el: makeStub - } - ] - }); - div = $.el('div', { - className: 'show-reply-link', - textContent: 'Show reply' - }); - apply = $.el('a', { - textContent: 'Apply', - href: 'javascript:;' - }); - $.on(apply, 'click', PostHiding.menu.show); - thisPost = $.el('label', { - innerHTML: ' This post' - }); - replies = $.el('label', { - innerHTML: " Show replies" - }); - hideStubLink = $.el('a', { - textContent: 'Hide stub', - href: 'javascript:;' - }); - $.on(hideStubLink, 'click', PostHiding.menu.hideStub); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(post) { - var data; - if (!post.isReply || post.isClone || !post.isHidden) { - return false; - } - if (!(data = PostHiding.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }))) { - return false; - } - PostHiding.menu.post = post; - thisPost.firstChild.checked = post.isHidden; - replies.firstChild.checked = (data != null ? data.hideRecursively : void 0) != null ? data.hideRecursively : Conf['Recursive Hiding']; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: thisPost - }, { - el: replies - } - ] - }); - return $.event('AddMenuEntry', { - type: 'post', - el: hideStubLink, - order: 15, - open: function(post) { - var data; - if (!post.isReply || post.isClone || !post.isHidden) { - return false; - } - if (!(data = PostHiding.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }))) { - return false; - } - return PostHiding.menu.post = post; - } - }); - }, - hide: function() { - var makeStub, parent, post, replies, thisPost; - parent = this.parentNode; - thisPost = $('input[name=thisPost]', parent).checked; - replies = $('input[name=replies]', parent).checked; - makeStub = $('input[name=makeStub]', parent).checked; - post = PostHiding.menu.post; - if (thisPost) { - PostHiding.hide(post, makeStub, replies); - } else if (replies) { - Recursive.apply(PostHiding.hide, post, makeStub, true); - Recursive.add(PostHiding.hide, post, makeStub, true); - } else { - return; - } - PostHiding.saveHiddenState(post, true, thisPost, makeStub, replies); - return $.event('CloseMenu'); - }, - show: function() { - var data, parent, post, replies, thisPost; - parent = this.parentNode; - thisPost = $('input[name=thisPost]', parent).checked; - replies = $('input[name=replies]', parent).checked; - post = PostHiding.menu.post; - if (thisPost) { - PostHiding.show(post, replies); - } else if (replies) { - Recursive.apply(PostHiding.show, post, true); - Recursive.rm(PostHiding.hide, post, true); - } else { - return; - } - if (data = PostHiding.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - })) { - PostHiding.saveHiddenState(post, !(thisPost && replies), !thisPost, data.makeStub, !replies); - } - return $.event('CloseMenu'); - }, - hideStub: function() { - var post; - post = PostHiding.menu.post; - post.nodes.root.hidden = true; - $.event('CloseMenu'); - } - }, - makeButton: function(post, type) { - var a, span; - span = $.el('span', { - className: "fa fa-" + (type === 'hide' ? 'minus' : 'plus') + "-square-o", - textContent: "" - }); - a = $.el('a', { - className: "" + type + "-reply-button", - href: 'javascript:;' - }); - $.add(a, span); - $.on(a, 'click', PostHiding.toggle); - return a; - }, - saveHiddenState: function(post, isHiding, thisPost, makeStub, hideRecursively) { - var data; - data = { - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }; - if (isHiding) { - data.val = { - thisPost: thisPost !== false, - makeStub: makeStub, - hideRecursively: hideRecursively - }; - return PostHiding.db.set(data); - } else { - return PostHiding.db["delete"](data); - } - }, - toggle: function() { - var post; - post = Get.postFromNode(this); - PostHiding[(post.isHidden ? 'show' : 'hide')](post); - return PostHiding.saveHiddenState(post, post.isHidden); - }, - hide: function(post, makeStub, hideRecursively) { - var a, postInfo, quotelink, _i, _len, _ref; - if (makeStub == null) { - makeStub = Conf['Stubs']; - } - if (hideRecursively == null) { - hideRecursively = Conf['Recursive Hiding']; - } - if (post.isHidden) { - return; - } - post.isHidden = true; - if (hideRecursively) { - Recursive.apply(PostHiding.hide, post, makeStub, true); - Recursive.add(PostHiding.hide, post, makeStub, true); - } - _ref = Get.allQuotelinksLinkingTo(post); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - $.addClass(quotelink, 'filtered'); - } - if (!makeStub) { - post.nodes.root.hidden = true; - return; - } - a = PostHiding.makeButton(post, 'show'); - postInfo = Conf['Anonymize'] ? 'Anonymous' : $('.nameBlock', post.nodes.info).textContent; - $.add(a, $.tn(" " + postInfo)); - post.nodes.stub = $.el('div', { - className: 'stub' - }); - $.add(post.nodes.stub, a); - if (Conf['Menu']) { - $.add(post.nodes.stub, Menu.makeButton()); - } - return $.prepend(post.nodes.root, post.nodes.stub); - }, - show: function(post, showRecursively) { - var quotelink, _i, _len, _ref; - if (showRecursively == null) { - showRecursively = Conf['Recursive Hiding']; - } - if (post.nodes.stub) { - $.rm(post.nodes.stub); - delete post.nodes.stub; - } else { - post.nodes.root.hidden = false; - } - post.isHidden = false; - if (showRecursively) { - Recursive.apply(PostHiding.show, post, true); - Recursive.rm(PostHiding.hide, post); - } - _ref = Get.allQuotelinksLinkingTo(post); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - $.rmClass(quotelink, 'filtered'); - } - } - }; - - Recursive = { - recursives: {}, - init: function() { - if (g.VIEW === 'catalog') { - return; - } - return Post.callbacks.push({ - name: 'Recursive', - cb: this.node - }); - }, - node: function() { - var i, obj, quote, recursive, _i, _j, _len, _len1, _ref, _ref1; - if (this.isClone) { - return; - } - _ref = this.quotes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - if (obj = Recursive.recursives[quote]) { - _ref1 = obj.recursives; - for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { - recursive = _ref1[i]; - recursive.apply(null, [this].concat(__slice.call(obj.args[i]))); - } - } - } - }, - add: function() { - var args, obj, post, recursive, _base, _name; - recursive = arguments[0], post = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - obj = (_base = Recursive.recursives)[_name = post.fullID] || (_base[_name] = { - recursives: [], - args: [] - }); - obj.recursives.push(recursive); - return obj.args.push(args); - }, - rm: function(recursive, post) { - var i, obj, rec, _i, _len, _ref; - if (!(obj = Recursive.recursives[post.fullID])) { - return; - } - _ref = obj.recursives; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - rec = _ref[i]; - if (rec === recursive) { - obj.recursives.splice(i, 1); - obj.args.splice(i, 1); - } - } - }, - apply: function() { - var args, fullID, post, recursive; - recursive = arguments[0], post = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - fullID = post.fullID; - return g.posts.forEach(function(post) { - if (__indexOf.call(post.quotes, fullID) >= 0) { - return recursive.apply(null, [post].concat(__slice.call(args))); - } - }); - } - }; - - ThreadHiding = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Thread Hiding Buttons'] && !Conf['Thread Hiding Link']) { - return; - } - this.db = new DataBoard('hiddenThreads'); - this.syncCatalog(); - $.on(d, 'IndexBuild', this.onIndexBuild); - return Thread.callbacks.push({ - name: 'Thread Hiding', - cb: this.node - }); - }, - node: function() { - var data; - if (data = ThreadHiding.db.get({ - boardID: this.board.ID, - threadID: this.ID - })) { - ThreadHiding.hide(this, data.makeStub); - } - if (!Conf['Thread Hiding Buttons']) { - return; - } - return $.prepend(this.OP.nodes.root, ThreadHiding.makeButton(this, 'hide')); - }, - onIndexBuild: function(_arg) { - var i, nodes, root, thread, _i, _len; - nodes = _arg.detail; - for (i = _i = 0, _len = nodes.length; _i < _len; i = _i += 2) { - root = nodes[i]; - thread = Get.threadFromRoot(root); - if (!thread.isHidden) { - continue; - } - if (!thread.stub) { - nodes[i + 1].hidden = true; - } else if (!root.contains(thread.stub)) { - ThreadHiding.makeStub(thread, root); - } - } - }, - syncCatalog: function() { - var hiddenThreads, hiddenThreadsOnCatalog, threadID; - hiddenThreads = ThreadHiding.db.get({ - boardID: g.BOARD.ID, - defaultValue: {} - }); - hiddenThreadsOnCatalog = JSON.parse(localStorage.getItem("4chan-hide-t-" + g.BOARD)) || {}; - for (threadID in hiddenThreadsOnCatalog) { - if (!(threadID in hiddenThreads)) { - hiddenThreads[threadID] = {}; - } - } - for (threadID in hiddenThreads) { - if (!(threadID in hiddenThreadsOnCatalog)) { - delete hiddenThreads[threadID]; - } - } - if ((ThreadHiding.db.data.lastChecked || 0) > Date.now() - $.MINUTE) { - ThreadHiding.cleanCatalog(hiddenThreadsOnCatalog); - } - return ThreadHiding.db.set({ - boardID: g.BOARD.ID, - val: hiddenThreads - }); - }, - cleanCatalog: function(hiddenThreadsOnCatalog) { - return $.cache("//a.4cdn.org/" + g.BOARD + "/threads.json", function() { - var page, thread, threads, _i, _j, _len, _len1, _ref, _ref1; - if (this.status !== 200) { - return; - } - threads = {}; - _ref = this.response; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - page = _ref[_i]; - _ref1 = page.threads; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - thread = _ref1[_j]; - if (thread.no in hiddenThreadsOnCatalog) { - threads[thread.no] = hiddenThreadsOnCatalog[thread.no]; - } - } - } - if (Object.keys(threads).length) { - return localStorage.setItem("4chan-hide-t-" + g.BOARD, JSON.stringify(threads)); - } else { - return localStorage.removeItem("4chan-hide-t-" + g.BOARD); - } - }); - }, - menu: { - init: function() { - var apply, div, hideStubLink, makeStub; - if (g.VIEW !== 'index' || !Conf['Menu'] || !Conf['Thread Hiding Link']) { - return; - } - div = $.el('div', { - className: 'hide-thread-link', - textContent: 'Hide thread' - }); - apply = $.el('a', { - textContent: 'Apply', - href: 'javascript:;' - }); - $.on(apply, 'click', ThreadHiding.menu.hide); - makeStub = $.el('label', { - innerHTML: " Make stub" - }); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(_arg) { - var isReply, thread; - thread = _arg.thread, isReply = _arg.isReply; - if (isReply || thread.isHidden) { - return false; - } - ThreadHiding.menu.thread = thread; - return true; - }, - subEntries: [ - { - el: apply - }, { - el: makeStub - } - ] - }); - div = $.el('a', { - className: 'show-thread-link', - textContent: 'Show thread', - href: 'javascript:;' - }); - $.on(div, 'click', ThreadHiding.menu.show); - $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 20, - open: function(_arg) { - var isReply, thread; - thread = _arg.thread, isReply = _arg.isReply; - if (isReply || !thread.isHidden) { - return false; - } - ThreadHiding.menu.thread = thread; - return true; - } - }); - hideStubLink = $.el('a', { - textContent: 'Hide stub', - href: 'javascript:;' - }); - $.on(hideStubLink, 'click', ThreadHiding.menu.hideStub); - return $.event('AddMenuEntry', { - type: 'post', - el: hideStubLink, - order: 15, - open: function(_arg) { - var isReply, thread; - thread = _arg.thread, isReply = _arg.isReply; - if (isReply || !thread.isHidden) { - return false; - } - return ThreadHiding.menu.thread = thread; - } - }); - }, - hide: function() { - var makeStub, thread; - makeStub = $('input', this.parentNode).checked; - thread = ThreadHiding.menu.thread; - ThreadHiding.hide(thread, makeStub); - ThreadHiding.saveHiddenState(thread, makeStub); - return $.event('CloseMenu'); - }, - show: function() { - var thread; - thread = ThreadHiding.menu.thread; - ThreadHiding.show(thread); - ThreadHiding.saveHiddenState(thread); - return $.event('CloseMenu'); - }, - hideStub: function() { - var thread; - thread = ThreadHiding.menu.thread; - ThreadHiding.hide(thread, false); - $.event('CloseMenu'); - } - }, - makeButton: function(thread, type) { - var a; - a = $.el('a', { - className: "" + type + "-thread-button", - innerHTML: "", - href: 'javascript:;' - }); - a.dataset.fullID = thread.fullID; - $.on(a, 'click', ThreadHiding.toggle); - return a; - }, - makeStub: function(thread, root) { - var a, numReplies, opInfo, summary; - numReplies = $$('.thread > .replyContainer', root).length; - if (summary = $('.summary', root)) { - numReplies += +summary.textContent.match(/\d+/); - } - opInfo = Conf['Anonymize'] ? 'Anonymous' : $('.nameBlock', thread.OP.nodes.info).textContent; - a = ThreadHiding.makeButton(thread, 'show'); - $.add(a, $.tn(" " + opInfo + " (" + (numReplies === 1 ? '1 reply' : "" + numReplies + " replies") + ")")); - thread.stub = $.el('div', { - className: 'stub' - }); - if (Conf['Menu']) { - $.add(thread.stub, [a, Menu.makeButton()]); - } else { - $.add(thread.stub, a); - } - return $.prepend(root, thread.stub); - }, - saveHiddenState: function(thread, makeStub) { - var hiddenThreadsOnCatalog; - hiddenThreadsOnCatalog = JSON.parse(localStorage.getItem("4chan-hide-t-" + g.BOARD)) || {}; - if (thread.isHidden) { - ThreadHiding.db.set({ - boardID: thread.board.ID, - threadID: thread.ID, - val: { - makeStub: makeStub - } - }); - hiddenThreadsOnCatalog[thread] = true; - } else { - ThreadHiding.db["delete"]({ - boardID: thread.board.ID, - threadID: thread.ID - }); - delete hiddenThreadsOnCatalog[thread]; - } - return localStorage.setItem("4chan-hide-t-" + g.BOARD, JSON.stringify(hiddenThreadsOnCatalog)); - }, - toggle: function(thread) { - if (!(thread instanceof Thread)) { - thread = g.threads[this.dataset.fullID]; - } - if (thread.isHidden) { - ThreadHiding.show(thread); - } else { - ThreadHiding.hide(thread); - } - return ThreadHiding.saveHiddenState(thread); - }, - hide: function(thread, makeStub) { - var threadRoot; - if (makeStub == null) { - makeStub = Conf['Stubs']; - } - if (thread.isHidden) { - return; - } - threadRoot = thread.OP.nodes.root.parentNode; - thread.isHidden = true; - if (!makeStub) { - return threadRoot.hidden = threadRoot.nextElementSibling.hidden = true; - } - return ThreadHiding.makeStub(thread, threadRoot); - }, - show: function(thread) { - var threadRoot; - if (thread.stub) { - $.rm(thread.stub); - delete thread.stub; - } - threadRoot = thread.OP.nodes.root.parentNode; - return threadRoot.nextElementSibling.hidden = threadRoot.hidden = thread.isHidden = false; - } - }; - - QuoteBacklink = { - containers: {}, - init: function() { - var format; - if (g.VIEW === 'catalog' || !Conf['Quote Backlinks']) { - return; - } - format = Conf['backlink'].replace(/%id/g, "' + id + '"); - this.funk = Function('id', "return '" + format + "'"); - Post.callbacks.push({ - name: 'Quote Backlinking Part 1', - cb: this.firstNode - }); - return Post.callbacks.push({ - name: 'Quote Backlinking Part 2', - cb: this.secondNode - }); - }, - firstNode: function() { - var a, clone, container, containers, link, nodes, post, quote, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - if (this.isClone || !this.quotes.length) { - return; - } - a = $.el('a', { - href: "/" + this.board + "/res/" + this.thread + "#p" + this, - className: this.isHidden ? 'filtered backlink' : 'backlink', - textContent: (QuoteBacklink.funk(this.ID)) + (Conf['Mark Quotes of You'] && this.info.yours ? '\u00A0(You)' : '') - }); - _ref = this.quotes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - containers = [QuoteBacklink.getContainer(quote)]; - if ((post = g.posts[quote]) && post.nodes.backlinkContainer) { - _ref1 = post.clones; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - clone = _ref1[_j]; - containers.push(clone.nodes.backlinkContainer); - } - } - for (_k = 0, _len2 = containers.length; _k < _len2; _k++) { - container = containers[_k]; - nodes = [$.tn(' '), link = a.cloneNode(true)]; - if (Conf['Quote Previewing']) { - $.on(link, 'mouseover', QuotePreview.mouseover); - } - if (Conf['Quote Inlining']) { - $.on(link, 'click', QuoteInline.toggle); - if (Conf['Quote Hash Navigation']) { - nodes.push(QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); - } - } - $.add(container, nodes); - } - } - }, - secondNode: function() { - var container; - if (this.isClone && (this.origin.isReply || Conf['OP Backlinks'])) { - this.nodes.backlinkContainer = $('.container', this.nodes.info); - return; - } - if (!(this.isReply || Conf['OP Backlinks'])) { - return; - } - container = QuoteBacklink.getContainer(this.fullID); - this.nodes.backlinkContainer = container; - return $.add(this.nodes.info, container); - }, - getContainer: function(id) { - var _base; - return (_base = this.containers)[id] || (_base[id] = $.el('span', { - className: 'container' - })); - } - }; - - QuoteCT = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Mark Cross-thread Quotes']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - this.text = '\u00A0(Cross-thread)'; - return Post.callbacks.push({ - name: 'Mark Cross-thread Quotes', - cb: this.node - }); - }, - node: function() { - var board, boardID, quotelink, thread, threadID, _i, _len, _ref, _ref1, _ref2; - if (this.isClone && this.thread === this.context.thread) { - return; - } - _ref = this.isClone ? this.context : this, board = _ref.board, thread = _ref.thread; - _ref1 = this.nodes.quotelinks; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - quotelink = _ref1[_i]; - _ref2 = Get.postDataFromLink(quotelink), boardID = _ref2.boardID, threadID = _ref2.threadID; - if (!threadID) { - continue; - } - if (this.isClone) { - quotelink.textContent = quotelink.textContent.replace(QuoteCT.text, ''); - } - if (boardID === board.ID && threadID !== thread.ID) { - $.add(quotelink, $.tn(QuoteCT.text)); - } - } - } - }; - - QuoteInline = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Quote Inlining']) { - return; - } - this.process = Conf['Quote Hash Navigation'] ? function(link, clone) { - if (!clone) { - $.after(link, QuoteInline.qiQuote(link, $.hasClass(link, 'filtered'))); - } - return $.on(link, 'click', QuoteInline.toggle); - } : function(link) { - return $.on(link, 'click', QuoteInline.toggle); - }; - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.callbacks.push({ - name: 'Quote Inlining', - cb: this.node - }); - }, - node: function() { - var isClone, link, process, _i, _j, _len, _len1, _ref, _ref1; - process = QuoteInline.process; - isClone = this.isClone; - _ref = this.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - process(link, isClone); - } - _ref1 = this.nodes.backlinks; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - link = _ref1[_j]; - process(link, isClone); - } - }, - qiQuote: function(link, hidden) { - return $.el('a', { - className: "hashlink" + (hidden ? ' filtered' : ''), - textContent: '#', - href: link.href - }); - }, - toggle: function(e) { - var boardID, context, postID, threadID, _ref; - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - _ref = Get.postDataFromLink(this), boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - context = Get.contextFromNode(this); - if ($.hasClass(this, 'inlined')) { - QuoteInline.rm(this, boardID, threadID, postID, context); - } else { - if ($.x("ancestor::div[@id='p" + postID + "']", this)) { - return; - } - QuoteInline.add(this, boardID, threadID, postID, context); - } - return this.classList.toggle('inlined'); - }, - findRoot: function(quotelink, isBacklink) { - if (isBacklink) { - return quotelink.parentNode.parentNode; - } else { - return $.x('ancestor-or-self::*[parent::blockquote][1]', quotelink); - } - }, - add: function(quotelink, boardID, threadID, postID, context) { - var inline, isBacklink, post, qroot, root; - isBacklink = $.hasClass(quotelink, 'backlink'); - inline = $.el('div', { - id: "i" + postID, - className: 'inline' - }); - root = QuoteInline.findRoot(quotelink, isBacklink); - $.after(root, inline); - qroot = $.x('ancestor::*[contains(@class,"postContainer")][1]', root); - $.addClass(qroot, 'hasInline'); - Get.postClone(boardID, threadID, postID, inline, context); - if (!((post = g.posts["" + boardID + "." + postID]) && context.thread === post.thread)) { - return; - } - if (isBacklink && Conf['Forward Hiding']) { - $.addClass(post.nodes.root, 'forwarded'); - post.forwarded++ || (post.forwarded = 1); - } - if (!Unread.posts) { - return; - } - return Unread.readSinglePost(post); - }, - rm: function(quotelink, boardID, threadID, postID, context) { - var el, inlined, isBacklink, post, qroot, root, _ref; - isBacklink = $.hasClass(quotelink, 'backlink'); - root = QuoteInline.findRoot(quotelink, isBacklink); - root = $.x("following-sibling::div[@id='i" + postID + "'][1]", root); - qroot = $.x('ancestor::*[contains(@class,"postContainer")][1]', root); - $.rm(root); - if (!$('.inline', qroot)) { - $.rmClass(qroot, 'hasInline'); - } - if (!(el = root.firstElementChild)) { - return; - } - post = g.posts["" + boardID + "." + postID]; - post.rmClone(el.dataset.clone); - if (Conf['Forward Hiding'] && isBacklink && context.thread === g.threads["" + boardID + "." + threadID] && !--post.forwarded) { - delete post.forwarded; - $.rmClass(post.nodes.root, 'forwarded'); - } - while (inlined = $('.inlined', el)) { - _ref = Get.postDataFromLink(inlined), boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - QuoteInline.rm(inlined, boardID, threadID, postID, context); - $.rmClass(inlined, 'inlined'); - } - } - }; - - QuoteOP = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Mark OP Quotes']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - this.text = '\u00A0(OP)'; - return Post.callbacks.push({ - name: 'Mark OP Quotes', - cb: this.node - }); - }, - node: function() { - var boardID, fullID, i, postID, quotelink, quotelinks, quotes, _ref, _ref1; - if (this.isClone && this.thread === this.context.thread) { - return; - } - if (!(quotes = this.quotes).length) { - return; - } - quotelinks = this.nodes.quotelinks; - if (this.isClone && (_ref = this.thread.fullID, __indexOf.call(quotes, _ref) >= 0)) { - i = 0; - while (quotelink = quotelinks[i++]) { - quotelink.textContent = quotelink.textContent.replace(QuoteOP.text, ''); - } - } - fullID = (this.isClone ? this.context : this).thread.fullID; - if (__indexOf.call(quotes, fullID) < 0) { - return; - } - i = 0; - while (quotelink = quotelinks[i++]) { - _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, postID = _ref1.postID; - if (("" + boardID + "." + postID) === fullID) { - $.add(quotelink, $.tn(QuoteOP.text)); - } - } - } - }; - - QuotePreview = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Quote Previewing']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.callbacks.push({ - name: 'Quote Previewing', - cb: this.node - }); - }, - node: function() { - var link, _i, _len, _ref; - _ref = this.nodes.quotelinks.concat(__slice.call(this.nodes.backlinks)); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - $.on(link, 'mouseover', QuotePreview.mouseover); - } - }, - mouseover: function(e) { - var boardID, clone, origin, post, postID, posts, qp, quote, quoterID, threadID, _i, _j, _len, _len1, _ref, _ref1; - if ($.hasClass(this, 'inlined')) { - return; - } - _ref = Get.postDataFromLink(this), boardID = _ref.boardID, threadID = _ref.threadID, postID = _ref.postID; - qp = $.el('div', { - id: 'qp', - className: 'dialog' - }); - $.add(Header.hover, qp); - Get.postClone(boardID, threadID, postID, qp, Get.contextFromNode(this)); - UI.hover({ - root: this, - el: qp, - latestEvent: e, - endEvents: 'mouseout click', - cb: QuotePreview.mouseout, - asapTest: function() { - return qp.firstElementChild; - } - }); - if (!(origin = g.posts["" + boardID + "." + postID])) { - return; - } - if (Conf['Quote Highlighting']) { - posts = [origin].concat(origin.clones); - posts.pop(); - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - $.addClass(post.nodes.post, 'qphl'); - } - } - quoterID = $.x('ancestor::*[@id][1]', this).id.match(/\d+$/)[0]; - clone = Get.postFromRoot(qp.firstChild); - _ref1 = clone.nodes.quotelinks.concat(__slice.call(clone.nodes.backlinks)); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - quote = _ref1[_j]; - if (quote.hash.slice(2) === quoterID) { - $.addClass(quote, 'forwardlink'); - } - } - }, - mouseout: function() { - var clone, post, root, _i, _len, _ref; - if (!(root = this.el.firstElementChild)) { - return; - } - clone = Get.postFromRoot(root); - post = clone.origin; - post.rmClone(root.dataset.clone); - if (!Conf['Quote Highlighting']) { - return; - } - _ref = [post].concat(post.clones); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post = _ref[_i]; - $.rmClass(post.nodes.post, 'qphl'); - } - } - }; - - QuoteStrikeThrough = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Reply Hiding Buttons'] && !Conf['Reply Hiding Link'] && !Conf['Filter']) { - return; - } - return Post.callbacks.push({ - name: 'Strike-through Quotes', - cb: this.node - }); - }, - node: function() { - var boardID, postID, quotelink, _i, _len, _ref, _ref1, _ref2; - if (this.isClone) { - return; - } - _ref = this.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - _ref1 = Get.postDataFromLink(quotelink), boardID = _ref1.boardID, postID = _ref1.postID; - if ((_ref2 = g.posts["" + boardID + "." + postID]) != null ? _ref2.isHidden : void 0) { - $.addClass(quotelink, 'filtered'); - } - } - } - }; - - /* - <3 aeosynth - */ - - - QuoteThreading = { - init: function() { - var input; - if (!(Conf['Quote Threading'] && g.VIEW === 'thread')) { - return; - } - this.enabled = true; - this.controls = $.el('span', { - innerHTML: '' - }); - input = $('input', this.controls); - $.on(input, 'change', this.toggle); - $.event('AddMenuEntry', this.entry = { - type: 'header', - el: this.controls, - order: 98 - }); - if (!Conf['Unread Count']) { - $.on(d, '4chanXInitFinished', this.ready); - } - return Post.callbacks.push({ - name: 'Quote Threading', - cb: this.node - }); - }, - disconnect: function() { - var input; - if (!(Conf['Quote Threading'] && g.VIEW === 'thread')) { - return; - } - input = $('input', this.controls); - $.off(input, 'change', this.toggle); - $.event('rmMenuEntry', this.entry); - delete this.enabled; - delete this.controls; - delete this.entry; - return Post.callbacks.disconnect('Quote Threading'); - }, - ready: function() { - $.off(d, '4chanXInitFinished', QuoteThreading.ready); - return QuoteThreading.force(); - }, - force: function() { - g.posts.forEach(function(post) { - if (post.cb) { - return post.cb(true); - } - }); - if (Conf['Unread Count'] && Unread.thread.OP.nodes.root.parentElement.parentElement) { - Unread.read(); - return Unread.update(); - } - }, - node: function() { - var keys, len, posts, quote, _i, _len, _ref; - posts = g.posts; - if (this.isClone || !QuoteThreading.enabled) { - return; - } - if (Conf['Unread Count']) { - Unread.posts.push(this); - } - if (this.thread.OP === this || this.isHidden) { - return; - } - keys = []; - len = g.BOARD.ID.length + 1; - _ref = this.quotes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quote = _ref[_i]; - if ((quote.slice(len) < this.ID) && quote in posts) { - keys.push(quote); - } - } - if (keys.length !== 1) { - return; - } - this.threaded = keys[0]; - return this.cb = QuoteThreading.nodeinsert; - }, - nodeinsert: function(force) { - var bottom, height, post, posts, root, threadContainer, top, _ref; - post = g.posts[this.threaded]; - if (this.thread.OP === post) { - return false; - } - posts = Unread.posts; - root = post.nodes.root; - if (!force) { - height = doc.clientHeight; - _ref = root.getBoundingClientRect(), bottom = _ref.bottom, top = _ref.top; - if (!((Conf['Unread Count'] && posts[post.ID]) || ((bottom < height) && (top > 0)))) { - return false; - } - } - if ($.hasClass(root, 'threadOP')) { - threadContainer = root.nextElementSibling; - post = Get.postFromRoot($.x('descendant::div[contains(@class,"postContainer")][last()]', threadContainer)); - $.add(threadContainer, this.nodes.root); - } else { - threadContainer = $.el('div', { - className: 'threadContainer' - }); - $.add(threadContainer, this.nodes.root); - $.after(root, threadContainer); - $.addClass(root, 'threadOP'); - } - if (!Conf['Unread Count']) { - return true; - } - if (post = posts[post.ID]) { - posts.after(post, posts[this.ID]); - } else { - posts.prepend(posts[this.ID]); - } - return true; - }, - toggle: function() { - var container, containers, nodes, post, posts, thread, _i, _j, _k, _len, _len1, _len2, _ref; - if (QuoteThreading.enabled = this.checked) { - QuoteThreading.force(); - } else { - thread = $('.thread'); - posts = []; - nodes = []; - g.posts.forEach(function(post) { - if (!(post === post.thread.OP || post.isClone)) { - return posts.push(post); - } - }); - posts.sort(function(a, b) { - return a.ID - b.ID; - }); - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - nodes.push(post.nodes.root); - } - $.add(thread, nodes); - containers = $$('.threadContainer', thread); - for (_j = 0, _len1 = containers.length; _j < _len1; _j++) { - container = containers[_j]; - $.rm(container); - } - _ref = $$('.threadOP'); - for (_k = 0, _len2 = _ref.length; _k < _len2; _k++) { - post = _ref[_k]; - $.rmClass(post, 'threadOP'); - } - } - }, - kb: function() { - var control; - control = $.id('threadingControl'); - control.checked = !control.checked; - return QuoteThreading.toggle.call(control); - } - }; - - QuoteYou = { - init: function() { - if (!(g.VIEW !== 'catalog' && Conf['Mark Quotes of You'] && Conf['Quick Reply'])) { - return; - } - if (Conf['Highlight Own Posts']) { - $.addClass(doc, 'highlight-own'); - } - if (Conf['Highlight Posts Quoting You']) { - $.addClass(doc, 'highlight-you'); - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - this.text = '\u00A0(You)'; - return Post.callbacks.push({ - name: 'Mark Quotes of You', - cb: this.node - }); - }, - node: function() { - var quotelink, _i, _len, _ref; - if (this.isClone) { - return; - } - if (QR.db.get({ - boardID: this.board.ID, - threadID: this.thread.ID, - postID: this.ID - })) { - $.addClass(this.nodes.root, 'yourPost'); - } - if (!this.quotes.length) { - return; - } - _ref = this.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - if (!(QR.db.get(Get.postDataFromLink(quotelink)))) { - continue; - } - $.add(quotelink, $.tn(QuoteYou.text)); - $.addClass(quotelink, 'you'); - $.addClass(this.nodes.root, 'quotesYou'); - } - }, - cb: { - seek: function(type) { - var highlight, post, posts, result, str; - if (!(Conf['Mark Quotes of You'] && Conf['Quick Reply'])) { - return; - } - if (highlight = $('.highlight')) { - $.rmClass(highlight, 'highlight'); - } - if (!QuoteYou.lastRead) { - if (!(post = QuoteYou.lastRead = $('.quotesYou'))) { - new Notice('warning', 'No posts are currently quoting you, loser.', 20); - return; - } - if (QuoteYou.cb.scroll(post)) { - return; - } - } else { - post = QuoteYou.lastRead; - } - str = "" + type + "::div[contains(@class,'quotesYou')]"; - while (post = (result = $.X(str, post)).snapshotItem(type === 'preceding' ? result.snapshotLength - 1 : 0)) { - if (QuoteYou.cb.scroll(post)) { - return; - } - } - posts = $$('.quotesYou'); - return QuoteYou.cb.scroll(posts[type === 'following' ? 0 : posts.length - 1]); - }, - scroll: function(post) { - if (Get.postFromRoot(post).isHidden) { - return false; - } else { - QuoteYou.lastRead = post; - window.location = "#" + post.id; - Header.scrollToPost(post); - $.addClass($('.post', post), 'highlight'); - return true; - } - } - } - }; - - Quotify = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Resurrect Quotes']) { - return; - } - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - return Post.callbacks.push({ - name: 'Resurrect Quotes', - cb: this.node - }); - }, - node: function() { - var deadlink, _i, _len, _ref; - _ref = $$('.deadlink', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - deadlink = _ref[_i]; - if (this.isClone) { - if ($.hasClass(deadlink, 'quotelink')) { - this.nodes.quotelinks.push(deadlink); - } - } else { - Quotify.parseDeadlink.call(this, deadlink); - } - } - }, - parseDeadlink: function(deadlink) { - var a, boardID, m, post, postID, quote, quoteID, redirect, _ref; - if ($.hasClass(deadlink.parentNode, 'prettyprint')) { - Quotify.fixDeadlink(deadlink); - return; - } - quote = deadlink.textContent; - if (!(postID = (_ref = quote.match(/\d+$/)) != null ? _ref[0] : void 0)) { - return; - } - if (postID[0] === '0') { - Quotify.fixDeadlink(deadlink); - return; - } - boardID = (m = quote.match(/^>>>\/([a-z\d]+)/)) ? m[1] : this.board.ID; - quoteID = "" + boardID + "." + postID; - if (post = g.posts[quoteID]) { - if (!post.isDead) { - a = $.el('a', { - href: "/" + boardID + "/res/" + post.thread + "#p" + postID, - className: 'quotelink', - textContent: quote - }); - } else { - a = $.el('a', { - href: "/" + boardID + "/res/" + post.thread + "#p" + postID, - className: 'quotelink deadlink', - target: '_blank', - textContent: "" + quote + "\u00A0(Dead)" - }); - $.extend(a.dataset, { - boardID: boardID, - threadID: post.thread.ID, - postID: postID - }); - } - } else if (redirect = Redirect.to('thread', { - boardID: boardID, - threadID: 0, - postID: postID - })) { - a = $.el('a', { - href: redirect, - className: 'deadlink', - target: '_blank', - textContent: "" + quote + "\u00A0(Dead)" - }); - if (Redirect.to('post', { - boardID: boardID, - postID: postID - })) { - $.addClass(a, 'quotelink'); - $.extend(a.dataset, { - boardID: boardID, - postID: postID - }); - } - } - if (__indexOf.call(this.quotes, quoteID) < 0) { - this.quotes.push(quoteID); - } - if (!a) { - return deadlink.textContent = "" + quote + "\u00A0(Dead)"; - } - $.replace(deadlink, a); - if ($.hasClass(a, 'quotelink')) { - return this.nodes.quotelinks.push(a); - } - }, - fixDeadlink: function(deadlink) { - var el, green; - if (!(el = deadlink.previousSibling) || el.nodeName === 'BR') { - green = $.el('span', { - className: 'quote' - }); - $.before(deadlink, green); - $.add(green, deadlink); - } - return $.replace(deadlink, __slice.call(deadlink.childNodes)); - } - }; - - QR = { - mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/x-shockwave-flash', ''], - init: function() { - var sc; - if (!Conf['Quick Reply']) { - return; - } - this.db = new DataBoard('yourPosts'); - this.posts = []; - if (Conf['QR Shortcut']) { - sc = $.el('a', { - className: "qr-shortcut fa fa-comment-o " + (!Conf['Persistent QR'] ? 'disabled' : ''), - textContent: 'QR', - title: 'Quick Reply', - href: 'javascript:;' - }); - $.on(sc, 'click', function() { - if (Conf['Persistent QR'] || !QR.nodes || QR.nodes.el.hidden) { - $.event('CloseMenu'); - QR.open(); - QR.nodes.com.focus(); - return $.rmClass(this, 'disabled'); - } else { - QR.close(); - return $.addClass(this, 'disabled'); - } - }); - Header.addShortcut(sc); - } - if (Conf['Hide Original Post Form']) { - $.asap((function() { - return doc; - }), function() { - return $.addClass(doc, 'hide-original-post-form'); - }); - } - $.ready(this.initReady); - if (Conf['Persistent QR']) { - if (!(g.BOARD.ID === 'f' && g.VIEW === 'index')) { - $.on(d, '4chanXInitFinished', this.persist); - } else { - $.ready(this.persist); - } - } - return Post.callbacks.push({ - name: 'Quick Reply', - cb: this.node - }); - }, - initReady: function() { - var link; - QR.postingIsEnabled = !!$.id('postForm'); - if (!QR.postingIsEnabled) { - return; - } - link = $.el('h1', { - innerHTML: "" + (g.VIEW === 'thread' ? 'Reply to Thread' : 'Start a Thread') + "", - className: "qr-link-container" - }); - QR.link = link.firstElementChild; - $.on(link.firstChild, 'click', function() { - $.event('CloseMenu'); - QR.open(); - QR.nodes.com.focus(); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }); - $.before($.id('postForm'), link); - $.on(d, 'QRGetSelectedPost', function(_arg) { - var cb; - cb = _arg.detail; - return cb(QR.selected); - }); - $.on(d, 'QRAddPreSubmitHook', function(_arg) { - var cb; - cb = _arg.detail; - return QR.preSubmitHooks.push(cb); - }); - $.on(d, 'dragover', QR.dragOver); - $.on(d, 'drop', QR.dropFile); - $.on(d, 'dragstart dragend', QR.drag); - return { - catalog: function() { - if (Conf["Persistent QR"]) { - QR.open(); - } - if (Conf['Auto Hide QR']) { - return QR.hide(); - } - }, - index: function() { - return $.on(d, 'IndexRefresh', QR.generatePostableThreadsList); - }, - thread: function() { - return $.on(d, 'ThreadUpdate', QR.statusCheck); - } - }[g.VIEW](); - }, - statusCheck: function() { - if (g.DEAD) { - return QR.abort(); - } else { - return QR.status(); - } - }, - node: function() { - return $.on($('a[title="Quote this post"]', this.nodes.info), 'click', QR.quote); - }, - persist: function() { - if (!QR.postingIsEnabled) { - return; - } - QR.open(); - if (Conf['Auto Hide QR'] || g.VIEW === 'catalog') { - return QR.hide(); - } - }, - open: function() { - var err; - if (QR.nodes) { - QR.nodes.el.hidden = false; - QR.unhide(); - return; - } - try { - return QR.dialog(); - } catch (_error) { - err = _error; - delete QR.nodes; - return Main.handleErrors({ - message: 'Quick Reply dialog creation crashed.', - error: err - }); - } - }, - close: function() { - var post, _i, _len, _ref; - if (QR.req) { - QR.abort(); - return; - } - QR.nodes.el.hidden = true; - QR.cleanNotifications(); - d.activeElement.blur(); - $.rmClass(QR.nodes.el, 'dump'); - if (!Conf['Captcha Warning Notifications']) { - if (QR.captcha.isEnabled) { - $.rmClass(QR.captcha.nodes.input, 'error'); - } - } - if (Conf['QR Shortcut']) { - $.toggleClass($('.qr-shortcut'), 'disabled'); - } - new QR.post(true); - _ref = QR.posts.splice(0, QR.posts.length - 1); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post = _ref[_i]; - post["delete"](); - } - QR.cooldown.auto = false; - return QR.status(); - }, - focusin: function() { - return $.addClass(QR.nodes.el, 'focus'); - }, - focusout: function() { - return $.rmClass(QR.nodes.el, 'focus'); - }, - hide: function() { - d.activeElement.blur(); - $.addClass(QR.nodes.el, 'autohide'); - return QR.nodes.autohide.checked = true; - }, - unhide: function() { - $.rmClass(QR.nodes.el, 'autohide'); - return QR.nodes.autohide.checked = false; - }, - toggleHide: function() { - if (this.checked) { - return QR.hide(); - } else { - return QR.unhide(); - } - }, - error: function(err) { - var el; - QR.open(); - if (typeof err === 'string') { - el = $.tn(err); - } else { - el = err; - el.removeAttribute('style'); - } - if (QR.captcha.isEnabled && /captcha|verification/i.test(el.textContent)) { - QR.captcha.nodes.input.focus(); - if (Conf['Captcha Warning Notifications'] && !d.hidden) { - QR.notify(el); - } else { - $.addClass(QR.captcha.nodes.input, 'error'); - $.on(QR.captcha.nodes.input, 'keydown', function() { - return $.rmClass(QR.captcha.nodes.input, 'error'); - }); - } - } else { - QR.notify(el); - } - if (d.hidden) { - return alert(el.textContent); - } - }, - notify: function(el) { - var notice, notif; - notice = new Notice('warning', el); - if (!(Header.areNotificationsEnabled && d.hidden)) { - return QR.notifications.push(notice); - } else { - notif = new Notification(el.textContent, { - body: el.textContent, - icon: Favicon.logo - }); - return notif.onclick = function() { - return window.focus(); - }; - } - }, - notifications: [], - cleanNotifications: function() { - var notification, _i, _len, _ref; - _ref = QR.notifications; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - notification = _ref[_i]; - notification.close(); - } - return QR.notifications = []; - }, - status: function() { - var disabled, status, thread, value; - if (!QR.nodes) { - return; - } - thread = QR.posts[0].thread; - if (thread !== 'new' && g.threads["" + g.BOARD + "." + thread].isDead) { - value = 404; - disabled = true; - QR.cooldown.auto = false; - } - value = QR.req ? QR.req.progress : QR.cooldown.seconds || value; - status = QR.nodes.status; - status.value = !value ? 'Submit' : QR.cooldown.auto ? "Auto " + value : value; - return status.disabled = disabled || false; - }, - quote: function(e) { - var caretPos, com, index, post, range, s, sel, text, thread, _ref; - if (e != null) { - e.preventDefault(); - } - if (!QR.postingIsEnabled) { - return; - } - sel = d.getSelection(); - post = Get.postFromNode(this); - text = ">>" + post + "\n"; - if ((s = sel.toString().trim()) && post === Get.postFromNode(sel.anchorNode)) { - s = s.replace(/\n/g, '\n>'); - text += ">" + s + "\n"; - } - QR.open(); - if (QR.selected.isLocked) { - index = QR.posts.indexOf(QR.selected); - (QR.posts[index + 1] || new QR.post()).select(); - $.addClass(QR.nodes.el, 'dump'); - QR.cooldown.auto = true; - } - _ref = QR.nodes, com = _ref.com, thread = _ref.thread; - if (!com.value) { - thread.value = Get.threadFromNode(this); - } - caretPos = com.selectionStart; - com.value = com.value.slice(0, caretPos) + text + com.value.slice(com.selectionEnd); - range = caretPos + text.length; - com.setSelectionRange(range, range); - com.focus(); - QR.selected.save(com); - QR.selected.save(thread); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }, - characterCount: function() { - var count, counter; - counter = QR.nodes.charCount; - count = QR.nodes.com.textLength; - counter.textContent = count; - counter.hidden = count < 1000; - return (count > 1500 ? $.addClass : $.rmClass)(counter, 'warning'); - }, - drag: function(e) { - var toggle; - toggle = e.type === 'dragstart' ? $.off : $.on; - toggle(d, 'dragover', QR.dragOver); - return toggle(d, 'drop', QR.dropFile); - }, - dragOver: function(e) { - e.preventDefault(); - return e.dataTransfer.dropEffect = 'copy'; - }, - dropFile: function(e) { - if (!e.dataTransfer.files.length) { - return; - } - e.preventDefault(); - QR.open(); - return QR.handleFiles(e.dataTransfer.files); - }, - paste: function(e) { - var blob, files, item, _i, _len, _ref; - files = []; - _ref = e.clipboardData.items; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - item = _ref[_i]; - if (!(item.kind === 'file')) { - continue; - } - blob = item.getAsFile(); - blob.name = 'file'; - if (blob.type) { - blob.name += '.' + blob.type.split('/')[1]; - } - files.push(blob); - } - if (!files.length) { - return; - } - QR.open(); - QR.handleFiles(files); - return $.addClass(QR.nodes.el, 'dump'); - }, - handleBlob: function(urlBlob, header, url) { - var blob, end, endnl, endsc, mime, name, name_end, name_start, start, _ref; - name = url.substr(url.lastIndexOf('/') + 1, url.length); - start = header.indexOf("Content-Type: ") + 14; - endsc = header.substr(start, header.length).indexOf(";"); - endnl = header.substr(start, header.length).indexOf("\n") - 1; - end = endnl; - if (endsc !== -1 && endsc < endnl) { - end = endsc; - } - mime = header.substr(start, end); - blob = new Blob([urlBlob], { - type: mime - }); - blob.name = url.substr(url.lastIndexOf('/') + 1, url.length); - name_start = header.indexOf('name="') + 6; - if (name_start - 6 !== -1) { - name_end = header.substr(name_start, header.length).indexOf('"'); - blob.name = header.substr(name_start, name_end); - } - if (blob.type === null) { - return QR.error("Unsupported file type."); - } - if (_ref = blob.type, __indexOf.call(QR.mimeTypes, _ref) < 0) { - return QR.error("Unsupported file type."); - } - return QR.handleFiles([blob]); - }, - handleUrl: function() { - var url; - url = prompt("Insert an url:"); - if (url === null) { - return; - } - GM_xmlhttpRequest({ - method: "GET", - url: url, - overrideMimeType: "text/plain; charset=x-user-defined", - onload: function(xhr) { - var data, i, r; - r = xhr.responseText; - data = new Uint8Array(r.length); - i = 0; - while (i < r.length) { - data[i] = r.charCodeAt(i); - i++; - } - QR.handleBlob(data, xhr.responseHeaders, url); - return; - return { - onerror: function(xhr) { - return QR.error("Can't load image."); - } - }; - } - }); - }, - handleFiles: function(files) { - var file, isSingle, max, _i, _len; - if (this !== QR) { - files = __slice.call(this.files); - this.value = null; - } - if (!files.length) { - return; - } - max = QR.nodes.fileInput.max; - isSingle = files.length === 1; - QR.cleanNotifications(); - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - QR.checkDimensions(file, isSingle, max); - } - if (!isSingle) { - return $.addClass(QR.nodes.el, 'dump'); - } - }, - checkDimensions: function(file, isSingle, max) { - var img, - _this = this; - img = new Image(); - img.onload = function() { - var height, width; - height = img.height, width = img.width; - if (height > QR.max_heigth || width > QR.max_heigth) { - return QR.error("" + file.name + ": Image too large (image: " + img.height + "x" + img.width + "px, max: " + QR.max_heigth + "x" + QR.max_width + "px)"); - } - if (height < QR.min_heigth || width < QR.min_heigth) { - return QR.error("" + file.name + ": Image too small (image: " + img.height + "x" + img.width + "px, min: " + QR.min_heigth + "x" + QR.min_width + "px)"); - } - return QR.handleFile(file, isSingle, max); - }; - return img.src = URL.createObjectURL(file); - }, - handleFile: function(file, isSingle, max) { - var post, _ref; - if (file.size > max) { - QR.error("" + file.name + ": File too large (file: " + ($.bytesToString(file.size)) + ", max: " + ($.bytesToString(max)) + ")."); - return; - } else if (_ref = file.type, __indexOf.call(QR.mimeTypes, _ref) < 0) { - if (!/^text/.test(file.type)) { - QR.error("" + file.name + ": Unsupported file type."); - return; - } - if (isSingle) { - post = QR.selected; - } else if ((post = QR.posts[QR.posts.length - 1]).com) { - post = new QR.post(); - } - post.pasteText(file); - return; - } - if (isSingle) { - post = QR.selected; - } else if ((post = QR.posts[QR.posts.length - 1]).file) { - post = new QR.post(); - } - return post.setFile(file); - }, - openFileInput: function(e) { - var _ref; - e.stopPropagation(); - if (e.shiftKey && e.type === 'click') { - return QR.selected.rmFile(); - } - if (e.ctrlKey && e.type === 'click') { - $.addClass(QR.nodes.filename, 'edit'); - QR.nodes.filename.focus(); - return $.on(QR.nodes.filename, 'blur', function() { - return $.rmClass(QR.nodes.filename, 'edit'); - }); - } - if (e.target.nodeName === 'INPUT' || (e.keyCode && ((_ref = e.keyCode) !== 32 && _ref !== 13)) || e.ctrlKey) { - return; - } - e.preventDefault(); - return QR.nodes.fileInput.click(); - }, - generatePostableThreadsList: function() { - var list, options, thread, val, _i, _len, _ref; - if (!QR.nodes) { - return; - } - list = QR.nodes.thread; - options = [list.firstChild]; - _ref = g.BOARD.threads.keys; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - thread = _ref[_i]; - options.push($.el('option', { - value: thread, - textContent: "Thread No." + thread - })); - } - val = list.value; - $.rmAll(list); - $.add(list, options); - list.value = val; - if (!list.value) { - return; - } - return list.value = g.VIEW === 'thread' ? g.THREADID : 'new'; - }, - dialog: function() { - var dialog, elm, event, i, items, key, max_heigth, max_width, min_heigth, min_width, name, node, nodes, rules, save, tmp_dim, value, _ref; - QR.nodes = nodes = { - el: dialog = UI.dialog('qr', 'top:0;right:0;', "
×
No selected file
") - }; - _ref = { - move: '.move', - autohide: '#autohide', - thread: 'select', - threadPar: '#qr-thread-select', - close: '.close', - form: 'form', - dumpButton: '#dump-button', - urlButton: '#url-button', - name: '[data-name=name]', - email: '[data-name=email]', - sub: '[data-name=sub]', - com: '[data-name=com]', - dumpList: '#dump-list', - addPost: '#add-post', - charCount: '#char-count', - fileSubmit: '#file-n-submit', - filename: '#qr-filename', - fileContainer: '#qr-filename-container', - fileRM: '#qr-filerm', - fileExtras: '#qr-extras-container', - spoiler: '#qr-file-spoiler', - spoilerPar: '#qr-spoiler-label', - status: '[type=submit]', - fileInput: '[type=file]' - }; - for (key in _ref) { - value = _ref[key]; - nodes[key] = $(value, dialog); - } - rules = $('ul.rules').textContent.trim(); - try { - tmp_dim = rules.match(/.+smaller than (\d+)x(\d+).+/); - min_width = tmp_dim[1]; - min_heigth = tmp_dim[2]; - } catch (_error) { - min_width = 1; - min_heigth = 1; - } - try { - tmp_dim = rules.match(/.+greater than (\d+)x(\d+).+/); - max_width = tmp_dim[1]; - max_heigth = tmp_dim[2]; - } catch (_error) { - QR.max_width = 5000; - QR.max_heigth = 5000; - } - nodes.fileInput.max = $('input[name=MAX_FILE_SIZE]').value; - QR.spoiler = !!$('input[name=spoiler]'); - if (QR.spoiler) { - $.addClass(QR.nodes.el, 'has-spoiler'); - } else { - nodes.spoiler.parentElement.hidden = true; - } - if (g.BOARD.ID === 'f') { - nodes.flashTag = $.el('select', { - name: 'filetag', - innerHTML: "\n\n\n\n\n\n" - }); - nodes.flashTag.dataset["default"] = '4'; - $.add(nodes.form, nodes.flashTag); - } - QR.flagsInput(); - $.on(nodes.filename.parentNode, 'click keydown', QR.openFileInput); - items = $$('*', QR.nodes.el); - i = 0; - while (elm = items[i++]) { - $.on(elm, 'blur', QR.focusout); - $.on(elm, 'focus', QR.focusin); - } - $.on(nodes.autohide, 'change', QR.toggleHide); - $.on(nodes.close, 'click', QR.close); - $.on(nodes.dumpButton, 'click', function() { - return nodes.el.classList.toggle('dump'); - }); - $.on(nodes.urlButton, 'click', QR.handleUrl); - $.on(nodes.addPost, 'click', function() { - return new QR.post(true); - }); - $.on(nodes.form, 'submit', QR.submit); - $.on(nodes.fileRM, 'click', function() { - return QR.selected.rmFile(); - }); - $.on(nodes.fileExtras, 'click', function(e) { - return e.stopPropagation(); - }); - $.on(nodes.spoiler, 'change', function() { - return QR.selected.nodes.spoiler.click(); - }); - $.on(nodes.fileInput, 'change', QR.handleFiles); - items = ['name', 'email', 'sub', 'com', 'filename', 'flag']; - i = 0; - save = function() { - return QR.selected.save(this); - }; - while (name = items[i++]) { - if (!(node = nodes[name])) { - continue; - } - event = node.nodeName === 'SELECT' ? 'change' : 'input'; - $.on(nodes[name], event, save); - } - if (Conf['Remember QR Size']) { - $.get('QR Size', '', function(item) { - return nodes.com.style.cssText = item['QR Size']; - }); - $.on(nodes.com, 'mouseup', function(e) { - if (e.button !== 0) { - return; - } - return $.set('QR Size', this.style.cssText); - }); - } - QR.generatePostableThreadsList(); - QR.persona.init(); - new QR.post(true); - QR.status(); - QR.cooldown.init(); - QR.captcha.init(); - $.add(d.body, dialog); - return $.event('QRDialogCreation', null, dialog); - }, - flags: function() { - var flag, fn, select, _i, _len, _ref; - fn = function(val) { - return $.el('option', { - value: val[0], - textContent: val[1] - }); - }; - select = $.el('select', { - name: 'flag', - className: 'flagSelector' - }); - _ref = [['0', 'None'], ['US', 'American'], ['KP', 'Best Korean'], ['BL', 'Black Nationalist'], ['CM', 'Communist'], ['CF', 'Confederate'], ['RE', 'Conservative'], ['EU', 'European'], ['GY', 'Gay'], ['PC', 'Hippie'], ['IL', 'Israeli'], ['DM', 'Liberal'], ['RP', 'Libertarian'], ['MF', 'Muslim'], ['NZ', 'Nazi'], ['OB', 'Obama'], ['PR', 'Pirate'], ['RB', 'Rebel'], ['TP', 'Tea Partier'], ['TX', 'Texan'], ['TR', 'Tree Hugger'], ['WP', 'White Supremacist']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - flag = _ref[_i]; - $.add(select, fn(flag)); - } - return select; - }, - flagsInput: function() { - var flag, nodes; - nodes = QR.nodes; - if (nodes.flagSelector) { - $.rm(nodes.flagSelector); - delete nodes.flagSelector; - } - if (g.BOARD.ID === 'pol') { - flag = QR.flags(); - flag.dataset.name = 'flag'; - flag.dataset["default"] = '0'; - nodes.flag = flag; - return $.add(nodes.form, flag); - } - }, - preSubmitHooks: [], - submit: function(e) { - var challenge, err, extra, filetag, formData, hook, options, post, response, textOnly, thread, threadID, _i, _len, _ref, _ref1; - if (e != null) { - e.preventDefault(); - } - if (QR.req) { - QR.abort(); - return; - } - if (QR.cooldown.seconds) { - QR.cooldown.auto = !QR.cooldown.auto; - QR.status(); - return; - } - post = QR.posts[0]; - post.forceSave(); - if (g.BOARD.ID === 'f') { - filetag = QR.nodes.flashTag.value; - } - threadID = post.thread; - thread = g.BOARD.threads[threadID]; - if (threadID === 'new') { - threadID = null; - if (g.BOARD.ID === 'vg' && !post.sub) { - err = 'New threads require a subject.'; - } else if (!(post.file || (textOnly = !!$('input[name=textonly]', $.id('postForm'))))) { - err = 'No file selected.'; - } - } else if (g.BOARD.threads[threadID].isClosed) { - err = 'You can\'t reply to this thread anymore.'; - } else if (!(post.com || post.file)) { - err = 'No file selected.'; - } else if (post.file && thread.fileLimit) { - err = 'Max limit of image replies has been reached.'; - } else { - _ref = QR.preSubmitHooks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - hook = _ref[_i]; - if (err = hook(post, thread)) { - break; - } - } - } - if (QR.captcha.isEnabled && !err) { - _ref1 = QR.captcha.getOne(), challenge = _ref1.challenge, response = _ref1.response; - if (!response) { - err = 'No valid captcha.'; - } - } - QR.cleanNotifications(); - if (err) { - QR.cooldown.auto = false; - QR.status(); - QR.error(err); - return; - } - QR.cooldown.auto = QR.posts.length > 1; - if (Conf['Auto Hide QR'] && !QR.cooldown.auto) { - QR.hide(); - } - if (!QR.cooldown.auto && $.x('ancestor::div[@id="qr"]', d.activeElement)) { - d.activeElement.blur(); - } - post.lock(); - formData = { - resto: threadID, - name: post.name, - email: post.email, - sub: post.sub, - com: post.com, - upfile: post.file, - filetag: filetag, - spoiler: post.spoiler, - flag: post.flag, - textonly: textOnly, - mode: 'regist', - pwd: QR.persona.pwd, - recaptcha_challenge_field: challenge, - recaptcha_response_field: response - }; - options = { - responseType: 'document', - withCredentials: true, - onload: QR.response, - onerror: function(err, url, line) { - delete QR.req; - post.unlock(); - QR.cooldown.auto = false; - QR.status(); - console.log(err); - console.log(url); - console.log(line); - return QR.error($.el('span', { - innerHTML: "4chan X encountered an error while posting. \n[Banned?] [More info]" - })); - } - }; - extra = { - form: $.formData(formData), - upCallbacks: { - onload: function() { - QR.req.isUploadFinished = true; - QR.req.uploadEndTime = Date.now(); - QR.req.progress = '...'; - return QR.status(); - }, - onprogress: function(e) { - QR.req.progress = "" + (Math.round(e.loaded / e.total * 100)) + "%"; - return QR.status(); - } - } - }; - QR.req = $.ajax("https://sys.4chan.org/" + g.BOARD + "/post", options, extra); - QR.req.uploadStartTime = Date.now(); - QR.req.progress = '...'; - return QR.status(); - }, - response: function() { - var URL, ban, board, captchasCount, err, h1, isReply, m, notif, post, postID, postsCount, req, resDoc, threadID, _, _ref, _ref1; - req = QR.req; - delete QR.req; - post = QR.posts[0]; - post.unlock(); - resDoc = req.response; - if (ban = $('.banType', resDoc)) { - board = $('.board', resDoc).innerHTML; - err = $.el('span', { - innerHTML: ban.textContent.toLowerCase() === 'banned' ? "You are banned on " + board + "! ;_;
\nClick here to see the reason." : "You were issued a warning on " + board + " as " + ($('.nameBlock', resDoc).innerHTML) + ".
\nReason: " + ($('.reason', resDoc).innerHTML) - }); - } else if (err = resDoc.getElementById('errmsg')) { - if ((_ref = $('a', err)) != null) { - _ref.target = '_blank'; - } - } else if (resDoc.title !== 'Post successful!') { - err = 'Connection error with sys.4chan.org.'; - } else if (req.status !== 200) { - err = "Error " + req.statusText + " (" + req.status + ")"; - } - if (err) { - if (/captcha|verification/i.test(err.textContent) || err === 'Connection error with sys.4chan.org.') { - if (/mistyped/i.test(err.textContent)) { - err = 'You seem to have mistyped the CAPTCHA.'; - } else if (/expired/i.test(err.textContent)) { - err = 'This CAPTCHA is no longer valid because it has expired.'; - } - QR.cooldown.auto = QR.captcha.isEnabled ? !!QR.captcha.captchas.length : err === 'Connection error with sys.4chan.org.' ? true : false; - QR.cooldown.set({ - delay: 2 - }); - } else if (err.textContent && (m = err.textContent.match(/wait\s+(\d+)\s+second/i))) { - QR.cooldown.auto = QR.captcha.isEnabled ? !!QR.captcha.captchas.length : true; - QR.cooldown.set({ - delay: m[1] - }); - } else { - QR.cooldown.auto = false; - } - QR.status(); - QR.error(err); - return; - } - h1 = $('h1', resDoc); - QR.cleanNotifications(); - if (Conf['Posting Success Notifications']) { - QR.notifications.push(new Notice('success', h1.textContent, 5)); - } - QR.persona.set(post); - _ref1 = h1.nextSibling.textContent.match(/thread:(\d+),no:(\d+)/), _ = _ref1[0], threadID = _ref1[1], postID = _ref1[2]; - postID = +postID; - threadID = +threadID || postID; - isReply = threadID !== postID; - QR.db.set({ - boardID: g.BOARD.ID, - threadID: threadID, - postID: postID, - val: true - }); - ThreadUpdater.postID = postID; - $.event('QRPostSuccessful', { - board: g.BOARD, - threadID: threadID, - postID: postID - }); - $.event('QRPostSuccessful_', { - threadID: threadID, - postID: postID - }); - postsCount = QR.posts.length - 1; - QR.cooldown.auto = postsCount && isReply; - if (QR.cooldown.auto && QR.captcha.isEnabled && (captchasCount = QR.captcha.captchas.length) < 3 && captchasCount < postsCount) { - notif = new Notification('Quick reply warning', { - body: "You are running low on cached captchas. Cache count: " + captchasCount + ".", - icon: Favicon.logo - }); - notif.onclick = function() { - QR.open(); - QR.captcha.nodes.input.focus(); - return window.focus(); - }; - notif.onshow = function() { - return setTimeout(function() { - return notif.close(); - }, 7 * $.SECOND); - }; - } - if (!(Conf['Persistent QR'] || QR.cooldown.auto)) { - QR.close(); - } else { - post.rm(); - } - QR.cooldown.set({ - req: req, - post: post, - isReply: isReply, - threadID: threadID - }); - URL = threadID === postID ? "/" + g.BOARD + "/res/" + threadID : g.VIEW === 'index' && !QR.cooldown.auto && Conf['Open Post in New Tab'] ? "/" + g.BOARD + "/res/" + threadID + "#p" + postID : void 0; - if (URL) { - if (Conf['Open Post in New Tab']) { - $.open(URL); - } else { - window.location = URL; - } - } - return QR.status(); - }, - abort: function() { - if (QR.req && !QR.req.isUploadFinished) { - QR.req.abort(); - delete QR.req; - QR.posts[0].unlock(); - QR.cooldown.auto = false; - QR.notifications.push(new Notice('info', 'QR upload aborted.', 5)); - } - return QR.status(); - } - }; - - QR.captcha = { - init: function() { - var container, imgContainer, input; - if (d.cookie.indexOf('pass_enabled=1') >= 0) { - return; - } - container = $.id('captchaContainer'); - if (!(this.isEnabled = !!container)) { - return; - } - if (Conf['Auto-load captcha']) { - $.globalEval('loadRecaptcha()'); - } - imgContainer = $.el('div', { - className: 'captcha-img', - title: 'Reload reCAPTCHA', - innerHTML: '', - hidden: true - }); - input = $.el('input', { - className: 'captcha-input field', - title: 'Verification', - placeholder: 'Focus to load reCAPTCHA', - autocomplete: 'off', - spellcheck: false, - tabIndex: 45 - }); - this.nodes = { - img: imgContainer.firstChild, - input: input - }; - $.on(input, 'focus', this.setup); - $.on(input, 'blur', QR.focusout); - $.on(input, 'focus', QR.focusin); - $.addClass(QR.nodes.el, 'has-captcha'); - $.after(QR.nodes.com.parentNode, [imgContainer, input]); - this.setupObserver = new MutationObserver(this.afterSetup); - this.setupObserver.observe(container, { - childList: true - }); - return this.afterSetup(); - }, - setup: function() { - return $.globalEval('loadRecaptcha()'); - }, - afterSetup: function() { - var challenge, img, input, setLifetime, _ref; - if (!(challenge = $.id('recaptcha_challenge_field_holder'))) { - return; - } - QR.captcha.setupObserver.disconnect(); - delete QR.captcha.setupObserver; - setLifetime = function(e) { - return QR.captcha.lifetime = e.detail; - }; - $.on(window, 'captcha:timeout', setLifetime); - $.globalEval('window.dispatchEvent(new CustomEvent("captcha:timeout", {detail: RecaptchaState.timeout}))'); - $.off(window, 'captcha:timeout', setLifetime); - _ref = QR.captcha.nodes, img = _ref.img, input = _ref.input; - img.parentNode.hidden = false; - $.off(input, 'focus', QR.captcha.setup); - $.on(input, 'keydown', QR.captcha.keydown.bind(QR.captcha)); - $.on(img.parentNode, 'click', QR.captcha.reload.bind(QR.captcha)); - $.get('captchas', [], function(_arg) { - var captchas; - captchas = _arg.captchas; - return QR.captcha.sync(captchas); - }); - $.sync('captchas', QR.captcha.sync); - QR.captcha.nodes.challenge = challenge; - new MutationObserver(QR.captcha.load.bind(QR.captcha)).observe(challenge, { - childList: true - }); - return QR.captcha.load(); - }, - sync: function(captchas) { - QR.captcha.captchas = captchas; - return QR.captcha.count(); - }, - getOne: function() { - var captcha, challenge, response; - this.clear(); - if (captcha = this.captchas.shift()) { - challenge = captcha.challenge, response = captcha.response; - this.count(); - $.set('captchas', this.captchas); - } else { - challenge = this.nodes.img.alt; - if (response = this.nodes.input.value) { - this.reload(); - } - } - if (response) { - response = response.trim(); - if (!/\s/.test(response)) { - response = "" + response + " " + response; - } - } - return { - challenge: challenge, - response: response - }; - }, - save: function() { - var response; - if (!(response = this.nodes.input.value.trim())) { - return; - } - this.captchas.push({ - challenge: this.nodes.img.alt, - response: response, - timeout: this.timeout - }); - this.count(); - this.reload(); - return $.set('captchas', this.captchas); - }, - clear: function() { - var captcha, i, now, _i, _len, _ref; - if (!this.captchas.length) { - return; - } - now = Date.now(); - _ref = this.captchas; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - captcha = _ref[i]; - if (captcha.timeout > now) { - break; - } - } - if (!i) { - return; - } - this.captchas = this.captchas.slice(i); - this.count(); - return $.set('captchas', this.captchas); - }, - load: function() { - var challenge; - if (!this.nodes.challenge.firstChild) { - return; - } - this.timeout = Date.now() + this.lifetime * $.SECOND - $.MINUTE; - challenge = this.nodes.challenge.firstChild.value; - this.nodes.img.alt = challenge; - this.nodes.img.src = "//www.google.com/recaptcha/api/image?c=" + challenge; - this.nodes.input.value = null; - return this.clear(); - }, - count: function() { - var count; - count = this.captchas ? this.captchas.length : 0; - this.nodes.input.placeholder = (function() { - switch (count) { - case 0: - return 'Verification (Shift + Enter to cache)'; - case 1: - return 'Verification (1 cached captcha)'; - default: - return "Verification (" + count + " cached captchas)"; - } - })(); - return this.nodes.input.alt = count; - }, - reload: function(focus) { - $.globalEval('Recaptcha.reload("t")'); - if (focus) { - return this.nodes.input.focus(); - } - }, - keydown: function(e) { - if (e.keyCode === 8 && !this.nodes.input.value) { - this.reload(); - } else if (e.keyCode === 13 && e.shiftKey) { - this.save(); - } else { - return; - } - return e.preventDefault(); - } - }; - - QR.cooldown = { - init: function() { - var key, setTimers, type, - _this = this; - if (!Conf['Cooldown']) { - return; - } - setTimers = function(e) { - return QR.cooldown.types = e.detail; - }; - $.on(window, 'cooldown:timers', setTimers); - $.globalEval('window.dispatchEvent(new CustomEvent("cooldown:timers", {detail: cooldowns}))'); - $.off(window, 'cooldown:timers', setTimers); - for (type in QR.cooldown.types) { - QR.cooldown.types[type] = +QR.cooldown.types[type]; - } - QR.cooldown.upSpd = 0; - QR.cooldown.upSpdAccuracy = .5; - key = "cooldown." + g.BOARD; - $.get(key, {}, function(item) { - QR.cooldown.cooldowns = item[key]; - return QR.cooldown.start(); - }); - return $.sync(key, QR.cooldown.sync); - }, - start: function() { - if (!Conf['Cooldown']) { - return; - } - if (QR.cooldown.isCounting) { - return; - } - QR.cooldown.isCounting = true; - return QR.cooldown.count(); - }, - sync: function(cooldowns) { - var id; - for (id in cooldowns) { - QR.cooldown.cooldowns[id] = cooldowns[id]; - } - return QR.cooldown.start(); - }, - set: function(data) { - var cooldown, delay, isReply, post, req, start, threadID, upSpd; - if (!Conf['Cooldown']) { - return; - } - req = data.req, post = data.post, isReply = data.isReply, threadID = data.threadID, delay = data.delay; - start = req ? req.uploadEndTime : Date.now(); - if (delay) { - cooldown = { - delay: delay - }; - } else { - if (post.file) { - upSpd = post.file.size / ((start - req.uploadStartTime) / $.SECOND); - QR.cooldown.upSpdAccuracy = ((upSpd > QR.cooldown.upSpd * .9) + QR.cooldown.upSpdAccuracy) / 2; - QR.cooldown.upSpd = upSpd; - } - cooldown = { - isReply: isReply, - threadID: threadID - }; - } - QR.cooldown.cooldowns[start] = cooldown; - $.set("cooldown." + g.BOARD, QR.cooldown.cooldowns); - return QR.cooldown.start(); - }, - unset: function(id) { - delete QR.cooldown.cooldowns[id]; - if (Object.keys(QR.cooldown.cooldowns).length) { - return $.set("cooldown." + g.BOARD, QR.cooldown.cooldowns); - } else { - return $["delete"]("cooldown." + g.BOARD); - } - }, - count: function() { - var cooldown, cooldowns, elapsed, hasFile, isReply, maxTimer, now, post, seconds, start, type, types, upSpd, upSpdAccuracy, update, _ref; - if (!Object.keys(QR.cooldown.cooldowns).length) { - $["delete"]("" + g.BOARD + ".cooldown"); - delete QR.cooldown.isCounting; - delete QR.cooldown.seconds; - QR.status(); - return; - } - clearTimeout(QR.cooldown.timeout); - QR.cooldown.timeout = setTimeout(QR.cooldown.count, $.SECOND); - now = Date.now(); - post = QR.posts[0]; - isReply = post.thread !== 'new'; - hasFile = !!post.file; - seconds = null; - _ref = QR.cooldown, types = _ref.types, cooldowns = _ref.cooldowns, upSpd = _ref.upSpd, upSpdAccuracy = _ref.upSpdAccuracy; - for (start in cooldowns) { - cooldown = cooldowns[start]; - if ('delay' in cooldown) { - if (cooldown.delay) { - seconds = Math.max(seconds, cooldown.delay--); - } else { - seconds = Math.max(seconds, 0); - QR.cooldown.unset(start); - } - continue; - } - if (isReply === cooldown.isReply) { - elapsed = Math.floor((now - start) / $.SECOND); - if (elapsed < 0) { - continue; - } - type = !isReply ? 'thread' : hasFile ? 'image' : 'reply'; - maxTimer = Math.max(types[type] || 0, types[type + '_intra'] || 0); - if (!((start <= now && now <= start + maxTimer * $.SECOND))) { - QR.cooldown.unset(start); - } - if (isReply && +post.thread === cooldown.threadID) { - type += '_intra'; - } - seconds = Math.max(seconds, types[type] - elapsed); - } - } - if (seconds && Conf['Cooldown Prediction'] && hasFile && upSpd) { - seconds -= Math.floor(post.file.size / upSpd * upSpdAccuracy); - seconds = seconds > 0 ? seconds : 0; - } - update = seconds !== null || !!QR.cooldown.seconds; - QR.cooldown.seconds = seconds; - if (update) { - QR.status(); - } - if (seconds === 0 && QR.cooldown.auto && !QR.req) { - return QR.submit(); - } - } - }; - - QR.persona = { - pwd: '', - always: {}, - init: function() { - QR.persona.getPassword(); - return $.get('QR.personas', Conf['QR.personas'], function(_arg) { - var arr, item, personas, type, types, _i, _len, _ref; - personas = _arg['QR.personas']; - types = { - name: [], - email: [], - sub: [] - }; - _ref = personas.split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - item = _ref[_i]; - QR.persona.parseItem(item.trim(), types); - } - for (type in types) { - arr = types[type]; - QR.persona.loadPersonas(type, arr); - } - }); - }, - parseItem: function(item, types) { - var boards, match, type, val, _ref, _ref1, _ref2; - if (item[0] === '#') { - return; - } - if (!(match = item.match(/(name|email|subject|password):"(.*)"/i))) { - return; - } - _ref = match, match = _ref[0], type = _ref[1], val = _ref[2]; - item = item.replace(match, ''); - boards = ((_ref1 = item.match(/boards:([^;]+)/i)) != null ? _ref1[1].toLowerCase() : void 0) || 'global'; - if (boards !== 'global' && (_ref2 = g.BOARD.ID, __indexOf.call(boards.split(','), _ref2) < 0)) { - return; - } - if (type === 'password') { - QR.persona.pwd = val; - return; - } - if (type === 'subject') { - type = 'sub'; - } - if (/always/i.test(item)) { - QR.persona.always[type] = val; - } - if (__indexOf.call(types[type], val) < 0) { - return types[type].push(val); - } - }, - loadPersonas: function(type, arr) { - var list, val, _i, _len; - list = $("#list-" + type, QR.nodes.el); - for (_i = 0, _len = arr.length; _i < _len; _i++) { - val = arr[_i]; - if (val) { - $.add(list, $.el('option', { - textContent: val - })); - } - } - }, - getPassword: function() { - var input, m; - if (!QR.persona.pwd) { - QR.persona.pwd = (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : (input = $.id('postPassword')) ? input.value : $.id('delPassword').value; - } - return QR.persona.pwd; - }, - get: function(cb) { - return $.get('QR.persona', {}, function(_arg) { - var persona; - persona = _arg['QR.persona']; - return cb(persona); - }); - }, - set: function(post) { - return $.get('QR.persona', {}, function(_arg) { - var persona; - persona = _arg['QR.persona']; - persona = { - name: post.name, - email: /^sage$/.test(post.email) ? persona.email : post.email, - sub: Conf['Remember Subject'] ? post.sub : void 0, - flag: post.flag - }; - return $.set('QR.persona', persona); - }); - } - }; - - QR.post = (function() { - function _Class(select) { - this.select = __bind(this.select, this); - var el, elm, event, prev, _i, _j, _len, _len1, _ref, _ref1, - _this = this; - el = $.el('a', { - className: 'qr-preview', - draggable: true, - href: 'javascript:;', - innerHTML: '' - }); - this.nodes = { - el: el, - rm: el.firstChild, - label: $('label', el), - spoiler: $('input', el), - span: el.lastChild - }; - _ref = $$('*', el); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - elm = _ref[_i]; - $.on(elm, 'blur', QR.focusout); - $.on(elm, 'focus', QR.focusin); - } - $.on(el, 'click', this.select); - $.on(this.nodes.rm, 'click', function(e) { - e.stopPropagation(); - return _this.rm(); - }); - $.on(this.nodes.label, 'click', function(e) { - return e.stopPropagation(); - }); - $.on(this.nodes.spoiler, 'change', function(e) { - _this.spoiler = e.target.checked; - if (_this === QR.selected) { - return QR.nodes.spoiler.checked = _this.spoiler; - } - }); - $.add(QR.nodes.dumpList, el); - _ref1 = ['dragStart', 'dragEnter', 'dragLeave', 'dragOver', 'dragEnd', 'drop']; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - event = _ref1[_j]; - $.on(el, event.toLowerCase(), this[event]); - } - this.thread = g.VIEW === 'thread' ? g.THREADID : 'new'; - prev = QR.posts[QR.posts.length - 1]; - QR.posts.push(this); - this.nodes.spoiler.checked = this.spoiler = prev && Conf['Remember Spoiler'] ? prev.spoiler : false; - QR.persona.get(function(persona) { - _this.name = 'name' in QR.persona.always ? QR.persona.always.name : prev ? prev.name : persona.name; - _this.email = 'email' in QR.persona.always ? QR.persona.always.email : prev && !/^sage$/.test(prev.email) ? prev.email : persona.email; - _this.sub = 'sub' in QR.persona.always ? QR.persona.always.sub : Conf['Remember Subject'] ? prev ? prev.sub : persona.sub : ''; - if (QR.nodes.flag) { - _this.flag = prev ? prev.flag : persona.flag; - } - if (QR.selected === _this) { - return _this.load(); - } - }); - if (select) { - this.select(); - } - this.unlock(); - } - - _Class.prototype.rm = function() { - var index; - this["delete"](); - index = QR.posts.indexOf(this); - if (QR.posts.length === 1) { - new QR.post(true); - $.rmClass(QR.nodes.el, 'dump'); - } else if (this === QR.selected) { - (QR.posts[index - 1] || QR.posts[index + 1]).select(); - } - QR.posts.splice(index, 1); - return QR.status(); - }; - - _Class.prototype["delete"] = function() { - $.rm(this.nodes.el); - return URL.revokeObjectURL(this.URL); - }; - - _Class.prototype.lock = function(lock) { - var name, node, _i, _len, _ref; - if (lock == null) { - lock = true; - } - this.isLocked = lock; - if (this !== QR.selected) { - return; - } - _ref = ['thread', 'name', 'email', 'sub', 'com', 'fileButton', 'filename', 'spoiler', 'flag']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - if (node = QR.nodes[name]) { - node.disabled = lock; - } - } - this.nodes.rm.style.visibility = lock ? 'hidden' : ''; - (lock ? $.off : $.on)(QR.nodes.filename.previousElementSibling, 'click', QR.openFileInput); - this.nodes.spoiler.disabled = lock; - return this.nodes.el.draggable = !lock; - }; - - _Class.prototype.unlock = function() { - return this.lock(false); - }; - - _Class.prototype.select = function() { - var rectEl, rectList; - if (QR.selected) { - QR.selected.nodes.el.id = null; - QR.selected.forceSave(); - } - QR.selected = this; - this.lock(this.isLocked); - this.nodes.el.id = 'selected'; - rectEl = this.nodes.el.getBoundingClientRect(); - rectList = this.nodes.el.parentNode.getBoundingClientRect(); - this.nodes.el.parentNode.scrollLeft += rectEl.left + rectEl.width / 2 - rectList.left - rectList.width / 2; - this.load(); - return $.event('QRPostSelection', this); - }; - - _Class.prototype.load = function() { - var name, node, _i, _len, _ref; - _ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'flag']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - if (!(node = QR.nodes[name])) { - continue; - } - node.value = this[name] || node.dataset["default"] || null; - } - this.showFileData(); - return QR.characterCount(); - }; - - _Class.prototype.save = function(input) { - var name, _ref; - if (input.type === 'checkbox') { - this.spoiler = input.checked; - return; - } - name = input.dataset.name; - this[name] = input.value || input.dataset["default"] || null; - switch (name) { - case 'thread': - return QR.status(); - case 'com': - this.nodes.span.textContent = this.com; - QR.characterCount(); - if (QR.cooldown.auto && this === QR.posts[0] && (0 < (_ref = QR.cooldown.seconds) && _ref <= 5)) { - return QR.cooldown.auto = false; - } - break; - case 'filename': - if (!this.file) { - return; - } - this.file.newName = this.filename.replace(/[/\\]/g, '-'); - if (!/\.(jpe?g|png|gif|pdf|swf)$/i.test(this.filename)) { - this.file.newName += '.jpg'; - } - return this.updateFilename(); - } - }; - - _Class.prototype.forceSave = function() { - var name, node, _i, _len, _ref; - if (this !== QR.selected) { - return; - } - _ref = ['thread', 'name', 'email', 'sub', 'com', 'filename', 'spoiler', 'flag']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - if (!(node = QR.nodes[name])) { - continue; - } - this.save(node); - } - }; - - _Class.prototype.setFile = function(file) { - this.file = file; - this.filename = file.name; - this.filesize = $.bytesToString(file.size); - if (QR.spoiler) { - this.nodes.label.hidden = false; - } - URL.revokeObjectURL(this.URL); - if (this === QR.selected) { - this.showFileData(); - } - if (!/^image/.test(file.type)) { - this.nodes.el.style.backgroundImage = null; - return; - } - return this.setThumbnail(); - }; - - _Class.prototype.setThumbnail = function() { - var fileURL, img, - _this = this; - img = $.el('img'); - img.onload = function() { - var cv, height, s, width; - s = 90 * 2 * window.devicePixelRatio; - if (_this.file.type === 'image/gif') { - s *= 3; - } - height = img.height, width = img.width; - if (height < s || width < s) { - _this.URL = fileURL; - _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - return; - } - if (height <= width) { - width = s / height * width; - height = s; - } else { - height = s / width * height; - width = s; - } - cv = $.el('canvas'); - cv.height = img.height = height; - cv.width = img.width = width; - cv.getContext('2d').drawImage(img, 0, 0, width, height); - URL.revokeObjectURL(fileURL); - return cv.toBlob(function(blob) { - _this.URL = URL.createObjectURL(blob); - return _this.nodes.el.style.backgroundImage = "url(" + _this.URL + ")"; - }); - }; - fileURL = URL.createObjectURL(this.file); - return img.src = fileURL; - }; - - _Class.prototype.rmFile = function() { - if (this.isLocked) { - return; - } - delete this.file; - delete this.filename; - delete this.filesize; - this.nodes.el.title = null; - QR.nodes.fileContainer.title = ''; - this.nodes.el.style.backgroundImage = null; - if (QR.spoiler) { - this.nodes.label.hidden = true; - } - this.showFileData(); - return URL.revokeObjectURL(this.URL); - }; - - _Class.prototype.updateFilename = function() { - var long; - long = "" + this.filename + " (" + this.filesize + ")\nCtrl+click to edit filename. Shift+click to clear."; - this.nodes.el.title = long; - if (this !== QR.selected) { - return; - } - return QR.nodes.fileContainer.title = long; - }; - - _Class.prototype.showFileData = function() { - if (this.file) { - this.updateFilename(); - QR.nodes.filename.value = this.filename; - QR.nodes.spoiler.checked = this.spoiler; - return $.addClass(QR.nodes.fileSubmit, 'has-file'); - } else { - return $.rmClass(QR.nodes.fileSubmit, 'has-file'); - } - }; - - _Class.prototype.pasteText = function(file) { - var reader, - _this = this; - reader = new FileReader(); - reader.onload = function(e) { - var text; - text = e.target.result; - if (_this.com) { - _this.com += "\n" + text; - } else { - _this.com = text; - } - if (QR.selected === _this) { - QR.nodes.com.value = _this.com; - } - return _this.nodes.span.textContent = _this.com; - }; - return reader.readAsText(file); - }; - - _Class.prototype.dragStart = function(e) { - e.dataTransfer.setDragImage(this, e.layerX, e.layerY); - return $.addClass(this, 'drag'); - }; - - _Class.prototype.dragEnd = function() { - return $.rmClass(this, 'drag'); - }; - - _Class.prototype.dragEnter = function() { - return $.addClass(this, 'over'); - }; - - _Class.prototype.dragLeave = function() { - return $.rmClass(this, 'over'); - }; - - _Class.prototype.dragOver = function(e) { - e.preventDefault(); - return e.dataTransfer.dropEffect = 'move'; - }; - - _Class.prototype.drop = function() { - var el, index, newIndex, oldIndex, post; - $.rmClass(this, 'over'); - if (!this.draggable) { - return; - } - el = $('.drag', this.parentNode); - index = function(el) { - return __slice.call(el.parentNode.children).indexOf(el); - }; - oldIndex = index(el); - newIndex = index(this); - (oldIndex < newIndex ? $.after : $.before)(this, el); - post = QR.posts.splice(oldIndex, 1)[0]; - QR.posts.splice(newIndex, 0, post); - return QR.status(); - }; - - return _Class; - - })(); - - AutoGIF = { - init: function() { - var _ref; - if (g.VIEW === 'catalog' || !Conf['Auto-GIF'] || ((_ref = g.BOARD.ID) === 'gif' || _ref === 'wsg')) { - return; - } - return Post.callbacks.push({ - name: 'Auto-GIF', - cb: this.node - }); - }, - node: function() { - var URL, gif, style, thumb, _ref, _ref1; - if (this.isClone || this.isHidden || this.thread.isHidden || !((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - _ref1 = this.file, thumb = _ref1.thumb, URL = _ref1.URL; - if (!(/gif$/.test(URL) && !/spoiler/.test(thumb.src))) { - return; - } - if (this.file.isSpoiler) { - style = thumb.style; - style.maxHeight = style.maxWidth = this.isReply ? '125px' : '250px'; - } - gif = $.el('img'); - $.on(gif, 'load', function() { - return thumb.src = URL; - }); - return gif.src = URL; - } - }; - - FappeTyme = { - init: function() { - var el, input, lc, type, _i, _len, _ref; - if (!(Conf['Fappe Tyme'] || Conf['Werk Tyme']) || g.VIEW === 'catalog' || g.BOARD === 'f') { - return; - } - _ref = ["Fappe", "Werk"]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - if (!Conf["" + type + " Tyme"]) { - continue; - } - lc = type.toLowerCase(); - el = $.el('label', { - innerHTML: " " + type + " Tyme", - title: "" + type + " Tyme" - }); - FappeTyme[lc] = input = el.firstElementChild; - $.on(input, 'change', FappeTyme.cb.toggle.bind(input)); - $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 97 - }); - if (Conf[lc]) { - FappeTyme.cb.set(lc); - } - } - return Post.callbacks.push({ - name: 'Fappe Tyme', - cb: this.node - }); - }, - node: function() { - if (this.file) { - return; - } - return $.addClass(this.nodes.root, "noFile"); - }, - cb: { - set: function(type) { - FappeTyme[type].checked = Conf[type]; - return $["" + (Conf[type] ? 'add' : 'rm') + "Class"](doc, "" + type + "Tyme"); - }, - toggle: function() { - Conf[this.name] = !Conf[this.name]; - FappeTyme.cb.set(this.name); - return $.cb.checked.call(FappeTyme[this.name]); - } - } - }; - - Gallery = { - init: function() { - var el; - if (g.VIEW === 'catalog' || g.BOARD === 'f' || !Conf['Gallery']) { - return; - } - el = $.el('a', { - href: 'javascript:;', - id: 'appchan-gal', - title: 'Gallery', - className: 'fa fa-picture-o', - textContent: 'Gallery' - }); - $.on(el, 'click', this.cb.toggle); - Header.addShortcut(el); - return Post.callbacks.push({ - name: 'Gallery', - cb: this.node - }); - }, - node: function() { - var _ref; - if (!((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - if (Gallery.nodes) { - Gallery.generateThumb($('.file', this.nodes.root)); - Gallery.nodes.total.textContent = Gallery.images.length; - } - if (!Conf['Image Expansion']) { - return $.on(this.file.thumb.parentNode, 'click', Gallery.cb.image); - } - }, - build: function(image) { - var cb, createSubEntry, dialog, el, file, files, i, key, menuButton, name, nodes, value, _ref; - Gallery.images = []; - nodes = Gallery.nodes = {}; - nodes.el = dialog = $.el('div', { - id: 'a-gallery', - innerHTML: "
\n \n \n ×\n \n \n / \n
\n
\n \n
\n
\n
\n
" - }); - _ref = { - frame: '.gal-image', - name: '.gal-name', - count: '.count', - total: '.total', - thumbs: '.gal-thumbnails', - next: '.gal-image a', - current: '.gal-image img' - }; - for (key in _ref) { - value = _ref[key]; - nodes[key] = $(value, dialog); - } - menuButton = $('.menu-button', dialog); - nodes.menu = new UI.Menu('gallery'); - cb = Gallery.cb; - $.on(nodes.frame, 'click', cb.blank); - $.on(nodes.current, 'click', cb.download); - $.on(nodes.next, 'click', cb.next); - $.on($('.gal-prev', dialog), 'click', cb.prev); - $.on($('.gal-next', dialog), 'click', cb.next); - $.on($('.gal-close', dialog), 'click', cb.close); - $.on(menuButton, 'click', function(e) { - return nodes.menu.toggle(e, this, g); - }); - createSubEntry = Gallery.menu.createSubEntry; - for (name in Config.gallery) { - el = createSubEntry(name).el; - $.event('AddMenuEntry', { - type: 'gallery', - el: el, - order: 0 - }); - } - $.on(d, 'keydown', cb.keybinds); - $.off(d, 'keydown', Keybinds.keydown); - i = 0; - files = $$('.post .file'); - while (file = files[i++]) { - if ($('.fileDeletedRes, .fileDeleted', file)) { - continue; - } - Gallery.generateThumb(file); - } - $.add(d.body, dialog); - nodes.thumbs.scrollTop = 0; - nodes.current.parentElement.scrollTop = 0; - Gallery.cb.open.call(image ? $("[href='" + (image.href.replace(/https?:/, '')) + "']", nodes.thumbs) : Gallery.images[0]); - d.body.style.overflow = 'hidden'; - return nodes.total.textContent = --i; - }, - generateThumb: function(file) { - var double, post, thumb, title; - post = Get.postFromNode(file); - title = ($('.fileText a', file)).textContent; - thumb = post.file.thumb.parentNode.cloneNode(true); - if (double = $('img + img', thumb)) { - $.rm(double); - } - thumb.className = 'gal-thumb'; - thumb.title = title; - thumb.dataset.id = Gallery.images.length; - thumb.dataset.post = $('a[title="Highlight this post"]', post.nodes.info).href; - thumb.firstElementChild.style.cssText = ''; - $.on(thumb, 'click', Gallery.cb.open); - Gallery.images.push(thumb); - return $.add(Gallery.nodes.thumbs, thumb); - }, - cb: { - keybinds: function(e) { - var cb, key; - if (!(key = Keybinds.keyCode(e))) { - return; - } - cb = (function() { - switch (key) { - case 'Esc': - case Conf['Open Gallery']: - return Gallery.cb.close; - case 'Right': - case 'Enter': - return Gallery.cb.next; - case 'Left': - case '': - return Gallery.cb.prev; - } - })(); - if (!cb) { - return; - } - e.stopPropagation(); - e.preventDefault(); - return cb(); - }, - open: function(e) { - var el, img, name, nodes, rect, top; - if (e) { - e.preventDefault(); - } - if (!this) { - return; - } - nodes = Gallery.nodes; - name = nodes.name; - if (el = $('.gal-highlight', Gallery.thumbs)) { - $.rmClass(el, 'gal-highlight'); - } - $.addClass(this, 'gal-highlight'); - img = $.el('img', { - src: name.href = this.href, - title: name.download = name.textContent = this.title - }); - $.extend(img.dataset, this.dataset); - $.replace(nodes.current, img); - nodes.count.textContent = +this.dataset.id + 1; - nodes.current = img; - nodes.frame.scrollTop = 0; - nodes.next.focus(); - rect = this.getBoundingClientRect(); - top = rect.top; - if (top > 0) { - top += rect.height - doc.clientHeight; - if (top < 0) { - return; - } - } - nodes.thumbs.scrollTop += top; - return $.on(img, 'error', function() { - return Gallery.cb.error(img, thumb); - }); - }, - image: function(e) { - e.preventDefault(); - e.stopPropagation(); - return Gallery.build(this); - }, - error: function(img, thumb) { - var URL, post, revived, src; - post = Get.postFromLink($.el('a', { - href: img.dataset.post - })); - delete post.file.fullImage; - src = this.src.split('/'); - if (src[2] === 'images.4chan.org') { - URL = Redirect.to('file', { - boardID: src[3], - filename: src[5] - }); - if (URL) { - thumb.href = URL; - if (Gallery.nodes.current !== img) { - return; - } - revived = $.el('img', { - src: URL, - title: img.title - }); - $.extend(revived.dataset, img.dataset); - $.replace(img, revived); - return; - } - if (g.DEAD || post.isDead || post.file.isDead) { - return; - } - } - return $.ajax("//api.4chan.org/" + post.board + "/res/" + post.thread + ".json", { - onload: function() { - var i, postObj, posts; - if (this.status !== 200) { - return; - } - i = 0; - posts = this.response.posts; - while (postObj = posts[i++]) { - if (postObj.no === post.ID) { - break; - } - } - if (!postObj.no) { - return post.kill(); - } - if (postObj.filedeleted) { - return post.kill(true); - } - } - }); - }, - prev: function() { - return Gallery.cb.open.call(Gallery.images[+Gallery.nodes.current.dataset.id - 1]); - }, - next: function() { - return Gallery.cb.open.call(Gallery.images[+Gallery.nodes.current.dataset.id + 1]); - }, - toggle: function() { - return (Gallery.nodes ? Gallery.cb.close : Gallery.build)(); - }, - blank: function(e) { - if (e.target === this) { - return Gallery.cb.close(); - } - }, - close: function() { - $.rm(Gallery.nodes.el); - delete Gallery.nodes; - d.body.style.overflow = ''; - $.off(d, 'keydown', Gallery.cb.keybinds); - return $.on(d, 'keydown', Keybinds.keydown); - }, - setFitness: function() { - return (this.checked ? $.addClass : $.rmClass)(doc, "gal-" + (this.name.toLowerCase().replace(/\s+/g, '-'))); - } - }, - menu: { - init: function() { - var createSubEntry, el, name, subEntries; - if (g.VIEW === 'catalog' || !Conf['Gallery']) { - return; - } - el = $.el('span', { - textContent: 'Gallery', - className: 'gallery-link' - }); - createSubEntry = Gallery.menu.createSubEntry; - subEntries = []; - for (name in Config.gallery) { - subEntries.push(createSubEntry(name)); - } - return $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 105, - subEntries: subEntries - }); - }, - createSubEntry: function(name) { - var input, label; - label = $.el('label', { - innerHTML: " " + name - }); - input = label.firstElementChild; - if (name === 'Fit Width' || name === 'Fit Height' || name === 'Hide Thumbnails') { - $.on(input, 'change', Gallery.cb.setFitness); - } - input.checked = Conf[name]; - $.event('change', null, input); - $.on(input, 'change', $.cb.checked); - return { - el: label - }; - } - } - }; - - ImageExpand = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { - return; - } - this.EAI = $.el('a', { - className: 'expand-all-shortcut fa fa-expand', - textContent: 'EAI', - title: 'Expand All Images', - href: 'javascript:;' - }); - $.on(this.EAI, 'click', ImageExpand.cb.toggleAll); - Header.addShortcut(this.EAI, 3); - return Post.callbacks.push({ - name: 'Image Expansion', - cb: this.node - }); - }, - node: function() { - var thumb, _ref; - if (!((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - thumb = this.file.thumb; - $.on(thumb.parentNode, 'click', ImageExpand.cb.toggle); - if (this.isClone && $.hasClass(thumb, 'expanding')) { - ImageExpand.contract(this); - ImageExpand.expand(this); - return; - } - if (ImageExpand.on && !this.isHidden && (Conf['Expand spoilers'] || !this.file.isSpoiler)) { - return ImageExpand.expand(this); - } - }, - cb: { - toggle: function(e) { - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - return ImageExpand.toggle(Get.postFromNode(this)); - }, - toggleAll: function() { - var func, toggle; - $.event('CloseMenu'); - toggle = function(post) { - var file; - file = post.file; - if (!(file && file.isImage && doc.contains(post.nodes.root))) { - return; - } - if (ImageExpand.on && (!Conf['Expand spoilers'] && file.isSpoiler || Conf['Expand from here'] && Header.getTopOf(file.thumb) < 0)) { - return; - } - return $.queueTask(func, post); - }; - if (ImageExpand.on = $.hasClass(ImageExpand.EAI, 'expand-all-shortcut')) { - ImageExpand.EAI.className = 'contract-all-shortcut fa fa-compress'; - ImageExpand.EAI.title = 'Contract All Images'; - func = ImageExpand.expand; - } else { - ImageExpand.EAI.className = 'expand-all-shortcut fa fa-expand'; - ImageExpand.EAI.title = 'Expand All Images'; - func = ImageExpand.contract; - } - return g.posts.forEach(function(post) { - var _i, _len, _ref; - toggle(post); - _ref = post.clones; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - post = _ref[_i]; - toggle(post); - } - }); - }, - setFitness: function() { - return (this.checked ? $.addClass : $.rmClass)(doc, this.name.toLowerCase().replace(/\s+/g, '-')); - } - }, - toggle: function(post) { - var headRect, left, root, thumb, top, x, y, _ref; - thumb = post.file.thumb; - if (!(post.file.isExpanded || $.hasClass(thumb, 'expanding'))) { - ImageExpand.expand(post); - return; - } - root = post.nodes.root; - _ref = (Conf['Advance on contract'] ? (function() { - var next; - next = root; - while (next = $.x("following::div[contains(@class,'postContainer')][1]", next)) { - if ($('.stub', next) || next.offsetHeight === 0) { - continue; - } - return next; - } - return root; - })() : root).getBoundingClientRect(), top = _ref.top, left = _ref.left; - if (top < 0) { - y = top; - if (Conf['Fixed Header'] && !Conf['Bottom Header']) { - headRect = Header.bar.getBoundingClientRect(); - y -= headRect.top + headRect.height; - } - } - if (left < 0) { - x = -window.scrollX; - } - if (x || y) { - window.scrollBy(x, y); - } - return ImageExpand.contract(post); - }, - contract: function(post) { - $.rmClass(post.nodes.root, 'expanded-image'); - $.rmClass(post.file.thumb, 'expanding'); - return post.file.isExpanded = false; - }, - expand: function(post, src) { - var img, thumb; - thumb = post.file.thumb; - if (post.isHidden || post.file.isExpanded || $.hasClass(thumb, 'expanding')) { - return; - } - $.addClass(thumb, 'expanding'); - if (post.file.fullImage) { - $.asap((function() { - return post.file.fullImage.naturalHeight; - }), function() { - return ImageExpand.completeExpand(post); - }); - return; - } - post.file.fullImage = img = $.el('img', { - className: 'full-image', - src: src || post.file.URL - }); - $.on(img, 'error', ImageExpand.error); - $.asap((function() { - return post.file.fullImage.naturalHeight; - }), function() { - return ImageExpand.completeExpand(post); - }); - return $.after(thumb, img); - }, - completeExpand: function(post) { - var bottom, thumb; - thumb = post.file.thumb; - if (!$.hasClass(thumb, 'expanding')) { - return; - } - post.file.isExpanded = true; - if (!post.nodes.root.parentNode) { - $.addClass(post.nodes.root, 'expanded-image'); - $.rmClass(post.file.thumb, 'expanding'); - return; - } - bottom = post.nodes.root.getBoundingClientRect().bottom; - return $.queueTask(function() { - $.addClass(post.nodes.root, 'expanded-image'); - $.rmClass(post.file.thumb, 'expanding'); - if (!(bottom <= 0)) { - return; - } - return window.scrollBy(0, post.nodes.root.getBoundingClientRect().bottom - bottom); - }); - }, - error: function() { - var URL, post, src, timeoutID; - post = Get.postFromNode(this); - $.rm(this); - delete post.file.fullImage; - if (!($.hasClass(post.file.thumb, 'expanding') || $.hasClass(post.nodes.root, 'expanded-image'))) { - return; - } - ImageExpand.contract(post); - src = this.src.split('/'); - if (src[2] === 'i.4cdn.org') { - URL = Redirect.to('file', { - boardID: src[3], - filename: src[5] - }); - if (URL) { - setTimeout(ImageExpand.expand, 10000, post, URL); - return; - } - if (g.DEAD || post.isDead || post.file.isDead) { - return; - } - } - timeoutID = setTimeout(ImageExpand.expand, 10000, post); - return $.ajax("//a.4cdn.org/" + post.board + "/res/" + post.thread + ".json", { - onload: function() { - var postObj, _i, _len, _ref; - if (this.status !== 200) { - return; - } - _ref = this.response.posts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - postObj = _ref[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - clearTimeout(timeoutID); - return post.kill(); - } else if (postObj.filedeleted) { - clearTimeout(timeoutID); - return post.kill(true); - } - } - }); - }, - menu: { - init: function() { - var conf, createSubEntry, el, name, subEntries, _ref; - if (g.VIEW === 'catalog' || !Conf['Image Expansion']) { - return; - } - el = $.el('span', { - textContent: 'Image Expansion', - className: 'image-expansion-link' - }); - createSubEntry = ImageExpand.menu.createSubEntry; - subEntries = []; - _ref = Config.imageExpansion; - for (name in _ref) { - conf = _ref[name]; - subEntries.push(createSubEntry(name, conf[1])); - } - return $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 105, - subEntries: subEntries - }); - }, - createSubEntry: function(name, desc) { - var input, label; - label = $.el('label', { - innerHTML: " " + name, - title: desc - }); - input = label.firstElementChild; - if (name === 'Fit width' || name === 'Fit height') { - $.on(input, 'change', ImageExpand.cb.setFitness); - } - input.checked = Conf[name]; - $.event('change', null, input); - $.on(input, 'change', $.cb.checked); - return { - el: label - }; - } - } - }; - - ImageHover = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Image Hover']) { - return; - } - return Post.callbacks.push({ - name: 'Image Hover', - cb: this.node - }); - }, - node: function() { - var _ref; - if (!((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - return $.on(this.file.thumb, 'mouseover', ImageHover.mouseover); - }, - mouseover: function(e) { - var el, post; - post = Get.postFromNode(this); - el = $.el('img', { - id: 'ihover', - src: post.file.URL - }); - el.dataset.fullID = post.fullID; - $.add(Header.hover, el); - UI.hover({ - root: this, - el: el, - latestEvent: e, - endEvents: 'mouseout click', - asapTest: function() { - return el.naturalHeight; - } - }); - return $.on(el, 'error', ImageHover.error); - }, - error: function() { - var URL, post, src, timeoutID, - _this = this; - if (!doc.contains(this)) { - return; - } - post = g.posts[this.dataset.fullID]; - src = this.src.split('/'); - if (src[2] === 'i.4cdn.org') { - URL = Redirect.to('file', { - boardID: src[3], - filename: src[5].replace(/\?.+$/, '') - }); - if (URL) { - this.src = URL; - return; - } - if (g.DEAD || post.isDead || post.file.isDead) { - return; - } - } - timeoutID = setTimeout((function() { - return _this.src = post.file.URL + '?' + Date.now(); - }), 3000); - return $.ajax("//a.4cdn.org/" + post.board + "/res/" + post.thread + ".json", { - onload: function() { - var postObj, _i, _len, _ref; - if (this.status !== 200) { - return; - } - _ref = this.response.posts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - postObj = _ref[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - clearTimeout(timeoutID); - return post.kill(); - } else if (postObj.filedeleted) { - clearTimeout(timeoutID); - return post.kill(true); - } - } - }); - } - }; - - ImageLoader = { - init: function() { - var prefetch; - if (g.VIEW === 'catalog') { - return; - } - if (!(Conf["Image Prefetching"] || Conf["Replace JPG"] || Conf["Replace PNG"] || Conf["Replace GIF"])) { - return; - } - Post.callbacks.push({ - name: 'Image Replace', - cb: this.node - }); - Thread.callbacks.push({ - name: 'Image Replace', - cb: this.thread - }); - if (!(Conf['Image Prefetching'] && g.VIEW === 'thread')) { - return; - } - prefetch = $.el('label', { - innerHTML: ' Prefetch Images' - }); - this.el = prefetch.firstElementChild; - $.on(this.el, 'change', this.toggle); - return $.event('AddMenuEntry', { - type: 'header', - el: prefetch, - order: 104 - }); - }, - thread: function() { - return ImageLoader.thread = this; - }, - node: function() { - var URL, img, string, style, thumb, type, _ref, _ref1; - if (this.isClone || this.isHidden || this.thread.isHidden || !((_ref = this.file) != null ? _ref.isImage : void 0)) { - return; - } - _ref1 = this.file, thumb = _ref1.thumb, URL = _ref1.URL; - if (!((Conf[string = "Replace " + ((type = (URL.match(/\w{3}$/))[0].toUpperCase()) === 'PEG' ? 'JPG' : type)] && !/spoiler/.test(thumb.src)) || Conf['prefetch'])) { - return; - } - if (this.file.isSpoiler) { - style = thumb.style; - style.maxHeight = style.maxWidth = this.isReply ? '125px' : '250px'; - } - img = $.el('img'); - if (Conf[string]) { - $.on(img, 'load', function() { - return thumb.src = URL; - }); - } - return img.src = URL; - }, - toggle: function() { - var enabled; - enabled = Conf['prefetch'] = this.checked; - if (enabled) { - ImageLoader.thread.posts.forEach(ImageLoader.node.call); - } - } - }; - - RevealSpoilers = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Reveal Spoiler Thumbnails']) { - return; - } - return Post.callbacks.push({ - cb: this.node - }); - }, - node: function() { - var thumb, _ref; - if (this.isClone || !((_ref = this.file) != null ? _ref.isSpoiler : void 0)) { - return; - } - thumb = this.file.thumb; - thumb.removeAttribute('style'); - return thumb.src = this.file.thumbURL; - } - }; - - Sauce = { - init: function() { - var err, link, links, _i, _len, _ref; - if (g.VIEW === 'catalog' || !Conf['Sauce']) { - return; - } - links = []; - _ref = Conf['sauces'].split('\n'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - try { - if (link[0] !== '#') { - links.push(this.createSauceLink(link.trim())); - } - } catch (_error) { - err = _error; - } - } - if (!links.length) { - return; - } - this.links = links; - this.link = $.el('a', { - target: '_blank' - }); - return Post.callbacks.push({ - name: 'Sauce', - cb: this.node - }); - }, - createSauceLink: function(link) { - var m, text; - link = link.replace(/%(T?URL|MD5|board|name)/g, function(parameter) { - var type; - return ((type = { - '%TURL': 'post.file.thumbURL', - '%URL': 'post.file.URL', - '%MD5': 'post.file.MD5', - '%board': 'post.board', - '%name': 'post.file.name' - }[parameter]) ? "' + encodeURIComponent(" + type + ") + '" : parameter); - }); - text = (m = link.match(/;text:(.+)$/)) ? m[1] : link.match(/(\w+)\.\w+\//)[1]; - link = link.replace(/;text:.+$/, ''); - return Function('post', 'a', "a.href = '" + link + "';\na.textContent = '" + text + "';\nreturn a;"); - }, - node: function() { - var link, nodes, _i, _len, _ref; - if (this.isClone || !this.file) { - return; - } - nodes = []; - _ref = Sauce.links; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - nodes.push($.tn('\u00A0'), link(this, Sauce.link.cloneNode(true))); - } - return $.add(this.file.text, nodes); - } - }; - - Linkify = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Linkify']) { - return; - } - this.regString = /((https?|mailto|git|magnet|ftp|irc):([a-z\d%\/])|[-a-z\d]+[.](aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|[a-z]{2})(\/|(?!.))|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}|[-\w\d.@]+@[a-z\d.-]+\.[a-z\d])/i; - if (Conf['Comment Expansion']) { - ExpandComment.callbacks.push(this.node); - } - if (Conf['Title Link']) { - $.sync('CachedTitles', Linkify.titleSync); - } - return Post.callbacks.push({ - name: 'Linkify', - cb: this.node - }); - }, - node: function() { - var data, el, end, endNode, i, index, items, length, link, links, node, result, saved, snapshot, space, test, word, _i, _len, _ref; - if (this.isClone) { - if (Conf['Embedding']) { - i = 0; - items = $$('.embed', this.nodes.comment); - while (el = items[i++]) { - $.on(el, 'click', Linkify.cb.toggle); - if ($.hasClass(el, 'embedded')) { - Linkify.cb.toggle.call(el); - } - } - } - return; - } - test = /[^\s'"]+/g; - space = /[\s'"]/; - snapshot = $.X('.//br|.//text()', this.nodes.comment); - i = 0; - links = []; - while (node = snapshot.snapshotItem(i++)) { - data = node.data; - if (node.parentElement.nodeName === "A" || !data) { - continue; - } - while (result = test.exec(data)) { - index = result.index; - endNode = node; - word = result[0]; - if ((length = index + word.length) === data.length) { - test.lastIndex = 0; - while ((saved = snapshot.snapshotItem(i++))) { - if (saved.nodeName === 'BR') { - break; - } - endNode = saved; - data = saved.data; - word += data; - length = data.length; - if (end = space.exec(data)) { - test.lastIndex = length = end.index; - i--; - break; - } - } - } - if (Linkify.regString.exec(word)) { - links.push(Linkify.makeRange(node, endNode, index, length)); - } - if (!(test.lastIndex && node === endNode)) { - break; - } - } - } - _ref = links.reverse(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - this.nodes.links.push(Linkify.makeLink(link, this)); - link.detach(); - } - if (!(Conf['Embedding'] || Conf['Link Title'])) { - return; - } - links = this.nodes.links; - i = 0; - while (link = links[i++]) { - if (data = Linkify.services(link)) { - if (Conf['Embedding']) { - Linkify.embed(data); - } - if (Conf['Link Title']) { - Linkify.title(data); - } - } - } - }, - makeRange: function(startNode, endNode, startOffset, endOffset) { - var range; - range = document.createRange(); - range.setStart(startNode, startOffset); - range.setEnd(endNode, endOffset); - return range; - }, - makeLink: function(range) { - var a, char, i, text; - text = range.toString(); - i = 0; - while (/[(\[{<>]/.test(text.charAt(i))) { - i++; - } - if (i) { - text = text.slice(i); - while (range.startOffset + i >= range.startContainer.data.length) { - i--; - } - if (i) { - range.setStart(range.startContainer, range.startOffset + i); - } - } - i = 0; - while (/[)\]}>.,]/.test(char = text.charAt(text.length - (1 + i)))) { - if (!(/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { - break; - } - i++; - } - if (i) { - text = text.slice(0, -i); - while (range.endOffset - i < 0) { - i--; - } - if (i) { - range.setEnd(range.endContainer, range.endOffset - i); - } - } - if (!/(https?|mailto|git|magnet|ftp|irc):/.test(text)) { - text = (/@/.test(text) ? 'mailto:' : 'http://') + text; - } - a = $.el('a', { - className: 'linkify', - rel: 'nofollow noreferrer', - target: '_blank', - href: text - }); - $.add(a, range.extractContents()); - range.insertNode(a); - return a; - }, - services: function(link) { - var href, key, match, type, _ref; - href = link.href; - _ref = Linkify.types; - for (key in _ref) { - type = _ref[key]; - if (!(match = type.regExp.exec(href))) { - continue; - } - return [key, match[1], match[2], link]; - } - }, - embed: function(data) { - var embed, href, key, link, name, options, uid, value, _ref; - key = data[0], uid = data[1], options = data[2], link = data[3]; - href = link.href; - embed = $.el('a', { - className: 'embedder', - href: 'javascript:;', - textContent: '(embed)' - }); - _ref = { - key: key, - href: href, - uid: uid, - options: options - }; - for (name in _ref) { - value = _ref[name]; - embed.dataset[name] = value; - } - embed.dataset.nodedata = link.innerHTML; - $.addClass(link, "" + embed.dataset.key); - $.on(embed, 'click', Linkify.cb.toggle); - $.after(link, [$.tn(' '), embed]); - if (Conf['Auto-embed']) { - Linkify.cb.toggle.call(embed); - } - data.push(embed); - }, - title: function(data) { - var embed, err, key, link, options, service, title, titles, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; - if (!(service = Linkify.types[key].title)) { - return; - } - titles = Conf['CachedTitles']; - if (title = titles[uid]) { - if (link) { - link.textContent = title[0]; - } - if (Conf['Embedding']) { - return embed.dataset.title = title[0]; - } - } else { - try { - $.cache(service.api(uid), function() { - return title = Linkify.cb.title(this, data); - }, { - responseType: 'json' - }); - } catch (_error) { - err = _error; - if (link) { - link.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; - } - return; - } - if (title) { - titles[uid] = [title, Date.now()]; - return $.set('CachedTitles', titles); - } - } - }, - titleSync: function(value) { - return Conf['CachedTitles'] = value; - }, - cb: { - toggle: function() { - var string, _ref; - _ref = $.hasClass(this, "embedded") ? ['unembed', '(embed)'] : ['embed', '(unembed)'], string = _ref[0], this.textContent = _ref[1]; - $.replace(this.previousElementSibling, Linkify.cb[string](this)); - return $.toggleClass(this, 'embedded'); - }, - embed: function(a) { - var el, style, type; - el = (type = Linkify.types[a.dataset.key]).el(a); - el.style.cssText = (style = type.style) ? style : "border: 0; width: 640px; height: 390px"; - return el; - }, - unembed: function(a) { - var el; - el = $.el('a', { - rel: 'nofollow noreferrer', - target: 'blank', - className: 'linkify', - href: a.dataset.href, - innerHTML: a.dataset.title || a.dataset.nodedata - }); - $.addClass(el, a.dataset.key); - return el; - }, - title: function(response, data) { - var embed, key, link, options, service, text, uid; - key = data[0], uid = data[1], options = data[2], link = data[3], embed = data[4]; - service = Linkify.types[key].title; - switch (response.status) { - case 200: - case 304: - text = "" + (service.text(response.response)); - if (Conf['Embedding']) { - embed.dataset.title = text; - } - break; - case 404: - text = "[" + key + "] Not Found"; - break; - case 403: - text = "[" + key + "] Forbidden or Private"; - break; - default: - text = "[" + key + "] " + this.status + "'d"; - } - if (link) { - return link.textContent = text; - } - } - }, - types: { - audio: { - regExp: /(.*\.(mp3|ogg|wav))$/, - el: function(a) { - return $.el('audio', { - controls: 'controls', - preload: 'auto', - src: a.dataset.uid - }); - } - }, - gist: { - regExp: /.*(?:gist.github.com.*\/)([^\/][^\/]*)$/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://www.purplegene.com/script?url=https://gist.github.com/" + a.dataset.uid + ".js" - }); - }, - title: { - api: function(uid) { - return "https://api.github.com/gists/" + uid; - }, - text: function(_arg) { - var file, files; - files = _arg.files; - for (file in files) { - if (files.hasOwnProperty(file)) { - return file; - } - } - } - } - }, - image: { - regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/, - style: 'border: 0; width: auto; height: auto;', - el: function(a) { - return $.el('div', { - innerHTML: "" - }); - } - }, - InstallGentoo: { - regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/, - el: function(a) { - return $.el('iframe', { - src: "http://paste.installgentoo.com/view/embed/" + a.dataset.uid - }); - } - }, - Twitter: { - regExp: /.*twitter.com\/(.+\/status\/\d+)/, - el: function(a) { - return $.el('iframe', { - src: "https://twitframe.com/show?url=https://twitter.com/" + a.dataset.uid - }); - } - }, - LiveLeak: { - regExp: /.*(?:liveleak.com\/view.+i=)([0-9a-z_]+)/, - el: function(a) { - var el; - el = $.el('iframe', { - width: "640", - height: "360", - src: "http://www.liveleak.com/ll_embed?i=" + a.dataset.uid, - frameborder: "0" - }); - el.setAttribute("allowfullscreen", "true"); - return el; - } - }, - MediaCrush: { - regExp: /.*(?:mediacru.sh\/)([0-9a-z_]+)/i, - style: 'border: 0;', - el: function(a) { - var el; - el = $.el('div'); - $.cache("https://mediacru.sh/" + a.dataset.uid + ".json", function() { - var embed, file, files, status, type, _i, _j, _len, _len1, _ref; - status = this.status; - if (status !== 200 && status !== 304) { - return div.innerHTML = "ERROR " + status; - } - files = this.response.files; - _ref = ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - for (_j = 0, _len1 = files.length; _j < _len1; _j++) { - file = files[_j]; - if (file.type === type) { - embed = file; - break; - } - } - if (embed) { - break; - } - } - if (!embed) { - return div.innerHTML = "ERROR: Not a valid filetype"; - } - return el.innerHTML = (function() { - switch (embed.type) { - case 'video/mp4': - case 'video/ogv': - return ""; - case 'image/png': - case 'image/gif': - case 'image/jpeg': - return ""; - case 'image/svg': - case 'image/svg+xml': - return ""; - case 'audio/mpeg': - return ""; - default: - return "ERROR: No valid filetype."; - } - })(); - }); - return el; - } - }, - pastebin: { - regExp: /.*(?:pastebin.com\/(?!u\/))([^#\&\?]*).*/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://pastebin.com/embed_iframe.php?i=" + a.dataset.uid - }); - } - }, - gfycat: { - regExp: /.*gfycat.com\/(?:iframe\/)?(\S*)/, - el: function(a) { - var div; - return div = $.el('iframe', { - src: "http://gfycat.com/iframe/" + a.dataset.uid - }); - } - }, - SoundCloud: { - regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/, - style: 'height: auto; width: 500px; display: inline-block;', - el: function(a) { - var div; - div = $.el('div', { - className: "soundcloud", - name: "soundcloud" - }); - $.ajax("//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + a.dataset.uid, { - onloadend: function() { - return div.innerHTML = JSON.parse(this.responseText).html; - } - }, false); - return div; - }, - title: { - api: function(uid) { - return "//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/" + uid; - }, - text: function(_) { - return _.title; - } - } - }, - StrawPoll: { - regExp: /strawpoll\.me\/(?:embed_\d+\/)?(\d+)/, - style: 'border: 0; width: 600px; height: 406px;', - el: function(a) { - return $.el('iframe', { - src: "http://strawpoll.me/embed_1/" + a.dataset.uid - }); - } - }, - TwitchTV: { - regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/, - style: "border: none; width: 640px; height: 360px;", - el: function(a) { - var channel, chapter, result, _; - if (result = /(\w+)\/(?:[a-z]\/)?(\d+)/i.exec(a.dataset.uid)) { - _ = result[0], channel = result[1], chapter = result[2]; - return $.el('object', { - data: 'http://www.twitch.tv/widgets/archive_embed_player.swf', - innerHTML: "\n" - }); - } else { - channel = (/(\w+)/.exec(a.dataset.uid))[0]; - return $.el('object', { - data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=" + channel, - innerHTML: "\n\n" - }); - } - } - }, - Vocaroo: { - regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/, - style: 'border: 0; width: 150px; height: 45px;', - el: function(a) { - return $.el('object', { - innerHTML: "" - }); - } - }, - Vimeo: { - regExp: /.*(?:vimeo.com\/)([^#\&\?]*).*/, - el: function(a) { - return $.el('iframe', { - src: "//player.vimeo.com/video/" + a.dataset.uid + "?wmode=opaque" - }); - }, - title: { - api: function(uid) { - return "https://vimeo.com/api/oembed.json?url=http://vimeo.com/" + uid; - }, - text: function(_) { - return _.title; - } - } - }, - Vine: { - regExp: /.*(?:vine.co\/)([^#\&\?]*).*/, - style: 'border: none; width: 500px; height: 500px;', - el: function(a) { - return $.el('iframe', { - src: "https://vine.co/" + a.dataset.uid + "/card" - }); - } - }, - YouTube: { - regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*)\??(t\=.*)?/, - el: function(a) { - var el; - el = $.el('iframe', { - src: "//www.youtube.com/embed/" + a.dataset.uid + (a.dataset.option ? '#' + a.dataset.option : '') + "?wmode=opaque" - }); - el.setAttribute("allowfullscreen", "true"); - return el; - }, - title: { - api: function(uid) { - return "https://gdata.youtube.com/feeds/api/videos/" + uid + "?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"; - }, - text: function(data) { - return data.entry.title.$t; - } - } - } - } - }; - - ArchiveLink = { - init: function() { - var div, entry, type, _i, _len, _ref; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Archive Link']) { - return; - } - div = $.el('div', { - textContent: 'Archive' - }); - entry = { - type: 'post', - el: div, - order: 90, - open: function(_arg) { - var ID, board, thread; - ID = _arg.ID, thread = _arg.thread, board = _arg.board; - return !!Redirect.to('thread', { - postID: ID, - threadID: thread.ID, - boardID: board.ID - }); - }, - subEntries: [] - }; - _ref = [['Post', 'post'], ['Name', 'name'], ['Tripcode', 'tripcode'], ['E-mail', 'email'], ['Subject', 'subject'], ['Filename', 'filename'], ['Image MD5', 'MD5']]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - entry.subEntries.push(this.createSubEntry(type[0], type[1])); - } - return $.event('AddMenuEntry', entry); - }, - createSubEntry: function(text, type) { - var el, open; - el = $.el('a', { - textContent: text, - target: '_blank' - }); - open = type === 'post' ? function(_arg) { - var ID, board, thread; - ID = _arg.ID, thread = _arg.thread, board = _arg.board; - el.href = Redirect.to('thread', { - postID: ID, - threadID: thread.ID, - boardID: board.ID - }); - return true; - } : function(post) { - var value; - value = Filter[type](post); - if (!value) { - return false; - } - el.href = Redirect.to('search', { - boardID: post.board.ID, - type: type, - value: value, - isSearch: true - }); - return true; - }; - return { - el: el, - open: open - }; - } - }; - - DeleteLink = { - init: function() { - var div, fileEl, fileEntry, postEl, postEntry; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Delete Link']) { - return; - } - div = $.el('div', { - className: 'delete-link', - textContent: 'Delete' - }); - postEl = $.el('a', { - className: 'delete-post', - href: 'javascript:;' - }); - fileEl = $.el('a', { - className: 'delete-file', - href: 'javascript:;' - }); - postEntry = { - el: postEl, - open: function() { - postEl.textContent = 'Post'; - $.on(postEl, 'click', DeleteLink["delete"]); - return true; - } - }; - fileEntry = { - el: fileEl, - open: function(_arg) { - var file; - file = _arg.file; - if (!file || file.isDead) { - return false; - } - fileEl.textContent = 'File'; - $.on(fileEl, 'click', DeleteLink["delete"]); - return true; - } - }; - return $.event('AddMenuEntry', { - type: 'post', - el: div, - order: 40, - open: function(post) { - var node; - if (post.isDead) { - return false; - } - DeleteLink.post = post; - node = div.firstChild; - node.textContent = 'Delete'; - DeleteLink.cooldown.start(post, node); - return true; - }, - subEntries: [postEntry, fileEntry] - }); - }, - "delete": function() { - var fileOnly, form, link, post; - post = DeleteLink.post; - if (DeleteLink.cooldown.counting === post) { - return; - } - $.off(this, 'click', DeleteLink["delete"]); - fileOnly = $.hasClass(this, 'delete-file'); - this.textContent = "Deleting " + (fileOnly ? 'file' : 'post') + "..."; - form = { - mode: 'usrdel', - onlyimgdel: fileOnly, - pwd: QR.persona.getPassword() - }; - form[post.ID] = 'delete'; - link = this; - return $.ajax($.id('delform').action.replace("/" + g.BOARD + "/", "/" + post.board + "/"), { - responseType: 'document', - withCredentials: true, - onload: function() { - return DeleteLink.load(link, post, fileOnly, this.response); - }, - onerror: function() { - return DeleteLink.error(link); - } - }, { - form: $.formData(form) - }); - }, - load: function(link, post, fileOnly, resDoc) { - var msg, s; - if (resDoc.title === '4chan - Banned') { - s = 'Banned!'; - } else if (msg = resDoc.getElementById('errmsg')) { - s = msg.textContent; - $.on(link, 'click', DeleteLink["delete"]); - } else { - if (resDoc.title === 'Updating index...') { - (post.origin || post).kill(fileOnly); - } - s = 'Deleted'; - } - return link.textContent = s; - }, - error: function(link) { - link.textContent = 'Connection error, please retry.'; - return $.on(link, 'click', DeleteLink["delete"]); - }, - cooldown: { - start: function(post, node) { - var length, seconds, _ref; - if (!((_ref = QR.db) != null ? _ref.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: post.ID - }) : void 0)) { - delete DeleteLink.cooldown.counting; - return; - } - DeleteLink.cooldown.counting = post; - length = 60; - seconds = Math.ceil((length * $.SECOND - (Date.now() - post.info.date)) / $.SECOND); - return DeleteLink.cooldown.count(post, seconds, length, node); - }, - count: function(post, seconds, length, node) { - if (DeleteLink.cooldown.counting !== post) { - return; - } - if (!((0 <= seconds && seconds <= length))) { - if (DeleteLink.cooldown.counting === post) { - node.textContent = 'Delete'; - delete DeleteLink.cooldown.counting; - } - return; - } - setTimeout(DeleteLink.cooldown.count, 1000, post, seconds - 1, length, node); - return node.textContent = "Delete (" + seconds + ")"; - } - } - }; - - DownloadLink = { - init: function() { - var a; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Download Link']) { - return; - } - a = $.el('a', { - className: 'download-link', - textContent: 'Download file' - }); - return $.event('AddMenuEntry', { - type: 'post', - el: a, - order: 100, - open: function(_arg) { - var file; - file = _arg.file; - if (!file) { - return false; - } - a.href = file.URL; - a.download = file.name; - return true; - } - }); - } - }; - - Menu = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Menu']) { - return; - } - this.menu = new UI.Menu('post'); - return Post.callbacks.push({ - name: 'Menu', - cb: this.node - }); - }, - node: function() { - if (this.isClone) { - $.on($('.menu-button', this.nodes.info), 'click', Menu.toggle); - return; - } - return $.add(this.nodes.info, Menu.makeButton()); - }, - makeButton: (function() { - var a; - a = $.el('a', { - className: 'menu-button', - innerHTML: '', - href: 'javascript:;' - }); - return function() { - var button; - button = a.cloneNode(true); - $.on(button, 'click', Menu.toggle); - return button; - }; - })(), - toggle: function(e) { - var post; - post = Get.postFromNode(this); - return Menu.menu.toggle(e, this, post); - } - }; - - ReportLink = { - init: function() { - var a; - if (g.VIEW === 'catalog' || !Conf['Menu'] || !Conf['Report Link']) { - return; - } - a = $.el('a', { - className: 'report-link', - href: 'javascript:;', - textContent: 'Report this post' - }); - $.on(a, 'click', ReportLink.report); - return $.event('AddMenuEntry', { - type: 'post', - el: a, - order: 10, - open: function(post) { - ReportLink.post = post; - return !post.isDead; - } - }); - }, - report: function() { - var id, post, set, url; - post = ReportLink.post; - url = "//sys.4chan.org/" + post.board + "/imgboard.php?mode=report&no=" + post; - id = Date.now(); - set = "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,resizable=1,width=685,height=200"; - return window.open(url, id, set); - } - }; - - Favicon = { - init: function() { - return $.asap((function() { - return Favicon.el = $('link[rel="shortcut icon"]', d.head); - }), Favicon.initAsap); - }, - initAsap: function() { - var href; - Favicon.el.type = 'image/x-icon'; - href = Favicon.el.href; - Favicon.SFW = /ws\.ico$/.test(href); - Favicon["default"] = href; - return Favicon["switch"](); - }, - "switch": function() { - var f, funreadDeadY, i, items, t; - items = { - ferongr: ['iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEX///9zBQC/AADpDAP/gID/q6voCwJJTwpOAAAAAXRSTlMAQObYZgAAAGJJREFUeF5Fi7ENg0AQBCfa/AFdDh2gdwPIogMK2E2+/xLslwOvdqRJhv+GQQPUCtJM7svankLrq/I+TY5e6Ueh1jyBMX7AFJi9vwfyVO4CbbO6jNYpp9GyVPbdkFhVgAQ2H0NOE5jk9DT8AAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAxUlEQVR42q1TOwrCQBB9s0FRtJI0WoqFtSLYegoP4gVSeJsUHsHSI3iFeIqRXXgwrhlXwYHHhLwPTB7B36abBCV+0pA4DUBQUNZYQptGtW3jtoKyxgoe0yrBCoyZfL/5ioQ3URZOXW9I341l3oo+NXEZiW4CEuIzvPECopED4OaZ3RNmeAm4u+a8Jr5f17VyVoL8fr8qcltzwlyyj2iqcgPOQ9ExkHAITgD75bYBe0A5S4H/P9htuWMF3QXoQpwaKeT+lnsC6JE5I6aq6fEAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEX///8AcH4AtswA2PJ55fKi6fIA1/FtpPADAAAAAXRSTlMAQObYZgAAAGJJREFUeF5Fi7ENg0AQBCfa/AFdDh2gdwPIogMK2E2+/xLslwOvdqRJhv+GQQPUCtJM7svankLrq/I+TY5e6Ueh1jyBMX7AFJi9vwfyVO4CbbO6jNYpp9GyVPbdkFhVgAQ2H0NOE5jk9DT8AAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAxElEQVQ4y2NgoBq4/vE/HJOsBiRQUIfA2AzBqQYqUfn00/9FLz+BaQxDCKqBmX7jExijKEDSDJPHrnnbGQhGV4RmOFwdVkNwhQMheYwQxhaIi7b9Z9A3gWAQm2BUoQOgRhgA8o7j1ozLC4LCyAZcx6kZI5qg4kLKqggDFFWxJySsUQVzlb4pwgAJaTRvokcVNgOqOv8zcHBCsL07DgNg8YsczzA5MxtUL+DMD8g0slxI/H8GQ/P/DJKyeKIRpglXZsIiBwBhP5O+VbI/JgAAAABJRU5ErkJggg==', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEX///8oeQBJ3ABV/wHM/7Lu/+ZU/gAqUP3dAAAAAXRSTlMAQObYZgAAAGJJREFUeF5Fi7ENg0AQBCfa/AFdDh2gdwPIogMK2E2+/xLslwOvdqRJhv+GQQPUCtJM7svankLrq/I+TY5e6Ueh1jyBMX7AFJi9vwfyVO4CbbO6jNYpp9GyVPbdkFhVgAQ2H0NOE5jk9DT8AAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAx0lEQVQ4y2NgoBYI+cfwH4ZJVgMS0KhEYGyG4FQDkzjzf9P/d/+fgWl0QwiqgSkI/c8IxsgKkDXD5LFq9rwDweiK0A2HqcNqCK5wICSPEcLYAtH+AMN/IXMIBrEJRie6OEgjDAC5x3FqxuUFNiEUA67j1IweTTBxBQ1puAG86jgSEraogskJWSBcwCGF5k30qMJmgMFEhv/MXBAs5oLDAFj8IsczTE7UEeECbhU8+QGZRpaTi2b4L2zF8J9TGk80wjThykzY5AAW/2O1C2mIbgAAAABJRU5ErkJggg=='], - 'xat-': ['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'], - Mayhem: ['iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABFklEQVR4AZ2R4WqEMBCEFy1yiJQQ14gcIhIuFBFR+qPQ93+v66QMksrlTwMfkZ2ZZbMKTgVqYIDl3YAbeCM31lJP/Zul4MAEPJjBQGNDLGsz8PQ6aqLAP5PTdd1WlmU09mSKtdTDRgrkzspJPKq6RxMahfj9yhOzQEZwZAwfzrk1ox3MXibIN8hO4MAjeV72CemJGWblnRsOYOdoGw0jebB20BPAwKzUQPlrFhrXFw1Wagu9yuzZwINzVAZCURRL+gRr7Wd8Vtqg4Th/lsUmewyk9WQ/A7NiwJz5VV/GmO+MNjMrFvh/NPDMigHTaeJN09a27ZHRJmalBg54CgfvAGYSLpoHjlmpuAwFdzDy7oGS/qIpM9UPFGg1b1kUlssAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABR0lEQVR4AYWSQWq0QBCFCw0SRIK0PQ4hiIhEZBhEySLyewUPEMgqR/JIXiDhzz7kKKYePIZajEzDRxfV9dWU3SO6IiVWUsVxT5R75Y4gTmwNnUh4kCulUiuV8sjChDjmKtaUcHgmHsnNrMPh0IVhiMIjKZGzNXDoyhMzF7C89z2KtFGD+FoNXEUKZdgpaPM8P++cDXTtBDca7EyQK8+bXTufYBccuvLAG26UnqN1LCgI4g/lm7zTgSux4vk0J8rnKw3+m1//pBPbBrVyGZVNmiAITviEtm3t+D+2QcJx7GUxlN4594K4ZY75Xzh0JVWqnad6TdP0H+LRNBjHcYNDV5xS32qwaC4my7Lwn6guu5QoomgbdFmWDYhnM8E8zxscuhLzPWtKA/dGqUizrityX9M0YX+DQ1ciXobnP6vgfmTOM7Znnk70B58pPaEvx+epAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/ElEQVR4AZ3RUWqEMBSF4ftQZAhSREQJIiIXpQwi+tSldkFdWPsLhyEE0ocKH2Fyzg1mNJ4KAQ1arTUeeJMH6qwTUJmCHjMcC6KKtbSIylzdXpl18J/k4fdTpUFmPLOOa9bGe+P4+n5RYYfLXuiMsAlXofBxK2QXpvwN/jqg+AY91vR+pStk+apZe0fEhhMXDhUmWXEoO9WNmrWAzvRPq7jnB2jvUGfWTEgPcJzZFTbZk/0Tnh5QI+af6lVGvq/Do2atwVL4VJ+3QrZo1lr4Pw5wzVqDWaV7SUvHrZDNmrWAHq7g0rphkS3LXDMBVqFGhxGT1gGdDFnWaab6BRmXRvbxDmYiAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4AY2SQUrEQBBFS9CMNFEkhAQdYmiCIUgcZlYGc4VsBcGVF/AuWXme4F7RtXiVWF9+Y9MYtOHRTdX/NZWaEj2RYpQTJeEdK4fKPuA7DjSGXiQkU0qlUqxySmFMEsYsNSU8zEmK4OwdEbmkKCclYoGmolfWCGyenh1O0EJE2gXNWpFC2S0IGrCQ29EbdPCPAmEHmXIxByf8hDAPD71yzAnXypatbSgoAN8Pyju5h4deMUrqJk1z+0uBN+/XX+gxfoFK2QafUJO2aRq//Q+/QIx2wr+Kwq0rusrP/QKf9MTCtbQLf9U1wNvYnz3qug45S68kSvVXgbPbx3nvYPXNOI7cRPWySukK+DcGCvA+urqZ3RmGAbmSXjFK5rpwW8nhWVJP04TYa9/3uO/goVciDiPlZhW8c8ZAHuRSeqIv32FK/GYGL8YAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/ElEQVR4AZ3RUWqEMBSF4ftQZAihDCKKiAQJShERQx+6o662e2p/4TCEQF468BEm95yLovFr4PBEq9PjgTd5wBcZp6559AiIWDAq6KXV3aJMUMfDOsTf7Mf/XaFBAvYiE9W16b74/vl8UeBAlKOSmWAzUiXwcavMkrrFE9QXVJ+gx5q9XvUVivmqrr1jxIYLCacCs6y6S8psGNU1hw4Bu4JHuUB3pzJBHZcviLiKV9jkyO4vxHyBx1h+qlcY5b2Wj+raE0vlU33dKrNFXWsR/7EgqmtPBIXuIw+dt8osqGsOPaIGSeeGRbZiFtVxsAYeHSbMOgd0MhSzTp3mD4RaQX4aW3NMAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABP0lEQVR4AYWS0UqFQBCGhziImNRBRImDmUgiIaF0kWSP4AMEXXXTE/QiPpL3UdR19Crb/PAvLEtyFj5mmfn/cdxd0RUokbJXEsZYCZUd4D72NBG8wkKmlEqtVMoFhTFJmKuoKelBTVIkjbNE5IainJTIeZqaXjkg8fp+Z7GCjiLQbWgOihTKsCFowUZtoNef4HgDf4JMuTbe8n/Br8NDr5zxhBul52i3FBQE+xflmzzTA69ESmpPmubunwZfztc/6IncBrXSe7/QkK5tW3f8H7dBjHH8q6Kwt033V6Hb4JeeWPgsq42rugfYZ92psWscRwMPvZIo9bEGD2+F2YUnBizLwpeoXnYpbQM34kAB9peP58aueZ4NPPRKxPusaRoYG6UizbquyH1O04T4RA+8EvAwUr6sgjFnDuReLaUn+ANygUa7+9SCWgAAAABJRU5ErkJggg=='], - '4chanJS': ['iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAD1BMVEUBAAAAAAD/AABnZ2f///8nFk05AAAAAXRSTlMAQObYZgAAAEFJREFUeNqNjgEKACAMAjvX/98cAkkxgmSgO8Bt/Ai4ApJ6KKhzF3OiEMDASrGB/QWgPEHsUpN+Ng9xAETMYhDrWmeHAMcmvycWAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAD1BMVEUBAAAAAAD/AAD///9nZ2f77Y6hAAAAAXRSTlMAQObYZgAAAEBJREFUeF6NjQEKACAMAnfW/98cAxFiBIngOsTqR8B1IGkeG9p5i7XabgAGZNigXgA8aoCUxvzWAIcBItGiSEwdccYA3BuRAWkAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAD1BMVEUBAAAAAAAul8NnZ2f////82iC9AAAAAXRSTlMAQObYZgAAAEFJREFUeNqNjgEKACAMAjvX/98cAkkxgmSgO8Bt/Ai4ApJ6KKhzF3OiEMDASrGB/QWgPEHsUpN+Ng9xAETMYhDrWmeHAMcmvycWAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAD1BMVEUBAAAAAAAul8P///9nZ2cgIeMlAAAAAXRSTlMAQObYZgAAAEBJREFUeF6NjQEKACAMAnfW/98cAxFiBIngOsTqR8B1IGkeG9p5i7XabgAGZNigXgA8aoCUxvzWAIcBItGiSEwdccYA3BuRAWkAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAElBMVEUBAAAAAABmzDNlyjJnZ2f///+6o7dfAAAAAXRSTlMAQObYZgAAAERJREFUeF6NjkEKADEIA51o///lJZfQxUsHITogWi8AvwZJuxmYa25xDooBLEwOWFTYAsYVhdorLZt9Ng9xCUTCUCQ2H3F4ANrZ2WNiAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAElBMVEUBAAAAAABmzDP///9lyjJnZ2cIHys9AAAAAXRSTlMAQObYZgAAAENJREFUeF6NjUEKwEAMAjNm9/9fLkEslFwqgjoEUn8EfAqSdrkwzj6ieyyTkQEVGWRvANfO1iEX620AjgBEwqR4Y+sBeGAA6d+vQ4IAAAAASUVORK5CYII='], - Original: ['iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEX/////AAD///8AAABBZmS3AAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhElEQVR42q1RwQnAMAjMu5M4guAKXa4j5dUROo5tipSDcrFChUONd0di2m/hEGVOHDyIPufgwAFASDkpoSzmBrkJ2UMyR9LsJ3rvrqo3Rt1YMIMhhNnOxLMnoMFBxHyJAr2IOBFzA8U+6pLBdmEJTA0aMVjpDd6Loks0s5HZNwYx8tfZCZ0kll7ORffZAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEX///8ul8P///8AAACaqgkzAAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAALVBMVEUAAAAAAAAAAAAAAAABBQcHFx4KISoNLToaVW4oKCgul8M4ODg7OzvBwcH///8uS/CdAAAAA3RSTlMAx9dmesIgAAAAV0lEQVR42m2NWw6AIBAD1eILZO5/XI0UAgm7H9tOsu0yGWAQSOoFijHOxOANGqm/LczpOaXs4gISrPZ+gc2+hO5w2xdwgOjBFUIF+sEJrhUl9JFr+badFwR+BfqlmGUJAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEX///9mzDP///8AAACT0n1lAAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII=', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAALVBMVEUAAAAAAAAAAAAAAAAECAIQIAgWLAsePA8oKCg4ODg6dB07OztmzDPBwcH///+rsf3XAAAAA3RSTlMAx9dmesIgAAAAV0lEQVR42m2NWw6AIBAD1eIDhbn/cTVSCCTsfmw7ybbLZIBBIKkXKKU0E4M3aKT+tjCn5xiziwuIsNr7BTb7ErrDZV/AAaIHdwgV6AcnuFaU0Eeu5dt2XiUyBjCQ2bIrAAAAAElFTkSuQmCC'], - 'Metro': ['iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAC/AABrZQDiAAAAAXRSTlMAQObYZgAAABJJREFUCB1jZGBgrMNAQEEc4gCSfAX5bRw/NQAAAABJRU5ErkJggg==', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAAAAAAAAAAHAAAdAAApAAAsAAA4AABsAACQAAC/AAD///9SVhtjAAAAA3RSTlMAPse+s4iwAAAAM0lEQVQIW2NggAGuVasWgDBpDDAQUoSaob0Jao73lgVojOitUEazBZRRvR3KmJa5AO4KAGBtLuMAuhIIAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAAA1/GhpCidAAAAAXRSTlMAQObYZgAAABJJREFUCB1jZGBgrMNAQEEc4gCSfAX5bRw/NQAAAABJRU5ErkJggg==', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAAAAAAAAAAACAkAISUALzQAMTcAQEcAeokAorYA1/H///8BrzTFAAAAA3RSTlMAPse+s4iwAAAAM0lEQVQIW2NggAGuVasWgDBpDDAQUoSaob0Jao73lgVojOitUEazBZRRvR3KmJa5AO4KAGBtLuMAuhIIAAAAAElFTkSuQmCC', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAABV/wErM5hwAAAAAXRSTlMAQObYZgAAABJJREFUCB1jZGBgrMNAQEEc4gCSfAX5bRw/NQAAAABJRU5ErkJggg==', 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAAAAAAAAAADCgANKAASOAATOwAZTAAwkQBAwQBV/wH////+Fmy4AAAAA3RSTlMAPse+s4iwAAAAM0lEQVQIW2NggAGuVasWgDBpDDAQUoSaob0Jao73lgVojOitUEazBZRRvR3KmJa5AO4KAGBtLuMAuhIIAAAAAElFTkSuQmCC'] - }[Conf['favicon']]; - f = Favicon; - t = 'data:image/png;base64,'; - i = 0; - while (items[i]) { - items[i] = t + items[i++]; - } - f.unreadDead = items[0], funreadDeadY = items[1], f.unreadSFW = items[2], f.unreadSFWY = items[3], f.unreadNSFW = items[4], f.unreadNSFWY = items[5]; - return f.update(); - }, - update: function() { - if (this.SFW) { - this.unread = this.unreadSFW; - return this.unreadY = this.unreadSFWY; - } else { - this.unread = this.unreadNSFW; - return this.unreadY = this.unreadNSFWY; - } - }, - dead: 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAP8AAP///////yH5BAEKAAIALAAAAAAQABAAAAIvlI+pq+D9DAgUoFkPDlbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==', - logo: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAgMAAAC+UIlYAAAACVBMVEUAAGcAAABmzDNZt9VtAAAAAXRSTlMAQObYZgAAAGlJREFUWMPtlkEKADEIA/tJP9lXLttQto2yHxgDHozTi0ToGK2WKZZ+HAQQMZc+xBwI4EZ+wAC2IfPuSIDOZJrSZQEAX9eVJhhwIuUYAnQe8rhAEMAZlTI2MID9f5Clyh0JeE1V1ZEAvB4qDfwuJTSGRAAAAABJRU5ErkJggg==' - }; - - ThreadExcerpt = { - init: function() { - if (g.VIEW !== 'thread' || !Conf['Thread Excerpt']) { - return; - } - return Thread.callbacks.push({ - name: 'Thread Excerpt', - cb: this.node - }); - }, - node: function() { - return d.title = Get.threadExcerpt(this); - }, - disconnect: function() { - if (g.VIEW !== 'thread' || !Conf['Thread Excerpt']) { - return; - } - return Thread.callbacks.disconnect('Thread Excerpt'); - } - }; - - ThreadStats = { - init: function() { - var sc, - _this = this; - if (g.VIEW !== 'thread' || !Conf['Thread Stats']) { - return; - } - if (Conf['Updater and Stats in Header']) { - this.dialog = sc = $.el('span', { - innerHTML: "0 / 0" + (Conf["Page Count in Stats"] ? " / 0" : ""), - id: 'thread-stats', - title: 'Post Count / File Count' + (Conf["Page Count in Stats"] ? " / Page Count" : "") - }); - $.ready(function() { - return Header.addShortcut(sc); - }); - } else { - this.dialog = sc = UI.dialog('thread-stats', 'bottom: 0px; right: 0px;', "
0 / 0" + (Conf["Page Count in Stats"] ? " / 0" : "") + "
"); - $.ready(function() { - return $.add(d.body, sc); - }); - } - this.postCountEl = $('#post-count', sc); - this.fileCountEl = $('#file-count', sc); - this.pageCountEl = $('#page-count', sc); - return Thread.callbacks.push({ - name: 'Thread Stats', - cb: this.node - }); - }, - node: function() { - var fileCount, postCount; - postCount = 0; - fileCount = 0; - this.posts.forEach(function(post) { - postCount++; - if (post.file) { - return fileCount++; - } - }); - ThreadStats.thread = this; - ThreadStats.fetchPage(); - ThreadStats.update(postCount, fileCount); - return $.on(d, 'ThreadUpdate', ThreadStats.onUpdate); - }, - disconnect: function() { - if (g.VIEW !== 'thread' || !Conf['Thread Stats']) { - return; - } - if (Conf['Updater and Stats in Header']) { - Header.rmShortcut(this.dialog); - } else { - $.rm(d.body, sc); - } - clearTimeout(this.timeout); - delete this.timeout; - delete this.thread; - delete this.postCountEl; - delete this.fileCountEl; - delete this.pageCountEl; - Thread.callbacks.disconnect('Thread Stats'); - return $.off(d, 'ThreadUpdate', ThreadStats.onUpdate); - }, - onUpdate: function(e) { - var fileCount, postCount, _ref; - if (e.detail[404]) { - return; - } - _ref = e.detail, postCount = _ref.postCount, fileCount = _ref.fileCount; - return ThreadStats.update(postCount, fileCount); - }, - update: function(postCount, fileCount) { - var fileCountEl, postCountEl, thread; - thread = ThreadStats.thread, postCountEl = ThreadStats.postCountEl, fileCountEl = ThreadStats.fileCountEl; - postCountEl.textContent = postCount; - fileCountEl.textContent = fileCount; - (thread.postLimit && !thread.isSticky ? $.addClass : $.rmClass)(postCountEl, 'warning'); - return (thread.fileLimit && !thread.isSticky ? $.addClass : $.rmClass)(fileCountEl, 'warning'); - }, - fetchPage: function() { - if (!Conf["Page Count in Stats"]) { - return; - } - if (ThreadStats.thread.isDead) { - ThreadStats.pageCountEl.textContent = 'Dead'; - $.addClass(ThreadStats.pageCountEl, 'warning'); - return; - } - ThreadStats.timeout = setTimeout(ThreadStats.fetchPage, 2 * $.MINUTE); - return $.ajax("//a.4cdn.org/" + ThreadStats.thread.board + "/threads.json", { - onload: ThreadStats.onThreadsLoad - }, { - whenModified: true - }); - }, - onThreadsLoad: function() { - var page, thread, _i, _j, _len, _len1, _ref, _ref1; - if (!(Conf["Page Count in Stats"] && this.status === 200)) { - return; - } - _ref = this.response; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - page = _ref[_i]; - _ref1 = page.threads; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - thread = _ref1[_j]; - if (!(thread.no === ThreadStats.thread.ID)) { - continue; - } - ThreadStats.pageCountEl.textContent = page.page; - (page.page === this.response.length - 1 ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); - return; - } - } - } - }; - - ThreadUpdater = { - init: function() { - var checked, conf, el, input, name, sc, subEntries, _ref, - _this = this; - if (g.VIEW !== 'thread' || !Conf['Thread Updater']) { - return; - } - if (Conf['Updater and Stats in Header']) { - this.dialog = sc = $.el('span', { - innerHTML: "", - id: 'updater' - }); - $.ready(function() { - return Header.addShortcut(sc); - }); - } else { - this.dialog = sc = UI.dialog('updater', 'bottom: 0px; left: 0px;', "
"); - $.addClass(doc, 'float'); - $.ready(function() { - $.addClass(doc, 'float'); - return $.add(d.body, sc); - }); - } - this.checkPostCount = 0; - this.timer = $('#update-timer', sc); - this.status = $('#update-status', sc); - this.isUpdating = Conf['Auto Update']; - $.on(this.timer, 'click', this.update); - $.on(this.status, 'click', this.update); - subEntries = []; - _ref = Config.updater.checkbox; - for (name in _ref) { - conf = _ref[name]; - checked = Conf[name] ? 'checked' : ''; - el = $.el('label', { - title: "" + conf[1], - innerHTML: " " + name - }); - input = el.firstElementChild; - $.on(input, 'change', $.cb.checked); - if (input.name === 'Scroll BG') { - $.on(input, 'change', this.cb.scrollBG); - this.cb.scrollBG(); - } else if (input.name === 'Auto Update') { - $.on(input, 'change', this.cb.update); - } - subEntries.push({ - el: el - }); - } - this.settings = $.el('span', { - innerHTML: 'Interval' - }); - $.on(this.settings, 'click', this.intervalShortcut); - subEntries.push({ - el: this.settings - }); - $.event('AddMenuEntry', this.entry = { - type: 'header', - el: $.el('span', { - textContent: 'Updater' - }), - order: 110, - subEntries: subEntries - }); - return Thread.callbacks.push({ - name: 'Thread Updater', - cb: this.node - }); - }, - disconnect: function() { - var el, entry, input, name, _i, _j, _len, _len1, _ref, _ref1; - if (g.VIEW !== 'thread' || !Conf['Thread Updater']) { - return; - } - $.off(this.timer, 'click', this.update); - $.off(this.status, 'click', this.update); - if (this.timeoutID) { - clearTimeout(this.timeoutID); - } - _ref = this.entry.subEntries; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - entry = _ref[_i]; - el = entry.el; - input = el.firstElementChild; - $.off(input, 'change', $.cb.checked); - $.off(input, 'change', this.cb.scrollBG); - $.off(input, 'change', this.cb.update); - } - $.off(this.settings, 'click', this.intervalShortcut); - $.off(window, 'online offline', this.cb.online); - $.off(d, 'QRPostSuccessful', this.cb.checkpost); - $.off(d, 'visibilitychange', this.cb.visibility); - this.set('timer', null); - this.set('status', 'Offline'); - $.event('rmMenuEntry', this.entry); - if (Conf['Updater and Stats in Header']) { - Header.rmShortcut(this.dialog); - } else { - $.rmClass(doc, 'float'); - $.rm(this.dialog); - } - _ref1 = ['checkPostCount', 'timer', 'status', 'isUpdating', 'entry', 'dialog', 'thread', 'root', 'lastPost', 'outdateCount', 'online', 'seconds', 'timeoutID']; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - name = _ref1[_j]; - delete this[name]; - } - return Thread.callbacks.disconnect('Thread Updater'); - }, - node: function() { - ThreadUpdater.thread = this; - ThreadUpdater.root = this.OP.nodes.root.parentNode; - ThreadUpdater.lastPost = +ThreadUpdater.root.lastElementChild.id.match(/\d+/)[0]; - ThreadUpdater.outdateCount = 0; - ThreadUpdater.cb.interval.call($.el('input', { - value: Conf['Interval'] - })); - $.on(window, 'online offline', ThreadUpdater.cb.online); - $.on(d, 'QRPostSuccessful', ThreadUpdater.cb.checkpost); - $.on(d, 'visibilitychange', ThreadUpdater.cb.visibility); - return ThreadUpdater.cb.online(); - }, - /* - http://freesound.org/people/pierrecartoons1979/sounds/90112/ - cc-by-nc-3.0 - */ - - beep: 'data:audio/wav;base64,UklGRjQDAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAc21wbDwAAABBAAADAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkYXRhzAIAAGMms8em0tleMV4zIpLVo8nhfSlcPR102Ki+5JspVEkdVtKzs+K1NEhUIT7DwKrcy0g6WygsrM2k1NpiLl0zIY/WpMrjgCdbPhxw2Kq+5Z4qUkkdU9K1s+K5NkVTITzBwqnczko3WikrqM+l1NxlLF0zIIvXpsnjgydZPhxs2ay95aIrUEkdUdC3suK8N0NUIjq+xKrcz002WioppdGm091pK1w0IIjYp8jkhydXPxxq2K295aUrTkoeTs65suK+OUFUIzi7xqrb0VA0WSoootKm0t5tKlo1H4TYqMfkiydWQBxm16+85actTEseS8y7seHAPD9TIza5yKra01QyWSson9On0d5wKVk2H4DYqcfkjidUQB1j1rG75KsvSkseScu8seDCPz1TJDW2yara1FYxWSwnm9Sn0N9zKVg2H33ZqsXkkihSQR1g1bK65K0wSEsfR8i+seDEQTxUJTOzy6rY1VowWC0mmNWoz993KVc3H3rYq8TklSlRQh1d1LS647AyR0wgRMbAsN/GRDpTJTKwzKrX1l4vVy4lldWpzt97KVY4IXbUr8LZljVPRCxhw7W3z6ZISkw1VK+4sMWvXEhSPk6buay9sm5JVkZNiLWqtrJ+TldNTnquqbCwilZXU1BwpKirrpNgWFhTaZmnpquZbFlbVmWOpaOonHZcXlljhaGhpZ1+YWBdYn2cn6GdhmdhYGN3lp2enIttY2Jjco+bnJuOdGZlZXCImJqakHpoZ2Zug5WYmZJ/bGlobX6RlpeSg3BqaW16jZSVkoZ0bGtteImSk5KIeG5tbnaFkJKRinxxbm91gY2QkIt/c3BwdH6Kj4+LgnZxcXR8iI2OjIR5c3J0e4WLjYuFe3VzdHmCioyLhn52dHR5gIiKioeAeHV1eH+GiYqHgXp2dnh9hIiJh4J8eHd4fIKHiIeDfXl4eHyBhoeHhH96eHmA', - cb: { - online: function() { - if (ThreadUpdater.online = navigator.onLine) { - ThreadUpdater.outdateCount = 0; - ThreadUpdater.setInterval(); - ThreadUpdater.set('status', null, null); - return; - } - ThreadUpdater.set('timer', null); - return ThreadUpdater.set('status', 'Offline', 'warning'); - }, - post: function(e) { - if (!(ThreadUpdater.isUpdating && e.detail.threadID === ThreadUpdater.thread.ID)) { - return; - } - ThreadUpdater.outdateCount = 0; - if (ThreadUpdater.seconds > 2) { - return setTimeout(ThreadUpdater.update, 1000); - } - }, - checkpost: function(e) { - if (!ThreadUpdater.checkPostCount) { - if (e.detail.threadID !== ThreadUpdater.thread.ID) { - return; - } - ThreadUpdater.seconds = 0; - ThreadUpdater.outdateCount = 0; - ThreadUpdater.set('timer', '...'); - } - if (!(g.DEAD || ThreadUpdater.foundPost || ThreadUpdater.checkPostCount >= 5)) { - return setTimeout(ThreadUpdater.update, ++ThreadUpdater.checkPostCount * $.SECOND); - } - ThreadUpdater.setInterval(); - ThreadUpdater.checkPostCount = 0; - delete ThreadUpdater.foundPost; - return delete ThreadUpdater.postID; - }, - visibility: function() { - if (d.hidden) { - return; - } - ThreadUpdater.outdateCount = 0; - if (ThreadUpdater.seconds > ThreadUpdater.interval) { - return ThreadUpdater.setInterval(); - } - }, - scrollBG: function() { - return ThreadUpdater.scrollBG = Conf['Scroll BG'] ? function() { - return true; - } : function() { - return !d.hidden; - }; - }, - interval: function() { - var val; - val = parseInt(this.value, 10); - if (val < 1) { - val = 1; - } - ThreadUpdater.interval = this.value = val; - return $.cb.value.call(this); - }, - load: function(e) { - var klass, req, text, _ref; - req = ThreadUpdater.req; - switch (req.status) { - case 200: - g.DEAD = false; - ThreadUpdater.parse(req.response.posts); - ThreadUpdater.setInterval(); - break; - case 404: - g.DEAD = true; - ThreadUpdater.set('timer', null); - ThreadUpdater.set('status', '404', 'warning'); - clearTimeout(ThreadUpdater.timeoutID); - ThreadUpdater.thread.kill(); - $.event('ThreadUpdate', { - 404: true, - thread: ThreadUpdater.thread - }); - break; - default: - ThreadUpdater.outdateCount++; - ThreadUpdater.setInterval(); - _ref = req.status === 304 ? [null, null] : ["" + req.statusText + " (" + req.status + ")", 'warning'], text = _ref[0], klass = _ref[1]; - ThreadUpdater.set('status', text, klass); - } - if (ThreadUpdater.postID) { - return ThreadUpdater.cb.checkpost(); - } - } - }, - setInterval: function() { - var cur, i, j, limit; - i = ThreadUpdater.interval + 1; - if (Conf['Optional Increase']) { - cur = ThreadUpdater.outdateCount || 1; - limit = d.hidden ? 7 : 10; - j = cur <= limit ? cur : limit; - cur = (Math.floor(i * 0.1) || 1) * j * j; - ThreadUpdater.seconds = cur > i ? cur <= 300 ? cur : 300 : i; - } else { - ThreadUpdater.seconds = i; - } - ThreadUpdater.set('timer', ThreadUpdater.seconds); - return ThreadUpdater.count(true); - }, - intervalShortcut: function() { - var settings; - Settings.open('Advanced'); - settings = $.id('fourchanx-settings'); - return $('input[name=Interval]', settings).focus(); - }, - set: function(name, text, klass) { - var el, node; - el = ThreadUpdater[name]; - if (node = el.firstChild) { - node.data = text; - } else { - el.textContent = text; - } - if (klass !== void 0) { - return el.className = klass; - } - }, - count: function(start) { - clearTimeout(ThreadUpdater.timeoutID); - if (start && ThreadUpdater.isUpdating && navigator.onLine) { - return ThreadUpdater.timeout(); - } - }, - timeout: function() { - var n; - ThreadUpdater.timeoutID = setTimeout(ThreadUpdater.timeout, 1000); - if (!(n = --ThreadUpdater.seconds)) { - return ThreadUpdater.update(); - } else if (n <= -60) { - ThreadUpdater.set('status', 'Retrying', null); - return ThreadUpdater.update(); - } else if (n > 0) { - return ThreadUpdater.set('timer', n); - } - }, - update: function() { - var url, _ref; - if (!navigator.onLine) { - return; - } - ThreadUpdater.count(); - if (Conf['Auto Update']) { - ThreadUpdater.set('timer', '...'); - } else { - ThreadUpdater.set('timer', 'Update'); - } - if ((_ref = ThreadUpdater.req) != null) { - _ref.abort(); - } - url = "//a.4cdn.org/" + ThreadUpdater.thread.board + "/res/" + ThreadUpdater.thread + ".json"; - return ThreadUpdater.req = $.ajax(url, { - onloadend: ThreadUpdater.cb.load - }, { - whenModified: true - }); - }, - updateThreadStatus: function(type, status) { - var change, hasChanged; - if (!(hasChanged = ThreadUpdater.thread["is" + type] !== status)) { - return; - } - ThreadUpdater.thread.setStatus(type, status); - change = type === 'Sticky' ? status ? 'now a sticky' : 'not a sticky anymore' : status ? 'now closed' : 'not closed anymore'; - return new Notice('info', "The thread is " + change + ".", 30); - }, - parse: function(postObjects) { - var OP, count, deletedFiles, deletedPosts, files, index, node, num, post, postObject, posts, root, scroll, _i, _j, _len, _len1; - OP = postObjects[0]; - Build.spoilerRange[ThreadUpdater.thread.board] = OP.custom_spoiler; - ThreadUpdater.updateThreadStatus('Sticky', !!OP.sticky); - ThreadUpdater.updateThreadStatus('Closed', !!OP.closed); - ThreadUpdater.thread.postLimit = !!OP.bumplimit; - ThreadUpdater.thread.fileLimit = !!OP.imagelimit; - posts = []; - index = []; - files = []; - count = 0; - for (_i = 0, _len = postObjects.length; _i < _len; _i++) { - postObject = postObjects[_i]; - num = postObject.no; - index.push(num); - if (postObject.fsize) { - files.push(num); - } - if (num <= ThreadUpdater.lastPost) { - continue; - } - count++; - node = Build.postFromObject(postObject, ThreadUpdater.thread.board.ID); - posts.push(new Post(node, ThreadUpdater.thread, ThreadUpdater.thread.board)); - } - deletedPosts = []; - deletedFiles = []; - ThreadUpdater.thread.posts.forEach(function(post) { - var ID; - ID = +post.ID; - if (__indexOf.call(index, ID) < 0) { - post.kill(); - deletedPosts.push(post); - } else if (post.isDead) { - post.resurrect(); - } else if (post.file && !(post.file.isDead || __indexOf.call(files, ID) >= 0)) { - post.kill(true); - deletedFiles.push(post); - } - if (ThreadUpdater.postID && ThreadUpdater.postID === ID) { - return ThreadUpdater.foundPost = true; - } - }); - if (!count) { - ThreadUpdater.set('status', null, null); - ThreadUpdater.outdateCount++; - } else { - ThreadUpdater.set('status', "+" + count, 'new'); - ThreadUpdater.outdateCount = 0; - if (Conf['Beep'] && d.hidden && Unread.posts && !Unread.posts.length) { - if (!ThreadUpdater.audio) { - ThreadUpdater.audio = $.el('audio', { - src: ThreadUpdater.beep - }); - } - ThreadUpdater.audio.play(); - } - ThreadUpdater.lastPost = posts[count - 1].ID; - Main.callbackNodes(Post, posts); - scroll = Conf['Auto Scroll'] && ThreadUpdater.scrollBG() && ThreadUpdater.root.getBoundingClientRect().bottom - doc.clientHeight < 25; - for (_j = 0, _len1 = posts.length; _j < _len1; _j++) { - post = posts[_j]; - root = post.nodes.root; - if (post.cb) { - if (!post.cb()) { - $.add(ThreadUpdater.root, root); - } - } else { - $.add(ThreadUpdater.root, root); - } - } - if (scroll) { - if (Conf['Bottom Scroll']) { - window.scrollTo(0, d.body.clientHeight); - } else { - if (root) { - Header.scrollTo(root); - } - } - } - $.queueTask(function() { - var length, threadID; - threadID = ThreadUpdater.thread.ID; - length = $$('.thread > .postContainer', ThreadUpdater.root).length; - return Fourchan.parseThread(threadID, length - count, length); - }); - } - return $.event('ThreadUpdate', { - 404: false, - thread: ThreadUpdater.thread, - newPosts: posts, - deletedPosts: deletedPosts, - deletedFiles: deletedFiles, - postCount: OP.replies + 1, - fileCount: OP.images + (!!ThreadUpdater.thread.OP.file && !ThreadUpdater.thread.OP.file.isDead) - }); - } - }; - - ThreadWatcher = { - init: function() { - var now, sc; - if (!Conf['Thread Watcher']) { - return; - } - this.shortcut = sc = $.el('a', { - id: 'watcher-link', - textContent: 'Watcher', - href: 'javascript:;', - className: 'disabled fa fa-eye' - }); - this.db = new DataBoard('watchedThreads', this.refresh, true); - this.dialog = UI.dialog('thread-watcher', 'top: 50px; left: 0px;', "
Thread Watcher ×
"); - this.status = $('#watcher-status', this.dialog); - this.list = this.dialog.lastElementChild; - $.on(d, 'QRPostSuccessful', this.cb.post); - if (g.VIEW === 'thread') { - $.on(d, 'ThreadUpdate', this.cb.threadUpdate); - } - $.on(sc, 'click', this.toggleWatcher); - $.on($('.move>.close', ThreadWatcher.dialog), 'click', this.toggleWatcher); - $.on(d, '4chanXInitFinished', this.ready); - switch (g.VIEW) { - case 'index': - $.on(d, 'IndexRefresh', this.cb.onIndexRefresh); - break; - case 'thread': - $.on(d, 'ThreadUpdate', this.cb.onThreadRefresh); - } - if (Conf['Toggleable Thread Watcher']) { - Header.addShortcut(sc); - $.addClass(doc, 'fixed-watcher'); - } - now = Date.now(); - if ((this.db.data.lastChecked || 0) < now - 2 * $.HOUR) { - this.db.data.lastChecked = now; - ThreadWatcher.fetchAllStatus(); - this.db.save(); - } - return Thread.callbacks.push({ - name: 'Thread Watcher', - cb: this.node - }); - }, - node: function() { - var toggler; - toggler = $.el('img', { - className: 'watch-thread-link' - }); - $.on(toggler, 'click', ThreadWatcher.cb.toggle); - return $.before($('input', this.OP.nodes.post), toggler); - }, - ready: function() { - $.off(d, '4chanXInitFinished', ThreadWatcher.ready); - if (!Main.isThisPageLegit()) { - return; - } - ThreadWatcher.refresh(); - $.add(d.body, ThreadWatcher.dialog); - if (Conf['Toggleable Thread Watcher']) { - ThreadWatcher.dialog.hidden = true; - } - if (!Conf['Auto Watch']) { - return; - } - return $.get('AutoWatch', 0, function(_arg) { - var AutoWatch, thread; - AutoWatch = _arg.AutoWatch; - if (!(thread = g.BOARD.threads[AutoWatch])) { - return; - } - ThreadWatcher.add(thread); - return $["delete"]('AutoWatch'); - }); - }, - toggleWatcher: function() { - $.toggleClass(ThreadWatcher.shortcut, 'disabled'); - return ThreadWatcher.dialog.hidden = !ThreadWatcher.dialog.hidden; - }, - cb: { - openAll: function() { - var a, _i, _len, _ref; - if ($.hasClass(this, 'disabled')) { - return; - } - _ref = $$('a[title]', ThreadWatcher.list); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - $.open(a.href); - } - return $.event('CloseMenu'); - }, - checkThreads: function() { - if ($.hasClass(this, 'disabled')) { - return; - } - return ThreadWatcher.fetchAllStatus(); - }, - pruneDeads: function() { - var boardID, data, threadID, _i, _len, _ref, _ref1; - if ($.hasClass(this, 'disabled')) { - return; - } - _ref = ThreadWatcher.getAll(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; - if (!data.isDead) { - continue; - } - delete ThreadWatcher.db.data.boards[boardID][threadID]; - ThreadWatcher.db.deleteIfEmpty({ - boardID: boardID - }); - } - ThreadWatcher.db.save(); - ThreadWatcher.refresh(); - return $.event('CloseMenu'); - }, - toggle: function() { - return ThreadWatcher.toggle(Get.postFromNode(this).thread); - }, - rm: function() { - var boardID, threadID, _ref; - _ref = this.parentNode.dataset.fullID.split('.'), boardID = _ref[0], threadID = _ref[1]; - return ThreadWatcher.rm(boardID, +threadID); - }, - post: function(e) { - var board, postID, threadID, _ref; - _ref = e.detail, board = _ref.board, postID = _ref.postID, threadID = _ref.threadID; - if (postID === threadID) { - if (Conf['Auto Watch']) { - return $.set('AutoWatch', threadID); - } - } else if (Conf['Auto Watch Reply']) { - return ThreadWatcher.add(board.threads[threadID]); - } - }, - onIndexRefresh: function() { - var boardID, data, db, threadID, _ref; - db = ThreadWatcher.db; - boardID = g.BOARD.ID; - _ref = db.data.boards[boardID]; - for (threadID in _ref) { - data = _ref[threadID]; - if (!data.isDead && !(threadID in g.BOARD.threads)) { - if (Conf['Auto Prune']) { - ThreadWatcher.db["delete"]({ - boardID: boardID, - threadID: threadID - }); - } else { - data.isDead = true; - ThreadWatcher.db.set({ - boardID: boardID, - threadID: threadID, - val: data - }); - } - } - } - return ThreadWatcher.refresh(); - }, - onThreadRefresh: function(e) { - var thread; - thread = e.detail.thread; - if (!(e.detail[404] && ThreadWatcher.db.get({ - boardID: thread.board.ID, - threadID: thread.ID - }))) { - return; - } - return ThreadWatcher.add(thread); - } - }, - fetchCount: { - fetched: 0, - fetching: 0 - }, - fetchAllStatus: function() { - var thread, threads, _i, _len; - if (!(threads = ThreadWatcher.getAll()).length) { - return; - } - ThreadWatcher.status.textContent = '...'; - for (_i = 0, _len = threads.length; _i < _len; _i++) { - thread = threads[_i]; - ThreadWatcher.fetchStatus(thread); - } - }, - fetchStatus: function(_arg) { - var boardID, data, fetchCount, threadID; - boardID = _arg.boardID, threadID = _arg.threadID, data = _arg.data; - if (data.isDead) { - return; - } - fetchCount = ThreadWatcher.fetchCount; - fetchCount.fetching++; - return $.ajax("//a.4cdn.org/" + boardID + "/res/" + threadID + ".json", { - onloadend: function() { - var status; - fetchCount.fetched++; - if (fetchCount.fetched === fetchCount.fetching) { - fetchCount.fetched = 0; - fetchCount.fetching = 0; - status = ''; - } else { - status = "" + (Math.round(fetchCount.fetched / fetchCount.fetching * 100)) + "%"; - } - ThreadWatcher.status.textContent = status; - if (this.status !== 404) { - return; - } - if (Conf['Auto Prune']) { - ThreadWatcher.db["delete"]({ - boardID: boardID, - threadID: threadID - }); - } else { - data.isDead = true; - ThreadWatcher.db.set({ - boardID: boardID, - threadID: threadID, - val: data - }); - } - return ThreadWatcher.refresh(); - } - }, { - type: 'head' - }); - }, - getAll: function() { - var all, boardID, data, threadID, threads, _ref; - all = []; - _ref = ThreadWatcher.db.data.boards; - for (boardID in _ref) { - threads = _ref[boardID]; - if (Conf['Current Board'] && boardID !== g.BOARD.ID) { - continue; - } - for (threadID in threads) { - data = threads[threadID]; - all.push({ - boardID: boardID, - threadID: threadID, - data: data - }); - } - } - return all; - }, - makeLine: function(boardID, threadID, data) { - var div, fullID, href, link, x; - x = $.el('a', { - className: 'fa fa-times', - href: 'javascript:;' - }); - $.on(x, 'click', ThreadWatcher.cb.rm); - if (data.isDead) { - href = Redirect.to('thread', { - boardID: boardID, - threadID: threadID - }); - } - link = $.el('a', { - href: href || ("/" + boardID + "/res/" + threadID), - textContent: data.excerpt, - title: data.excerpt - }); - div = $.el('div'); - fullID = "" + boardID + "." + threadID; - div.dataset.fullID = fullID; - if (g.VIEW === 'thread' && fullID === ("" + g.BOARD + "." + g.THREADID)) { - $.addClass(div, 'current'); - } - if (data.isDead) { - $.addClass(div, 'dead-thread'); - } - $.add(div, [x, $.tn(' '), link]); - return div; - }, - refresh: function() { - var boardID, data, helper, list, nodes, refresher, thread, threadID, threads, toggler, watched, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3; - nodes = []; - _ref = ThreadWatcher.getAll(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], boardID = _ref1.boardID, threadID = _ref1.threadID, data = _ref1.data; - nodes.push(ThreadWatcher.makeLine(boardID, threadID, data)); - } - list = ThreadWatcher.list; - $.rmAll(list); - $.add(list, nodes); - threads = g.BOARD.threads; - _ref2 = threads.keys; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - threadID = _ref2[_j]; - thread = threads[threadID]; - toggler = $('.watch-thread-link', thread.OP.nodes.post); - watched = ThreadWatcher.db.get({ - boardID: thread.board.ID, - threadID: threadID - }); - helper = watched ? ['addClass', 'Unwatch'] : ['rmClass', 'Watch']; - $[helper[0]](toggler, 'watched'); - toggler.title = "" + helper[1] + " Thread"; - } - _ref3 = ThreadWatcher.menu.refreshers; - for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { - refresher = _ref3[_k]; - refresher(); - } - }, - toggle: function(thread) { - var boardID, threadID; - boardID = thread.board.ID; - threadID = thread.ID; - if (ThreadWatcher.db.get({ - boardID: boardID, - threadID: threadID - })) { - return ThreadWatcher.rm(boardID, threadID); - } else { - return ThreadWatcher.add(thread); - } - }, - add: function(thread) { - var boardID, data, threadID; - data = {}; - boardID = thread.board.ID; - threadID = thread.ID; - if (thread.isDead) { - if (Conf['Auto Prune'] && ThreadWatcher.db.get({ - boardID: boardID, - threadID: threadID - })) { - ThreadWatcher.rm(boardID, threadID); - return; - } - data.isDead = true; - } - data.excerpt = Get.threadExcerpt(thread); - ThreadWatcher.db.set({ - boardID: boardID, - threadID: threadID, - val: data - }); - return ThreadWatcher.refresh(); - }, - rm: function(boardID, threadID) { - ThreadWatcher.db["delete"]({ - boardID: boardID, - threadID: threadID - }); - return ThreadWatcher.refresh(); - }, - convert: function(oldFormat) { - var boardID, data, newFormat, threadID, threads; - newFormat = {}; - for (boardID in oldFormat) { - threads = oldFormat[boardID]; - for (threadID in threads) { - data = threads[threadID]; - (newFormat[boardID] || (newFormat[boardID] = {}))[threadID] = { - excerpt: data.textContent - }; - } - } - return newFormat; - }, - menu: { - refreshers: [], - init: function() { - var menu; - if (!Conf['Thread Watcher']) { - return; - } - menu = new UI.Menu('thread watcher'); - $.on($('.menu-button', ThreadWatcher.dialog), 'click', function(e) { - return menu.toggle(e, this, ThreadWatcher); - }); - this.addHeaderMenuEntry(); - return this.addMenuEntries(); - }, - addHeaderMenuEntry: function() { - var entryEl; - if (g.VIEW !== 'thread') { - return; - } - entryEl = $.el('a', { - href: 'javascript:;' - }); - $.event('AddMenuEntry', { - type: 'header', - el: entryEl, - order: 60 - }); - $.on(entryEl, 'click', function() { - return ThreadWatcher.toggle(g.threads["" + g.BOARD + "." + g.THREADID]); - }); - return this.refreshers.push(function() { - var addClass, rmClass, text, _ref; - _ref = $('.current', ThreadWatcher.list) ? ['unwatch-thread', 'watch-thread', 'Unwatch thread'] : ['watch-thread', 'unwatch-thread', 'Watch thread'], addClass = _ref[0], rmClass = _ref[1], text = _ref[2]; - $.addClass(entryEl, addClass); - $.rmClass(entryEl, rmClass); - return entryEl.textContent = text; - }); - }, - addMenuEntries: function() { - var cb, conf, entries, entry, name, refresh, subEntries, _i, _len, _ref, _ref1; - entries = []; - entries.push({ - cb: ThreadWatcher.cb.openAll, - entry: { - type: 'thread watcher', - el: $.el('a', { - textContent: 'Open all threads' - }) - }, - refresh: function() { - return (ThreadWatcher.list.firstElementChild ? $.rmClass : $.addClass)(this.el, 'disabled'); - } - }); - entries.push({ - cb: ThreadWatcher.cb.checkThreads, - entry: { - type: 'thread watcher', - el: $.el('a', { - textContent: 'Check 404\'d threads' - }) - }, - refresh: function() { - return ($('div:not(.dead-thread)', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); - } - }); - entries.push({ - cb: ThreadWatcher.cb.pruneDeads, - entry: { - type: 'thread watcher', - el: $.el('a', { - textContent: 'Prune 404\'d threads' - }) - }, - refresh: function() { - return ($('.dead-thread', ThreadWatcher.list) ? $.rmClass : $.addClass)(this.el, 'disabled'); - } - }); - subEntries = []; - _ref = Config.threadWatcher; - for (name in _ref) { - conf = _ref[name]; - subEntries.push(this.createSubEntry(name, conf[1])); - } - entries.push({ - entry: { - type: 'thread watcher', - el: $.el('span', { - textContent: 'Settings' - }), - subEntries: subEntries - } - }); - for (_i = 0, _len = entries.length; _i < _len; _i++) { - _ref1 = entries[_i], entry = _ref1.entry, cb = _ref1.cb, refresh = _ref1.refresh; - if (entry.el.nodeName === 'A') { - entry.el.href = 'javascript:;'; - } - if (cb) { - $.on(entry.el, 'click', cb); - } - if (refresh) { - this.refreshers.push(refresh.bind(entry)); - } - $.event('AddMenuEntry', entry); - } - }, - createSubEntry: function(name, desc) { - var entry, input; - entry = { - type: 'thread watcher', - el: $.el('label', { - innerHTML: " " + name, - title: desc - }) - }; - input = entry.el.firstElementChild; - input.checked = Conf[name]; - $.on(input, 'change', $.cb.checked); - if (name === 'Current Board') { - $.on(input, 'change', ThreadWatcher.refresh); - } - return entry; - } - } - }; - - Unread = { - init: function() { - if (g.VIEW !== 'thread' || !Conf['Unread Count'] && !Conf['Unread Favicon'] && !Conf['Desktop Notifications']) { - return; - } - this.db = new DataBoard('lastReadPosts', this.sync); - this.hr = $.el('hr', { - id: 'unread-line' - }); - this.posts = new RandomAccessList; - this.postsQuotingYou = []; - return Thread.callbacks.push({ - name: 'Unread', - cb: this.node - }); - }, - disconnect: function() { - var hr, name, _i, _len, _ref; - if (g.VIEW !== 'thread' || !Conf['Unread Count'] && !Conf['Unread Favicon'] && !Conf['Desktop Notifications']) { - return; - } - Unread.db.disconnect(); - if (hr = Unread.hr, Unread) { - $.rm(hr); - } - _ref = ['db', 'hr', 'posts', 'postsQuotingYou', 'thread', 'title', 'lastReadPost']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - delete this[name]; - } - $.off(d, '4chanXInitFinished', this.ready); - $.off(d, 'ThreadUpdate', this.onUpdate); - $.off(d, 'scroll visibilitychange', this.read); - if (Conf['Unread Line']) { - $.off(d, 'visibilitychange', this.setLine); - } - return Thread.callbacks.disconnect('Unread'); - }, - node: function() { - Unread.thread = this; - Unread.title = d.title; - Unread.lastReadPost = Unread.db.get({ - boardID: this.board.ID, - threadID: this.ID, - defaultValue: 0 - }); - $.on(d, '4chanXInitFinished', Unread.ready); - $.on(d, 'ThreadUpdate', Unread.onUpdate); - $.on(d, 'scroll visibilitychange', Unread.read); - if (Conf['Unread Line']) { - return $.on(d, 'visibilitychange', Unread.setLine); - } - }, - ready: function() { - var posts; - $.off(d, '4chanXInitFinished', Unread.ready); - if (!Conf['Quote Threading']) { - posts = []; - Unread.thread.posts.forEach(function(post) { - if (post.isReply) { - return posts.push(post); - } - }); - Unread.addPosts(posts); - } - if (Conf['Quote Threading']) { - QuoteThreading.force(); - } - if (Conf['Scroll to Last Read Post']) { - return Unread.scroll(); - } - }, - scroll: function() { - var down, hash, keys, post, posts, root; - if ((hash = location.hash.match(/\d+/)) && hash[0] in Unread.thread.posts) { - return; - } - if (post = Unread.posts.first) { - while (root = $.x('preceding-sibling::div[contains(@class,"replyContainer")][1]', post.data.nodes.root)) { - if (!(post = Get.postFromRoot(root)).isHidden) { - break; - } - } - if (!root) { - return; - } - down = true; - } else { - posts = Unread.thread.posts; - keys = posts.keys; - root = posts[keys[keys.length - 1]].nodes.root; - } - if (Header.getBottomOf(root) < 0) { - return Header.scrollTo(root, down); - } - }, - sync: function() { - var ID, lastReadPost, post; - lastReadPost = Unread.db.get({ - boardID: Unread.thread.board.ID, - threadID: Unread.thread.ID, - defaultValue: 0 - }); - if (!(Unread.lastReadPost < lastReadPost)) { - return; - } - Unread.lastReadPost = lastReadPost; - post = Unread.posts.first; - while (post) { - if ((ID = post.ID, post) > Unread.lastReadPost) { - break; - } - post = post.next; - Unread.posts.rm(ID); - } - Unread.readArray(Unread.postsQuotingYou); - if (Conf['Unread Line']) { - Unread.setLine(); - } - return Unread.update(); - }, - addPosts: function(posts) { - var ID, post, _i, _len, _ref, _ref1; - for (_i = 0, _len = posts.length; _i < _len; _i++) { - post = posts[_i]; - ID = post.ID; - if (ID <= Unread.lastReadPost || post.isHidden || QR.db.get({ - boardID: post.board.ID, - threadID: post.thread.ID, - postID: ID - })) { - continue; - } - Unread.posts.push(post); - Unread.addPostQuotingYou(post); - } - if (Conf['Unread Line']) { - Unread.setLine((_ref = (_ref1 = Unread.posts.first) != null ? _ref1.data : void 0, __indexOf.call(posts, _ref) >= 0)); - } - Unread.read(); - return Unread.update(); - }, - addPostQuotingYou: function(post) { - var quotelink, _i, _len, _ref; - _ref = post.nodes.quotelinks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - quotelink = _ref[_i]; - if (!(QR.db.get(Get.postDataFromLink(quotelink)))) { - continue; - } - Unread.postsQuotingYou.push(post); - Unread.openNotification(post); - return; - } - }, - openNotification: function(post) { - var name, notif; - if (!Header.areNotificationsEnabled) { - return; - } - name = Conf['Anonymize'] ? 'Anonymous' : $('.nameBlock', post.nodes.info).textContent.trim(); - notif = new Notification("" + name + " replied to you", { - body: post.info.comment, - icon: Favicon.logo - }); - notif.onclick = function() { - Header.scrollToIfNeeded(post.nodes.root, true); - return window.focus(); - }; - return notif.onshow = function() { - return setTimeout(function() { - return notif.close(); - }, 7 * $.SECOND); - }; - }, - onUpdate: function(e) { - if (e.detail[404]) { - return Unread.update(); - } else if (!Conf['Quote Threading']) { - return Unread.addPosts(e.detail.newPosts); - } else { - Unread.read(); - return Unread.update(); - } - }, - readSinglePost: function(post) { - var ID, i, posts; - ID = post.ID; - posts = Unread.posts; - if (!posts[ID]) { - return; - } - if (post === posts.first) { - Unread.lastReadPost = ID; - Unread.saveLastReadPost(); - } - posts.rm(ID); - if ((i = Unread.postsQuotingYou.indexOf(post)) !== -1) { - Unread.postsQuotingYou.splice(i, 1); - } - return Unread.update(); - }, - readArray: function(arr) { - var i, post, _i, _len; - for (i = _i = 0, _len = arr.length; _i < _len; i = ++_i) { - post = arr[i]; - if (post.ID > Unread.lastReadPost) { - break; - } - } - return arr.splice(0, i); - }, - read: $.debounce(100, function(e) { - var ID, data, height, post, posts; - if (d.hidden || !Unread.posts.length) { - return; - } - height = doc.clientHeight; - posts = Unread.posts; - while (post = posts.first) { - if (!(Header.getBottomOf(post.data.nodes.root) > -1)) { - break; - } - ID = post.ID, data = post.data; - posts.rm(ID); - if (Conf['Mark Quotes of You'] && QR.db.get({ - boardID: data.board.ID, - threadID: data.thread.ID, - postID: ID - })) { - QuoteYou.lastRead = data.nodes.root; - } - } - if (!ID) { - return; - } - if (Unread.lastReadPost < ID || !Unread.lastReadPost) { - Unread.lastReadPost = ID; - } - Unread.saveLastReadPost(); - Unread.readArray(Unread.postsQuotingYou); - if (e) { - return Unread.update(); - } - }), - saveLastReadPost: $.debounce(2 * $.SECOND, function() { - if (Unread.thread.isDead) { - return; - } - return Unread.db.set({ - boardID: Unread.thread.board.ID, - threadID: Unread.thread.ID, - val: Unread.lastReadPost - }); - }), - setLine: function(force) { - var post; - if (!(d.hidden || force === true)) { - return; - } - if (!(post = Unread.posts.first)) { - return $.rm(Unread.hr); - } - if ($.x('preceding-sibling::div[contains(@class,"replyContainer")]', post.data.nodes.root)) { - return $.before(post.data.nodes.root, Unread.hr); - } - }, - update: function() { - var count; - count = Unread.posts.length; - if (Conf['Unread Count']) { - d.title = "" + (Conf['Quoted Title'] && Unread.postsQuotingYou.length ? '(!) ' : '') + (count || !Conf['Hide Unread Count at (0)'] ? "(" + count + ") " : '') + (g.DEAD ? "/" + g.BOARD + "/ - 404" : "" + Unread.title); - } - if (!Conf['Unread Favicon']) { - return; - } - Favicon.el.href = g.DEAD ? Unread.postsQuotingYou[0] ? Favicon.unreadDeadY : count ? Favicon.unreadDead : Favicon.dead : count ? Unread.postsQuotingYou[0] ? Favicon.unreadY : Favicon.unread : Favicon["default"]; - return $.add(d.head, Favicon.el); - } - }; - - Redirect = { - init: function() { - var archive, archives, boardID, boards, data, files, id, name, o, record, software, type, _i, _j, _len, _len1, _ref, _ref1, _ref2; - o = { - thread: {}, - post: {}, - file: {} - }; - archives = {}; - _ref = Redirect.archives; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], name = _ref1.name, boards = _ref1.boards, files = _ref1.files, data = _ref1.data; - archives[name] = { - boards: boards, - files: files, - data: data - }; - software = data.software; - for (_j = 0, _len1 = boards.length; _j < _len1; _j++) { - boardID = boards[_j]; - if (!(boardID in o.thread)) { - o.thread[boardID] = data; - } - if (!(boardID in o.post || software !== 'foolfuuka')) { - o.post[boardID] = data; - } - if (!(boardID in o.file || __indexOf.call(files, boardID) < 0)) { - o.file[boardID] = data; - } - } - } - _ref2 = Conf['selectedArchives']; - for (boardID in _ref2) { - record = _ref2[boardID]; - for (type in record) { - id = record[type]; - if (!((archive = archives[id]))) { - continue; - } - boards = type === 'file' ? archive.files : archive.boards; - if (__indexOf.call(boards, boardID) < 0) { - continue; - } - o[type][boardID] = archive.data; - } - } - return Redirect.data = o; - }, - archives: [ - { - name: "Foolz", - boards: ["a", "biz", "co", "diy", "gd", "jp", "m", "sci", "sp", "tg", "tv", "v", "vg", "vp", "vr", "wsg"], - files: ["a", "biz", "diy", "gd", "jp", "m", "sci", "tg", "vg", "vp", "vr", "wsg"], - data: { - domain: "archive.foolz.us", - http: false, - https: true, - software: "foolfuuka" - } - }, { - name: "NSFW Foolz", - boards: ["u"], - files: ["u"], - data: { - domain: "nsfw.foolz.us", - http: false, - https: true, - software: "foolfuuka" - } - }, { - name: "The Dark Cave", - boards: ["c", "int", "out", "po"], - files: ["c", "po"], - data: { - domain: "archive.thedarkcave.org", - http: true, - https: true, - software: "foolfuuka" - } - }, { - name: "4plebs", - boards: ["adv", "hr", "o", "pol", "s4s", "tg", "tv", "x"], - files: ["adv", "hr", "o", "pol", "s4s", "tg", "tv", "x"], - data: { - domain: "archive.4plebs.org", - http: true, - https: true, - software: "foolfuuka" - } - }, { - name: "Nyafuu", - boards: ["c", "e", "w", "wg"], - files: ["c", "e", "w", "wg"], - data: { - domain: "archive.nyafuu.org", - http: true, - https: true, - software: "foolfuuka" - } - }, { - name: "Love is Over", - boards: ["d", "i"], - files: ["d", "i"], - data: { - domain: "loveisover.me", - http: true, - https: true, - software: "foolfuuka" - } - }, { - name: "Rebecca Black Tech", - boards: ["cgl", "g", "mu", "w"], - files: ["cgl", "g", "mu", "w"], - data: { - domain: "archive.rebeccablacktech.com", - http: true, - https: true, - software: "fuuka" - } - }, { - name: "Heinessen", - boards: ["an", "fit", "k", "mlp", "r9k", "toy"], - files: ["an", "fit", "k", "r9k", "toy"], - data: { - domain: "archive.heinessen.com", - http: true, - software: "fuuka" - } - }, { - name: "warosu", - boards: ["3", "biz", "cgl", "ck", "diy", "fa", "g", "ic", "jp", "lit", "sci", "tg", "vr"], - files: ["3", "biz", "cgl", "ck", "diy", "fa", "ic", "jp", "lit", "sci", "tg", "vr"], - data: { - domain: "fuuka.warosu.org", - https: true, - software: "fuuka" - } - }, { - name: "fgts", - boards: ["r", "soc"], - files: ["r", "soc"], - data: { - domain: "fgst.eu", - http: true, - https: true, - software: "foolfuuka" - } - }, { - name: "maware", - boards: ["t"], - files: ["t"], - data: { - domain: "archive.mawa.re", - http: true, - software: "foolfuuka" - } - }, { - name: "InstallGentoo", - boards: ["g", "t"], - files: ["g", "t"], - data: { - domain: "chan.installgentoo.com", - http: true, - software: "foolfuuka" - } - }, { - name: "Foolz Beta", - boards: ["a", "biz", "co", "d", "diy", "gd", "jp", "m", "mlp", "s4s", "sci", "sp", "tg", "tv", "u", "v", "vg", "vp", "vr", "wsg"], - files: ["a", "biz", "d", "diy", "gd", "jp", "m", "s4s", "sci", "tg", "u", "vg", "vp", "vr", "wsg"], - data: { - domain: "beta.foolz.us", - http: true, - https: true, - withCredentials: true, - software: "foolfuuka" - } - } - ], - to: function(dest, data) { - var archive; - archive = (dest === 'search' ? Redirect.data.thread : Redirect.data[dest])[data.boardID]; - if (!archive) { - return ''; - } - return Redirect[dest](archive, data); - }, - protocol: function(archive) { - var protocol; - protocol = location.protocol; - if (!archive[protocol.slice(0, -1)]) { - protocol = protocol === 'https:' ? 'http:' : 'https:'; - } - return "" + protocol + "//"; - }, - thread: function(archive, _arg) { - var boardID, path, postID, threadID; - boardID = _arg.boardID, threadID = _arg.threadID, postID = _arg.postID; - path = threadID ? "" + boardID + "/thread/" + threadID : "" + boardID + "/post/" + postID; - if (archive.software === 'foolfuuka') { - path += '/'; - } - if (threadID && postID) { - path += archive.software === 'foolfuuka' ? "#" + postID : "#p" + postID; - } - return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; - }, - post: function(archive, _arg) { - var URL, boardID, postID; - boardID = _arg.boardID, postID = _arg.postID; - URL = new String("" + (Redirect.protocol(archive)) + archive.domain + "/_/api/chan/post/?board=" + boardID + "&num=" + postID); - URL.archive = archive; - return URL; - }, - file: function(archive, _arg) { - var boardID, filename; - boardID = _arg.boardID, filename = _arg.filename; - return "" + (Redirect.protocol(archive)) + archive.domain + "/" + boardID + "/full_image/" + filename; - }, - search: function(archive, _arg) { - var boardID, path, type, value; - boardID = _arg.boardID, type = _arg.type, value = _arg.value; - type = type === 'name' ? 'username' : type === 'MD5' ? 'image' : type; - value = encodeURIComponent(value); - path = archive.software === 'foolfuuka' ? "" + boardID + "/search/" + type + "/" + value : "" + boardID + "/?task=search2&search_" + (type === 'image' ? 'media_hash' : type) + "=" + value; - return "" + (Redirect.protocol(archive)) + archive.domain + "/" + path; - } - }; - - PSAHiding = { - init: function() { - if (!Conf['Announcement Hiding']) { - return; - } - $.addClass(doc, 'hide-announcement'); - return $.on(d, '4chanXInitFinished', this.setup); - }, - setup: function() { - var btn, entry, psa; - $.off(d, '4chanXInitFinished', PSAHiding.setup); - if (!(psa = $.id('globalMessage'))) { - $.rmClass(doc, 'hide-announcement'); - return; - } - entry = { - type: 'header', - el: $.el('a', { - textContent: 'Show announcement', - className: 'show-announcement', - href: 'javascript:;' - }), - order: 50, - open: function() { - return psa.hidden; - } - }; - $.event('AddMenuEntry', entry); - $.on(entry.el, 'click', PSAHiding.toggle); - PSAHiding.btn = btn = $.el('span', { - innerHTML: '[Dismiss]', - title: 'Mark announcement as read and hide.', - className: 'hide-announcement', - href: 'javascript:;' - }); - $.on(btn, 'click', PSAHiding.toggle); - $.get('hiddenPSA', 0, function(_arg) { - var hiddenPSA; - hiddenPSA = _arg.hiddenPSA; - PSAHiding.sync(hiddenPSA); - $.add(psa, btn); - return $.rmClass(doc, 'hide-announcement'); - }); - return $.sync('hiddenPSA', PSAHiding.sync); - }, - toggle: function(e) { - var UTC; - if ($.hasClass(this, 'hide-announcement')) { - UTC = +$.id('globalMessage').dataset.utc; - $.set('hiddenPSA', UTC); - } else { - $.event('CloseMenu'); - $["delete"]('hiddenPSA'); - } - return PSAHiding.sync(UTC); - }, - sync: function(UTC) { - var hr, psa; - psa = $.id('globalMessage'); - psa.hidden = PSAHiding.btn.hidden = UTC && UTC >= +psa.dataset.utc ? true : false; - if ((hr = psa.nextElementSibling) && hr.nodeName === 'HR') { - return hr.hidden = psa.hidden; - } - } - }; - - Banner = { - init: function() { - return $.asap((function() { - return d.body; - }), function() { - return $.asap((function() { - return $('.abovePostForm'); - }), Banner.ready); - }); - }, - ready: function() { - var banner, child, children, i; - banner = $(".boardBanner"); - children = banner.children; - i = 0; - while (child = children[i++]) { - if (i === 1) { - child.id = "Banner"; - child.title = "Click to change"; - $.on(child, 'click', Banner.cb.toggle); - continue; - } - if (Conf['Custom Board Titles']) { - Banner.custom(child).title = "Ctrl+click to edit board " + (i === 3 ? 'sub' : '') + "title"; - child.spellcheck = false; - } - } - }, - cb: { - toggle: (function() { - var types; - types = { - jpg: 227, - png: 270, - gif: 253 - }; - return function() { - var num, type; - type = Object.keys(types)[Math.floor(3 * Math.random())]; - num = Math.floor(types[type] * Math.random()); - return this.src = "//static.4chan.org/image/title/" + num + "." + type; - }; - })(), - click: function(e) { - if (e.ctrlKey) { - this.contentEditable = true; - return this.focus(); - } - }, - keydown: function(e) { - e.stopPropagation(); - if (!e.shiftKey && e.keyCode === 13) { - return this.blur(); - } - }, - focus: function() { - var items, string, string2; - this.textContent = this.innerHTML; - string = "" + g.BOARD + "." + this.className; - string2 = "" + string + ".orig"; - items = { - title: this.innerHTML - }; - items[string] = ''; - items[string2] = false; - $.get(items, function(items) { - if (!(items[string2] && items.title === items[string])) { - return $.set(string2, items.title); - } - }); - }, - blur: function() { - this.innerHTML = this.textContent; - this.contentEditable = false; - return $.set("" + g.BOARD + "." + this.className, this.textContent); - } - }, - custom: function(child) { - var cachedTest, string; - cachedTest = child.innerHTML; - string = "" + g.BOARD + "." + child.className; - $.on(child, 'click keydown focus blur', function(e) { - return Banner.cb[e.type].apply(this, [e]); - }); - $.get(string, cachedTest, function(item) { - var string2, title; - if (!(title = item[string])) { - return; - } - if (Conf['Persistent Custom Board Titles']) { - return child.innerHTML = title; - } - string2 = "" + string + ".orig"; - return $.get(string2, cachedTest, function(itemb) { - if (cachedTest === itemb[string2]) { - return child.innerHTML = title; - } else { - $.set(string, cachedTest); - return $.set(string2, cachedTest); - } - }); - }); - return child; - } - }; - - CatalogLinks = { - init: function() { - var el, input; - if (!Conf['Catalog Links']) { - return; - } - CatalogLinks.el = el = $.el('label', { - id: 'toggleCatalog', - href: 'javascript:;', - innerHTML: " Catalog Links" - }); - input = $('input', el); - $.on(input, 'change', this.toggle); - $.sync('Header catalog links', CatalogLinks.set); - $.event('AddMenuEntry', { - type: 'header', - el: el, - order: 95 - }); - return $.on(d, '4chanXInitFinished', function() { - return CatalogLinks.set(Conf['Header catalog links']); - }); - }, - toggle: function() { - $.event('CloseMenu'); - $.set('Header catalog links', this.checked); - return CatalogLinks.set(this.checked); - }, - set: function(useCatalog) { - var a, board, generateURL, path, _i, _len, _ref, _ref1; - path = useCatalog ? 'catalog' : ''; - generateURL = useCatalog && Conf['External Catalog'] ? CatalogLinks.external : function(board) { - return a.href = "/" + board + "/" + path; - }; - _ref = $$("#board-list a:not(.catalog), #boardNavDesktopFoot a"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - a = _ref[_i]; - if (((_ref1 = a.hostname) !== 'boards.4chan.org' && _ref1 !== 'catalog.neet.tv' && _ref1 !== '4index.gropes.us') || !(board = a.pathname.split('/')[1]) || (board === 'f' || board === 'status' || board === '4chan')) { - continue; - } - a.href = generateURL(board); - } - return CatalogLinks.el.title = "Turn catalog links " + (useCatalog ? 'off' : 'on') + "."; - }, - external: function(board) { - switch (board) { - case 'a': - case 'c': - case 'g': - case 'co': - case 'k': - case 'm': - case 'o': - case 'p': - case 'v': - case 'vg': - case 'w': - case 'cm': - case '3': - case 'adv': - case 'an': - case 'cgl': - case 'ck': - case 'diy': - case 'fa': - case 'fit': - case 'int': - case 'jp': - case 'mlp': - case 'lit': - case 'mu': - case 'n': - case 'po': - case 'sci': - case 'toy': - case 'trv': - case 'tv': - case 'vp': - case 'x': - case 'q': - return "http://catalog.neet.tv/" + board; - case 'd': - case 'e': - case 'gif': - case 'h': - case 'hr': - case 'hc': - case 'r9k': - case 's': - case 'pol': - case 'soc': - case 'u': - case 'i': - case 'ic': - case 'hm': - case 'r': - case 'w': - case 'wg': - case 'wsg': - case 't': - case 'y': - return "http://4index.gropes.us/" + board; - default: - return "/" + board + "/catalog"; - } - } - }; - - CustomCSS = { - init: function() { - if (!Conf['Custom CSS']) { - return; - } - return this.addStyle(); - }, - addStyle: function() { - return this.style = $.addStyle(Conf['usercss']); - }, - rmStyle: function() { - if (this.style) { - $.rm(this.style); - return delete this.style; - } - }, - update: function() { - if (!this.style) { - this.addStyle(); - } - return this.style.textContent = Conf['usercss']; - } - }; - - Dice = { - init: function() { - if (g.BOARD.ID !== 'tg' || g.VIEW === 'catalog' || !Conf['Show Dice Roll']) { - return; - } - return Post.callbacks.push({ - name: 'Show Dice Roll', - cb: this.node - }); - }, - node: function() { - var dicestats, roll, _ref; - if (this.isClone || !(dicestats = (_ref = this.info.email) != null ? _ref.match(/dice[+\s](\d+)d(\d+)/) : void 0)) { - return; - } - roll = $('b', this.nodes.comment).firstChild; - return roll.data = "Rolled " + dicestats[1] + "d" + dicestats[2] + ": " + (roll.data.slice(7)); - } - }; - - Emoji = { - init: function() { - var css, icon, name, pos, _ref; - if (!Conf['Emoji']) { - return; - } - pos = Conf['emojiPos']; - css = ["a.useremail[href]:last-of-type::" + pos + " {\n vertical-align: top;\n margin-" + (pos === "before" ? "right" : "left") + ": 5px;\n}\n"]; - this.icons["PlanNine"] = Emoji.icons["Plan9"]; - this.icons['Sage'] = Emoji.sage[Conf['sageEmoji']]; - _ref = this.icons; - for (name in _ref) { - icon = _ref[name]; - if (!this.icons.hasOwnProperty(name)) { - continue; - } - css.push("a.useremail[href*='" + name + "']:last-of-type::" + pos + ",\na.useremail[href*='" + (name.toLowerCase()) + "']:last-of-type::" + pos + ",\na.useremail[href*='" + (name.toUpperCase()) + "']:last-of-type::" + pos + " {\n content: url('data:image/png;base64," + icon + "');\n}\n"); - } - return $.addStyle(css.join(""), 'emoji'); - }, - sage: { - '4chan SS': 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAANCAMAAACuAq9NAAABIFBMVEUAAAAAXwAAOAAAVQAAKgAAOgAALwAAagAATwAAdAAAYAAAYwAARAAAcgAANwAAOAABcwEBZAEBXwEAQwABbwEBaQEBWgEBTwECdAICaQIIcwgBWQEIXAcARAAALgACdAICbQICdAICcAIBVQEBTgEAQgAAQwAkjCIcexomgSIcbRtCnj9IpUNEmT5LoUNYtFE9lDtClD5dtVJqwmNCmEFMoEh1zGcnfCYnfCc6jzc7kDs9kjxAlUBDmEFInUNLoEpMoExOo0tPpExQpU1Rpk1Sp0pSp1JXrFVZrlhar1Rar1pes1xftFhhtmFit19juFxkuVxovWRrwGBuw2Juw2Nuw2Ruw2V0yWx1ym14zWt6z2980W6A1XGD2HSD2XSI3XdgUJhRAAAAN3RSTlMACAkJDBobHyBERUVHR3KIiYyNkJmanZ6rrq+ws7S5vL29vsLFxsfP0dLU5eXn5+vt7e34+fn5LB88GQAAAI1JREFUGFdNzjsSwjAMRdGn2PngmZAUVHQshP0vArYQYCYDlmxLos3tTncx4xjdAMCEhR1ApLup+bPxtgsQzZ2Mr4iPYROEU129g6it0jJCv6xqFJlpKbl2kr21Zsl/Mo0IBpmrqg7ZnPfgSnKuqhrKwO+AVrSUOjmo5VcEuHzH9CEAXaTDYZ88HGh++QNCDFZ4bvbHSQAAAABJRU5ErkJggg==', - 'appchan': 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAABa1BMVEUAAACqrKiCgYIAAAAAAAAAAACHmX5pgl5NUEx/hnx4hXRSUVMiIyKwrbFzn19SbkZ1d3OvtqtpaWhcX1ooMyRsd2aWkZddkEV8vWGcpZl+kHd7jHNdYFuRmI4bHRthaV5WhUFsfGZReUBFZjdJazpGVUBnamYfHB9TeUMzSSpHgS1cY1k1NDUyOC8yWiFywVBoh1lDSEAZHBpucW0ICQgUHhBjfFhCRUA+QTtEQUUBAQFyo1praWspKigWFRZHU0F6j3E9Oz5VWFN0j2hncWONk4sAAABASDxJWkJKTUgAAAAvNC0fJR0DAwMAAAA9QzoWGhQAAAA8YytvrFOJsnlqyT9oqExqtkdrsExpsUsqQx9rpVJDbzBBbi5utk9jiFRuk11iqUR64k5Wf0JIZTpadk5om1BkyjmF1GRNY0FheFdXpjVXhz86XSp2yFJwslR3w1NbxitbtDWW5nNnilhFXTtYqDRwp1dSijiJ7H99AAAAUnRSTlMAJTgNGQml71ypu3cPEN/RDh8HBbOwQN7wVg4CAQZ28vs9EDluXjo58Ge8xwMy0P3+rV8cT73sawEdTv63NAa3rQwo4cUdAl3hWQSWvS8qqYsjEDiCzAAAAIVJREFUeNpFx7GKAQAYAOD/A7GbZVAWZTBZFGQw6LyCF/MIkiTdcOmWSzYbJVE2u1KX0J1v+8QDv/EkyS0yXF/NgeEILiHfyc74mICTQltqYXBeAWU9HGxU09YqqEvAElGjyZYjPyLqitjzHSEiGkrsfMWr0VLe+oy/djGP//YwfbeP8bN3Or0bkqEVblAAAAAASUVORK5CYII=' - }, - icons: { - 'Plan9': 'iVBORw0KGgoAAAANSUhEUgAAAAwAAAAPCAYAAAGn5h7fAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AoYAzE15J1s7QAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAACAElEQVQoz3WSz4sSARTHvzMjygpqYg3+KIhkE83DKtKlf0C9SrTRuZNEx0VowU6CuSeJNlwwpEO2kJ6SQBiIUAzFjRDF4wrjKosnGx3HmdehFDfpe/2+z/s++D5gU7IsEwRByICIiAEAIiIAYAFAXsjYVr/fLxMRNVvN+prJ5/OA3+/XERFNf02JyeVyDx0OxyvLNQsnimLKfcf9KRQKXQAAnE6nlf5qMpnQycnbP/kAoKoqsSwLAJhOp+AAwOv1otvtpqxWq73dbt/r9XqvEQ6HUalUEvF4XLd5IpvNZqlerzd5nlf6/f6tTCZjBACk0+nb+XxeW4UrikLJZPImAGA0Gq0NIqJyuSyyANDr9Q5Wu1utFvR6/SULAI1G4+vK8Pv90DTtGwsAJpPpaGUYDAZ0Op3PHAAEg8H3tVqtbrtu21sqyxuRSOQJk0ql9IvF4r7b7f7pcrlejkaj57IsH58Pzp8dvjhc/lsBk0gkbLFYrFqtVvd27+4qOk733ePxPDCbzVBVFfP5fCiK4rvhxfDN/qP9wSasGwwGMv1HiqJQsVg8ZlfTHMepkiR1t05gGJBGmM/nMBqNj9nN9kql0lNN064ARISzH2cQBAGz2ewLu2na7XYLwzBbvxYIBBCNRrFj3BmsAZ/PZ+J5/kOhUIAkSVeA8XiMZqt5efrx9OA3GfcgvyVno9cAAAAASUVORK5CYII=', - 'Neko': 'iVBORw0KGgoAAAANSUhEUgAAABMAAAARCAMAAAAIRmf1AAACoFBMVEUAAABnUFZoUVddU1T6+PvFwLzn4eFXVlT/+vZpZGCgm5dKU1Cfnpz//flbWljr5uLp5OCalpNZWFb//f3r6+n28ff9+PRaVVH59Pr//vr38vj57/Dp7eyjn5zq8O5aVVJbYV9nVFhjUFRiWFlZVlFgZGOboJzm5uZhamfz9/bt8fDw6+drb26bl5j/8/lkX1z06uldWFS5r61UT0tfWlbDwr3Ew76moqNRTU7Mx8P75OpeY19pWl1XW1qzr6x5eHaLiojv7+1UT0xIU0uzqadVS0nV0MxkZGT5+PPk497///ra29Xq5eFtY2H28e2hnJignJlUUE1dXV2vrqxkY2FkYF/m3d5vZmfDuruhl5aZlJHx8O75+PZWVVP29vT/9fTj3trv6ubh5eRdXFqTkpBOTUtqZmX88/RMQ0T78vPEvr7HwcHDwsDq6ef///3Gx8H++fXEv7tZWVedmZZXXVudnJp0c3FZU1f79fnb1dlXUVVjXWFrZmy8t7359/qLj455e3q4s69vamZjX1zy4+avpaReWFz/+f1NR0vu6Ozp4+f48/lnYmi8ur3Iw7/69fHz7+xbV1SZmJZVUk1ZV1zq5ez++f/c196uqbDn4uj9+P7z7vRVVVXt6ORiXl/OycXHw8CPi4ihoJ5aWF3/+v/k3+axrLOsp67LzMZYU1m2sq9dWF5WUU1WUk/Au7eYlJGqpqObmphYVV749f7p5Or38fPu6OpiXFz38fH79vLz7urv6+hhYF5cWWKal6D//f/Z09Xg29exraqbl5RqaW6kpKTq5uPv7Of/+PDj29D//vP18Ozs5+OloJymoZ1ZVVJZWVlkYF2hnpmblIyspJmVjYKQi4enop5STUlRTUpcWUhqY1BgWT9ZUjhcV1NiXVkkhke3AAAABHRSTlMA5vjapJ+a9wAAAP9JREFUGBk9wA1EAwEAhuHv3dTQAkLiUlJFJWF0QDLFYDRXIMkomBgxNIYxhOk4wwCqQhQjxgxSGIsALFA5BiYbMZHajz1oJlx51sBJpf6Gd3zONcrqm/r1W8ByK0r+XV1LXyOLLnjW6hMGpu0u1IzPSdO17DgrGC6AadrVodGcDQYbhguP6wAvAaC0BRZQalkUQ8UQDz5tAof0XbejOFcV5xiUoCfjj3O/nf0ZbqAMPYmzU18KSDaRQ08qnfw+B2JNdAEQt2O5vctUGjhoIBU4ygPsj2Vh5zYopDK73hsirdkPTwGCbSHpiYFwYVVC/17pCFSBeUmoqwYQuZtWxx+BVEz0LeVKIQAAAABJRU5ErkJggg==', - 'Madotsuki': 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAMAAADTRh9nAAAALVBMVEUAAAC3iopWLTtWPkHnvqUcBxx5GCZyAAARERGbdXJrRUyGRUyYbY23coZFGDRFGEYfAAAAAXRSTlMAQObYZgAAAGdJREFUeNpVywkOwCAQAkAXtPb+/3PLWklTiIlMtDiH4rvpVM22K+WvY+7Z/dOxZ2xkLmYpNWo6RoKMUQJ8SYiozEYiZAuLbCZQsGB+/hC4SwZsdV2rTjSR0+J9tzXL0B4RW5f9VbE94skEEpHbpw8AAAAASUVORK5CYII=', - 'Sega': 'iVBORw0KGgoAAAANSUhEUgAAACwAAAALBAMAAAD2A3K8AAAAMFBMVEUAAACMjpOChImytLmdnqMrKzDIyM55dnkODQ94foQ7PkXm5Olsb3VUUVVhZmw8Sl6klHLxAAAAAXRSTlMAQObYZgAAANFJREFUGJVjYIACRiUlJUUGDHBk4syTkxQwhO3/rQ/4ZYsuymi3YEFUqAhC4LCJZJGIi1uimKKjk3KysbOxsaMnAwNLyqoopaXhttf2it1anrJqke1pr1DlBAZhicLnM5YXZ4RWlIYoezx0zrjYqG6czCDsYRzxIko6Q/qFaKy0690Ij0MxN8K2MIhJXF+hsfxJxuwdpYGVaUU3Mm5bqgKFOZOFit3Vp23J3pgsqLxFUXpLtlD5bgcGBs45794dn6mkOVFQUOjNmXPPz8ysOcAAANw6SHLtrqolAAAAAElFTkSuQmCC', - 'Sakamoto': 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAxVJREFUOE+Nk19IU1EYwK+GQQTVQ39egh6ibKlzw91z7rn3bvfOmddNszl1bjKXc5rJJGmBUr7Yg9qTD0IalFgRBEYg6EDQQB+GovQyQgiaUZsoLcgHMcr069w7MgcGXfi453zn+37fv3MYZt/n99e76tzVj4JN/hP79fvXnV3hnNabwUBjoOHcgTYOu/JQspgTzsqKgn9BfD4vkWTzur287PqLVy+zM+yePB7KsRXLywTjnSpnZctBkPCdW8ccDuU55vBO8RXbkC/oP5ph19V5+7LIky0OY1BKbZEbLcFSt7u6pN7jLmltCVrr3DV5jY3+KovFEsccB1KJNVpefe10BqS2tqqO4/AuphBB4L/LkrRqNgtJs1lMypLls1kU38mytMLz/E8VIlutqVqX6/weZG52OttRXjbE0cP/FYLRlpVjDXuQ/r77x2XZPKkCHA4HBAIBkCQpAygIAvh8Pu2MZgO0Lz+QSa/sQfwN9RfpVN66XC6Ynp6GhYUFGBwczAC1t7fD0tISxONx6O7upgHILmsqvLcHodOggfiV/v5+SCaT4HQ6IRaLgdfr1bIRRREmJyfBZrNBNBqF+fl5sNsdgE2GiAbp6bmbdbXC7qWQbxMTE7C2tgY6nQ5SqRSEw2ENopaoZpCXlwdTU1NaoECgCbgiU6y8QH+ECYWaTymK7TWdys7MzIwGaWtrg42NDejo6AB1WjU1NZo+FArB2NgYrK6uQrAlCASxn2z6wkuMp87VIAhkE2MEAwMDkEgkYHx8HBYXF0HtkQpRy1BLiEQisLy8rPVNKSsFjEzrXH4+z1hlS4xDhKadNu7t7YPR0VHweDzAEVWfHru6HxkZgeHhYVAURYNjkylVWKArZjjMzqmdVi+QCsLUkQiEjvDvncEkvU7/qQ0Vgukeo48Go87IiCJnZNmipxiz7wXEbVDnbUxQOgM12h9n6qTq6NvapRdtkwaP0XK8RmPuYSbxYfaQ/sJJhjfknuFRURUi7AMOozcCwl94hLZp5F+EioDQVwqYI6jomZU1NFtM+rOSxZjVazcyvwHr/p/Kws1jegAAAABJRU5ErkJggg==', - 'Baka': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA0pJREFUOE91k3tI01EUx39JOpA0H4jNx0pbD3XTalISWf8YFlEgldqDsBLLyqjEKBCiLLWiggh6/KEV1WZ7OaelLZvDdDafNW1JFraWe/32+01FrUZ9uy4ylLpw4Z5z7/nc77n3HIqaMRIjZJyEcNX+uFCFeGmI/GZciEIsCFJUTvoAzDz+1y7K76MSwhX5hXl6z+WSbrzU2KB8YEGDwgrTaxZ3b7xHcaHhR3xw7Z5/UviB1ReP5XSg3+TAqYJOxMzWISFIC0GQDomhTVA9skCnsaAwp/vnMq66dBokNuBR9uFd7T9Z1zCunjci0qcRJUVdoJ3DYOhRnC/qBZ+jQbfeCc+37yjY2UEg0iwvJE0k9l8Z+8xqHmTgot0QLdQgTaQFQ2AsOzlHvOu1S5pwOLsHHo8HjHMCq2MazNvTlByKHyrJLDvdR25jMWRxYx5HjeMH2r1BDOOeguRua4OI14jx8a8YH5tA+al3EHKlW6mYOapb2oZBOOwMbEMseAE12L+jjUh3w+VipyAZ65oxn1NP/GMYGR6Ftn4Qsf7qa9S82Y/l/X122G0uL2TbxmZEz1WhXW8mUol8moXu+SCi/OoQ6VsDh3UUwyQ1k9GOaI5MTkX4yWTGHutvgI1F28sviAlRgxeoRm62HvsyW8En9pZ1TYgi6TntoyQtFm86rVgUoJZRvDnKMmXVAGxWmkAYOBwudBqGcHCvHulrGpGT2Uy+z4yT+QYsCXtCUpp8GxbKhx8gDK0ro+KjJGvzdjfDZnN6VdisLD5/JjArQ2zW66PJOj2lEZtStaBphkwah7K6kMJ/GEulp1bMWhAmMbTozOQRaWRtfoZVgjo4iRra4SYgGi26TwjxVeDKhR7Y7U606ixICq9tr7hd7+OthRWL7yUnJ1WPmXotqLhpRICPHCePtuFV6xdUPTAhcWEtRHEqfHpPyto4hPXLXnzflSEJnFaN3OCKDcsFsrEntR9RUmxARLAUgT5iBPuJsXWDBj0dZjRU9yNV+PTbpjTp9OA/pOSk24nRkXf1J462oPxcJ65f6ULlHSMulepRerYDgvj7A0cKpNz/tyTZqbzXO4t0ZZGQJ34RH11lFHIlA8LIqreCCMUZRY3cd2bwL/5/RmjNSXqtAAAAAElFTkSuQmCC', - 'Ponyo': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACAVBMVEUAAAAAAAA/AAC/AADMAACqAAC2AADGcQBMGQCyZgDMGRnEYgDMERHJGhrOGBjHeQvSISFPGgjNgyDQHh7MHx9QHgqBGhHLeQzQHh7OGRnSHR3WJCTTJCTQGxvQHx9jLBbKfxjPGxvPHh7QOB7TJCRrLRrTJCRZJhHbljjeqmN3OibaLS1+NyXYMDC8NzPaKyvYKyvaLS3YOincQEDorFvbKCjdNjbaKCjuypjZMjLcKyveLi6GRi/hOzvhMTHrs2ftxpHXLix/OCODOCeGSjOHRy2IPyqJQSqKSy6PTjmQQS6XSDGZMSefWUKgTzehUz2jVT2kVDqkbVSlWUGmUTema02qZUqrbkyrckCsMSmwNyywbEyyQTm0XkC1YkS1ak+1gVK2Qzu3iVq5Ni26Qjy6oHy9JiG9ZUnCb0vENCLFxcXGdVLGpIzJdVDKfFbMd1HNqILQysXScU7Sck/TwrDXRS3YSEbcS0rdLy7d0cHd3Nref1XfSknfflTfhFnf3tzgwp3hLi7hgFXhglfiLi7iRUTiTU3ihVnjMTHjSknkMDDlODjlOjrlOzvmPDzmrFzm0bbnTU3oT0/oUlLpU1PpVlbpWFjp1r7qW1vqYGDrvoHs1rnt0q7vwH/yz6HzypLz2bb306L43bn50Zr62Kv637r82Kf83LD83rb837f84b0dlQysAAAAQnRSTlMAAQQEBQYHCQoKCg0PExUXFx0fISgzOTtCRUVMTVJSXFxcXGNqa3BykJegp6mqtLS1t7/Jz9DU1trb3eTn8/X2/P3IgXZJAAAA30lEQVQoz2NggAJmSUUlPgYEYDNs6es150II6HfNmNZhIAznizlOmdzdONFWCsLlENVyTixPKZs004oFxFe3CfDLyI5zi2mb2iPHwCCoqhPYXNvU1FQd7FNjJsLAwCSfl5+bXldU3B6bJsHMwKCr5+Tu6hHtHxbqHR+pBjRAu9U3YmFCeFLOPBfPKBVeRgbZipCCqoblKxdVlgQlG1uyMrCYZqbWz148f0JWoVennTRQj4DR3AUrlixdMX1OqbUM2FncJstWAMEqC2UeqLv5Nez7ZzloCiH5lV1cgRPKBAApxz0bK1ScOQAAAABJRU5ErkJggg==', - 'Rabite': 'iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAD7klEQVQYGQXBW2xTZQDA8f93zmlPe7qOrVvXyzY2B6ybTLksIAImanTiDGimb/pAohISEx980TffTHwjPviiDxiNokajMSAQIwEGIwzYTWAFcZdudOt9bdfbuXz+fuLHrz9935bFnbr3yY/6Y/3O9PQkXk8T6UyeYHuY/u1RCvkyqWyBJo+XQyOvIRQFKSVut4fJG5cO5HPJlCZz42+MjvaM3l5ZayoWu0+oiuqABAAAAEAIQa1aIbV6D6/PQAiFdCrbkU3/cjGTN08rfp/fzvyVY/fTm+9WauN/bhTKfqFogAQAAEAgsC2bSmWT1rYmfD4vdXPy84NDQX9fwN2t+CND91qsIMnzizx/xBjp27p0pVjI90g0EAIABCBAKIJisYLV0Hl0f/zkth3F40rCjaH6DEUx+s5uRgO0LfeycPY+I0cCu/cNzk+a5eWxekMiFDf1ukO10sBsSBqmws3xX4+0G1dPifU6SsJNplJaF7OTE5jJ76/2lwcPJ2cSbPTcIjbSiyUMfv69fLE3Eo6HQuYeR5HNlbJVmJlOmh2e1cMHXxzUzXMmLX1Bvl2MHxdrS3GSq/cPqInTl2P1w+6V63PM1xL49qrsOjaEt70d3edDShBCYtXr5JaWuPDVHZ5zQhT36PM388PD6rN795LLOyu37q7+W639cTTQoWsD/X6697fiHxhkYibJb+cfs2egA3DQNDdnrqXpjUWZW5h2HlpPvR3eOhhXXEKnyevG0zJwZka+PjSxmV1pGi6jx2IgdC7NrvLxTxe4Mb2I5nKDojC3lOaLKw/YMbLPaQ/FUp2dIbRgWzvegA8j2Ar19LaO8q0uJTRITfFQz+c4OTbM0PYou3aGKaSKlPLwyZu7KFmwtUVqldTsCc32faA4AjKJxy814tlvlq/+8GVvp4rt8iGlpF4s0N7i5dj+CLn4fzz6J0N18wXSCYXekI7LMGjeYh1cWiihrS/GXx20/Oe6up9hqlQDKRGlDKrmwohEsUwbKTSiQ9vp1lQya5fpDBgIVUG4VFrD/sj12wt+TatUXwn6fdSLj2iYFrViCelKoQuB1aghjS0I3UCoIJEEu7xIBxzLQqNCannt8e3ZjZJmmtWas3YXuzGHzG7hYXOGAXcWt2Hgskzk5gZ2Uyu4dLBNcGxUu4HiVMklkszOej47dGAf6tjYsXRzw3onpOGOqC1MzVSZym8kvdYGml3SPR6JapZQagWURhmlkqeWzfFgPr/x953wh31Do99FoxE0f7BrZt7leXliauI9vSH1dS0Qb+s9eupCfKa1K8tb5sT8bpdab7Vte7MuXDZaOJ+tBK5LredsOPpEMdLVjWWZ/A+8EtJREuofIwAAAABJRU5ErkJggg==', - 'Arch': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABCFBMVEUAAAAA//8rqtVAqtUQj88tpdIYks46otwVldUbktEaldMjldM2qNcXk9IWktQZkdIYlc8mnNUXlNEZktEZlNIYktIWlNMXktE7o9klmdMXktFHqdkXk9EWk9EYk9IlmtQXlNEXktAWk9AWlNEYlNFDptkZldMYk9E4otg/p9kXktEXk9AXlNA4otclmdQXk9IYktEXlNEwn9YXk9IXk9FFp9o3otgXk9FPrdwXk9E2otdCptkXk9E/ptkcldIXk9Edl9IXk9EjmdUXk9EXk9EXk9EbldIcldIjmdMmmtQsndUvntYyn9YyoNYzoNc0odc1odc2odc6pNg7pNg9pdlDp9pJqttOrdzlYlFbAAAARXRSTlMAAQYMEBEVFhgcHR0mLS8zNTY3PT4/RU1kdXp6e3+Cg4WIiYqMjZGXl5mbnqSnrbS3zMzV3OPk7Ozv8fT29vf4+fz8/f7SyXIjAAAAlUlEQVQYV1XNQwIDAQBD0dS2bdvmNLV5/5t0UU52728CvGayQLx8UWz1eKoXhdBqmRaF6mbdVfzZXWgetomfpY3b4Hruqb7B97hf9rtT5mNZ+7ggyaHuHTxzzqIxgUy+LG+RWSBFjrQAgAhJF+Ak6ykA0PRJOgAj2QlKAOTISkADKMM1Mg4YJmXr585cEozw2vE3m/8J5h8V7jsI1XAAAAAASUVORK5CYII=', - 'CentOS': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB5lBMVEUAAADy8tng4Ovs9tnk5O3c7bX44LLduNO1tdDh7r/eutj43q2kocX23az07N+qqsvUqcmXl7331ZXJj7r40o/Pn8T42qP63KjNw9n21p3Y387Ml7732JzR55z05MSxtMLGn8TC4Hx8eqt8e62Af6/B4HnG4oPC4HzH44fBf7LCgbOkoMTcsrmtn8PWqcfFtKrj4Jvs2ZOz2FnMqLXT3KfY5p60Z6NUU5XRuqHzwWSywqDn3JaiiLWahrWhkry5zJjRmqm1Z6P1wmb1y319fK632mK5cKi5nH+73Gu73Gy73W283W+9eK17e6y1yZS3aqRZWJdcW5ldXJplXZppaKBwb6VwcKV5eKswL306OYNPTpGkfK+m0kGpUJWq1EnEqIuXK3+Xh7ahP4qhkryMfK6BgK+CdpGMaKKMa6O9ea2+eq6+oYW/eq+NbqWVlL2Wlr7AjanA4HnA4HrBkqbBlafB33rCgbLCmKjCxIzC1mSs1UytV5mtxIWt1lCuz2evWpuvXJywxYzHjrvH4oXIjrrN2HXO5pTO5pXUlYnUlYvVl5Hb0G7e0XTg03rhr5fpzHPpzXTp0Hvtz3/wrDHytknyt0zyuE3yuVHzvVr0wGP1x3T1yHf1yXe0ZaL2zYP30o730pD31ZeRIcF5AAAAQ3RSTlMAFBkbHEhJS0xMTk5UWWBsd4SEiIiPkJCVlZaam6CjpK29wMPDxMTFxcnK193e3+Dg4uTn5+fo6e/v8/P4+fn7/P7+J4XBAAAAANNJREFUGFdjYIAAcW4oA0rJOFnywkVk1VVNWyf1OehpaQqABTW8213jJna5lfnECoMF1NqaC2MmdM5tyfKHCJi4FpV69nc05VTXK4D40hVVtR5ehjqZDUkJNjwMDKKOBeUlxcZ8EnbJiSnB5hwM7GbRuRnpulJyFvHZ7mlKLAwMXLZhofnh9tYLF8ycrs8EMkQ7Nc830K93/jznOZJgW1RcfIMiG3tmOM+aKgIWUI4KCYio6Z42e8pkiAC/oKC8VV2lgZiQEBvcP6xGioyo3uVkhvIBH9A0EWEgTIIAAAAASUVORK5CYII=', - 'Debian': 'iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAZ5JREFUOE+Nkk0oBHEYxv8fu5GQj3JwcaDkIAc5IpR87M7MKnIVJVKclaIQ5Sy5OLkgR7n5OigcSNpmd2c2Vyfl4KT8/muWiVU79TTv+7zv837NCBF6PG1X+NpZyEYSD9mIc+tHnBPe23B9xKrCuTmbQA/JKfABrhBswa1hH4A38IwfOxPdX1qcjiCQxO5NyrjKV70TnSbeRPwJvGN3i4yyqnEucPY8ZZX9GSEgGK+RvFfyjk2VKZxzBNG8wJWWgh/xtDOeUXZ7Slr6TrSLYL9N4SMgYTTcwdc2ArvJcElhSVcM6mCNSV8n9hA59yTU5UWMG6HIbLhIWlglgWiC2L4Z79qTdo40D6ISuOWwKCWHyk9Fv8ldpUHOuGTuynwSBUynddPdlbEosVpP9Eu4FnOsRzUYNTsdmZN/d5LDiqM0w+2CMdAFFsFGWgfXxZnheqe/z+0puwEM0HHYV3Z9Sgz8TEz7GkQvpuJ/36ggj2AaHLrSlkULWV5x+h2E8xkZL16YVjGNaAUscfZ/f6c/k9ywLKI2MMcRWl0RLy007idmRbQJ7RIfDAAAAABJRU5ErkJggg==', - 'Elementary': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAACXBIWXMAAABIAAAASABGyWs+AAAAAmJLR0QA/4ePzL8AAAFuSURBVCiRfVG/S8NQEH4VimAHcXKS+otIsNb2vpc4W0QXF8FBqKOiIEgQKTgEK/gXBKEOIoIIgmMo6KSIkxYXHRxcqhjQQpQKOojES9K0mxwc7919d/fdd8IToemKLMKGw2bLoq5E8dDFyIALixZlAWvsd/BBhog1ACKGMiqkyiVU5SGO8EQzmV66QNmHMICrK4hjHXUt49dgHM+D7ekELslggK7AJVUbxicmo7l4yY56Yqwbrq4IpmZx6FweN9MdcOVQ8CrRpoBNedGGLzkXAWgFpyF13soWcHhAP7xsMkyPdOFRpoL6DXzDYYDehwF4NBUEO+UNbQd9cvhhCANsbYK/1zA9oWm4xbKf1nrwii3K8wgmWeLKVdSxhzfK+Wk5ixoOmIPFJHnNGit3D4/tShZol1Wp0jR3VYM1A6F+YWaTNI8T3OEMZjrBPeOsrtGS+iFUsbmqyn0iqRvHepf7WJApUpmaxeq2jvX/uf8A9h7IjHC1AQkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTMtMTAtMTVUMjI6MjM6NTQrMDg6MDCQ664gAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEzLTEwLTE1VDIyOjIzOjU0KzA4OjAw4bYWnAAAAABJRU5ErkJggg==', - 'Fedora': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABPlBMVEUAAAApQXIpQXIpQXIqQ3UpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIqQ3QpQXIpQXIqRHYpQXIpQXIqQ3QqRHYpQXI8brT///8uTYMpQnM5Zqg5ZqnS1+I4ZaY4ZactSn8uRnYrQ3MrRXgsRHUsR3s8bbM8brMtSX4wUosxVI01XZw2X50vUIguToQvR3c6X5o6aKs6aq08Un8qQnM9VIFDWINJXohKcKlXapEqQ3UvUIc2X55bhcBdcJVgcpdhfapmd5tuk8dxgqJ1hKR5jbB6iah/m8Shudq3v9C4wNG/x9bFy9nFzNnFzNrIz9zK0NzK0t/O2+3P1eA2YaDU2eTb3+jb4Oje4urj6fHm6e/s7/Tz9fj3+fz7/P38/f3+/v83YaEa/NNxAAAAHnRSTlMABAoVGyY1SVlpeIuQsLfDzdHW4+3y8/b39/n6+vr4+ns8AAAAxklEQVQYGSXBhUJCQRRF0SNYgIooiPJ0zwXE7k6wu7s7//8HdGAteeFoPNne2lhfpYpIioqWWnkNeNv3X+87HXWSIni73/b2updvq1E4hffys8/ag5toUhRv0QpAn5tCcbyiXQBZN4mSQG62ZDf9Q2PdbhplyPacmPe56TZAwcyIOy4828fj7cp4DhTk3ToU7YoKdbleoGiXlKXVOToPbNkpZTEFv25uefXJDvASIWWGF+7M7GyJf4lqqZnBw+vzowEgHQtJfyetJP7BfFOIAAAAAElFTkSuQmCC', - 'FreeBSD': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADXklEQVQ4EQXBS2wUZQDA8f83j33M9rF9d7u4loaWklaDpkSo9KDGaIKUaGxshD2YSPRiuDVeTDyhBxosJCoa40ktpAkPDcUqAYVIpUSUPrAulEdD2bbb7e7ObGcfM/P5+4kwKDvq6yJ1FYYcvb+YAkqAHo/HQ7FYrFIoCiurq9ZXJ06YSOkA+kBzfX06bys3zHxS9EL0tXDVyZfefacqV+X/ZSJx5+qLbx98LhaL9RiGEZWlEsWC/Thd9q6Pf3vs2u6Orc83rFsvTwwfLf5obgywT1Vjh2Hh+rbNsnTssJdNLedK5aIrpSuldKVXKsnH4+Pyn6FDXn5tMef9O+3NvdkvP1V4+EYw2AoQ+KSx8dRYS6NXXnwovaItXduSrrkinWxGOmZWJi9OyOK9m1LmsjIz9IH8QUMOd3WfAQwNKCy2tJwbHB5+XasPaxIHmc4g7WWEZ1MquBiRFlJTf1E7+Tl/H/8asavPzTY1nWd2ZkMDRPeBeHPz5ojwsilEQCBvTSKunCF3M8FSNkBGVTHDYYrLj8jVNhDZ2SMa2zo3MTamaIC/u6Ojr3DtrOrvP0BpdATnyBeIhTxpR5ABUlKSUlXS1dWstbVxdz6hPL0l1quGqkLaKwNvVcjEXNRd/4mit4Z19DjefBEPyCKxgQJQcF28dBrHNDGTSZSezsjeff0hraa2Vs2vrvit81O4vj9xLJcC4ADrQA7YAGqBGsAql/EtLdFQE/L7dF1XZmdnSrbPMJfXoLDmolQK8gJyQBowgQhQDRQBD+hsraVhd4e5MH+/oExfvWLJ9q3/3S7qMpNH2hsS40kFS4EUUAMA2IANRIBXv4uzuO67c2PykqkA5YmZ6bN18YPi0Yoknxc4AsJPCMLVAk2BLKDosCWqs/PZaulkuxk9fekcUBAAQGDks5FT0W++3NuYuC0DVUL4DIEdlIQDAj0IRkigaMjArkFx0tf523sffrQHyKsAgHPhwoXLL+yP9/kePNhk5ExUTyKFkJVAUAiCFZrQup4Rv9ftuLV/6ONBYBVABQAArMvJ5MXW7duD6P62sD8UrPAFRU1TpeCpCnGvPZr7WW///v0jpw+VC9ZdAAABAAAAAMLo7drWrmQyPWG/r8tnaGIjaM05ujr16x/ZBFh5AACA/wGZnIuwraa4ZgAAAABJRU5ErkJggg==', - 'Gentoo': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB9VBMVEUAAAD///+AgICqqv+AgIC/v9+Ojqqii9GAgKptYZKQkOmPj/ddUYBgW4eVjeCTgfiWjO5wbJaZkvPBvepkXomYkNldV4Bzbpl6dJ+Uj7ynoO6Vi+1qZI63se2mnudjXYjOy+GCfaqZjvWlm/Pc2e+Oh7NeWIOWjfeXjeW1sd+gl+diXIfp5/KHgKnn5/F2cZx6c6ZgWoXc2e6dltrAvNu0scrX1eTOyujCvup4c5qpovVpY43///+6uPPJyPXq6fvm5vrz8/z8/P7+/v/d3PixqvmxrPSyrfe0sPO0sfS3tMve2/3r6vy6ufPz8/3d3fi3tM63tPO4tsu5tsu5tvO6tfe6t/Vva5KRjKy7tvW7t/W9vPO/vM+/vvPCwfPEw/TFwvTFxOfGxfTGxvTHxvTIx/TJx/aTiOrNzPXNzfXQzfnRzuHS0fbS0vbT0uHU0e/U0uTU0/bW0+zW1ffX1vfY1/jZ2Pjb2/jc2uSTiemVkLSlnvbe3PTe3vng3fzg3f3g4Pnh4Pnh4fri4enj4/nk5Prl5Prm4/ymn/bn5vro5/rp6O/p6funoPWsqs3t7Pvt7fXv7vzv7v3w7/nx7/3y8f3y8v3z8vytqPWuqPX09P319P319P719f339v739/34+P35+f37+/+uqev9/f6vqvSwrPQAR0dcAAAAPHRSTlMAAQIDBAgJCwwVFyAsNUFHSVBneH+Bh4mVmZmanKCxsrK2tr3ExtDW19rb4ODl5u3t7u/w8/T6+/z9/f4MkNJ1AAAA7UlEQVQYGQXBA2IDABAAwU1t27aNi1Pbtm0rtW277+wMgEN05nRWjBMAgCJgVUTed+sibQEg9EZEvm7V8x05LgCOJSKi1+8XdKmUhT5AyIuIvHUOLDWoyvKb/MG3uVRExuOTzvqUf6fDrthEfc/diXwczXbX/h7kpYCle+qETrQ7Y+1VDysbaYAiTER3bhhsKXpcn/QG8zgR0e7N9Cjrr0bCLTBNEJHXk4Whtv77ymArCBL5eVKvjfZuHS97mQEZn8+XhxVThuviRGcA0ss1xk3NRXW2nzUAeNZsL7Y25gbaAwCYuMUmR3jYAQDwDzDCPrxVMnjZAAAAAElFTkSuQmCC', - 'Mint': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACVVBMVEUAAADh4eEAAAAAAAAAAAAAAAAAAAAsLCyXl5dgYGCnp6eTk5N3d3fBwcGqqqq8vLzNzc3Ozs7Ozs7Pz8/Pz9DQ0NHR0dLS0tLS0tPT09Pf3t/Pz8/i4eLb29vZ2drZ2tna2dra2trf3t/u7O/u7e/u7O/r6+vt7O/w7/Lw8PDy8fTz8fXz8fbx8fHz8/P19fb49/j49/n6+vuPxlmWyGOx437h9NDr9eD6/fj////+/v75/vTA5Jv6/fb7/fnL5bDL5q+AxjeDxUCEzTyGxUaGzjyHxkiHzz6J0D+Kxk6K0kCLyE2M00WNy06P00mSz1OUyF+W2FGX1FiY0F6Z02CZ21ac0Wiez2yfz2+f2mOh4GCi4GOi4WKi4mOk12+k3Wul32um1Hin0nun4G6n5Gin5Wmo23Op2Huq1n+q43Cr526s4Hit23+v6XSw34Cw34Gw6nWx4IKy4IOy44Cy63ez146z34az4IWz4YW03Y217nu38H2625e645G74pK83pu98Iq984W+4ZjA4px0tzDA5ZrB8ZDC5p7D55/E947F6KHF+JHH4qvH6qTI46/K5LLL5LN1tzLL5bN1uTDL57DM5bPM6qzM66/N5rTP6LbP6bTR6rfS573T67vT7LrV7r3X68XX7MHX773Y77/Y9rvZ8cHa7cjd88bi88/j8tTk8djk9tHm8trn89vo89zo9N3p9N3p9d7p9tvq9d/s+93s/dzy+erz+O73+vT4/PX5/fT5/fX5/vN1uzB3vTD6/ff6/fh5uTj8/fv9/vr9/vx8wjV/xDmrMRH0AAAAOXRSTlMAAAECAwQJDzk/RUlNU3F0kpSVlpeYmpucnaKjpKWqqqqtu8LExMTEzdTU1NXY4evy8vP+/v7+/v6LaR1mAAABDUlEQVQYGWPgk5QQFxMVERYSFODnYGZgYJA7vMfa2nrXbltbiyOW0mwMDApbuzsbq6sKslJiok0tFYECW9oalqwuyU2NjQoNjLfkYpC3tCxevDE5c/nShBUdfmZSDJw8Rr3zN0Ru2n/AaptlXa0G0FiDrnnrgizLsg95LVqfp8PAwGTQPnutv2VOmp3P9M352iABm5lrfC3T4+w8pkEEDJtmrPJeGBY8y9VmWSFQBYN+c892TzcXp2POlfVFIAGllQGWc2qSIsIz+kMqQALclsalOywXTJjUl+heDhJg1d1pcnBiy+S9+446tmoBBRjY9azMp9rbOzhMmWulycAIFGHhlVFWUVFRVVVXkwUAyhJUc5MwaMIAAAAASUVORK5CYII=', - 'OpenSUSE': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKDigueojqlAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADEklEQVQ4y5WTTWxUZRSGn/PdO9PpdKYjbRmmrWmm/00ptlS02FqjEgpRNCxo3Eg0auJCrJqYmGA0hEiC7ghroy40Rk0wppYiIbEBjQSlFEJFWksTqv21vwydmTv3Oy5GFho2PvvzvHnf5MA/XP5jqPPMtU8fWFr6q5P/MDT+uTM1PybcBZlbmD0dL9u0c2j8Cx2YPEqkoBzR7G9V0Y61RyueW0+Eq38NRt2XAX6c+Lqos2Zv6qcb/Wyv3pMXvNgfT9fGHioImcLcjbWLbtAEyPheNmtX1bMeG4IVwZayHmku6Z6LBst7Nld2jNxJPz/Zj/QNNqnFs1bVuOKiRgCLWBcRyNoUgqvhQETAob1sz8i+pkM7bq6Mpms3bUm5CAgB46IggBVEDKIWS44d9x6gK/6MpHLLCA7vXXysJuCEFnq3vC2fXTpkXMjfIfmNREBV8cjQXvo0YSfGwQttVIab8TTDW+2D0cMXunKTc+NfJeN1+8xdlxUH3+boLn+B01PHqSraxpttA4SdUlYyMySLt+pHV19qBMgLVFEFweD56yAWEWFm/TqJwnrm02O8+3MH4ytniQbiZHO3AxinZXhy8GEDoAgGy7pdpbfuKBFTguBwYuIw+xuP0VKyk0RBLW+0DnBl8Ttu+7dYSU+xnFvYbe70tgKFJsrVxZO88+AP7K0+SNau88HwEySKGmgt28XZ6Y85N/0hjjgE3Cglwcpl6TvVpCiIKJYcaqHAjdBbe4Sme7q5tPgtv8yeYCkzjxEl6ERoiHVmHql4/lpiY2WbvDrYqAiIku+uDhYla1PEguVUFNbzeNUrJEI1qCqz6d859+cn3Exfp654a6f0napXUSdvEIO1ihGLIICDMYbl7AxqBas59TUjyeJtNMa2Dz973/v75cDJWn/NW8w6xsVXD9cUEDAhsKDGx/dz+GTElbBJRlsDDRu6ZkNOZNdTza+NALgVRZu/fzL5ejTslup8eoLp1BhTq5fxxCNkwsTD1SSj9/vVxW23NpZW9sAAX145UgTwzegxUNUg/4P+0eP/euu/AVF+N0gj+MWXAAAAAElFTkSuQmCC', - 'Osx': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABrVBMVEUAAAD///////+qqqr///+ZmZn///+qqqqAgID///////+tra339/eAgICoqKjx8fGMjIzm5ubh4eGPj4/g4ODIyMiAgICSkpKLi4vS1tbPz8+Xl5eMjIypqanIyMjW1tZ2dnbR0dGamprFxcV3d3d+fn60tbV3d3dcXFx3d3epqal7fHxxcXF+foCnp6hYWFhyc3Ojo6SMjI5fX196enp+fn6Li4xERERqamqgoKFpaWmFhoeen6A/Pz9QUFCWlpeSk5SUlZWUlZaOjo+Tk5RHR0cuLi5YWFgwMDAeHh40NDQ3Nzc6OjpcXF1rbG0XFxdSU1NVVVVXV1dZWVlbW1tnZ2lwcHABAQEEBAQXFxchISI+P0BISUpaW1xHR0kNDg4qKyszNDU1NTY9Pj8NDQ1cXF4XFxhSU1QSEhIDAwMrKywtLS4uLi4wMDFHSElISEggISE0NDVJSktNTU1FRUVWVlhGRkYEBAVBQUE0NTZQUVJQUVMFBQUqKitWV1lXV1daWlpaWlw+Pj8bGxtcXV9dXV1fX19fYGFgYGBkZGRlZmhpaWlsbGxwcHB2dna844Y9AAAAV3RSTlMAAQIDAwUFBggMDhkeICMkKCgqMDIzPj9ERFBib4CCg4iMjZCcnp+jqamrw83W1tvb3ePl6Ojp6+vs7u7v8PHy9PT09PT3+vr7/f39/f39/v7+/v7+/v50ou7NAAAA30lEQVR4XkXIY3vDYABG4SepMdq2bRSz/capzdm2fvOuDO397Rw0Ly4tz2QAQPbcxuZ2E/STJwfxPhWgG355fRrVAIVb1zeP9UDLfiSwkAcADe8fn7tFxWuEXFRDoer/OgoMTRBCumj8yJwPBo8Zhpk14U856/HI8n0ZUtpZ1udrSzfVneA4roNKjdrwpcMRilb8d8G60+lKnrpWcn9bO+B23w2O8Tzfq4aiNSZJqzn5O4Kw16h06fPZ+VUlUHfo97+VAEb7rSh2UgDd4/U+TBlQY7FMj5gBIGvcarVVfQPVPTG94D0j9QAAAABJRU5ErkJggg==', - 'Rhel': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABj1BMVEUAAAD///////8AAAD///////8AAAD///8AAAD///////8AAAD///8AAAD+/v4AAAAAAAAAAAArKysAAAD///////8AAAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAD///8AAAAAAAAAAAAAAAB5eXn+/v5JSUnKysrS0tJ5eXmqqqqxsrL+/v4ZCgknJyeHh4eIiIjo6OgZCAdOTk7t7e3///8GCwwPAAArKyv19fX29vb9/f0EAAD////+/v4AAAAGBgYHAAAJAAAMAAANAQAPAQAVAQFyCQV9fX2pIRzmEQjn5+cBAAAFAAAAAADnEQjvEgn////uEQjyEgnsEQjzEgnxEgljBwPaEAj9EwnwEglHBQJHBQNNBQIBAAB3CQR5CQSHCgWLCgWRCgWTCwadDAWmDAapDAa/DgfKDwjWEAgGAADh4eHiEQjmEQjmEQkKAADoEQgLAQDtEQgMAQDuEQnvEQjvEQkPAQAfAgEuAwEvAwE8BAL1Egn3Egn4Egn6Egk+BAL+/v5CBQJrB0muAAAAT3RSTlMAAAMEBAkYGhsbMTRLUmpvcHeIjLe6vcHCxM3P0NbW3Ojp6u/w9ff5+fn6+vr6+/v7+/v8/Pz9/f39/f39/f7+/v7+/v7+/v7+/v7+/v7+Q8UoNAAAAO5JREFUeF4tiwVPA0EYRL9SXIsWl+LuxfcOd2Z3764quLu788NZNrxkksmbDP2R7vH6GioLs+iffEzNXd4+TqPErUUpVqMOvwgdzMPn1rv5vPsVeufBTaBK/bH2FPvkEUuIG5jIIc+sHYn/HJ3dC/Hxuo4y8s44dzwBbFkisHN8bVIdXs6jb+H97aCwbHEIqgcml64CD7YllNkAVQC940MLYe5YzvIeQAXNrd19Roc5MdzfdQLUUKaUYyuG9I8y1g4gj6hIak4X5cBIT2MquZJrJdOqpY11ZpAiqVwbY/C7KY1cRCrZxX4pWXVuiuq/hs49kg4OyP4AAAAASUVORK5CYII=', - 'Sabayon': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABvFBMVEUAAAAcUaYdVKwAAAAAAAUABAwWRY4YSZYhZtIhaNYHDx0KCgoFDBcKCgoRMmYSNm0fXL0fXb8AAAAYS5gaTp8fXLwgXsEGBgYFBQUZSpgZTZ4JFSgODg4IEiIOJkwOKVIkW7EnXbQLGzUTExMKGC8LHjwMIkITExMiIiIPEBEPJ00QEhMXOXAaPncOJEgoXbApXbEcHBwwMDAEAgAfHRgQDgo3NC8AAAAHBwcKCgoLCwsJCQkaGhofHx8lJSUwMDA0NDQ4ODiRkZEICQocHBweHh4GBgYHCg8mJiYnJycpKSkrKystLS0uLi4ICAgODg43NzcRERF1dXUUFBSjo6O1tbUbGxsEBAMLGS8MDA0iIiIjIyMkJCQNDQ0NHTYKCQkoKCgPDw8QEBArMDkKCgkRERIREhMxMTEyMjISIz00Njk1NTU2NjYCAgIVFRU5OTo5P0c8PD0+Pj4/QURAQEBHR0dKSkpMTExSUlJiYmJlZWVnZ2cWFhZ2dnZ4eHh8fHx9fX2FhYUXFxeVlZWXl5eYmJiZmZmcnJwZGRmlpaWrq6usrKyvr68KFiq/v7/FxcXY2Nji4uLn5+ft7e0yif9uAAAAN3RSTlMAAAApKSkqKioqg4OEhISEhoa1tra3t7y9vr7S09PT09TU+Pj5+fn5+/v7+/v7+/v7/v7+/v7+70RY/wAAAPlJREFUGBktwQNbQ2EYANC3lt3NtazltvDh+s52tm1z2f7Dfe3pHPiTllfT1V2bnw5xCVDUPruyub271VEMicCUTfQ6XEtritq/XA5MwVvw7NFydOB0e+WhQoCUzh5MxmcWPRZxxNHXmgo5doyxDd3ESPhaCNtzocrsY9BXFPHU7zdXQ+McTwhZ//lAhPC+ySZoIBuUUv77HVGbNTJYB5X4SnZh8hlBQuhYHq6ArPnphxdtP/p88vQqBBcyIKnFaD29vdO0+0tlwNiWDMCJ0ujOeejicEySRA6YUqfJs7qnur2mqRKI4wxKQFUDioGDf7psfXO9PlMHzC/HlDtslvM8zQAAAABJRU5ErkJggg==', - 'Slackware': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AcEDi0qZWWDgAAAAx1JREFUOMt9kktoXHUchb/ffc1M7rySSdJMOknFPMRitLgoNKKI8ZHGKkgrjU8SitidimSh2UkXoQmoO1dGQSxJjdvOtqSaqlR0USEGSjVJGxuSmWR6M3fu4/93YX0g4rc9HA6cc4Q7DI+fpzz7PA8++2mxvZAeBZ4xhHtFcJRmXWsWvb36/OLcyxf5B/KHeYHy7DmGx1+YSDjmWTdlobTGMAStQGkNoLXS4tXDq7u7tUcWz49tA8jR8QUuzB5n5NTCV13F9JEo1JJwTLKuzU61QiOMcd0UDb+BncwQK3Rl15eNja3ui/Njq8aF2eMcO/XlBz0H8oO2ZUkum6A13WB99TtyzXlaCi24SaFa+ZFCzsG2DNnfkdbFjsI1APPhk+d6ujqznycdCxFozadYWvyMpx47wa+bPkGksKwUNnsk3TaCGASRXDZh5LpHXPPg4Rcni+3uYBxrtBbQghlscOVKmYHeEm0ZIZ9xyLffw41ND6VAa43SmjiMByzHYtjzwr9arfshxf5jOKlvKZfn8es77N2uks24PPfSFD/9Uvt7AtPKWmEU9d645eHYJo5tcKi/FX/zG+zmQxQH+rANk862DOW5N/hhaY64cJSa5xNFCgDDILZACMKYWAmh73HmzFsMlBQJ06LeiMinE1S3KzRCm5rXIIoUIoKIYCVM36urZFbEoiBLNMIhAE6/NsSB7h6SKZdL8xsUOnpx9j1KbTdARACIowArYe1ergfNT2i0mIbJys0GI6PT3N1/hJvrPxOFdRJNBQIy/FapI4Bpgohgcjuw+jq8jy8tV55MNBWI4ohS802CpizKv8q+FgALZAfYgSyAZtNro1oLaU1VvxCA029Oraxs7u/tKnXiNjn8HyKwur6lI++6vPK4V7IA7u+1Dyu1tr183ddNbkHuXP8/zEIYeFqiLRl6YO/p0bHJdflT/PD9qZa1W+ry99fcvlAlcZwUpuUAglIRYVgnDEIOlna4q0M/NPnuO1/PzMwg/045O/XeibUt5/Xangx6viSVFpK2jtMpvdyWCz+5ryf10clX3/amp6eZmJjgd441URWWJY8BAAAAAElFTkSuQmCC', - 'Trisquel': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABjFBMVEX///8AAAAAAAAAAAAAADMAAGYAAAAAHFUAGWYAF10AImYAIGAAHloAHGMAKGsAGmYAJmYAJGEAKnUAJ1gAMXYAJnEAJGQAI2EAK28AK3cAGTEAMHgALXEALXgALG0AFUAAI2oAK3EAMngANoYALXMANIAAM4IANIIAL3gANIcANokANoQANYQAOY0ANIYANooAN4kAN40AOY0APZMANIUAOY0AO5AAPZUAPJAAP5MAPpQAQJUAOYsAPpYANoUAPpoAPpUAM4AAQJkAPZIAPJEAQpgAN4cAPpQAPZUAPJEAO4oAOosAOo8AQJoAOYsAO44AQpsAO48AQp0AP5UAQpoARJwAQ58ARaAAQZgAQ54AQ50AQpgARaIARqMARaMARaIAR6QARaIARaEASakARKEAR6MASqsARKEASKcAR6MARqYAR6UATbEATa8ARqUARKAAR6oARqMASKgATK8AR6QATbIATbAASq0AR6cASKgASqwAR6UASKcATa8ASqoASqwAS6wASKoAS60ATbHn4CTpAAAAhHRSTlMAAQIFBQUGCQoLDxAREhMUFBUYGhobHB0eHh8gIiIjJCQkJCYoLC0xMTE0NDo6Oz1BQUNHSUxOVFVVVldaWl5iY2RkZWZoamtsb3FycnR1ent9f4KDhIiJioyNkJGYm5+foqOkpqamqKmqrKytsLKzs7e4uLy8v8TFxcXGx8rO0NXY2eZc4XYcAAAAzUlEQVQYV2NggAMWdX12BiQglJ+SXqIMYqmHxQdJMzAEmXLKuCcyMTBYNWYmNTVYMARzMToqlAsycFYYSBppFFVp6nqa2VkVcDCIFXK7GfrrlWWISKjqpAUwMPDkibIz+Inn5iSHxxQn8AHN9Ig1d7DRzimtrasO5QJZwqhmrMoQ2Rwix8WIcANrTaqAT6AWQoC33t5Flj1CCS7AUenqrMJk7YRQEpXFb6LoawvjMjIJZ8dZ+maKMcHMZWST8or2lmdD2MPILKYlxgziAwCs9yR3GXo0vAAAAABJRU5ErkJggg==', - 'Ubuntu': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABKVBMVEX////ojFzplGf1zbnqnHLvs5P10b3yuZv1xKrytZXvtJXys5LysI32waT0n3HxiVHwg0jxhk31kFn0h0zxf0P0hUrveTv2iU3yfkD1hEfyejv5eDLybSX0aR7zZxvyayH6ZxnxZBj4YhH7XAb5WALlUQLeTwHgUAHeTgHfTwD65NzdTQDdTQHdTgD31MfcTgLcTADcTQD////xt5/31Mf54dfmfE/dUAbeVQ/jcUDcTgHeWBnnflHohFvpjGbqkGztnX342Mz53dLgXiP65d399PHdUgrtoYLyu6Xzvaf76eLfXB/rkm/fWhvupojwrpTeVhTgYSfgYynzwa30xbL1ybnngFT31snngljhZS3539XhZzDiajbibDn77OX88Ovrl3X99vTjbz1fisGCAAAAMHRSTlMABgYGBwcHJiorMDA1NXGHjY2Nl5mZmZyfn6O5u8XHzc3X193j9fj4+vr6/f39/f08OUojAAAAxklEQVQYGS3BBULDQABFwY8WLdbiHjzI201Sd8Hd3e5/CJKWGUVio0u77vJYTP/iG7RsxhXpmDe0BDsHc12SpgzkyscnhVojZ8algT34KD5YGxTq4PYpabh+es3fXJSbXy8wIgeO7Dehkr2HFZnLn1SQIXToXcGWtivN7GmayO8brGsNKjZFKGs9WNWsIVP182fp58ZnHSY0ZKBYurO29ngLbr80Y4Bzz3v3fUhI6l2krbrPQqdCPdOGtmS32oYTjjHO5KBCf5XaKpkxFPzRAAAAAElFTkSuQmCC', - 'Windows': 'iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA+pJREFUOE+F0n84FHYcB3CWSsL9ojo/6ik64c6PnTjmSS0limmrpBm2G002y++xzXRz6zE0R4nbw+RnTj/WD4sbanLkkAe55ccYlyNme4SrO9u9d13PI3/saZ+/vs/3831ez+f9eb5aWsuqy2mjRYeNUa7YmtjfTico7jNJ8z0eG24NB9vvnDrvufzpq89Npnr8VjMddNmuRh9rDfp36mFg91oM7qPIc5JdbDJq3An/JfCu7Hl53W2lpS220pP2OuniN299jAYbYizSENIoAgbCTdrTKtxOJVdvGo8psUwKy7Vxe4ez1YEVudGP8YEZzyveInFJ6mZRHHqYazDspw/pJwTIuERM5JIwmUdGdyo9K7/BszGzzg6fXzZHGJ8KvzQqXKOpoIeZLjofWR++BPWyCEnPY4xFGEKWQcLjMjKmr1MwfcMYwmz/Y4KOgNki0V5k1dkjUWCK93Kp2PMFFawos8cm1gZ2GqjLXktL4mbQPHLQ4B9ZDFE5+S356fQlyuJMqzH++HnTo6ui2OO1ko9Ul+4fxfd3d4F7k4YTReqpuFS88bGZUE2QNNDobuIq8Q5CduHb7lFJaTnvnym9ergjMWD/FG8zf+aKS3G9JO5C01Asah6wUXrvALKEDoitMMHhDKrKJdg8RU2s0EB2EWWur8dd7PDPFv6dUC0Gv3kAN36VPRGP/5k5NS6lljWxG0TDiSr1VKhoPwhevRMSqkwRxDObc/DavGtpP6zoi8XOyZfhnyNEvKANBU0P8VPfI/wyNCGXSn7wlEmyA9KrgmOKGth3eDVvPfyywq2dnUEv2R9qG2rLsH7xJXziKnWcI8tlTvEC7Mu8hROlImTU9aKqcwQ1vWOihWFu+sJknmph5CvxQh87c7bNh/NXo03hrMCosyvLmMNgMF7TQL6J1dsZIUVwjKqEO+cajp5vxPN439U/gKBt8PTcYHzL/BgHCyOf4unAISj6mFC2bYC82kB5Ls460NHRUVsDeYSXpGw7UgC7sAtwShDgzdM38W7BbURXtqpqhfmB8sEQuXwoCM/6faGQuGCxyxyKWhIm+PrSD495WL3cT0hhi8Whc3NbAs9KaOyCTvrJ8qkdX19XBeTUDU00+55USFzVU2yHstcaix0mUAjJkJeuRU868Ucmk0lcguiBnMAVxjbbdHV1yeq8+u4Hgo22huSG+iQXp83ftaxW3lsPZcs6KG5T8OwaAfJiPcxlrVRVRhvF02i0F/t5VbHZ7JWDfErKTLnhE3mFPuRFepg/uxqz6TqLv6euGj3ut87t/4ylvre3t3ZehOWWO1zjSFEqMVP4GfGb/DBykJcjmaZOoLsc+hcVY/LaAgcTQAAAAABJRU5ErkJggg==', - 'OpenBSD': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AoYAykIPu64pQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADTklEQVQ4y32RXUxTdxjGn3N6eujoKT3SUkuk3VoBGfVjgFXAsZ7WkipyYXQbuu3CzUXZmGRbssnFEseFkWzgcGzGXky9MWL8TsC4IeFgtK4oAqOnG5vMVl1pCMVWQD7b/y5M6jLdflfvxfPked/nBQA0NDSChqnGVrLuGkES742NhJAdhAKAuk9yyUs5Gry7RQMZAARCWgivpQiPe71P5DUfH0xaqTL7m/iiLkJmphawa+e4SM2PvUyC4yUIBu8CnAQKAK53rCA5OUtQtStVpJ4Gw/FOBddZVKhCfq4MP4n6+at+DUsJm/e0G9JZzYEvI2tHwlEYjDxomkZ+3nG8WroRtHihZVOhVlorDQzh0okhcByDP4ZGcf+X9XAsvY5/RsBa7Kq5H/CqLctKyl/g08S2i6fq8W/MS3P34T9wNDVYSeDX1eTD9xhiLXbtB/Akwmmv6Kr+ICFkLpGhtNSM3qsSstS3oX8lSsmsxS6ZVn3j6PvVVqhUcvC8AtPxVPxwygVKvngN89WOjgVprggGA4eenjB4nsXsTASpC63I0wVTZYPR11FoKRB8Ax54PCFk6BhMTk5CPR3GSbHouGzknr/bYFq9EAvfc9Tu1sLjHcXNKxLuTOTgzOlOe7IHBc/beAXWpWmXlz8a84nhcLQ+ecVzsAEQrMWuMX+f9HZF2YPZ28FVSNfoPWqOzMUmqYMAJm7+/OOzXQFwHGpyEV+vi+yvtxBC9pDmpgJC4tvI3mo9GTitIxvW24nT7ug67HY/3eDs2bbyrVsrY2day70rV6kRfDAHk5lDLJqAmmeRiD9GJDKHvwb74R8G0mkTPjrQTTG122xkTTbwaV2b1H4u16JQKXGr7yG2b8/H1MQ09IsTSEmRwzf4CCwzD+dmE1re8CI7wwi5XNlFf9vaTXX4dWJg4LLl7h05fpNGwNAMWpp9CIVYNO/tRCzGwpDFQaVMQTS2CKY0BWr3GVGWNSXKACDDaA4Mh976pq9f5Sy09GgKlmeAMIBKzUKpU+BFoxJecRhUfAbMxDi4eADfHVmE79v7q575gvvYeVvjZ58LD5mwsKUyX0hnf0feslnQCWD4zxnc6reKisxsfH2oscqcmTmK/+Ow252cna7K52r+Bky6PqmoT5HBAAAAAElFTkSuQmCC', - 'Gnu': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAHC/Qd8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AoYAywUV5gQrwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAAmJLR0QA/4ePzL8AAAHHSURBVBgZZcFPSJNxAAbgt28uanSRapCsy0KK2CWCUYecB5HBolNsglZEsmAwaUvHaIu2YYty1bKGMKmgHIRbGEhURIEY/VHUQ+uwZcxEJSL5Ft+W5ubv7TMkip4HJglrPhHeUmAchWprBK+Kni9pukoAJAOF04j4y6Z9dZtu3sIT32lxXwxeRepwidP0mAF0p5JKPfBsLOMBQs/dJ3pehzcnQ+jc6SfFKlN8KMgEodLiQJWTFOyPY52mUbLmzANY4zro+xG8DVXn8UjOvg2WFSB69Oxo8Hx3F3CM2KsE2wO8LKbp5gWvtYK78zHKooM/eZFu9t0AUOCYIIf4IRfvOrIBKn12vEJyjtDhtx3QfV+dYPgO/qipOfeAgA0qn+UaW+TE9ZQjE0g63uhrpZh2yJyOPXKFe9uWrmTxtmpaSOwCgk5bWUfQywyt3MOOHmB4f9MyBu610ii3fRvlvBgRMrOc4mPmxQs2yPpylABObQ9FJxVyhAqXuEiyyOFiQcnT6TipBWDf6k9fGjwUWZgjF8V7PmVOlPmxkNmNvxhR136muELOclZ85QR73fiHBgZshM1e+UzBdzOmRvxPgmqLlKgl8mjGul/jG/ctzIC/LwAAAABJRU5ErkJggg==', - 'CrunchBang': 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAQCAQAAAC45EetAAAA8ElEQVR4XnWOsUpCYQBGz1TIHYu2Qix6g0DEtSeQu/UIISJtUS8gJq61F1wcdMohcBDxKUR8hsz1xA/y44/cs3znbB+RJ0Skl3pSkeFQbUs79VAPzrwPFRmN1Ja0Ug/16I93+1oi4lKte+zMXv32WuoAm43lXMrqzbFncgWw21lORf4+/PREKpAhYqZuPXZ+T/3yXbZEajV1JavUQ104sRcq0myqc5mnHurWqc/7yhExVwuPncl+C4Bu13L60ueAwcByOtLhgAIRCzU38fRGTmSxUBvSSD3Ui1NvQkXWa7Uq1dRD9R17HiqyRUSy1NP6B7e1Yu2GtlUKAAAAAElFTkSuQmCC', - 'Yuno': 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAPCAYAAAD+pA/bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAABDtJREFUOE+FlHtMm1UYxrtsi8aEgCb+oTFmZur+WNS5RaPERU10C2qGaBgb6hgwLwMmHTIKlIKlQIHSQrmU24BSSmnpBVooUmihtEC5yKWDjVu5uOkcEca4lG5E93j6EQmELX7Jky/fOed9fu973vMdGu0xT3Cgz57yXMZLDdXcy821PFWLKmuA6HqLMqtLX5POl4iYb2ukWW8IOOFe/qfe3/M4n0eOjwyZD8//bldODOk37N1yDJgl+LVdjEGLFKO9KkzZm8hbje7mIrTXZ7sMtTydrJh15H8hHW11XvN/jGS7VudcD5w34ZZzeQYb67fwYO03LN4exo1+LWzNxbA05O5QuzbHqRYn+++CHDx4YK9WLfaedfQzV5em54g5Zbi8OIml+VFMDLWQ7GXoaSmFWZsDZVGCO2u0EbkhHTrhFqi9PmelSsQ8tAtSVch60dpUeGe4kxgZxegzVkBzlQ2NKBG2+iJIMqMok9r8OLRIMqApToSqmAWTmk9B2+o2YW79oshU7ABcuvAFrVGWXkVKpBYoSaBSxIS2mINpiwbjZiUMZRloVfJQyaXDKObBpimBScpHFe8KmmXpaKhK3arGrBVuVBclHN2CiPNin1OVs1tVJYlQlyZBxA6DviQVo6ZaOKd7sTplw53BVugruBBzfsRslw7rZPxaczWutSpQV/gzJPxo1JexyfaxKBBpuiEx+tw+CpKdEvGWTprGlhcwqbIzL5/DYKMYndpK3L1hxf3ZfkrzwybUZjPhnOqmvlcmutFF1jis9QSShOrcWNSXJ1MA0ou/NZWc8Ddfe4VGO3bk0JON1dyMMlK+gmxNrZCFhZF2Kng7YNO0awt4b7wLNp2EqtAsF6ImP56SG0B6siovTYpIjg15gapCVhAfJRUyIBFEo6k8AyuTtkcC/qvG/XbDexulWJvqgYH0o0nKhVHFJ40XwFQnWM5OCX+XMg86c3KvVMSMapCmPpSTIygTxGKZZOcOXhrr3Mp4uzkFuG6B3ajE3TELDDU8qEmsmvRATxquKkxAnSTFjwKEfv3JU9JC5unG6rQ1bTkbQ4Yq/DVgxOqwBWt2K9Yne3ZCZvrgHO2k5paHzOhSiVCZSkdNTgzy40JRlPgDhDHBCxUZdCs91G8fLeK87zOl6XSOICZYXMGNhDqX9fDP/mbK2DXVi/szm03eLpejl5pzOfqwOt4JBT8OeYwQt/4R/BR0OzXiLCM5LOCji/4nXt46rpywgG+zor5RxgSdupBzJdglSY+5ZZbl3XNY6mbn7W0Lcx06zBg1WBjtcC6OmG+OmRTrFrnIUZESZeVeCpwh8TpiPsQ47/tloM97T+/6m8mg55mT3tStyL54mhlwwtszNvjzD8/6HH8i7PvvPPRioZdRWuDBZUR6pEWG7I8P9Xs1Jsj36MfvvO5J/+rTw58dP7afJPfBgeef3XGz/gskFVpJc4HwGwAAAABJRU5ErkJggg==' - } - }; - - ExpandComment = { - init: function() { - if (g.VIEW !== 'index' || !Conf['Comment Expansion']) { - return; - } - if (g.BOARD.ID === 'g') { - this.callbacks.push(Fourchan.code); - } - if (g.BOARD.ID === 'sci') { - this.callbacks.push(Fourchan.math); - } - return Post.callbacks.push({ - name: 'Comment Expansion', - cb: this.node - }); - }, - node: function() { - var a; - if (a = $('.abbr > a:not([onclick])', this.nodes.comment)) { - return $.on(a, 'click', ExpandComment.cb); - } - }, - callbacks: [], - cb: function(e) { - e.preventDefault(); - return ExpandComment.expand(Get.postFromNode(this)); - }, - expand: function(post) { - var a; - if (post.nodes.longComment && !post.nodes.longComment.parentNode) { - $.replace(post.nodes.shortComment, post.nodes.longComment); - post.nodes.comment = post.nodes.longComment; - return; - } - if (!(a = $('.abbr > a', post.nodes.comment))) { - return; - } - a.textContent = "Post No." + post + " Loading..."; - return $.cache("//api.4chan.org" + a.pathname + ".json", function() { - return ExpandComment.parse(this, a, post); - }); - }, - contract: function(post) { - var a; - if (!post.nodes.shortComment) { - return; - } - a = $('.abbr > a', post.nodes.shortComment); - a.textContent = 'here'; - $.replace(post.nodes.longComment, post.nodes.shortComment); - return post.nodes.comment = post.nodes.shortComment; - }, - parse: function(req, a, post) { - var callback, clone, comment, href, postObj, posts, quote, spoilerRange, status, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - status = req.status; - if (status !== 200 && status !== 304) { - a.textContent = "Error " + req.statusText + " (" + status + ")"; - return; - } - posts = JSON.parse(req.response).posts; - if (spoilerRange = posts[0].custom_spoiler) { - Build.spoilerRange[g.BOARD] = spoilerRange; - } - for (_i = 0, _len = posts.length; _i < _len; _i++) { - postObj = posts[_i]; - if (postObj.no === post.ID) { - break; - } - } - if (postObj.no !== post.ID) { - a.textContent = "Post No." + post + " not found."; - return; - } - comment = post.nodes.comment; - clone = comment.cloneNode(false); - clone.innerHTML = postObj.com; - _ref = $$('.quotelink', clone); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - quote = _ref[_j]; - href = quote.getAttribute('href'); - if (href[0] === '/') { - continue; - } - quote.href = "/" + post.board + "/res/" + href; - } - post.nodes.shortComment = comment; - $.replace(comment, clone); - post.nodes.comment = post.nodes.longComment = clone; - post.parseComment(); - post.parseQuotes(); - _ref1 = ExpandComment.callbacks; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - callback = _ref1[_k]; - callback.call(post); - } - } - }; - - ExpandThread = { - statuses: {}, - init: function() { - if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { - return; - } - return $.on(d, 'IndexRefresh', this.onIndexRefresh); - }, - setButton: function(thread) { - var a; - if (!(a = $.x('following-sibling::a[contains(@class,"summary")][1]', thread.OP.nodes.root))) { - return; - } - a.textContent = ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(a.textContent.match(/\d+/g)))); - return $.on(a, 'click', ExpandThread.cbToggle); - }, - disconnect: function(refresh) { - var status, threadID, _ref, _ref1; - if (g.VIEW === 'thread' || !Conf['Thread Expansion']) { - return; - } - _ref = ExpandThread.statuses; - for (threadID in _ref) { - status = _ref[threadID]; - if ((_ref1 = status.req) != null) { - _ref1.abort(); - } - delete ExpandThread.statuses[threadID]; - } - if (!refresh) { - return $.off(d, 'IndexRefresh', this.onIndexRefresh); - } - }, - onIndexRefresh: function() { - ExpandThread.disconnect(true); - return g.BOARD.threads.forEach(function(thread) { - return ExpandThread.setButton(thread); - }); - }, - text: function(status, posts, files) { - return ("" + status + " " + posts + " post" + (posts > 1 ? 's' : '')) + (+files ? " and " + files + " image repl" + (files > 1 ? 'ies' : 'y') : "") + (" " + (status === '-' ? 'shown' : 'omitted') + "."); - }, - cbToggle: function(e) { - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { - return; - } - e.preventDefault(); - return ExpandThread.toggle(Get.threadFromNode(this)); - }, - toggle: function(thread) { - var a, threadRoot; - threadRoot = thread.OP.nodes.root.parentNode; - if (!(a = $('.summary', threadRoot))) { - return; - } - if (thread.ID in ExpandThread.statuses) { - return ExpandThread.contract(thread, a, threadRoot); - } else { - return ExpandThread.expand(thread, a, threadRoot); - } - }, - expand: function(thread, a, threadRoot) { - var status; - ExpandThread.statuses[thread] = status = {}; - a.textContent = ExpandThread.text.apply(ExpandThread, ['...'].concat(__slice.call(a.textContent.match(/\d+/g)))); - return status.req = $.cache("//a.4cdn.org/" + thread.board + "/res/" + thread + ".json", function() { - delete status.req; - return ExpandThread.parse(this, thread, a); - }); - }, - contract: function(thread, a, threadRoot) { - var filesCount, inlined, num, postsCount, replies, reply, status, _i, _len; - status = ExpandThread.statuses[thread]; - delete ExpandThread.statuses[thread]; - if (status.req) { - status.req.abort(); - if (a) { - a.textContent = ExpandThread.text.apply(ExpandThread, ['+'].concat(__slice.call(a.textContent.match(/\d+/g)))); - } - return; - } - replies = $$('.thread > .replyContainer', threadRoot); - if (Conf['Show Replies']) { - num = (function() { - if (thread.isSticky) { - return 1; - } else { - switch (g.BOARD.ID) { - case 'b': - case 'vg': - return 3; - case 't': - return 1; - default: - return 5; - } - } - })(); - replies = replies.slice(0, -num); - } - postsCount = 0; - filesCount = 0; - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (Conf['Quote Inlining']) { - while (inlined = $('.inlined', reply)) { - inlined.click(); - } - } - postsCount++; - if ('file' in Get.postFromRoot(reply)) { - filesCount++; - } - $.rm(reply); - } - return a.textContent = ExpandThread.text('+', postsCount, filesCount); - }, - parse: function(req, thread, a) { - var filesCount, post, postData, posts, postsCount, postsRoot, root, _i, _len, _ref, _ref1; - if ((_ref = req.status) !== 200 && _ref !== 304) { - a.textContent = "Error " + req.statusText + " (" + req.status + ")"; - return; - } - Build.spoilerRange[thread.board] = req.response.posts[0].custom_spoiler; - posts = []; - postsRoot = []; - filesCount = 0; - _ref1 = req.response.posts; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - postData = _ref1[_i]; - if (postData.no === thread.ID) { - continue; - } - if (post = thread.posts[postData.no]) { - if ('file' in post) { - filesCount++; - } - postsRoot.push(post.nodes.root); - continue; - } - root = Build.postFromObject(postData, thread.board.ID); - post = new Post(root, thread, thread.board); - if ('file' in post) { - filesCount++; - } - posts.push(post); - postsRoot.push(root); - } - Main.callbackNodes(Post, posts); - $.after(a, postsRoot); - postsCount = postsRoot.length; - a.textContent = ExpandThread.text('-', postsCount, filesCount); - return Fourchan.parseThread(thread.ID, 1, postsCount); - } - }; - - FileInfo = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['File Info Formatting']) { - return; - } - this.funk = this.createFunc(Conf['fileInfo']); - return Post.callbacks.push({ - name: 'File Info Formatting', - cb: this.node - }); - }, - node: function() { - if (!this.file || this.isClone) { - return; - } - return this.file.text.innerHTML = "" + (FileInfo.funk(FileInfo, this)) + ""; - }, - createFunc: function(format) { - var code; - code = format.replace(/%(.)/g, function(s, c) { - if (c in FileInfo.formatters) { - return "' + FileInfo.formatters." + c + ".call(post) + '"; - } else { - return s; - } - }); - return Function('FileInfo', 'post', "return '" + code + "'"); - }, - convertUnit: function(size, unit) { - var i; - if (unit === 'B') { - return "" + (size.toFixed()) + " Bytes"; - } - i = 1 + ['KB', 'MB'].indexOf(unit); - while (i--) { - size /= 1024; - } - size = unit === 'MB' ? Math.round(size * 100) / 100 : size.toFixed(); - return "" + size + " " + unit; - }, - escape: function(name) { - return name.replace(/<|>/g, function(c) { - return c === '<' && '<' || '>'; - }); - }, - formatters: { - t: function() { - return this.file.URL.match(/\d+\..+$/)[0]; - }, - T: function() { - return "" + (FileInfo.formatters.t.call(this)) + ""; - }, - l: function() { - return "" + (FileInfo.formatters.n.call(this)) + ""; - }, - L: function() { - return "" + (FileInfo.formatters.N.call(this)) + ""; - }, - n: function() { - var fullname, shortname; - fullname = this.file.name; - shortname = Build.shortFilename(this.file.name, this.isReply); - if (fullname === shortname) { - return FileInfo.escape(fullname); - } else { - return "" + (FileInfo.escape(shortname)) + "" + (FileInfo.escape(fullname)) + ""; - } - }, - N: function() { - return FileInfo.escape(this.file.name); - }, - p: function() { - if (this.file.isSpoiler) { - return 'Spoiler, '; - } else { - return ''; - } - }, - s: function() { - return this.file.size; - }, - B: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'B'); - }, - K: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'KB'); - }, - M: function() { - return FileInfo.convertUnit(this.file.sizeInBytes, 'MB'); - }, - r: function() { - if (this.file.isImage) { - return this.file.dimensions; - } else { - return 'PDF'; - } - } - } - }; - - Fourchan = { - init: function() { - var board; - if (g.VIEW === 'catalog') { - return; - } - board = g.BOARD.ID; - if (board === 'g') { - $.globalEval("window.addEventListener('prettyprint', function(e) {\n window.dispatchEvent(new CustomEvent('prettyprint:cb', {\n detail: prettyPrintOne(e.detail)\n }));\n}, false);"); - Post.callbacks.push({ - name: 'Parse /g/ code', - cb: this.code - }); - } - if (board === 'sci') { - $.globalEval("window.addEventListener('jsmath', function(e) {\n if (jsMath.loaded) {\n // process one post\n jsMath.ProcessBeforeShowing(e.detail);\n } else {\n // load jsMath and process whole document\n jsMath.Autoload.Script.Push('ProcessBeforeShowing', [null]);\n jsMath.Autoload.LoadJsMath();\n }\n}, false);"); - return Post.callbacks.push({ - name: 'Parse /sci/ math', - cb: this.math - }); - } - }, - code: function() { - var apply, pre, _i, _len, _ref; - if (this.isClone) { - return; - } - apply = function(e) { - return pre.innerHTML = e.detail; - }; - $.on(window, 'prettyprint:cb', apply); - _ref = $$('.prettyprint:not(.prettyprinted)', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - pre = _ref[_i]; - $.event('prettyprint', pre.innerHTML, window); - } - $.off(window, 'prettyprint:cb', apply); - }, - math: function() { - if (this.isClone || !$('.math', this.nodes.comment)) { - return; - } - return $.event('jsmath', this.nodes.post, window); - }, - parseThread: function(threadID, offset, limit) { - return $.event('4chanParsingDone', { - threadId: threadID, - offset: offset, - limit: limit - }); - } - }; - - IDColor = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Color User IDs']) { - return; - } - this.ids = {}; - return Post.callbacks.push({ - name: 'Color User IDs', - cb: this.node - }); - }, - node: function() { - var rgb, span, style, uid; - if (this.isClone || !(uid = this.info.uniqueID)) { - return; - } - span = $('.hand', this.nodes.uniqueID); - if (!(span && span.nodeName === 'SPAN')) { - return; - } - rgb = IDColor.compute(uid); - style = span.style; - style.color = rgb[3]; - style.backgroundColor = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"; - $.addClass(span, 'painted'); - return span.title = 'Highlight posts by this ID'; - }, - compute: function(uid) { - var hash, rgb; - if (IDColor.ids[uid]) { - return IDColor.ids[uid]; - } - hash = IDColor.hash(uid); - rgb = [(hash >> 24) & 0xFF, (hash >> 16) & 0xFF, (hash >> 8) & 0xFF]; - rgb[3] = (rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114) > 125 ? '#000' : '#fff'; - return this.ids[uid] = rgb; - }, - hash: function(uid) { - var i, msg; - msg = 0; - i = 0; - while (i < 8) { - msg = (msg << 5) - msg + uid.charCodeAt(i++); - } - return msg; - } - }; - - InfiniScroll = { - init: function() { - if (!(Conf['Infinite Scrolling'] && g.VIEW === 'index' && g.BOARD !== 'f')) { - return; - } - this.threads = g.threads; - return $.on(d, '4chanXInitFinished', this.ready); - }, - ready: function() { - $.off(d, '4chanXInitFinished', InfiniScroll.ready); - $.on(d, 'scroll', InfiniScroll.scroll); - return InfiniScroll.scroll(); - }, - scroll: $.debounce(100, function() { - var url; - if (InfiniScroll.isFetching || ((d.body.scrollTop || doc.scrollTop) <= doc.scrollHeight - (300 + window.innerHeight))) { - return; - } - if (InfiniScroll.isDead) { - return InfiniScroll.notice(); - } - if (InfiniScroll.cache && InfiniScroll.cache.time > Date.now() - $.MINUTE) { - return InfiniScroll.parse(InfiniScroll.cache); - } - new Notice('info', "Fetching next page.", 2); - InfiniScroll.isFetching = true; - url = "//api.4chan.org/" + g.BOARD + "/catalog.json"; - return $.ajax(url, { - onloadend: InfiniScroll.cb.load - }, { - whenModified: true - }); - }), - parse: function(response) { - var botPostForm, el, nodes, omitted_images, omitted_posts, op, post, postlink, posts, replylink, thread, threadID, threadNodes, threads, _i, _j, _len, _len1, _ref; - threads = InfiniScroll.parsePages(response); - threadNodes = []; - nodes = []; - if (!threads.length) { - InfiniScroll.notice(); - return InfiniScroll.isDead = true; - } - for (_i = 0, _len = threads.length; _i < _len; _i++) { - thread = threads[_i]; - posts = []; - omitted_posts = thread.omitted_posts, omitted_images = thread.omitted_images; - threadID = thread.no; - el = $.el('div', { - className: 'thread', - id: "t" + threadID - }); - op = Build.postFromObject(thread, g.BOARD); - posts.push(op); - replylink = $.el('a', { - href: "res/" + threadID, - className: 'replylink', - textContent: 'Reply' - }); - postlink = $.el('div', { - className: "postLink mobile", - innerHTML: "View Thread" - }); - if (omitted_posts) { - posts.push($.el('span', { - className: 'summary desktop', - innerHTML: "" + omitted_posts + " posts " + (omitted_images ? "and " + omitted_images + " image replies" : void 0) + " omitted. Click here to view." - })); - $.prepend(postlink, $.el('span', { - className: 'info', - innerHTML: "" + omitted_posts + " posts omitted" + (omitted_images ? "
(" + omitted_images + " have images)" : "") - })); - } - $.add($('.postInfo', op), [$.tn('\u00A0\u00A0\u00A0['), replylink, $.tn(']\u00A0')]); - $.add(op, postlink); - if (thread.last_replies) { - _ref = thread.last_replies; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - post = _ref[_j]; - posts.push(Build.postFromObject(post, g.BOARD)); - } - } - $.add(el, posts); - threadNodes.push(el); - nodes.push(el); - nodes.push($.el('hr')); - } - InfiniScroll.features(threadNodes); - if (botPostForm = $('.board > .mobile.center')) { - return $.before(botPostForm, nodes); - } - }, - parsePages: function(response) { - var newThreads, number, page, pages, thread, threads, _i, _len; - pages = JSON.parse(response); - newThreads = []; - for (number in pages) { - page = pages[number]; - if (!(pages.hasOwnProperty(number))) { - continue; - } - threads = page.threads; - for (_i = 0, _len = threads.length; _i < _len; _i++) { - thread = threads[_i]; - if (g.threads["" + g.BOARD + "." + thread.no]) { - continue; - } - newThreads.push(thread); - if (newThreads.length === 15) { - return newThreads; - } - } - } - return newThreads; - }, - features: function(threadNodes) { - var err, errors, post, posts, thread, threadRoot, threads, _i, _j, _len, _len1, _ref; - posts = []; - threads = []; - for (_i = 0, _len = threadNodes.length; _i < _len; _i++) { - threadRoot = threadNodes[_i]; - thread = new Thread(+threadRoot.id.slice(1), g.BOARD); - threads.push(thread); - _ref = $$('.thread > .postContainer', threadRoot); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - post = _ref[_j]; - try { - posts.push(new Post(post, thread, g.BOARD)); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Parsing of Post No." + (postRoot.id.match(/\d+/)) + " failed. Post will be skipped.", - error: err - }); - } - } - } - if (errors) { - Main.handleErrors(errors); - } - Main.callbackNodes(Thread, threads); - return Main.callbackNodes(Post, posts); - }, - notice: (function() { - var notify, reset; - notify = false; - reset = function() { - return notify = false; - }; - return function() { - if (notify) { - return; - } - notify = true; - new Notice('info', "Last page reached.", 2); - return setTimeout(reset, 3 * $.SECOND); - }; - })(), - cb: { - load: function() { - InfiniScroll.isFetching = false; - if (this.status !== 200) { - return; - } - InfiniScroll.cache = new String(this.response); - InfiniScroll.cache.time = Date.now(); - return InfiniScroll.parse(this.response); - } - } - }; - - Keybinds = { - init: function() { - var hotkey, init; - if (g.VIEW === 'catalog' || !Conf['Keybinds']) { - return; - } - for (hotkey in Conf.hotkeys) { - $.sync(hotkey, Keybinds.sync); - } - init = function() { - var node, _i, _len, _ref; - $.off(d, '4chanXInitFinished', init); - $.on(d, 'keydown', Keybinds.keydown); - _ref = $$('[accesskey]'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - node.removeAttribute('accesskey'); - } - }; - return $.on(d, '4chanXInitFinished', init); - }, - sync: function(key, hotkey) { - return Conf[hotkey] = key; - }, - keydown: function(e) { - var key, notification, notifications, op, target, thread, threadRoot, _i, _len, _ref; - if (!(key = Keybinds.keyCode(e))) { - return; - } - target = e.target; - if ((_ref = target.nodeName) === 'INPUT' || _ref === 'TEXTAREA') { - if (!/(Esc|Alt|Ctrl|Meta|Shift\+\w{2,})/.test(key)) { - return; - } - } - threadRoot = Nav.getThread(); - if (op = $('.op', threadRoot)) { - thread = Get.postFromNode(op).thread; - } - switch (key) { - case Conf['Toggle board list']: - if (Conf['Custom Board Navigation']) { - Header.toggleBoardList(); - } - break; - case Conf['Toggle header']: - Header.toggleBarVisibility(); - break; - case Conf['Open empty QR']: - Keybinds.qr(threadRoot); - break; - case Conf['Open QR']: - Keybinds.qr(threadRoot, true); - break; - case Conf['Open settings']: - Settings.open(); - break; - case Conf['Close']: - if (Settings.dialog) { - Settings.close(); - } else if ((notifications = $$('.notification')).length) { - for (_i = 0, _len = notifications.length; _i < _len; _i++) { - notification = notifications[_i]; - $('.close', notification).click(); - } - } else if (QR.nodes) { - if (Conf['Persistent QR']) { - QR.hide(); - } else { - QR.close(); - } - } - break; - case Conf['Spoiler tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('spoiler', target); - break; - case Conf['Code tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('code', target); - break; - case Conf['Eqn tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('eqn', target); - break; - case Conf['Math tags']: - if (target.nodeName !== 'TEXTAREA') { - return; - } - Keybinds.tags('math', target); - break; - case Conf['Toggle sage']: - if (QR.nodes) { - Keybinds.sage(); - } - break; - case Conf['Submit QR']: - if (QR.nodes && !QR.status()) { - QR.submit(); - } - break; - case Conf['Update']: - switch (g.VIEW) { - case 'thread': - ThreadUpdater.update(); - break; - case 'index': - Index.update(); - } - break; - case Conf['Watch']: - ThreadWatcher.toggle(thread); - break; - case Conf['Expand image']: - Keybinds.img(threadRoot); - break; - case Conf['Expand images']: - Keybinds.img(threadRoot, true); - break; - case Conf['Open Gallery']: - Gallery.cb.toggle(); - break; - case Conf['fappeTyme']: - FappeTyme.cb.toggle.call({ - name: 'fappe' - }); - break; - case Conf['werkTyme']: - FappeTyme.cb.toggle.call({ - name: 'werk' - }); - break; - case Conf['Front page']: - if (g.VIEW === 'index') { - Index.userPageNav(0); - } else { - window.location = "/" + g.BOARD + "/"; - } - break; - case Conf['Open front page']: - $.open("/" + g.BOARD + "/"); - break; - case Conf['Next page']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'all pages')) { - return; - } - $('.next button', Index.pagelist).click(); - break; - case Conf['Previous page']: - if (!(g.VIEW === 'index' && Conf['Index Mode'] !== 'all pages')) { - return; - } - $('.prev button', Index.pagelist).click(); - break; - case Conf['Search form']: - Index.searchInput.focus(); - break; - case Conf['Open catalog']: - if (Conf['External Catalog']) { - window.location = CatalogLinks.external(g.BOARD.ID); - } else { - window.location = "/" + g.BOARD + "/catalog"; - } - break; - case Conf['Next thread']: - if (g.VIEW !== 'index') { - return; - } - Nav.scroll(+1); - break; - case Conf['Previous thread']: - if (g.VIEW !== 'index') { - return; - } - Nav.scroll(-1); - break; - case Conf['Expand thread']: - ExpandThread.toggle(thread); - break; - case Conf['Open thread']: - Keybinds.open(thread); - break; - case Conf['Open thread tab']: - Keybinds.open(thread, true); - break; - case Conf['Next reply']: - Keybinds.hl(+1, threadRoot); - break; - case Conf['Previous reply']: - Keybinds.hl(-1, threadRoot); - break; - case Conf['Deselect reply']: - Keybinds.hl(0, threadRoot); - break; - case Conf['Hide']: - if (ThreadHiding.db) { - ThreadHiding.toggle(thread); - } - break; - case Conf['Previous Post Quoting You']: - QuoteYou.cb.seek('preceding'); - break; - case Conf['Next Post Quoting You']: - QuoteYou.cb.seek('following'); - break; - default: - return; - } - e.preventDefault(); - return e.stopPropagation(); - }, - keyCode: function(e) { - var kc, key; - key = (function() { - switch (kc = e.keyCode) { - case 8: - return ''; - case 13: - return 'Enter'; - case 27: - return 'Esc'; - case 37: - return 'Left'; - case 38: - return 'Up'; - case 39: - return 'Right'; - case 40: - return 'Down'; - default: - if ((48 <= kc && kc <= 57) || (65 <= kc && kc <= 90)) { - return String.fromCharCode(kc).toLowerCase(); - } else { - return null; - } - } - })(); - if (key) { - if (e.altKey) { - key = 'Alt+' + key; - } - if (e.ctrlKey) { - key = 'Ctrl+' + key; - } - if (e.metaKey) { - key = 'Meta+' + key; - } - if (e.shiftKey) { - key = 'Shift+' + key; - } - } - return key; - }, - qr: function(thread, quote) { - if (!(Conf['Quick Reply'] && QR.postingIsEnabled)) { - return; - } - QR.open(); - if (quote) { - QR.quote.call($('input', $('.post.highlight', thread) || thread)); - } - QR.nodes.com.focus(); - if (Conf['QR Shortcut']) { - return $.rmClass($('.qr-shortcut'), 'disabled'); - } - }, - tags: function(tag, ta) { - var range, selEnd, selStart, value; - value = ta.value; - selStart = ta.selectionStart; - selEnd = ta.selectionEnd; - ta.value = value.slice(0, selStart) + ("[" + tag + "]") + value.slice(selStart, selEnd) + ("[/" + tag + "]") + value.slice(selEnd); - range = ("[" + tag + "]").length + selEnd; - ta.setSelectionRange(range, range); - return $.event('input', null, ta); - }, - sage: function() { - var isSage; - isSage = /sage/i.test(QR.nodes.email.value); - return QR.nodes.email.value = isSage ? "" : "sage"; - }, - img: function(thread, all) { - var post; - if (all) { - return ImageExpand.cb.toggleAll(); - } else { - post = Get.postFromNode($('.post.highlight', thread) || $('.op', thread)); - return ImageExpand.toggle(post); - } - }, - open: function(thread, tab) { - var url; - if (g.VIEW !== 'index') { - return; - } - url = "/" + thread.board + "/res/" + thread; - if (tab) { - return $.open(url); - } else { - return location.href = url; - } - }, - hl: function(delta, thread) { - var axis, height, next, postEl, replies, reply, root, _i, _len; - postEl = $('.reply.highlight', thread); - if (!delta) { - if (postEl) { - $.rmClass(postEl, 'highlight'); - } - return; - } - if (postEl) { - height = postEl.getBoundingClientRect().height; - if (Header.getTopOf(postEl) >= -height && Header.getBottomOf(postEl) >= -height) { - root = postEl.parentNode; - axis = delta === +1 ? 'following' : 'preceding'; - if (!(next = $.x("" + axis + "-sibling::div[contains(@class,'replyContainer') and not(@hidden) and not(child::div[@class='stub'])][1]/child::div[contains(@class,'reply')]", root))) { - return; - } - Header.scrollToIfNeeded(next, delta === +1); - this.focus(next); - $.rmClass(postEl, 'highlight'); - return; - } - $.rmClass(postEl, 'highlight'); - } - replies = $$('.reply', thread); - if (delta === -1) { - replies.reverse(); - } - for (_i = 0, _len = replies.length; _i < _len; _i++) { - reply = replies[_i]; - if (delta === +1 && Header.getTopOf(reply) > 0 || delta === -1 && Header.getBottomOf(reply) > 0) { - this.focus(reply); - return; - } - } - }, - focus: function(post) { - return $.addClass(post, 'highlight'); - } - }; - - Nav = { - init: function() { - var append, next, prev, span; - switch (g.VIEW) { - case 'index': - if (!Conf['Index Navigation']) { - return; - } - break; - case 'thread': - if (!Conf['Reply Navigation']) { - return; - } - break; - default: - return; - } - span = $.el('span', { - id: 'navlinks' - }); - prev = $.el('a', { - textContent: '▲', - href: 'javascript:;' - }); - next = $.el('a', { - textContent: '▼', - href: 'javascript:;' - }); - $.on(prev, 'click', this.prev); - $.on(next, 'click', this.next); - $.add(span, [prev, $.tn(' '), next]); - append = function() { - $.off(d, '4chanXInitFinished', append); - return $.add(d.body, span); - }; - return $.on(d, '4chanXInitFinished', append); - }, - prev: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, 0); - } else { - return Nav.scroll(-1); - } - }, - next: function() { - if (g.VIEW === 'thread') { - return window.scrollTo(0, d.body.scrollHeight); - } else { - return Nav.scroll(+1); - } - }, - getThread: function() { - var thread, threadRoot, _i, _len, _ref; - _ref = $$('.thread'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - threadRoot = _ref[_i]; - thread = Get.threadFromRoot(threadRoot); - if (thread.isHidden && !thread.stub) { - continue; - } - if (Header.getTopOf(threadRoot) >= -threadRoot.getBoundingClientRect().height) { - return threadRoot; - } - } - return $('.board'); - }, - scroll: function(delta) { - var axis, next, thread, top; - thread = Nav.getThread(); - axis = delta === +1 ? 'following' : 'preceding'; - if (next = $.x("" + axis + "-sibling::div[contains(@class,'thread') and not(@hidden)][1]", thread)) { - top = Header.getTopOf(thread); - if (delta === +1 && top < 5 || delta === -1 && top > -5) { - thread = next; - } - } - return Header.scrollTo(thread); - } - }; - - RelativeDates = { - INTERVAL: $.MINUTE / 2, - init: function() { - switch (g.VIEW) { - case 'index': - this.flush(); - $.on(d, 'visibilitychange', this.flush); - if (!Conf['Relative Post Dates']) { - return; - } - break; - case 'thread': - if (!Conf['Relative Post Dates']) { - return; - } - this.flush(); - if (g.VIEW === 'thread') { - $.on(d, 'visibilitychange ThreadUpdate', this.flush); - } - break; - default: - return; - } - return Post.callbacks.push({ - name: 'Relative Post Dates', - cb: this.node - }); - }, - node: function() { - var dateEl; - if (this.isClone) { - return; - } - dateEl = this.nodes.date; - dateEl.title = dateEl.textContent; - return RelativeDates.update(this); - }, - relative: function(diff, now, date) { - var days, months, number, rounded, unit, years; - unit = (number = diff / $.DAY) >= 1 ? (years = now.getYear() - date.getYear(), months = now.getMonth() - date.getMonth(), days = now.getDate() - date.getDate(), years > 1 ? (number = years - (months < 0 || months === 0 && days < 0), 'year') : years === 1 && (months > 0 || months === 0 && days >= 0) ? (number = years, 'year') : (months = (months + 12) % 12) > 1 ? (number = months - (days < 0), 'month') : months === 1 && days >= 0 ? (number = months, 'month') : 'day') : (number = diff / $.HOUR) >= 1 ? 'hour' : (number = diff / $.MINUTE) >= 1 ? 'minute' : (number = Math.max(0, diff) / $.SECOND, 'second'); - rounded = Math.round(number); - if (rounded !== 1) { - unit += 's'; - } - return "" + rounded + " " + unit + " ago"; - }, - stale: [], - flush: function() { - var data, now, _i, _len, _ref; - if (d.hidden) { - return; - } - now = new Date(); - _ref = RelativeDates.stale; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - data = _ref[_i]; - RelativeDates.update(data, now); - } - RelativeDates.stale = []; - clearTimeout(RelativeDates.timeout); - return RelativeDates.timeout = setTimeout(RelativeDates.flush, RelativeDates.INTERVAL); - }, - update: function(data, now) { - var date, diff, isPost, relative, singlePost, _i, _len, _ref; - isPost = data instanceof Post; - date = isPost ? data.info.date : new Date(+data.dataset.utc); - now || (now = new Date()); - diff = now - date; - relative = RelativeDates.relative(diff, now, date); - if (isPost) { - _ref = [data].concat(data.clones); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - singlePost = _ref[_i]; - singlePost.nodes.date.firstChild.textContent = relative; - } - } else { - data.firstChild.textContent = relative; - } - return RelativeDates.setOwnTimeout(diff, data); - }, - setOwnTimeout: function(diff, data) { - var delay; - delay = diff < $.MINUTE ? $.SECOND - (diff + $.SECOND / 2) % $.SECOND : diff < $.HOUR ? $.MINUTE - (diff + $.MINUTE / 2) % $.MINUTE : diff < $.DAY ? $.HOUR - (diff + $.HOUR / 2) % $.HOUR : $.DAY - (diff + $.DAY / 2) % $.DAY; - return setTimeout(RelativeDates.markStale, delay, data); - }, - markStale: function(data) { - if (__indexOf.call(RelativeDates.stale, data) >= 0) { - return; - } - if (data instanceof Post && !g.posts[data.fullID]) { - return; - } - return RelativeDates.stale.push(data); - } - }; - - RemoveSpoilers = { - init: function() { - if (Conf['Reveal Spoilers'] && !Conf['Remove Spoilers']) { - $.addClass(doc, 'reveal-spoilers'); - } - if (!Conf['Remove Spoilers']) { - return; - } - if (Conf['Reveal Spoilers']) { - this.wrapper = function(text) { - return "[spoiler]" + text + "[/spoiler]"; - }; - } - return Post.callbacks.push({ - name: 'Reveal Spoilers', - cb: this.node - }); - }, - wrapper: function(text) { - return text; - }, - node: function(post) { - var spoiler, spoilers, _i, _len; - spoilers = $$('s', this.nodes.comment); - for (_i = 0, _len = spoilers.length; _i < _len; _i++) { - spoiler = spoilers[_i]; - $.replace(spoiler, $.tn(RemoveSpoilers.wrapper(spoiler.textContent))); - } - } - }; - - Report = { - init: function() { - if (!/report/.test(location.search)) { - return; - } - return $.asap((function() { - return $.id('recaptcha_response_field'); - }), Report.ready); - }, - ready: function() { - var field; - field = $.id('recaptcha_response_field'); - $.on(field, 'keydown', function(e) { - if (e.keyCode === 8 && !field.value) { - return $.globalEval('Recaptcha.reload("t")'); - } - }); - return $.on($('form'), 'submit', function(e) { - var response; - e.preventDefault(); - response = field.value.trim(); - if (!/\s/.test(response)) { - field.value = "" + response + " " + response; - } - return this.submit(); - }); - } - }; - - Time = { - init: function() { - if (g.VIEW === 'catalog' || !Conf['Time Formatting']) { - return; - } - this.funk = this.createFunc(Conf['time']); - return Post.callbacks.push({ - name: 'Time Formatting', - cb: this.node - }); - }, - node: function() { - if (this.isClone) { - return; - } - return this.nodes.date.textContent = Time.funk(Time, this.info.date); - }, - createFunc: function(format) { - var code; - code = format.replace(/%([A-Za-z])/g, function(s, c) { - if (c in Time.formatters) { - return "' + Time.formatters." + c + ".call(date) + '"; - } else { - return s; - } - }); - return Function('Time', 'date', "return '" + code + "'"); - }, - day: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - zeroPad: function(n) { - if (n < 10) { - return "0" + n; - } else { - return n; - } - }, - formatters: { - a: function() { - return Time.day[this.getDay()].slice(0, 3); - }, - A: function() { - return Time.day[this.getDay()]; - }, - b: function() { - return Time.month[this.getMonth()].slice(0, 3); - }, - B: function() { - return Time.month[this.getMonth()]; - }, - d: function() { - return Time.zeroPad(this.getDate()); - }, - e: function() { - return this.getDate(); - }, - H: function() { - return Time.zeroPad(this.getHours()); - }, - I: function() { - return Time.zeroPad(this.getHours() % 12 || 12); - }, - k: function() { - return this.getHours(); - }, - l: function() { - return this.getHours() % 12 || 12; - }, - m: function() { - return Time.zeroPad(this.getMonth() + 1); - }, - M: function() { - return Time.zeroPad(this.getMinutes()); - }, - p: function() { - if (this.getHours() < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - P: function() { - if (this.getHours() < 12) { - return 'am'; - } else { - return 'pm'; - } - }, - S: function() { - return Time.zeroPad(this.getSeconds()); - }, - y: function() { - return this.getFullYear().toString().slice(2); - }, - Y: function() { - return this.getFullYear(); - } - } - }; - - Navigate = { - path: window.location.pathname, - init: function() { - if (g.VIEW === 'catalog' || g.BOARD.ID === 'f' || !Conf['JSON Navigation']) { - return; - } - $.ready(function() { - return $.on(window, 'popstate', Navigate.popstate); - }); - this.title = function() {}; - Thread.callbacks.push({ - name: 'Navigate', - cb: this.thread - }); - return Post.callbacks.push({ - name: 'Navigate', - cb: this.post - }); - }, - thread: function() { - var replyLink; - if (g.VIEW === 'thread') { - return; - } - replyLink = $('a.replylink', this.OP.nodes.info); - return $.on(replyLink, 'click', Navigate.navigate); - }, - post: function() { - var hashlink, postlink, _i, _len, _ref; - if (g.VIEW === 'thread' && this.thread.ID === g.THREADID) { - return; - } - postlink = $('a[title="Highlight this post"]', this.nodes.info); - $.on(postlink, 'click', Navigate.navigate); - if (!Conf['Quote Hash Navigation']) { - return; - } - _ref = $$('.hashlink', this.nodes.comment); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - hashlink = _ref[_i]; - $.on(hashlink, 'click', Navigate.navigate); - } - }, - clean: function() { - g.threads.forEach(function(thread) { - return thread.collect(); - }); - QuoteBacklink.containers = {}; - return $.rmAll($('.board')); - }, - features: [['Thread Excerpt', ThreadExcerpt], ['Unread Count', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Expansion', ExpandThread]], - disconnect: function() { - var err, errors, feature, name, _i, _len, _ref, _ref1; - _ref = Navigate.features; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], name = _ref1[0], feature = _ref1[1]; - try { - feature.disconnect(); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Failed to disconnect feature " + name + ".", - error: err - }); - } - if (errors) { - Main.handleErrors(errors); - } - } - }, - reconnect: function() { - var err, errors, feature, name, _i, _len, _ref, _ref1; - _ref = Navigate.features; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], name = _ref1[0], feature = _ref1[1]; - try { - feature.init(); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Failed to reconnect feature " + name + ".", - error: err - }); - } - } - if (errors) { - Main.handleErrors(errors); - } - }, - ready: function(name, feature, condition) { - var err, error; - try { - if (condition) { - feature(); - } - } catch (_error) { - err = _error; - error = [ - { - message: "" + name + " Failed.", - error: err - } - ]; - } - if (error) { - Main.handleErrors(error); - } - return QR.generatePostableThreadsList(); - }, - updateContext: function(view) { - var oldView; - g.DEAD = false; - if (view !== g.VIEW) { - $.rmClass(doc, g.VIEW); - $.addClass(doc, view); - } - oldView = g.VIEW; - g.VIEW = view; - return { - index: function() { - if (oldView === g.VIEW) { - return; - } - delete g.THREADID; - QR.link.textContent = 'Start a Thread'; - $.off(d, 'ThreadUpdate', QR.statusCheck); - return $.on(d, 'IndexRefresh', QR.generatePostableThreadsList); - }, - thread: function() { - g.THREADID = +window.location.pathname.split('/')[3]; - if (oldView === g.VIEW) { - return; - } - QR.link.textContent = 'Reply to Thread'; - $.on(d, 'ThreadUpdate', QR.statusCheck); - return $.off(d, 'IndexRefresh', QR.generatePostableThreadsList); - } - }[g.VIEW](); - }, - updateBoard: function(boardID) { - var fullBoardList, onload, req; - fullBoardList = $('#full-board-list', Header.boardList); - $.rmClass($('.current', fullBoardList), 'current'); - $.addClass($("a[href*='/" + boardID + "/']", fullBoardList), 'current'); - Header.generateBoardList(Conf['boardnav'].replace(/(\r\n|\n|\r)/g, ' ')); - QR.flagsInput(); - onload = function(e) { - var aboard, board, err, _i, _len, _ref; - if (e.type === 'abort') { - req.onloadend = null; - return; - } - if (req.status !== 200) { - return; - } - try { - _ref = req.response.boards; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - aboard = _ref[_i]; - if (!(aboard.board === boardID)) { - continue; - } - board = aboard; - break; - } - } catch (_error) { - err = _error; - Main.handleErrors([ - { - message: "Navigation failed to update board name.", - error: err - } - ]); - return false; - } - if (!board) { - return; - } - Navigate.updateTitle(board); - return Navigate.updateSFW(!!board.ws_board); - }; - return req = $.ajax('//a.4cdn.org/boards.json', { - onabort: onload, - onloadend: onload - }); - }, - updateSFW: function(sfw) { - var findStyle, style; - Favicon.el.href = "//s.4cdn.org/image/favicon" + (sfw ? '-ws' : '') + ".ico"; - $.add(d.head, Favicon.el); - if (Favicon.SFW === sfw) { - return; - } - Favicon.SFW = sfw; - Favicon.update(); - findStyle = function(type, base) { - var style; - style = d.cookie.match(new RegExp("\b" + type + "\_style\=([^;]+);\b")); - return ["" + type + "_style", (style ? style[1] : base)]; - }; - style = findStyle.apply(null, (sfw ? ['ws', 'Yotsuba B New'] : ['nws', 'Yotsuba New'])); - $.globalEval("var style_group = '" + style[0] + "'"); - $('link[title=switch]', d.head).href = $("link[title='" + style[1] + "']", d.head).href; - return Main.setClass(); - }, - updateTitle: function(_arg) { - var board, subtitle, title; - board = _arg.board, title = _arg.title; - if (subtitle = $('.boardSubtitle')) { - $.rm(subtitle); - } - return $('.boardTitle').textContent = d.title = "/" + board + "/ - " + title; - }, - navigate: function(e) { - var boardID, load, pageNum, path, threadID, view; - if (this.hostname !== 'boards.4chan.org' || window.location.hostname === 'rs.4chan.org' || (e && (e.shiftKey || e.ctrlKey || (e.type === 'click' && e.button !== 0)))) { - return; - } - $.addClass(Index.button, 'fa-spin'); - path = this.pathname.split('/'); - if (path[0] === '') { - path.shift(); - } - boardID = path[0], view = path[1], threadID = path[2]; - if (view === 'catalog' || ('f' === boardID || 'f' === g.BOARD.ID)) { - return; - } - if (e) { - e.preventDefault(); - } - Navigate.title = function() {}; - delete Index.pageNum; - path = this.pathname; - if (this.hash) { - path += this.hash; - } - if (this.id !== 'popState') { - history.pushState(null, '', path); - } - Navigate.path = this.pathname; - if (threadID) { - view = 'thread'; - } else { - pageNum = view; - view = 'index'; - } - if (view === g.VIEW && boardID === g.BOARD.ID) { - Navigate.updateContext(view); - } else { - Navigate.disconnect(); - Navigate.updateContext(view); - Navigate.clean(); - Navigate.reconnect(); - } - if (boardID === g.BOARD.ID) { - Navigate.title = function() { - if (view === 'index') { - return d.title = $('.boardTitle').textContent; - } - }; - } else { - g.BOARD = new Board(boardID); - Navigate.title = function() { - return Navigate.updateBoard(boardID); - }; - } - if (view === 'index') { - return Index.update(pageNum); - } else { - Navigate.updateSFW(Favicon.SFW); - load = Navigate.load; - Navigate.req = $.ajax("//a.4cdn.org/" + boardID + "/res/" + threadID + ".json", { - onabort: load, - onloadend: load - }); - return setTimeout((function() { - if (Navigate.req && !Navigate.notice) { - return Navigate.notice = new Notice('info', 'Loading thread...'); - } - }), 3 * $.SECOND); - } - }, - load: function(e) { - var err, notice, req; - $.rmClass(Index.button, 'fa-spin'); - req = Navigate.req, notice = Navigate.notice; - if (notice != null) { - notice.close(); - } - delete Navigate.req; - delete Navigate.notice; - if (e.type === 'abort' || req.status !== 200) { - req.onloadend = null; - new Notice('warning', "Failed to load thread." + (req.status ? " " + req.status : '')); - return; - } - Navigate.title(); - try { - return Navigate.parse(req.response.posts); - } catch (_error) { - err = _error; - console.error('Navigate failure:'); - console.log(err); - if (notice) { - notice.setType('error'); - notice.el.lastElementChild.textContent = 'Navigation Failed.'; - setTimeout(notice.close, 2 * $.SECOND); - } else { - new Notice('error', 'Navigation Failed.', 2); - } - } - }, - parse: function(data) { - var OP, board, errors, makePost, obj, post, posts, thread, threadRoot, _i, _len; - board = g.BOARD; - Navigate.threadRoot = threadRoot = Build.thread(board, OP = data.shift(), true); - thread = new Thread(OP.no, board); - posts = []; - errors = null; - makePost = function(postNode) { - var err; - try { - return posts.push(new Post(postNode, thread, board)); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - return errors.push({ - message: "Parsing of Post No." + thread.ID + " failed. Post will be skipped.", - error: err - }); - } - }; - makePost($('.opContainer', threadRoot)); - for (_i = 0, _len = data.length; _i < _len; _i++) { - obj = data[_i]; - post = Build.postFromObject(obj, board); - makePost(post); - $.add(threadRoot, post); - } - if (errors) { - Main.handleErrors(errors); - } - Main.callbackNodes(Thread, [thread]); - Main.callbackNodes(Post, posts); - Navigate.ready('Quote Threading', QuoteThreading.force, Conf['Quote Threading'] && !Conf['Unread Count']); - Navigate.buildThread(); - return Header.hashScroll.call(window); - }, - buildThread: function() { - var board; - board = $('.board'); - $.rmAll(board); - $.add(board, [Navigate.threadRoot, $.el('hr')]); - if (Conf['Unread Count']) { - return Navigate.ready('Unread Count', Unread.ready, Conf['Unread Count']); - } - }, - popstate: function() { - var a; - if (window.location.pathname === Navigate.path) { - return; - } - a = $.el('a', { - href: window.location, - id: 'popState' - }); - return Navigate.navigate.call(a); - } - }; - - Settings = { - init: function() { - var link, settings; - link = $.el('a', { - className: 'settings-link fa fa-wrench', - textContent: 'Settings', - href: 'javascript:;' - }); - $.on(link, 'click', Settings.open); - Header.addShortcut(link); - Settings.addSection('Main', Settings.main); - Settings.addSection('Filter', Settings.filter); - Settings.addSection('Sauce', Settings.sauce); - Settings.addSection('Advanced', Settings.advanced); - Settings.addSection('Keybinds', Settings.keybinds); - $.on(d, 'AddSettingsSection', Settings.addSection); - $.on(d, 'OpenSettings', function(e) { - return Settings.open(e.detail); - }); - settings = JSON.parse(localStorage.getItem('4chan-settings')) || {}; - if (settings.disableAll) { - return; - } - settings.disableAll = true; - return localStorage.setItem('4chan-settings', JSON.stringify(settings)); - }, - open: function(openSection) { - var dialog, html, link, links, overlay, section, sectionToOpen, _i, _len, _ref; - if (Settings.dialog) { - return; - } - $.event('CloseMenu'); - html = "
"; - Settings.overlay = overlay = $.el('div', { - id: 'overlay' - }); - Settings.dialog = dialog = $.el('div', { - id: 'fourchanx-settings', - className: 'dialog', - innerHTML: html - }); - $.on($('.export', Settings.dialog), 'click', Settings["export"]); - $.on($('.import', Settings.dialog), 'click', Settings["import"]); - $.on($('.reset', Settings.dialog), 'click', Settings.reset); - $.on($('input', Settings.dialog), 'change', Settings.onImport); - links = []; - _ref = Settings.sections; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - section = _ref[_i]; - link = $.el('a', { - className: "tab-" + section.hyphenatedTitle, - textContent: section.title, - href: 'javascript:;' - }); - $.on(link, 'click', Settings.openSection.bind(section)); - links.push(link, $.tn(' | ')); - if (section.title === openSection) { - sectionToOpen = link; - } - } - links.pop(); - $.add($('.sections-list', dialog), links); - (sectionToOpen ? sectionToOpen : links[0]).click(); - $.on($('.close', dialog), 'click', Settings.close); - $.on(overlay, 'click', Settings.close); - $.add(d.body, [overlay, dialog]); - return $.event('OpenSettings', null, dialog); - }, - close: function() { - if (!Settings.dialog) { - return; - } - $.rm(Settings.overlay); - $.rm(Settings.dialog); - delete Settings.overlay; - return delete Settings.dialog; - }, - sections: [], - addSection: function(title, open) { - var hyphenatedTitle, _ref; - if (typeof title !== 'string') { - _ref = title.detail, title = _ref.title, open = _ref.open; - } - hyphenatedTitle = title.toLowerCase().replace(/\s+/g, '-'); - return Settings.sections.push({ - title: title, - hyphenatedTitle: hyphenatedTitle, - open: open - }); - }, - openSection: function() { - var section, selected; - if (selected = $('.tab-selected', Settings.dialog)) { - $.rmClass(selected, 'tab-selected'); - } - $.addClass($(".tab-" + this.hyphenatedTitle, Settings.dialog), 'tab-selected'); - section = $('section', Settings.dialog); - $.rmAll(section); - section.className = "section-" + this.hyphenatedTitle; - this.open(section, g); - section.scrollTop = 0; - return $.event('OpenSettings', null, section); - }, - main: function(section) { - var arr, button, description, div, fs, input, inputs, items, key, obj, _ref; - items = {}; - inputs = {}; - _ref = Config.main; - for (key in _ref) { - obj = _ref[key]; - fs = $.el('fieldset', { - innerHTML: "" + key + "" - }); - for (key in obj) { - arr = obj[key]; - description = arr[1]; - div = $.el('div', { - innerHTML: ": " + description + "" - }); - input = $('input', div); - $.on(input, 'change', $.cb.checked); - items[key] = Conf[key]; - inputs[key] = input; - $.add(fs, div); - } - $.add(section, fs); - } - $.get(items, function(items) { - var val; - for (key in items) { - val = items[key]; - inputs[key].checked = val; - } - }); - div = $.el('div', { - innerHTML: ": Clear manually-hidden threads and posts on all boards. Reload the page to apply." - }); - button = $('button', div); - $.get({ - hiddenThreads: {}, - hiddenPosts: {} - }, function(_arg) { - var ID, board, hiddenNum, hiddenPosts, hiddenThreads, thread, _ref1, _ref2; - hiddenThreads = _arg.hiddenThreads, hiddenPosts = _arg.hiddenPosts; - hiddenNum = 0; - _ref1 = hiddenThreads.boards; - for (ID in _ref1) { - board = _ref1[ID]; - hiddenNum += Object.keys(board).length; - } - _ref2 = hiddenPosts.boards; - for (ID in _ref2) { - board = _ref2[ID]; - for (ID in board) { - thread = board[ID]; - hiddenNum += Object.keys(thread).length; - } - } - return button.textContent = "Hidden: " + hiddenNum; - }); - $.on(button, 'click', function() { - this.textContent = 'Hidden: 0'; - return $.get('hiddenThreads', {}, function(_arg) { - var boardID, hiddenThreads; - hiddenThreads = _arg.hiddenThreads; - for (boardID in hiddenThreads.boards) { - localStorage.removeItem("4chan-hide-t-" + boardID); - } - return $["delete"](['hiddenThreads', 'hiddenPosts']); - }); - }); - return $.after($('input[name="Stubs"]', section).parentNode.parentNode, div); - }, - "export": function() { - return $.get(Conf, function(Conf) { - delete Conf['archives']; - return Settings.downloadExport({ - version: g.VERSION, - date: Date.now(), - Conf: Conf - }); - }); - }, - downloadExport: function(data) { - var a, p; - a = $.el('a', { - download: "4chan X v" + g.VERSION + "-" + data.date + ".json", - href: "data:application/json;base64," + (btoa(unescape(encodeURIComponent(JSON.stringify(data, null, 2))))) - }); - p = $('.imp-exp-result', Settings.dialog); - $.rmAll(p); - $.add(p, a); - return a.click(); - }, - "import": function() { - return $('input', this.parentNode).click(); - }, - onImport: function() { - var file, output, reader; - if (!(file = this.files[0])) { - return; - } - output = $('.imp-exp-result'); - if (!confirm('Your current settings will be entirely overwritten, are you sure?')) { - output.textContent = 'Import aborted.'; - return; - } - reader = new FileReader(); - reader.onload = function(e) { - var err; - try { - Settings.loadSettings(JSON.parse(e.target.result)); - if (confirm('Import successful. Reload now?')) { - return window.location.reload(); - } - } catch (_error) { - err = _error; - output.textContent = 'Import failed due to an error.'; - return c.error(err.stack); - } - }; - return reader.readAsText(file); - }, - loadSettings: function(data) { - var convertSettings, key, val, version, _ref; - version = data.version.split('.'); - if (version[0] === '2') { - convertSettings = function(data, map) { - var newKey, prevKey; - for (prevKey in map) { - newKey = map[prevKey]; - if (newKey) { - data.Conf[newKey] = data.Conf[prevKey]; - } - delete data.Conf[prevKey]; - } - return data; - }; - data = Settings.convertSettings(data, { - 'Disable 4chan\'s extension': '', - 'Catalog Links': '', - 'Reply Navigation': '', - 'Show Stubs': 'Stubs', - 'Image Auto-Gif': 'Auto-GIF', - 'Expand From Current': '', - 'Unread Tab Icon': 'Unread Favicon', - 'Post in Title': 'Thread Excerpt', - 'Auto Hide QR': '', - 'Open Reply in New Tab': '', - 'Remember QR size': '', - 'Quote Inline': 'Quote Inlining', - 'Quote Preview': 'Quote Previewing', - 'Indicate OP quote': 'Mark OP Quotes', - 'Indicate Cross-thread Quotes': 'Mark Cross-thread Quotes', - 'Reply Hiding': 'Reply Hiding Buttons', - 'Thread Hiding': 'Thread Hiding Buttons', - 'uniqueid': 'uniqueID', - 'mod': 'capcode', - 'country': 'flag', - 'md5': 'MD5', - 'openEmptyQR': 'Open empty QR', - 'openQR': 'Open QR', - 'openOptions': 'Open settings', - 'close': 'Close', - 'spoiler': 'Spoiler tags', - 'code': 'Code tags', - 'submit': 'Submit QR', - 'watch': 'Watch', - 'update': 'Update', - 'unreadCountTo0': '', - 'expandAllImages': 'Expand images', - 'expandImage': 'Expand image', - 'zero': 'Front page', - 'nextPage': 'Next page', - 'previousPage': 'Previous page', - 'nextThread': 'Next thread', - 'previousThread': 'Previous thread', - 'expandThread': 'Expand thread', - 'openThreadTab': 'Open thread', - 'openThread': 'Open thread tab', - 'nextReply': 'Next reply', - 'previousReply': 'Previous reply', - 'hide': 'Hide', - 'Scrolling': 'Auto Scroll', - 'Verbose': '' - }); - data.Conf.sauces = data.Conf.sauces.replace(/\$\d/g, function(c) { - switch (c) { - case '$1': - return '%TURL'; - case '$2': - return '%URL'; - case '$3': - return '%MD5'; - case '$4': - return '%board'; - default: - return c; - } - }); - _ref = Config.hotkeys; - for (key in _ref) { - val = _ref[key]; - if (key in data.Conf) { - data.Conf[key] = data.Conf[key].replace(/ctrl|alt|meta/g, function(s) { - return "" + (s[0].toUpperCase()) + s.slice(1); - }).replace(/(^|.+\+)[A-Z]$/g, function(s) { - return "Shift+" + s.slice(0, -1) + (s.slice(-1).toLowerCase()); - }); - } - } - data.Conf['WatchedThreads'] = data.WatchedThreads; - } - if (data.Conf['WatchedThreads']) { - data.Conf['watchedThreads'] = { - boards: ThreadWatcher.convert(data.Conf['WatchedThreads']) - }; - delete data.Conf['WatchedThreads']; - } - return $.set(data.Conf); - }, - reset: function() { - if (confirm('Your current settings will be entirely wiped, are you sure?')) { - return $.clear(function() { - if (confirm('Reset successful. Reload now?')) { - return window.location.reload(); - } - }); - } - }, - filter: function(section) { - var select; - section.innerHTML = "
"; - select = $('select', section); - $.on(select, 'change', Settings.selectFilter); - return Settings.selectFilter.call(select); - }, - selectFilter: function() { - var div, name, ta; - div = this.nextElementSibling; - if ((name = this.value) !== 'guide') { - $.rmAll(div); - ta = $.el('textarea', { - name: name, - className: 'field', - spellcheck: false - }); - $.get(name, Conf[name], function(item) { - return ta.value = item[name]; - }); - $.on(ta, 'change', $.cb.value); - $.add(div, ta); - return; - } - return div.innerHTML = "
Filter is disabled.

Use regular expressions, one per line.
Lines starting with a # will be ignored.
For example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.
MD5 filtering uses exact string matching, not regular expressions.

    You can use these settings with each regular expression, separate them with semicolons:
  • Per boards, separate them with commas. It is global if not specified.
    For example: boards:a,jp;.
  • Filter OPs only along with their threads (`only`), replies only (`no`), or both (`yes`, this is default).
    For example: op:only;, op:no; or op:yes;.
  • Overrule the `Show Stubs` setting if specified: create a stub (`yes`) or not (`no`).
    For example: stub:yes; or stub:no;.
  • Highlight instead of hiding. You can specify a class name to use with a userstyle.
    For example: highlight; or highlight:wallpaper;.
  • Highlighted OPs will have their threads put on top of the board index by default.
    For example: top:yes; or top:no;.
"; - }, - sauce: function(section) { - var ta; - section.innerHTML = "
Sauce is disabled.
Lines starting with a # will be ignored.
You can specify a display text by appending ;text:[text] to the URL.
    These parameters will be replaced by their corresponding values:
  • %TURL: Thumbnail URL.
  • %URL: Full image URL.
  • %MD5: MD5 hash.
  • %name: Original file name.
  • %board: Current board.
"; - ta = $('textarea', section); - $.get('sauces', Conf['sauces'], function(item) { - return ta.value = item['sauces']; - }); - return $.on(ta, 'change', $.cb.value); - }, - advanced: function(section) { - var archBoards, boardID, boardOptions, boardSelect, boards, data, event, files, input, inputs, item, items, name, o, row, rows, ta, table, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4; - section.innerHTML = "
Archiver
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection
Disabled selections indicate that only one archive is available for that board and redirection type.
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
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
External link: external-text:\"Google\",\"http://www.google.com\"
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/.
Time Formatting is disabled.
:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Quote Backlinks formatting is disabled.
:
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (Unix timestamp)
Original file name: %n (truncated), %N (untruncated), %t (Unix timestamp)
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
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, email, subject and password.
  • Wrap values of items with quotes, like this: email:\"sage\".
  • Force values as defaults with the always keyword, for example: email:\"sage\";always.
  • Select specific boards for an item, separated with commas, for example: email:\"sage\";boards:jp;always.
Unread Favicon is disabled.
Emoji is disabled.
Sage Icon:
Position:
Thread Updater is disabled.
Interval:
"; - items = {}; - inputs = {}; - _ref = ['boardnav', 'time', 'backlink', 'fileInfo', 'favicon', 'sageEmoji', 'emojiPos', 'usercss']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - input = $("[name=" + name + "]", section); - items[name] = Conf[name]; - inputs[name] = input; - event = name === 'favicon' || name === 'usercss' || name === 'sageEmoji' || name === 'emojiPos' ? 'change' : 'input'; - $.on(input, event, $.cb.value); - } - ta = $('.personafield', section); - $.get('QR.personas', Conf['QR.personas'], function(item) { - return ta.value = item['QR.personas']; - }); - $.on(ta, 'change', $.cb.value); - $.get(items, function(items) { - var key, val; - for (key in items) { - val = items[key]; - if (key === 'emojiPos') { - continue; - } - input = inputs[key]; - input.value = val; - if (key === 'usercss') { - continue; - } - $.on(input, event, Settings[key]); - Settings[key].call(input); - } - }); - $.on($('input[name=Interval]', section), 'change', ThreadUpdater.cb.interval); - $.on($('input[name="Custom CSS"]', section), 'change', Settings.togglecss); - $.on($.id('apply-css'), 'click', Settings.usercss); - archBoards = {}; - _ref1 = Redirect.archives; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - _ref2 = _ref1[_j], name = _ref2.name, boards = _ref2.boards, files = _ref2.files, data = _ref2.data; - for (_k = 0, _len2 = boards.length; _k < _len2; _k++) { - boardID = boards[_k]; - o = archBoards[boardID] || (archBoards[boardID] = { - thread: [], - post: [], - file: [] - }); - o.thread.push(name); - if (data.software === 'foolfuuka') { - o.post.push(name); - } - if (__indexOf.call(files, boardID) >= 0) { - o.file.push(name); - } - } - } - rows = []; - boardOptions = []; - _ref3 = Object.keys(archBoards).sort(); - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - boardID = _ref3[_l]; - row = $.el('tr', { - className: "board-" + boardID - }); - row.hidden = boardID !== g.BOARD.ID; - boardOptions.push($.el('option', { - textContent: "/" + boardID + "/", - value: "board-" + boardID, - selected: boardID === g.BOARD.ID - })); - o = archBoards[boardID]; - _ref4 = ['thread', 'post', 'file']; - for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) { - item = _ref4[_m]; - $.add(row, Settings.addArchiveCell(boardID, o, item)); - } - rows.push(row); - } - $.add($('tbody', section), rows); - boardSelect = $('#archive-board-select', section); - $.add(boardSelect, boardOptions); - table = $.id('archive-table'); - $.on(boardSelect, 'change', function() { - $('tbody > :not([hidden])', table).hidden = true; - return $("tbody > ." + this.value, table).hidden = false; - }); - $.get('selectedArchives', Conf['selectedArchives'], function(_arg) { - var option, selectedArchives, type; - selectedArchives = _arg.selectedArchives; - for (boardID in selectedArchives) { - data = selectedArchives[boardID]; - for (type in data) { - name = data[type]; - if (option = $("select[data-boardid='" + boardID + "'][data-type='" + type + "'] > option[value='" + name + "']", section)) { - option.selected = true; - } - } - } - }); - }, - addArchiveCell: function(boardID, data, type) { - var archive, i, length, options, select, td; - length = data[type].length; - td = $.el('td', { - className: 'archive-cell' - }); - if (!length) { - td.textContent = '--'; - return td; - } - options = []; - i = 0; - while (i < length) { - archive = data[type][i++]; - options.push($.el('option', { - textContent: archive, - value: archive - })); - } - td.innerHTML = ''; - select = td.firstElementChild; - if (!(select.disabled = length === 1)) { - select.setAttribute('data-boardid', boardID); - select.setAttribute('data-type', type); - $.on(select, 'change', Settings.saveSelectedArchive); - } - $.add(select, options); - return td; - }, - saveSelectedArchive: function() { - var _this = this; - return $.get('selectedArchives', Conf['selectedArchives'], function(_arg) { - var selectedArchives, _name; - selectedArchives = _arg.selectedArchives; - (selectedArchives[_name = _this.dataset.boardid] || (selectedArchives[_name] = {}))[_this.dataset.type] = _this.value; - return $.set('selectedArchives', selectedArchives); - }); - }, - boardnav: function() { - return Header.generateBoardList(this.value); - }, - time: function() { - var funk; - funk = Time.createFunc(this.value); - return this.nextElementSibling.textContent = funk(Time, new Date()); - }, - backlink: function() { - return this.nextElementSibling.textContent = this.value.replace(/%id/, '123456789'); - }, - fileInfo: function() { - var data, funk; - data = { - isReply: true, - file: { - URL: '//i.4cdn.org/g/src/1334437723720.jpg', - name: 'd9bb2efc98dd0df141a94399ff5880b7.jpg', - size: '276 KB', - sizeInBytes: 276 * 1024, - dimensions: '1280x720', - isImage: true, - isSpoiler: true - } - }; - funk = FileInfo.createFunc(this.value); - return this.nextElementSibling.innerHTML = funk(FileInfo, data); - }, - favicon: function() { - Favicon["switch"](); - if (g.VIEW === 'thread' && Conf['Unread Favicon']) { - Unread.update(); - } - return this.nextElementSibling.innerHTML = "\n\n\n"; - }, - sageEmoji: function() { - return this.nextElementSibling.innerHTML = ""; - }, - togglecss: function() { - if ($('textarea[name=usercss]', $.x('ancestor::fieldset[1]', this)).disabled = !this.checked) { - CustomCSS.rmStyle(); - } else { - CustomCSS.addStyle(); - } - return $.cb.checked.call(this); - }, - usercss: function() { - return CustomCSS.update(); - }, - keybinds: function(section) { - var arr, input, inputs, items, key, tbody, tr, _ref; - section.innerHTML = "
Keybinds are disabled.
Allowed keys: a-z, 0-9, Ctrl, Shift, Alt, Meta, Enter, Esc, Up, Down, Right, Left.
Press Backspace to disable a keybind.
ActionsKeybinds
"; - tbody = $('tbody', section); - items = {}; - inputs = {}; - _ref = Config.hotkeys; - for (key in _ref) { - arr = _ref[key]; - tr = $.el('tr', { - innerHTML: "" + arr[1] + "" - }); - input = $('input', tr); - input.name = key; - input.spellcheck = false; - items[key] = Conf[key]; - inputs[key] = input; - $.on(input, 'keydown', Settings.keybind); - $.add(tbody, tr); - } - return $.get(items, function(items) { - var val; - for (key in items) { - val = items[key]; - inputs[key].value = val; - } - }); - }, - keybind: function(e) { - var key; - if (e.keyCode === 9) { - return; - } - e.preventDefault(); - e.stopPropagation(); - if ((key = Keybinds.keyCode(e)) == null) { - return; - } - this.value = key; - return $.cb.value.call(this); - } - }; - - Main = { - init: function() { - var db, flatten, pathname, _i, _len, _ref, _ref1; - g.threads = new SimpleDict; - g.posts = new SimpleDict; - pathname = location.pathname.split('/'); - g.BOARD = new Board(pathname[1]); - if ((_ref = g.BOARD.ID) === 'z' || _ref === 'fk') { - return; - } - g.VIEW = (function() { - switch (pathname[2]) { - case 'res': - return 'thread'; - case 'catalog': - return 'catalog'; - default: - return 'index'; - } - })(); - if (g.VIEW === 'thread') { - g.THREADID = +pathname[3]; - } - flatten = function(parent, obj) { - var key, val; - if (obj instanceof Array) { - Conf[parent] = obj[0]; - } else if (typeof obj === 'object') { - for (key in obj) { - val = obj[key]; - flatten(key, val); - } - } else { - Conf[parent] = obj; - } - }; - flatten(null, Config); - _ref1 = DataBoard.keys; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - db = _ref1[_i]; - Conf[db] = { - boards: {} - }; - } - Conf['selectedArchives'] = {}; - Conf['CachedTitles'] = []; - $.get(Conf, function(items) { - $.extend(Conf, items); - return Main.initFeatures(); - }); - return $.on(d, '4chanMainInit', Main.initStyle); - }, - initFeatures: function() { - var err, feature, name, _i, _len, _ref, _ref1; - switch (location.hostname) { - case 'a.4cdn.org': - return; - case 'sys.4chan.org': - Report.init(); - return; - case 'i.4cdn.org': - $.ready(function() { - var URL, pathname, _ref; - if (Conf['404 Redirect'] && ((_ref = d.title) === '4chan - Temporarily Offline' || _ref === '4chan - 404 Not Found')) { - Redirect.init(); - pathname = location.pathname.split('/'); - URL = Redirect.to('file', { - boardID: g.BOARD.ID, - filename: pathname[pathname.length - 1] - }); - if (URL) { - return location.replace(URL); - } - } - }); - return; - } - _ref = Main.features; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], name = _ref1[0], feature = _ref1[1]; - try { - feature.init(); - } catch (_error) { - err = _error; - Main.handleErrors({ - message: "\"" + name + "\" initialization crashed.", - error: err - }); - } - } - $.on(d, 'AddCallback', Main.addCallback); - return $.ready(Main.initReady); - }, - initStyle: function() { - var _ref; - $.off(d, '4chanMainInit', Main.initStyle); - if (!Main.isThisPageLegit() || $.hasClass(doc, 'fourchan-x')) { - return; - } - if ((_ref = $('link[href*=mobile]', d.head)) != null) { - _ref.disabled = true; - } - $.addClass(doc, 'fourchan-x', 'seaweedchan', g.VIEW, 'gecko'); - $.addStyle(Main.css); - return Main.setClass(); - }, - setClass: function() { - var mainStyleSheet, setStyle, style, styleSheets; - if (g.VIEW === 'catalog') { - $.addClass(doc, $.id('base-css').href.match(/catalog_(\w+)/)[1].replace('_new', '').replace(/_+/g, '-')); - return; - } - style = 'yotsuba-b'; - mainStyleSheet = $('link[title=switch]', d.head); - styleSheets = $$('link[rel="alternate stylesheet"]', d.head); - setStyle = function() { - var styleSheet, _i, _len; - $.rmClass(doc, style); - for (_i = 0, _len = styleSheets.length; _i < _len; _i++) { - styleSheet = styleSheets[_i]; - if (styleSheet.href === mainStyleSheet.href) { - style = styleSheet.title.toLowerCase().replace('new', '').trim().replace(/\s+/g, '-'); - break; - } - } - return $.addClass(doc, style); - }; - setStyle(); - if (!mainStyleSheet) { - return; - } - return new MutationObserver(setStyle).observe(mainStyleSheet, { - attributes: true, - attributeFilter: ['href'] - }); - }, - initReady: function() { - var GMver, err, href, i, passLink, styleSelector, test, v, _i, _len, _ref, _ref1; - if ((_ref = d.title) === '4chan - Temporarily Offline' || _ref === '4chan - 404 Not Found') { - if (Conf['404 Redirect'] && g.VIEW === 'thread') { - href = Redirect.to('thread', { - boardID: g.BOARD.ID, - threadID: g.THREADID, - postID: +location.hash.match(/\d+/) - }); - location.replace(href || ("/" + g.BOARD + "/")); - } - return; - } - Main.initStyle(); - if (styleSelector = $.id('styleSelector')) { - passLink = $.el('a', { - textContent: '4chan Pass', - href: 'javascript:;' - }); - $.on(passLink, 'click', function() { - return window.open('//sys.4chan.org/auth', 'This will steal your data.', 'left=0,top=0,width=500,height=255,toolbar=0,resizable=0'); - }); - $.before(styleSelector.previousSibling, [$.tn('['), passLink, $.tn(']\u00A0\u00A0')]); - } - if (!(Conf['JSON Navigation'] && g.VIEW === 'index')) { - Main.initThread(); - } else { - $.event('4chanXInitFinished'); - } - test = $.el('span'); - test.classList.add('a', 'b'); - if (test.className !== 'a b') { - new Notice('warning', "Your version of Firefox is outdated (v26 minimum) and 4chan X may not operate correctly.", 30); - } - GMver = GM_info.version.split('.'); - _ref1 = "1.14".split('.'); - for (i = _i = 0, _len = _ref1.length; _i < _len; i = ++_i) { - v = _ref1[i]; - if (v === GMver[i]) { - continue; - } - (v < GMver[i]) || new Notice('warning', "Your version of Greasemonkey is outdated (v" + GM_info.version + " instead of v1.14 minimum) and 4chan X may not operate correctly.", 30); - break; - } - try { - return localStorage.getItem('4chan-settings'); - } catch (_error) { - err = _error; - return new Notice('warning', 'Cookies need to be enabled on 4chan for 4chan X to operate properly.', 30); - } - }, - initThread: function() { - var board, err, errors, postRoot, posts, thread, threadRoot, threads, _i, _j, _len, _len1, _ref, _ref1; - if (board = $('.board')) { - threads = []; - posts = []; - _ref = $$('.board > .thread', board); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - threadRoot = _ref[_i]; - thread = new Thread(+threadRoot.id.slice(1), g.BOARD); - threads.push(thread); - _ref1 = $$('.thread > .postContainer', threadRoot); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - postRoot = _ref1[_j]; - try { - posts.push(new Post(postRoot, thread, g.BOARD)); - } catch (_error) { - err = _error; - if (!errors) { - errors = []; - } - errors.push({ - message: "Parsing of Post No." + (postRoot.id.match(/\d+/)) + " failed. Post will be skipped.", - error: err - }); - } - } - } - if (errors) { - Main.handleErrors(errors); - } - Main.callbackNodes(Thread, threads); - Main.callbackNodesDB(Post, posts, function() { - return $.event('4chanXInitFinished'); - }); - } - return $.get('previousversion', null, function(_arg) { - var changelog, el, previousversion; - previousversion = _arg.previousversion; - if (previousversion === g.VERSION) { - return; - } - if (previousversion) { - changelog = 'https://github.com/Spittie/4chan-x/blob/master/CHANGELOG.md'; - el = $.el('span', { - innerHTML: "4chan X has been updated to version " + g.VERSION + "." - }); - new Notice('info', el, 15); - } else { - Settings.open(); - } - return $.set('previousversion', g.VERSION); - }); - }, - callbackNodes: function(klass, nodes) { - var cb, i, node; - i = 0; - cb = klass.callbacks; - while (node = nodes[i++]) { - cb.execute(node); - } - }, - callbackNodesDB: function(klass, nodes, cb) { - var cbs, fn, i, softTask; - i = 0; - cbs = klass.callbacks; - fn = function() { - var node; - if (!(node = nodes[i])) { - return false; - } - cbs.execute(node); - return ++i % 25; - }; - softTask = function() { - while (fn()) { - continue; - } - if (!nodes[i]) { - if (cb) { - cb(); - } - return; - } - return setTimeout(softTask, 0); - }; - return softTask(); - }, - addCallback: function(e) { - var Klass, obj; - obj = e.detail; - if (typeof obj.callback.name !== 'string') { - throw new Error("Invalid callback name: " + obj.callback.name); - } - switch (obj.type) { - case 'Post': - Klass = Post; - break; - case 'Thread': - Klass = Thread; - break; - default: - return; - } - obj.callback.isAddon = true; - return Klass.callbacks.push(obj.callback); - }, - handleErrors: function(errors) { - var div, error, logs, _i, _len; - if (!(errors instanceof Array)) { - error = errors; - } else if (errors.length === 1) { - error = errors[0]; - } - if (error) { - new Notice('error', Main.parseError(error), 15); - return; - } - div = $.el('div', { - innerHTML: "" + errors.length + " errors occurred. [show]" - }); - $.on(div.lastElementChild, 'click', function() { - var _ref; - return _ref = this.textContent === 'show' ? ['hide', false] : ['show', true], this.textContent = _ref[0], logs.hidden = _ref[1], _ref; - }); - logs = $.el('div', { - hidden: true - }); - for (_i = 0, _len = errors.length; _i < _len; _i++) { - error = errors[_i]; - $.add(logs, Main.parseError(error)); - } - return new Notice('error', [div, logs], 30); - }, - parseError: function(data) { - var error, message; - c.error(data.message, data.error.stack); - message = $.el('div', { - textContent: data.message - }); - error = $.el('div', { - textContent: data.error - }); - return [message, error]; - }, - isThisPageLegit: function() { - var _ref; - if (!('thisPageIsLegit' in Main)) { - Main.thisPageIsLegit = location.hostname === 'boards.4chan.org' && !$('link[href*="favicon-status.ico"]', d.head) && ((_ref = d.title) !== '4chan - Temporarily Offline' && _ref !== '4chan - Error' && _ref !== '504 Gateway Time-out'); - } - return Main.thisPageIsLegit; - }, - css: "/*! * Font Awesome 4.0.3 * the iconic font designed for Bootstrap * ------------------------------------------------------------------------------ * The full suite of pictographic icons, examples, and documentation can be * found at http://fontawesome.io. Stay up to date on Twitter at * http://twitter.com/fontawesome. * * License * ------------------------------------------------------------------------------ * - The Font Awesome font is licensed under SIL OFL 1.1 - * http://scripts.sil.org/OFL * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - * http://opensource.org/licenses/mit-license.html * - Font Awesome documentation licensed under CC BY 3.0 - * http://creativecommons.org/licenses/by/3.0/ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: * \"Font Awesome by Dave Gandy - http://fontawesome.io\" * * Author - Dave Gandy * ------------------------------------------------------------------------------ * Email: dave@fontawesome.io * Twitter: http://twitter.com/davegandy * Work: Lead Product Designer @ Kyruus - http://kyruus.com */ @font-face{font-family:FontAwesome;src:url('data:application/font-woff;base64,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') format('woff');font-weight:400;font-style:normal}.fa::before{font-family:FontAwesome;font-weight:400;font-style:normal;-webkit-font-smoothing:antialiased;*margin-right:.3em;text-decoration:inherit;display:none;speak:none} :root.shortcut-icons .fa::before, .menu-button .fa::before, .hide-reply-button .fa::before, .hide-thread-button .fa::before {display:inline-block;font-size:13px;visibility:visible} :root.shortcut-icons #shortcuts .fa::before{font-size:15px!important;margin-top:-3px!important;position:relative;top:1px} :root.shortcut-icons .fa, .menu-button .fa{font-size:0;visibility:hidden} :root.shortcut-icons .shortcut.brackets-wrap::after,:root.shortcut-icons .shortcut.brackets-wrap::before{display:none} :root.shortcut-icons a .fa, .menu-button .fa, .hide-reply-button .fa, .hide-thread-button .fa {display:inline} /* Update this line only */ .fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-gear:before,.fa-cog:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-gears:before,.fa-cogs:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-save:before,.fa-floppy-o:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-bars:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-unsorted:before,.fa-sort:before{content:\"\\f0dc\"}.fa-sort-down:before,.fa-sort-asc:before{content:\"\\f0dd\"}.fa-sort-up:before,.fa-sort-desc:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-legal:before,.fa-gavel:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-flash:before,.fa-bolt:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-paste:before,.fa-clipboard:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-reply-all:before{content:\"\\f122\"}.fa-mail-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\\f150\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\\f151\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\\f152\"}.fa-euro:before,.fa-eur:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-rupee:before,.fa-inr:before{content:\"\\f156\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\\f157\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\\f158\"}.fa-won:before,.fa-krw:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-turkish-lira:before,.fa-try:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"} /* */ .fa-spin::before{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}\n/* General */ .dialog { border: 1px solid; display: block; } .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); } .captcha-img, .field { background-color: #FFF; border: 1px solid #CCC; -moz-box-sizing: border-box; box-sizing: border-box; color: #333; font: 13px sans-serif; outline: none; transition: color .25s, border-color .25s; transition: color .25s, border-color .25s; } .field::-moz-placeholder, .field:hover::-moz-placeholder { color: #AAA !important; font-size: 13px !important; opacity: 1.0 !important; } .captch-img:hover, .field:hover { border-color: #999; } .field:hover, .field:focus { color: #000; } .field[disabled] { background-color: #F2F2F2; color: #888; } .field::-webkit-search-decoration { display: none; } .move { cursor: move; overflow: hidden; } label, .watch-thread-link { cursor: pointer; } a[href=\"javascript:;\"] { text-decoration: none; } .warning { color: red; } #boardNavDesktop { display: none !important; } a { outline: none !important; } .painted { border-radius: 3px; padding: 0px 2px; } body>hr, .ad-plea-bottom + hr { display: none; } .board > hr:last-of-type { border-top-color: transparent !important; } div.navLinks { margin-bottom: -10px !important; } .ad-plea { display: none; } .ad-cnt { margin: 10px !important; } /* 4chan style fixes */ .opContainer, .op { display: block !important; overflow: visible !important; } .reply > .file > .fileText { margin: 0 20px; } .hashlink::before { content: ' '; visibility: hidden; } .inline + .hashlink, [hidden] { display: none !important; } div.center:not(.ad-cnt) { display: none !important; } .page-num { margin-right: -8px; } /* fixed, z-index */ #overlay, #fourchanx-settings, #qp, #ihover, #navlinks, .fixed #header-bar, :root.float #updater, :root.float #thread-stats, #qr { position: fixed; } #fourchanx-settings { z-index: 999; } #overlay { z-index: 900; } #notifications { z-index: 70; } #qp, #ihover { z-index: 60; } #menu { z-index: 50; } #navlinks, #updater, #thread-stats { z-index: 40; } .fixed #header-bar.autohide { z-index: 35; } #qr { z-index: 30; } #thread-watcher { z-index: 8; } :root.fixed-watcher #thread-watcher { z-index: 20; } .fixed #header-bar { z-index: 10; } /* Header */ .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; } .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); } #custom-board-list .current { padding: 1px 1px 4px 1px; } :root.centered-links #shortcuts { width: 300px; text-align: right; } :root.centered-links #header-bar { text-align: center; } #board-list { font-size: 13px; } :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; } #board-list { text-align: center; } .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; -webkit-transform: translateY(-100%); transform: translateY(-100%); } .fixed.bottom-header #header-bar.autohide:not(:hover) { -webkit-transform: translateY(100%); transform: translateY(100%); } #scroll-marker { left: 0; right: 0; height: 10px; position: absolute; } :root: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%; } #header-bar a:not(.entry):not(.close) { text-decoration: none; } #header-bar a:not(.entry):not(.close):not(.current) { padding: 1px; } #header-bar input { margin: 0; vertical-align: bottom; } #shortcuts:empty { display: none; } .brackets-wrap::before { content: \"\\00a0[\"; } .brackets-wrap::after { content: \"]\\00a0\"; } .dead-thread, .disabled { opacity: .45; } #shortcuts { float: right; } .shortcut { margin-left: 3px; } #navbotright, #navtopright { display: none; } #toggleMsgBtn { display: none !important; } .current { font-weight: bold; } /* 4chan X link brackets */ .brackets-wrap::before { content: \"[\"; } .brackets-wrap::after { content: \"]\"; } /* Notifications */ #notifications { position: fixed; top: 0; height: 0; text-align: center; right: 0; left: 0; transition: all .8s .6s cubic-bezier(.55, .055, .675, .19); } .fixed.top-header #header-bar #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: 500px; 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 { padding: 7px; top: 0px; right: 5px; position: absolute; } .notification > .fa-times::before { font-size: 11px !important; } .message { -moz-box-sizing: border-box; box-sizing: border-box; padding: 6px 20px; max-height: 200px; width: 100%; overflow: auto; } /* Settings */ :root.fourchan-x body { -moz-box-sizing: border-box; box-sizing: border-box; } #overlay { background-color: rgba(0, 0, 0, .5); top: 0; left: 0; height: 100%; width: 100%; } #fourchanx-settings { -moz-box-sizing: border-box; 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: 3px; top: 50%; left: 50%; -moz-transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } #fourchanx-settings > nav { padding: 2px 2px 0; height: 15px; } #fourchanx-settings > nav a { text-decoration: underline; } #fourchanx-settings > nav a.close { text-decoration: none; padding: 0 2px; } .section-container { overflow: auto; position: absolute; top: 2.1em; right: 5px; bottom: 5px; left: 5px; padding-right: 5px; } .sections-list { padding: 0 3px; float: left; } .credits { float: right; } .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 label { text-decoration: underline; } .section-filter ul { padding: 0; } .section-filter li { margin: 10px 40px; } .section-filter textarea { height: 500px; } .section-sauce textarea { height: 350px; } .section-advanced .field[name=\"boardnav\"] { width: 100%; } .section-advanced textarea { height: 150px; } .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; } .section-keybinds .field { font-family: monospace; } #fourchanx-settings fieldset { border: 1px solid; border-radius: 3px; } #fourchanx-settings legend { font-weight: 700; } #fourchanx-settings textarea { font-family: monospace; min-width: 100%; max-width: 100%; } #fourchanx-settings code { color: #000; background-color: #FFF; padding: 0 2px; } .unscroll { overflow: hidden; } /* Index */ :root.index-loading .navLinks, :root.index-loading .board, :root.index-loading .pagelist { 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; margin-left: -1em; } #index-search:not([data-searching]) + #index-search-clear { display: none; } .summary { text-decoration: none; } .index #returnlink, .index #bottomlink, .thread #index-last-refresh, .thread #index-search-clear, .thread #index-search { display: none; } /* Announcement Hiding */ :root.hide-announcement #globalMessage { display: none; } span.hide-announcement { font-size: 11px; position: relative; bottom: 5px; } .globalMessage, h2, h3 { color: inherit !important; font-size: 13px; font-weight: 100; } /* Unread */ #unread-line { margin: 0; border-color: rgb(255,0,0); } /* Thread Updater */ #updater { background: none; border: none; box-shadow: none; } #updater > .move { padding: 5px 3px 0px; margin-bottom: -3px; } #updater > div:last-child { text-align: center; } #updater input[type=number] { width: 4em; } :root.float #updater { padding: 0px 3px; } .new { color: limegreen; } #update-status.new { margin-right: 5px; } #update-timer { cursor: pointer; } /* Thread Watcher */ #thread-watcher { position: absolute; } #thread-watcher { padding-bottom: 3px; padding-left: 3px; overflow: hidden; white-space: nowrap; min-width: 136px; max-height: 92%; overflow-y: auto; } #thread-watcher .menu-button { bottom: 1px; } :root.fixed-watcher #thread-watcher { position: fixed; } :root:not(.fixed-watcher) #thread-watcher:not(:hover) { max-height: 210px; overflow-y: hidden; } #thread-watcher > .move { padding-top: 3px; } #watched-threads > div { max-width: 250px; overflow: hidden; padding-left: 3px; padding-right: 3px; text-overflow: ellipsis; } #thread-watcher a { text-decoration: none; } #thread-watcher .move>.close { position: absolute; right: 0px; top: 0px; padding: 0px 4px; } .watch-thread-link { padding-top: 18px; width: 18px; height: 0px; display: inline-block; background-repeat: no-repeat; opacity: 0.2; position: relative; top: 1px; } .watch-thread-link.watched { opacity: 1; } /* Thread Stats */ #thread-stats { background: none; border: none; box-shadow: none; } :root.float #post-count, :root.float #file-count { pointer-events: none; } :root.float #thread-stats { padding: 0px 3px; } /* Quote */ .deadlink { text-decoration: none !important; } .backlink.deadlink:not(.forwardlink), .quotelink.deadlink:not(.forwardlink) { text-decoration: underline !important; } .inlined { opacity: .5; } #qp input, .forwarded { display: none; } .quotelink.forwardlink, .backlink.forwardlink { text-decoration: none; border-bottom: 1px dashed; } @supports (text-decoration-style: dashed) or (-moz-text-decoration-style: dashed) { .quotelink.forwardlink, .backlink.forwardlink { text-decoration: underline; -moz-text-decoration-style: dashed; text-decoration-style: dashed; border-bottom: none; } } .filtered { text-decoration: underline line-through; } :root.hide-backlinks .backlink.filtered { display: none; } .inline { border: 1px solid; display: table; margin: 2px 0; } .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; } .qphl { outline: 2px solid rgba(216, 94, 49, .7); } :root.highlight-own .yourPost > .reply, :root.highlight-you .quotesYou > .reply { border-left: 2px solid rgba(221,0,0,.5); } /* Quote Threading */ .threadContainer { margin-left: 20px; border-left: 1px solid rgba(128,128,128,.3); } .threadOP { clear: both; } /* File */ .fileText:hover .fntrunc, .fileText:not(:hover) .fnfull, .expanded-image > .post > .file > .fileThumb > img[data-md5], :not(.expanded-image) > .post > .file > .fileThumb > .full-image { display: none; } .expanding { opacity: .5; } :root.fit-height .full-image { max-height: 100vh; } :root.fit-width .full-image { max-width: 100%; } :root.gecko.fit-width .full-image { width: 100%; } #ihover { -moz-box-sizing: border-box; box-sizing: border-box; max-height: 100%; max-width: 75%; padding-bottom: 16px; } /* Fappe Tyme */ .fappeTyme .thread > .noFile, .fappeTyme .threadContainer > .noFile { display: none; } /* Werk Tyme */ .werkTyme .post .file { display: none; } /* Index/Reply Navigation */ #navlinks { font-size: 16px; top: 25px; right: 10px; } /* Filter */ .opContainer.filter-highlight { box-shadow: inset 5px 0 rgba(255, 0, 0, .5); } .filter-highlight > .reply { box-shadow: -5px 0 rgba(255, 0, 0, .5); } /* Spoiler text */ :root.reveal-spoilers s { color: white !important; } /* Thread & Reply Hiding */ .hide-thread-button, .hide-reply-button { float: left; margin-right: 4px; padding: 2px; } .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; } .stub ~ * { display: none !important; } .stub input { display: inline-block; } /* QR */ :root.hide-original-post-form #postForm, :root.hide-original-post-form .postingMode, :root.hide-original-post-form #togglePostForm, #qr.autohide:not(.has-focus):not(:hover) > form, .thread #qr select[data-name=thread], #file-n-submit:not(.has-file) #qr-filerm { display: none; } #qr select, #dump-button, #url-button, .remove, .captcha-img { cursor: pointer; } #qr { z-index: 20; position: fixed; padding: 1px; border: 1px solid transparent; min-width: 300px; border-radius: 3px 3px 0 0; } #qrtab { border-radius: 3px 3px 0 0; } #qrtab { margin-bottom: 1px; } #qr .close { float: right; padding: 0 3px; } #qr .warning { min-height: 1.6em; vertical-align: middle; padding: 0 1px; border-width: 1px; border-style: solid; } .qr-link-container { 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; } .persona { width: 248px; max-width: 100%; min-width: 100%; } #dump-button { width: 10%; margin: 0; margin-right: 4px; font: 13px sans-serif; padding: 1px 0px 2px; opacity: 0.6; } #url-button { width: 10%; margin: 0; margin-right: 4px; font: 13px sans-serif; padding: 1px 0px 2px; opacity: 0.6; } .persona .field:not(#dump) { width: 95px; min-width: 33.3%; max-width: 33.3%; } #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 { resize: both; } .captcha-img { margin: 0px; text-align: center; background-image: #fff; font-size: 0px; min-height: 59px; min-width: 302px; } .captcha-input{ width: 100%; margin: 1px 0 0; } .captcha-input.error:focus { border-color: rgb(255,0,0) !important; } .field { -moz-box-sizing: border-box; margin: 0px; padding: 2px 4px 3px; } #qr textarea { min-width: 100%; } #qr [type='submit'] { width: 25%; vertical-align: top; } :root.webkit #qr [type='submit'] { height: 24px; } #qr label input[type=\"checkbox\"] { position: relative; top: 2px; } /* Fake File Input */ input#qr-filename { border: none !important; width: 80%; padding: 0px 4px; position: relative; bottom: 1px; background: none !important; } input#qr-filename:not(.edit) { pointer-events: none; } #qr-filename, #qr-filesize, .has-file #qr-no-file { display: none; } #qr-no-file, .has-file #qr-filename, .has-file #qr-filesize { display: inline-block; margin: 0 0 2px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; } #qr-no-file { color: #AAA; padding: 1px 4px; } #qr-filename-container { -moz-box-sizing: border-box; display: inline-block; position: relative; width: 100px; min-width: 74.6%; max-width: 74.6%; margin-right: 0.4%; margin-top: 1px; overflow: hidden; padding: 2px 1px 0; height: 22px; } #qr-filename-container:hover { cursor: text; } #qr-extras-container { position: absolute; right: 0px; } #qr-filerm { margin-right: 3px; z-index: 2; } #file-n-submit { height: 23px; } #qr input[type=file] { visibility: hidden; position: absolute; } /* Thread Select / Spoiler Label */ #qr select[data-name=thread] { float: right; } #qr.has-spoiler .has-file #qr-spoiler-label { width: 6.7%; min-width: 6.7%; max-width: 6.7%; display: inline-block; text-align: center; vertical-align: top; } #qr.has-spoiler #file-n-submit:not(.has-file) #qr-spoiler-label { display: none; } #qr.has-spoiler .has-file #qr-filename-container { max-width: 67.9%; min-width: 67.9%; } #qr-spoiler-label input { position: relative; top: 3px; } /* Dumping UI */ .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: hidden; white-space: nowrap; width: 248px; max-width: 100%; min-width: 100%; } #dump-list:hover { overflow-x: auto; } .qr-preview { -moz-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; -moz-transition: opacity .25s ease-in-out; vertical-align: top; background-size: cover; } .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); } .qr-preview.over { border-color: #fff; } .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 > 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; top: 50%; right: 10px; -moz-transform: translateY(-50%); } .textarea { position: relative; } :root.webkit .textarea { margin-bottom: -2px; } #char-count { color: #000; background: hsla(0, 0%, 100%, .5); font-size: 8pt; position: absolute; bottom: 1px; right: 1px; pointer-events: none; } /* Menu */ .menu-button:not(.fa-bars) { display: inline-block; position: relative; cursor: pointer; } .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; } .reply .menu-button, .op .menu-button, #thread-watcher .menu-button { margin-left: -1px !important; position: relative; } .op .menu-button, #thread-watcher .menu-button { top: 1px; } :root.blink .reply .menu-button { position: relative; top: 2px; } :root.blink .op .menu-button, :root.blink #thread-watcher .menu-button { top: 3px; } .menu-button + .container:not(:empty) { margin-left: -5px !important; } #menu { position: fixed; outline: none; } #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; } .left>.entry.has-submenu { padding-right: 17px !important; } .entry input[type=\"checkbox\"], .entry input[type=\"radio\"] { margin: 0px; position: relative; top: 2px; } .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; } .export, .import, .reset { cursor: pointer; text-decoration: none !important; } /* Custom Board Titles */ .boardTitle[contenteditable=\"true\"], .boardSubtitle[contenteditable=\"true\"] { cursor: text !important; } div.boardTitle { font-weight: 400 !important; } /* Link Title Favicons */ .linkify.YouTube { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABIklEQVQoz53LvUrDUBjG8bOoOammSf1IoBSvoCB4JeIqOHgBLt6AIMRBBQelWurQ2kERnMRBsBUcIp5FJSBI5oQsJVkkUHh8W0o5nhaFHvjBgef/Mq+Q46RJBMkI/vE+aOus956tnEswIZe1LV0QyJ5sE2GzgZfVMtRNIdiDpccEssdlB1mW4bvTwdvWJtRdErM7U+8S/FJykCRJX5qm+KpVce8UMNLRLbulz4iSjTAMh6Iowsd5BeNadp3nUF0VlxAEwZBotXC0Usa4ll3meZdA1iguwvf9vpvDA2wvmKgYGtSud8suDB4TyGr2PF49D/vra9jRZ1BVdknMzgwuCGSnZEObwu6sBnVTCHZiaC7BhFx2PKdxUidiAH/4lLo9Mv0DELVs9qsOHXwAAAAASUVORK5CYII=') center left no-repeat!important; padding-left: 18px; } .linkify.Vimeo { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAYFBMVEUAAAAIdZUKh6sLlLkLmr4LmsAMp88NrdYVW3MZj7Acstkrt9s1e5E7vN5EfI9JvdtKwuBijp5kpbl30eiDt8aG1uqRr7qTyNehxM+k4PCy3enB3OTg6Ovv9PXw+fz////L9U5WAAAAAXRSTlMAQObYZgAAAIFJREFUeNplz90OwiAMBWAQpAoyxclkP3je/y0H2AQXz0WT8100rRD6kNI9/cRroemQL3hXhoujZYj4OHoAmBvYGcBISwbWBvfXCrytnIDUQMkbsBpagMA7zhtQdyTFQAmIG7IkYniiZuh3XGsPqoOZkMOJOpAcLqUzNFGGu/57fwc1hgtp0mVSyQAAAABJRU5ErkJggg==') center left no-repeat!important; padding-left: 18px; } .linkify.SoundCloud { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABsklEQVQ4y5WTy2pUQRCGv2rbzDjJeAlIBmOyipGIIJqFEBDElwh4yULGeRFXPoEIBl/AvQ/gC2RnxCAoxijiwks852S6+3dxzslcHJCpTXVX11/Xv0097gLPgVNMJxnQNfX4zsqleWbnpoMf/oa9d988MM9MC/rp+E0a+A0dsVobMNMCOO8B6McRoABJI+A6gJmN3D2A8jgEBCEkSEMBrcrsDAzDWWn3AjgKFaDMmgRqniGFgsaDp1jrLOngDf1XT1D+A1dFc4MKAkkiCVKjjVu7g9+4Rzx4i1u6hjXbuMWr0O5QPNvCu7IaCZwEKQukLGDrm5x8uI0tr6MkiGlkiv7yLfzN+6S5i6QsIMABkEfcxhbWWYMkVAOjxvYAjc3HNHrbKI9VBQBFwF25XQKSBjqIf1YBuAurEMrczgDygD6/x2LCpFLXLUyQ+PoldphhBhYfIX09XU1+Flaukz7uYqs3SHs7cG4BmTsmkBUF9mmXEwa28BNLPaQPLepuNcbGSWQquQC2/Kdcox1FUGkcB0ykck1nA2+wTzMs8stGnP4rbWGw74EuS/GFQWfK7/wF6P4F7fzIAYkdmdEAAAAASUVORK5CYII=') center left no-repeat!important; padding-left: 18px; } .linkify.audio { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAitJREFUOE9jYCAWKJWwavr0KyXWb/FIbDtUFFyzJx6nVofE2Xo5nXsj0rqPNSR0nVkR2Hjmgmfd+U9Otdf+m5Vf/6+SfeU/R9ChVVgNYDRtlfJuuPA/rPfe/4QpD/6nznj0P27Kw/9unff/69Xf+69c/+C/SO7N/0z+OAxgMmmRCe++/r9i3ev/KWvf/vdY8PK/bt/9/wrNV3/IN5y/IVt1YqNg4pGTTP4HsbuA2bhZ2qvpyn+xjIObxAp3VwqlrgngLFyryVy5nhPmZJHANS2cwYexG8BmVC/pWn3hP4NZlzWuQDJI3dIiFnUUuwEsQAOcq87jNcC7fHeLUtJxHF4AGmBWeAavAWH1+1rUUk7giAWjOknllON4DXAs2NEiG4/DBQxAF/CFHfrPYI4jDFSLuJVjNrUJhB/B7gIGo1pJRt99GAZYJK7wLJ1z7Xzl4vu/7aqv/GRBj0bjqAX2qb0nJ7mXH17C4HcUxQA+hymWtSue/C5a9up/9Ozn/7Vr7v1nRY7GqMb91T3b3v6vWvPmf/S0p/9ZQk+DDLCBRSOz06Jqk+o7/21nvfqvsebDf7kZL/5zBaxphkezd+OFn7HzXvz3Wvjmv9a8N//5Ek//ZTBpVYUrMG2X5wjcdl68+uI/wa5Lr3hSNjczGFeywOVZ/bbcVGp//F9izfv/Ql03f3P4LC/HSEQquYwMFnUCDJ7dzBhyjGZNQpye89M5gpfnMvtNUyE2h4PUAQBovvT7lyNljwAAAABJRU5ErkJggg==') center left no-repeat!important; padding-left: 18px; } .linkify.LiveLeak { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAlNJREFUGBkFwU2LVmUYAODrPu8Z5x1xSpRBXQyFoLsBE+wfiO5atJOgnf9DUPwFgtGinUgEaQsRhHYuMtpEiEWuG5iNjuOcj+c8z911xXcXL/68c3Dw1fzhg0QgEQAAEYGUKXFie9vxlSs/xk/rdavjGEkmkWSih65z4osv9GfOiK6LzEyZ2uGh4dUrmzs72ddlUUhkoiMr4PT167589Mh6c1N0nSRlqrX67dat+PDyZXRT19m5edPnt28rGFHxMcJ6d9fprS1/37tneP3aemPD1uamUydPOru3p5DdGOH0tWsu3LhhxIQJM2qEpRT/Pn3q/du3AhARSmvGTH0lplKMrVkiYpVpQaJlighzhDkzhmEA0fcWoqAfyaFW4zTlgCABxlrNmY4ylUzLsiREprFWc0T2M+ZSjKWY0AEaltZUjJixZJIpuk5pTWlNP2BYFvOyKJkCAKU1tTXHrZlqVWolUxdhxsfVSj9FmJfFMM9GdICGGa01HyMstYpMIFPJVNDPmYZSTOPoOEKHzNRlKpmWWh1j6TpLa2SKTKVWU6Z+Qolwdm/P9QcPZKa2LH69e9eIMs+WCL/cv2/98CGZPrt61am+V9APq1X89eyZ/968obVYaiXT4dGREgG+vnPHeHgYMsH2+fP+efEihtVKv7SWw/6+9/v7KYLMhIywTJPamvOXLomukyRsrNf+ePzYkpl9dJ3SWgSCSCQCfz5/7pMLF2yfO6eLiAQcHRz4/cmT+HR7O+Ob3d0fNt69+7a2BiICQCJbA0EgE5lpvbXl1OXL3/8Pfax4+6SjSukAAAAASUVORK5CYII=') center left no-repeat!important; padding-left: 18px; } .linkify.Vocaroo { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAw9JREFUOE9jYMABuMwYmCyTJKUCGlSnFSy02TTzeOyCiQcDViX26qVz2TAyYtWmEMwuoZ3M7V40LcB79pHkc0svpvzY8jD//87nxf+3Pyn8v/ZO8v+VNyP/2mZJumI1QCWSI8232Hjumitlfw5+qPp/9l8TCt76JP//xkdx/wsXWCzjtWFkwTCkbWFe9plPk/+ga4Txz/xt/D/hkN//gMXif21a+NbyWjIwoRiy6GDT5rP/mlFsPfyp5n/NpOj/22+0gMUXXIz/H7hC/L/bFKFbPDZMrHAD5H35OPt2J9zacDv/f3V7xv9FhwrBGubsT/1//Pjx/1GJ/mD+/nfl/1v3Ovy3KRJNQbHdOlXCvOO03/+pm1P/v3v37n90hhtYw9HPtf8Xb2v937cmHswHeWPRxYj/LvkK3igGKARwicTO07118H3V/5kbi/4vPZMJtK3s/6YH2f+Pfq1B8VbjWrdnMu5s4nAD9CNFhKwz5DTUvLl419zKvAcLtG1P84BRl/b/5M/6/6f/NPzf/qzo84yj0Uus0xUU4Zor54bm9+4OfZG02OCuoAMTb9ZkC9ull1Nvrr2Z+XvRpaRfc65H/68F+jl9svEhzyLFWoccWVc+eyTHq/twydjlKRln7jX9bNMkMJnbhoFRL1xCqmKx6/yi2fYXa/c5/e846PV/5fW0/7OPx/yfcjzop34ulxdGGvDuU8mMXaX507lBuiN6ueadmQeT/p/93vf/1O+G//sP5fw/eL3o/5JLif8zVxs+Tlir9S26UyeFQQvJGBE7FvaFZ9LfN+1y+WjbItSb3GmXvXd15v8zroH/HxgE/D+aGPx/18vi/z07PeZNPRKxe/Kh0Ae8toxscCO4zBkYXArk9C1SxJUYjBkYPPIVtbbuTftz3cz//2O9wP/75iSAXdO72/dt2HL5F6YlfBW4MiJYXMiBiW3t7azHBx+V/t89N+H/8a+1//e9K/9attDp5LQjYX8SuvVL8RoAkmxa65299Erq1FnHo0qrl7t4BddriIs4MrM3rfWcFd+pGwVSAwBZ0bKP8yrZPAAAAABJRU5ErkJggg==') center left no-repeat!important; padding-left: 18px; } .linkify.pastebin { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB1FBMVEUAAAAAAAAAAABWYWwAAABbY3BbYm5dZnFdZXJeZnMEBAQHCAhYYGpdZnFdZnBgaHIlJyomKCooKi09QkdESU5eZGtdYmhdYmleY2lrcXdqb3Rqb3Rqb3SSmJ+SlJeWmJutr7GtrrCWm6ChpKhbW1tmZmZvb290dHR3d3d4eHh5eXl6enp8fHx+gIJ/f3+CgoKDg4OEhISFhYWHh4eKioqKjI2Li4uMjIyOjo6Pj4+QkJCRkZGSkpKUlJSVl5mWlpaYmZqZm52ampqbm5ucnJydnZ2enp6fn5+hoaGioqKkpKSkpaalpaWmp6mmp6qnqauoqKioqquoqq2qqqqrrK2srKysra6srrCsrrGurq6vr6+wsLCxsbGysrKztLa0tLS1t7m2tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr7AwMDAwsTBwcHExcfFxcXFxsnGxsbHx8fIyMjJycnMzMzNzc3Ozs7O0NLPz8/Q0NDR0dHR09XT09PV1dXV1dbV1tfV19rW1tbX19fX19jY2tzZ2dnZ2tva2tra3N3a3N7c3Nze3t7f39/f4OHg4ODi4uLl5+jm5ubs7Ozs7e3u7u7v7+/v8PDw8PDx8fHy8vLz8/P29vYSoLMZAAAAJHRSTlMABAUGCwsNHCAiLzMzMzZEYGJwgIuOnJycnqmqq9bc3+/w8fkZ0N/uAAAA/klEQVQoU2NgYGDl5YMDdgYGBmZZ3964CYFtIR3e9Q7K/AwMHI55KfaFmcHWMy3K3MwlGRg4wz0zdYpcorRbNbL0LaWAAp3ts2umV8wo6MupTauQBgqUG03VL7W3sfZSb1erAgm02M+yzYrVCXUy6zapAQlUx/dEdyX3J3ZHVUYVywAF8o2rDNN1Go2jzGLMokAC2QbuSc42mXmaOXop9iAtCXrJ5qXWjT59Abl2ESJAAX/tSIMMiyrrqQ3T6uS5gQK6kSqpqkUermGTexQFmYACflqR+hlWZSamzQpCLEDPsSmVVDT1TJw0JUhOAMRnYOARFRMTE5cQF+ZiBPIAII5B3EVG0b4AAAAASUVORK5CYII=') center left no-repeat!important; padding-left: 18px; } .linkify.gist { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABblBMVEXc3NykpKTW1tbb29ugoKCdnZ0AAAACAgIEDRcKCgoMDAwODg4QIzYRDAoTExMUDwwVAg0WICsaEw8aGhoiCBklGxUmERwwKCQ7LSU7Ozs8LSZFLyNINi1JNyxJNy1KSklMOi5VR1FXV1daQTRkZGRseYZwU0F4eHh7dnR8bWV/YE6IdGiKcGCKkJaNgYeNjY2RdGOScWCUcWCZmZmhoaGkpKSoqKirfmaurq6xsbG1tbW6urq+vr7AbmzBb23CwsLGxsbHx8fHyMjJycnJysrMzMzOiYbPi4fQ0NDRoYbT09PU1NTW1tbY2NjZqIzZ2dnb29vd3d3f39/i4uLktZrk5OTl5eXm5ubn5+fo6Ojq6urs7OzttKLu7u7wuqbw8PDx8fHz8/P4+Pj5+fn7uZj8vpz9ya79ybD/tZf/upr/wZ//w6H/xKH/xaL/xrH/yqj/y7T/zqv/z7D/07D/17n/2Lv/2Lz/3L//38n/4Mk3Q/ZuAAAABnRSTlMSFcbGzc5MNKFvAAAA1klEQVQoz2NgYPZHAswMDEwRSclwkBTBxOARn4gE4j0YXBOiJNUDg7y8Ar1UlOITXBkcY73Z2Li42dg42dn4wmIdGeyjQ7nZoEA4PNqewSZKlw0O9KJsGKwjBdl4ZeWkJGQUhNjEIq0ZrMI5+D0ri7Jz8itCRAXCrRgsQ3mUy+xicrPSbfO0REItGSyCVaVL3ONSU9LcCtQUgy0YzIJ85M1LizMzCsv9xF2CzBhMAwN99TV1DI0MtDWcAgNNGUycA5CAswkDi5kDwrMOZiwMjKzGSICVEQDhZj0UQV7PewAAAABJRU5ErkJggg==') center left no-repeat!important; padding-left: 18px; } .linkify.image { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAs5JREFUOE+lk/tvi1EYx98/xT8gW4REIpGFMEQWl2FiM9ZMZhm2xRAyOsmujFFmdFRHu0tWm87UypxStr69zPauN5e5rHVp3IYhbOvHy+wHEQlxkm+ek+d8nm9OznkeSfrfldmgJC7QyUlTymsJTfuTZ25z4HdWYwyLreYhtpgekGPw0+kKvo1Eo+IXRSIiEhkWZuc9tqnsJD9EqTUopCxjSGTpB0iueczSo1HyW8cpsExQ1DbxI2pt45j9cXpexul4FEd79RnZphAa/SD7WvuFtO6UItbU9LC+YQxNI2w0wwYT5LRAdhOU3oBTIXC9gXP3oUSGgz2vST3gYHejR0jptT1C332f8yrUEYHrz8CgxDnpm6DKCUfc0KnmXa/AEVPPwnDcD0cvetA2uYRk67Ive/lpjO7YBO1PPuF8Df3vwf4cbNE4tqdw7YVq8HYyHx6FvhE1hkMEg8HDUqvFkjT4aIjMqkqyqkswDSrcfBfH+Q561YLAZ/B+BLda6FXlU/cPv0AoEPhuoP1h4Av7Wbh9E/Py15NWWUjeSR3nZDfeN+N0DY9hG/7K1eGP3P0S5/EYRFUF/IOTBrUXHPm9fT6mr1xEwupkZqxbzLyiDJYUZ5NSnkdqdSHpxyrYdFpPgdmAsdfJwPMI/Yr65bf7tZLGGBQ7DNdJWFtIYvoOZmbuZE7OXpIKKli86zAr9p9gTVktWTVnKTI2U95uRWe3U2IJUDbVB5p6hVm5x5m9Vc/cnedZUNzC8lILaQesZBy6hEZ3maKzgvJWFzVWD9XtXvVGQbSWASFtMATVRlJIKbOTWtlJXaeXepuPM1f6MNp9GLt8mLvvYLmp0OhQ2Fwvk6m7xaqDTvY0eYWUVtcnllXfYlGpnfklVuraHHg8HjxuN+6fktUHlWWZPaZeUo/ILK0UKttBcbNbSB9GP0yLxWJJUxoZGUn80zD9C/vXQ/4NHY10h3M1zmQAAAAASUVORK5CYII=') center left no-repeat!important; padding-left: 18px; } .linkify.InstallGentoo { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABcVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3dIYAAAAAAAAAAAAbGh4BBAcCBgoBBgoCBwsCCQ/QzucCCA7MyuXZ1eUBBQmTh8fo5/i9svIAAADh3vQAAAACCA0CCQ8CCQ4DDBQbGCUDChDr6vgAAAAAAAAREBIDCxK6tdfe2fTv7/cDCxIDDBQEDRUHDhgMJjXk4PZdXWdLUFoUNEYOKDgSMUMRLUBneI4eTGj08/QmW3onW3rTzvfOx/giU3IiVHMkWHdEaYJobHv3+PokWHpua6TNy9xZgZ+1quz8/foQKj0XPFInWn0nW38tZ4o6fqg8gq48grA9hrU/i7pAhrNAiLdBjLtEjr1FksNIjr5Il8pImMtKWnNqhL97odKFqti5q/q5rPq60+nCt/vLw/vPx/jV0vHY0/rc1/rg2/vh3fzn4fzu6/vx8vf19Pv19Pz49/v5+Pv8/Pv8/fr9/vv+/frziVtUAAAAT3RSTlMABQYHCAoNDhARGRobL0ZOV1xdXV5fYGBmZnB0eX2MjZSaoaGio6mqqqustLq7zubo6Ojo6evt7u/x8fLy9/f4+Pj5+vr6+vr6+/39/v7+XKgUSwAAAMhJREFUKM9jYGDg4OZmZgABKINT1dBAhBHIYFMxMBIDisjbhoZbCTExsCu5hoeY8DEwcOkEx8fY6MqpucTGB0izglVEplcU5/gmRYWBVQDNMK+s0hN3SvMyBpsBNJxXw0NfwTEjVQZqHQMHj5RfWW5mliSEC7TPzK6yJD/bXZQRzGdXcisqLy309okA2Q4Eis4peQWmstqBCdGW/CABraC45ERBBs3A6Fh/AbAKTwsHa34QZW8NVsGuLqwswQSjQICTmYMFQaEDAAF8JHLfKGswAAAAAElFTkSuQmCC') center left no-repeat!important; padding-left: 18px; } /* Gallery */ #a-gallery { position: fixed; top: 0; bottom: 0; left: 0; right: 0; z-index: 30; 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; } .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 { 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 { order: 0; border-right: 1px solid #222; } .gal-next { order: 2; 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 { order: 1; flex: 1 0 auto; display: flex; align-items: flex-start; justify-content: space-around; overflow: hidden; /* Flex > Non-Flex child max-width and overflow fix (Firefox only?) */ width: 1%; } :root:not(.gal-fit-height) .gal-image { overflow-y: scroll !important; } :root:not(.gal-fit-width) .gal-image { overflow-x: scroll !important; } .gal-image a { margin: auto; line-height: 0; } .gal-fit-width .gal-image img { max-width: 100%; } .gal-fit-height .gal-image img { /* Chrome doesn't support viewpoint units in calc() http://bugs.chromium.org/168840 \"It looks like the original author of viewport units in WebKit is not coming back to fix this stuff.\" Well, fuck. */ max-height: 95vh; max-height: calc(100vh - 25px); } .gal-buttons { font-size: 2em; margin-right: 10px; top: 5px; } .gal-buttons i { vertical-align: baseline; border-top-width: .4em; border-right-width: .25em; border-left-width: .25em; } .gal-buttons .menu-button { bottom: 2px; color: #ffffff; text-shadow: 0px 0px 1px #000000; } .gal-close { color: #ffffff; text-shadow: 0px 0px 1px #000000; } .gal-buttons, .gal-name, .gal-count { position: fixed; right: 178px; } .gal-hide-thumbnails .gal-buttons, .gal-hide-thumbnails .gal-count, .gal-hide-thumbnails .gal-name { right: 28px; } .gal-name { bottom: 6px; background: rgba(0,0,0,0.6) !important; border-radius: 3px; padding: 1px 5px 2px 5px; text-decoration: none !important; color: white !important; } .gal-name:hover, .gal-close:hover, .gal-buttons .menu-button:hover { color: rgb(95, 95, 101) !important; } .gal-count { bottom: 27px; background: rgba(0,0,0,0.6) !important; border-radius: 3px; padding: 1px 5px 2px 5px; color: #ffffff !important; } :root:not(.gal-fit-width) .gal-name { bottom: 23px !important; } :root:not(.gal-fit-width) .gal-count { bottom: 44px !important; } :root:not(.gal-fit-height):not(.gal-hide-thumbnails) .gal-buttons, :root:not(.gal-fit-height):not(.gal-hide-thumbnails) .gal-name, :root:not(.gal-fit-height):not(.gal-hide-thumbnails) .gal-count { right: 195px !important; } :root.gal-hide-thumbnails:not(.gal-fit-height) .gal-buttons, :root.gal-hide-thumbnails:not(.gal-fit-height) .gal-name, :root.gal-hide-thumbnails:not(.gal-fit-height) .gal-count { right: 44px !important; } @media screen and (resolution: 1dppx) { .fa-bars { font-size: 14px; } #shortcuts .fa-bars { vertical-align: -1px; } }\n/* General */ :root.yotsuba .dialog { background-color: #F0E0D6; border-color: #D9BFB7; } :root.yotsuba .field:focus { border-color: #EA8; } /* Header */ :root.yotsuba #header-bar.dialog { background-color: rgba(240,224,214,0.98); } :root.yotsuba #header-bar, :root.yotsuba #notifications { font-size: 9pt; color: #B86; } :root.yotsuba #board-list a, :root.yotsuba #shortcuts a { color: #800000; } :root.yotsuba.fixed #custom-board-list a.current { border-bottom: 1px solid rgba(178,0,0,0.2); } :root.yotsuba.fixed #custom-board-list .current:hover { border-bottom-color: rgba(255,0,0,0.2); } /* Settings */ :root.yotsuba #fourchanx-settings fieldset { border-color: #D9BFB7; } /* Quote */ :root.yotsuba .backlink.deadlink { color: #00E !important; } :root.yotsuba .inline { border-color: #D9BFB7; background-color: rgba(255, 255, 255, .14); } /* QR */ .yotsuba #dump-list::-webkit-scrollbar-thumb { background-color: #F0E0D6; border-color: #D9BFB7; } :root.yotsuba .qr-preview { background-color: rgba(0, 0, 0, .15); } :root.yotsuba .qr-link { border-color: rgb(225, 209, 199) rgb(225, 209, 199) rgb(210, 194, 184); background: linear-gradient(#FFEFE5, #F0E0D6) repeat scroll 0% 0% transparent; } :root.yotsuba .qr-link:hover { background: #F0E0D6; } /* Menu */ :root.yotsuba #menu { color: #800000; } :root.yotsuba .entry { font-size: 10pt; } :root.yotsuba .focused.entry { background: rgba(255, 255, 255, .33); } /* Watcher Favicon */ :root.yotsuba .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } /* Board Title */ :root.yotsuba div.boardTitle { font-family: sans-serif !important; text-shadow: 1px 1px 1px rgba(100,0,0,0.6); }\n/* General */ :root.yotsuba-b .dialog { background-color: #D6DAF0; border-color: #B7C5D9; } :root.yotsuba-b .field:focus { border-color: #98E; } /* Header */ :root.yotsuba-b #header-bar.dialog { background-color: rgba(214,218,240,0.98); } :root.yotsuba-b #header-bar, :root.yotsuba-b #notifications { font-size: 9pt; color: #89A; } :root.yotsuba-b #board-list a, :root.yotsuba-b #shortcuts a { color: #34345C; } :root.yotsuba-b.fixed #custom-board-list .current { border-bottom: 1px solid rgba(30, 30, 255, 0.2); } :root.yotsuba-b.fixed #custom-board-list .current:hover { border-bottom-color: rgba(255,0,0,0.2); } /* Settings */ :root.yotsuba-b #fourchanx-settings fieldset { border-color: #B7C5D9; } /* Quote */ :root.yotsuba-b .backlink.deadlink { color: #34345C !important; } :root.yotsuba-b .inline { border-color: #B7C5D9; background-color: rgba(255, 255, 255, .14); } /* QR */ .yotsuba-b #dump-list::-webkit-scrollbar-thumb { background-color: #D6DAF0; border-color: #B7C5D9; } :root.yotsuba-b .qr-preview { background-color: rgba(0, 0, 0, .15); } :root.yotsuba-b .qr-link { border-color: rgb(199, 203, 225) rgb(199, 203, 225) rgb(184, 188, 210); background: linear-gradient(#E5E9FF, #D6DAF0) repeat scroll 0% 0% transparent; } :root.yotsuba-b .qr-link:hover { background: #D9DDF3; } /* Menu */ :root.yotsuba-b #menu { color: #000; } :root.yotsuba-b .entry { font-size: 10pt; } :root.yotsuba-b .focused.entry { background: rgba(255, 255, 255, .33); } /* Watcher Favicon */ :root.yotsuba-b .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } /* Board Title */ :root.yotsuba-b div.boardTitle { font-family: sans-serif !important; text-shadow: 1px 1px 1px rgba(105,10,15,0.6); }\n/* General */ :root.futaba .dialog { background-color: #F0E0D6; border-color: #D9BFB7; } :root.futaba .field:focus { border-color: #EA8; } /* Header */ :root.futaba #header-bar.dialog { background-color: rgba(240,224,214,0.98); } :root.futaba #header-bar, :root.futaba #notifications { font-size: 11pt; color: #B86; } :root.futaba #header-bar a, :root.futaba #notifications a { color: #800000; } :root.futaba.fixed #custom-board-list a.current { border-bottom: 1px solid rgba(178,0,0,0.2); } :root.futaba.fixed #custom-board-list .current:hover { border-bottom-color: rgba(255,0,0,0.2); } /* Settings */ :root.futaba #fourchanx-settings fieldset { border-color: #D9BFB7; } /* Quote */ :root.futaba .backlink.deadlink { color: #00E !important; } :root.futaba .inline { border-color: #D9BFB7; background-color: rgba(255, 255, 255, .14); } /* QR */ .futaba #dump-list::-webkit-scrollbar-thumb { background-color: #F0E0D6; border-color: #D9BFB7; } :root.futaba .qr-preview { background-color: rgba(0, 0, 0, .15); } :root.futaba .qr-link { border-color: rgb(225, 209, 199) rgb(225, 209, 199) rgb(210, 194, 184); background: linear-gradient(#FFEFE5, #F0E0D6) repeat scroll 0% 0% transparent; } :root.futaba .qr-link:hover { background: #F0E0D6; } /* Menu */ :root.futaba #menu { color: #800000; } :root.futaba .entry { font-size: 12pt; } :root.futaba .focused.entry { background: rgba(255, 255, 255, .33); } /* Watcher Favicon */ :root.futaba .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); }\n/* General */ :root.burichan .dialog { background-color: #D6DAF0; border-color: #B7C5D9; } :root.burichan .field:focus { border-color: #98E; } /* Header */ :root.burichan #header-bar.dialog { background-color: rgba(214,218,240,0.98); } :root.burichan #header-bar, :root.burichan #header-bar #notifications { font-size: 11pt; color: #89A; } :root.burichan #header-bar a, :root.burichan #header-bar #notifications a { color: #34345C; } :root.burichan.fixed #custom-board-list .current { border-bottom: 1px solid rgba(30, 30, 255, 0.2); } :root.burichan.fixed #custom-board-list .current:hover { border-bottom-color: rgba(255,0,0,0.2); } /* Settings */ :root.burichan #fourchanx-settings fieldset { border-color: #B7C5D9; } /* Quote */ :root.burichan .backlink.deadlink { color: #34345C !important; } :root.burichan .inline { border-color: #B7C5D9; background-color: rgba(255, 255, 255, .14); } /* QR */ .burichan #dump-list::-webkit-scrollbar-thumb { background-color: #D6DAF0; border-color: #B7C5D9; } :root.burichan .qr-preview { background-color: rgba(0, 0, 0, .15); } :root.burichan .qr-link { border-color: rgb(199, 203, 225) rgb(199, 203, 225) rgb(184, 188, 210); background: linear-gradient(#E5E9FF, #D6DAF0) repeat scroll 0% 0% transparent; } :root.burichan .qr-link:hover { background: #D9DDF3; } /* Menu */ :root.burichan #menu { color: #000000; } :root.burichan .entry { font-size: 12pt; } :root.burichan .focused.entry { background: rgba(255, 255, 255, .33); } /* Watcher Favicon */ :root.burichan .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); }\n/* General */ :root.tomorrow .dialog { background-color: #282A2E; border-color: #111; } /* Header */ :root.tomorrow #header-bar.dialog { background-color: rgba(40,42,46,0.9); } :root.tomorrow #header-bar, :root.tomorrow #notifications { font-size: 9pt; color: #C5C8C6; } :root.tomorrow #header-bar a, :root.tomorrow #notifications a { color: #81A2BE; } :root.tomorrow.fixed #custom-board-list a.current { border-bottom: 1px solid rgba(83,124,160,0.4); } :root.tomorrow.fixed #custom-board-list .current:hover { border-bottom-color: rgba(95,137,172,0.4); } /* Settings */ :root.tomorrow #fourchanx-settings fieldset { border-color: #111; } /* Quote */ :root.tomorrow .backlink.deadlink { color: #81A2BE !important; } :root.tomorrow .inline { border-color: #111; background-color: rgba(0, 0, 0, .14); } /* QR */ .tomorrow #dump-list::-webkit-scrollbar-thumb { background-color: #282A2E; border-color: #111; } :root.tomorrow .qr-preview { background-color: rgba(255, 255, 255, .15); } :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 { border-color: rgb(129, 162, 190) !important; background-color: rgb(30,32,36); } :root.tomorrow .qr-link { border-color: rgb(25, 27, 31) rgb(25, 27, 31) rgb(10, 12, 16); background: linear-gradient(#37393D, #282A2E) repeat scroll 0% 0% transparent; } :root.tomorrow .qr-link:hover { background: #282A2E; } /* Menu */ :root.tomorrow #menu { color: #C5C8C6; } :root.tomorrow .entry { font-size: 10pt; } :root.tomorrow .focused.entry { background: rgba(0, 0, 0, .33); } /* Watcher Favicon */ :root.tomorrow .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } /* Board Title */ :root.tomorrow div.boardTitle { font-family: sans-serif !important; text-shadow: 1px 1px 1px rgba(167,170,168,0.6); }\n/* General */ :root.photon .dialog { background-color: #DDD; border-color: #CCC; } :root.photon .field:focus { border-color: #EA8; } /* Header */ :root.photon #header-bar.dialog { background-color: rgba(221,221,221,0.98); } :root.photon #header-bar, :root.photon #notifications { font-size: 9pt; color: #333; } :root.photon #header-bar a, :root.photon #notifications a { color: #FF6600; } :root.photon.fixed #custom-board-list a.current { border-bottom: 1px solid rgba(0,74,153,0.2); } :root.photon.fixed #custom-board-list .current:hover { border-bottom-color: rgba(255,51,0,0.2); } /* Settings */ :root.photon #fourchanx-settings fieldset { border-color: #CCC; } /* Quote */ :root.photon .backlink.deadlink { color: #F60 !important; } :root.photon .inline { border-color: #CCC; background-color: rgba(255, 255, 255, .14); } /* QR */ .photon #dump-list::-webkit-scrollbar-thumb { background-color: #DDD; border-color: #CCC; } :root.photon .qr-preview { background-color: rgba(0, 0, 0, .15); } :root.photon .qr-link { border-color: rgb(206, 206, 206) rgb(206, 206, 206) rgb(191, 191, 191); background: linear-gradient(#ECECEC, #DDD) repeat scroll 0% 0% transparent; } :root.photon .qr-link:hover { background: #DDDDDD; } /* Menu */ :root.photon #menu { color: #333; } :root.photon .entry { font-size: 10pt; } :root.photon .focused.entry { background: rgba(255, 255, 255, .33); } /* Watcher Favicon */ :root.photon .watch-thread-link { background-image: url(\"data:image/svg+xml,\"); } /* Board Title */ :root.photon div.boardTitle { font-family: sans-serif !important; text-shadow: 1px 1px 1px rgba(0,74,153,0.6); }", - features: [['Polyfill', Polyfill], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Emoji', Emoji], ['Color User IDs', IDColor], ['Custom CSS', CustomCSS], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Menu', Menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Show Dice Roll', Dice], ['Banner', Banner], ['Navigate', Navigate]] - }; - - Main.init(); - -}).call(this); diff --git a/builds/xpi/data/greaseshim.js b/builds/xpi/data/greaseshim.js deleted file mode 100644 index 0d89a981f..000000000 --- a/builds/xpi/data/greaseshim.js +++ /dev/null @@ -1,62 +0,0 @@ -function GM_openInTab(_url) { - self.port.emit("GM_openInTab", _url); - return; // Should return the Window object -}; - -function GM_setValue(_name, _value) { - localStorage[_name] = _value; - return; -}; - -function GM_getValue(_name, _default) { - if (localStorage[_name] === null && _default === null) return null; - return (localStorage[_name] || _default); -}; - -function GM_deleteValue(_name) { - localStorage.removeItem(_name); - return; -}; - -function GM_listValues() { - return Object.keys(localStorage); -}; - -function GM_setClipboard(_text) { - self.port.emit("GM_setClipboard", _text); -}; - -//Deprecated -function GM_log(_message) { - console.log(_message); - return; -}; - -function GM_xmlhttpRequest(_details) { - //Ugly hack? Race condition? Memory leak? - _onload = _details.onload; - _context = _details.context; - self.port.emit("GM_xmlhttpRequest", _details); -}; - -self.port.on("callback_GM_xmlhttpRequest", function(_response) { - _response.context = _context; - _onload(_response); -}); - -function GM_addStyle(_css) { - self.port.emit("GM_addStyle", _css); -} - -var GM_info = new Object(); -GM_info.version = '1.15'; -GM_info.scriptWillUpdate = true; - -//To do -function GM_registerMenuCommand(_caption, _commandFunc, _accessKey) { - return; -} - -self.port.on("load-userscript", function(_script) { - eval(_script); -}); diff --git a/builds/xpi/doc/main.md b/builds/xpi/doc/main.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/builds/xpi/icon.png b/builds/xpi/icon.png deleted file mode 100755 index 6b9265ec96b6c6778889dedbf4c46e984f26d521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-soB=)|t_%$6KxWz*%-n-dVn0W`gn( zDQ!m9Ni0pPL|B?0`$OL6q>l`RV$+L=&U& zo^