From 0fbb87dd470d1928c66e46b8b2f7799f57aa87f4 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Tue, 7 May 2013 23:04:35 -0700 Subject: [PATCH] Add a dummy appchan_x.user.js for updates. --- appchan_x.meta.js | 17 + appchan_x.user.js | 11701 +++++++++++++++++++++++++++++++++++++++++ builds/appchan-x.zip | Bin 0 -> 164348 bytes 3 files changed, 11718 insertions(+) create mode 100644 appchan_x.meta.js create mode 100644 appchan_x.user.js create mode 100644 builds/appchan-x.zip diff --git a/appchan_x.meta.js b/appchan_x.meta.js new file mode 100644 index 000000000..11450598c --- /dev/null +++ b/appchan_x.meta.js @@ -0,0 +1,17 @@ +// ==UserScript== +// @name appchan x +// @namespace zixaphir +// @version 1.2.7 +// @description Cross-browser userscript for maximum lurking on 4chan. +// @copyright 2013 Zixaphir +// @copyright 2009-2011 James Campos +// @copyright 2013 Nicolas Stepien +// @license MIT; http://en.wikipedia.org/wiki/Mit_license +// @match *://*.4chan.org/* +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_deleteValue +// @grant GM_openInTab +// @run-at document-start +// @icon data:image/gif;base64,R0lGODlhIAAgAKIAAAQCBARmBHy6VKTShP///////wAAAAAAACH5BAEAAAUALAAAAAAgACAAAAO6WLrc/jDKWYK9VF3cts2Vx1hDaX4RaZaouqKQewZjINwCS3dBiQuwheWnc6h+weFPAGg6n88lcKf8Qa9OadLTJHi/4KZnV9t0wWixaHK+epsgRhv6BsQXZ/QXfi/k9QR8d3NPdX1+AHWFgXZxFnMKc0ESj4mMkZZqFCpXmE9FKT0DnYifA5NCokhkqUSnrBqqOKhVOa9GNku0uau4WrAhv75TN7vFucbEU8NKqLHPodAxVMA10ofY2REJADs= +// ==/UserScript== diff --git a/appchan_x.user.js b/appchan_x.user.js new file mode 100644 index 000000000..54968a0e4 --- /dev/null +++ b/appchan_x.user.js @@ -0,0 +1,11701 @@ +// ==UserScript== +// @name appchan x +// @namespace zixaphir +// @version 1.2.7 +// @description Cross-browser userscript for maximum lurking on 4chan. +// @copyright 2013 Zixaphir +// @copyright 2009-2011 James Campos +// @copyright 2013 Nicolas Stepien +// @license MIT; http://en.wikipedia.org/wiki/Mit_license +// @match *://*.4chan.org/* +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_deleteValue +// @grant GM_openInTab +// @run-at document-start +// @updateURL https://github.com/zixaphir/appchan-x/raw/stable/appchan_x.meta.js +// @downloadURL https://github.com/zixaphir/appchan-x/raw/stable/appchan_x.user.js +// @icon data:image/gif;base64,R0lGODlhIAAgAKIAAAQCBARmBHy6VKTShP///////wAAAAAAACH5BAEAAAUALAAAAAAgACAAAAO6WLrc/jDKWYK9VF3cts2Vx1hDaX4RaZaouqKQewZjINwCS3dBiQuwheWnc6h+weFPAGg6n88lcKf8Qa9OadLTJHi/4KZnV9t0wWixaHK+epsgRhv6BsQXZ/QXfi/k9QR8d3NPdX1+AHWFgXZxFnMKc0ESj4mMkZZqFCpXmE9FKT0DnYifA5NCokhkqUSnrBqqOKhVOa9GNku0uau4WrAhv75TN7vFucbEU8NKqLHPodAxVMA10ofY2REJADs= +// ==/UserScript== + +/* + * appchan-x - Version 1.2.7 - 2013-05-04 + * + * Licensed under the MIT license. + * https://github.com/zixaphir/appchan-x/blob/master/LICENSE + * + * Appchan X Copyright © 2013 Zixaphir + * http://zixaphir.github.com/appchan-x/ + * 4chan x Copyright © 2009-2011 James Campos + * http://aeosynth.github.com/4chan-x/ + * 4chan x Copyright © 2013 Nicolas Stepien + * http://mayhemydg.github.com/4chan-x/ + * OneeChan Copyright © 2013 Jordan Bates + * http://seaweedchan.github.com/oneechan/ + * 4chan SS Copyright © 2013 Ahodesuka + * http://ahodesuka.github.com/4chan-Style-Script + * Raphael Icons Copyright © 2013 Dmitry Baranovskiy + * http://raphaeljs.com/icons/ + * + * 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 + * Gógol + * + * All the people who've taken the time to write bug reports. + * + * Thank you. + */ + +/* + * Linkify based on: + * http://downloads.mozdev.org/greasemonkey/linkify.user.js + * https://github.com/MayhemYDG/LinkifyPlusFork + * + * Originally written by Anthony Lieuallen of http://arantius.com/ + * Licensed for unlimited modification and redistribution as long as + * this notice is kept intact. + */ + +/* + * JSColor, JavaScript Color Picker + * + * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html + * @author Jan Odvarko, http://odvarko.cz + * @link http://JSColor.com + */ +(function() { + var $, $$, Anonymize, ArchiveLink, BanChecker, Build, CatalogLinks, Conf, Config, CustomNavigation, DeleteLink, DownloadLink, EmbedLink, Emoji, ExpandComment, ExpandThread, FappeTyme, Favicon, FileInfo, Filter, Get, IDColor, Icons, ImageExpand, ImageHover, ImageReplace, JSColor, Keybinds, Linkify, Main, MarkOwn, Markdown, MascotTools, Mascots, Menu, MutationObserver, Nav, Navigation, Options, Prefetch, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, Quotify, Redirect, ReplyHideLink, ReplyHiding, ReportLink, RevealSpoilers, Sauce, StrikethroughQuotes, Style, ThemeTools, Themes, ThreadHideLink, ThreadHiding, ThreadStats, Time, TitlePost, UI, Unread, Updater, Watcher, d, editMascot, editTheme, g, userNavigation, _base, + __slice = [].slice; + + Config = { + main: { + Enhancing: { + 'Catalog Links': [true, 'Turn Navigation links into links to each board\'s catalog.'], + 'External Catalog': [false, 'Link to external catalog instead of the internal one.'], + '404 Redirect': [true, 'Redirect dead threads and images'], + 'Keybinds': [true, 'Binds actions to keys'], + 'Time Formatting': [true, 'Arbitrarily formatted timestamps, using your local time'], + 'File Info Formatting': [true, 'Reformats the file information'], + 'Comment Expansion': [true, 'Expand too long comments'], + 'Thread Expansion': [true, 'View all replies'], + 'Index Navigation': [true, 'Navigate to previous / next thread'], + 'Reply Navigation': [false, 'Navigate to top / bottom of thread'], + 'Custom Navigation': [false, 'Customize your Navigation bar.'], + 'Append Delimiters': [false, 'Adds delimiters before and after custom navigation.'], + 'Check for Updates': [true, 'Check for updated versions of Appchan X'], + 'Check for Bans': [false, 'Check ban status and prepend it to the top of the page.'], + 'Check for Bans constantly': [false, 'Optain ban status on every refresh. Note that this will cause delay on getting the result.'] + }, + Linkification: { + 'Linkify': [true, 'Convert text into links where applicable.'], + 'Embedding': [true, 'Embed supported services.'], + 'Link Title': [true, 'Replace the link of a supported site with its actual title. Currently Supported: YouTube, Vimeo, SoundCloud'] + }, + Filtering: { + 'Anonymize': [false, 'Make everybody anonymous'], + 'Filter': [true, 'Self-moderation placebo'], + 'Recursive Filtering': [true, 'Filter replies of filtered posts, recursively'], + 'Reply Hiding': [false, 'Hide single replies'], + 'Thread Hiding': [false, 'Hide entire threads'], + 'Show Stubs': [true, 'Of hidden threads / replies'] + }, + Imaging: { + 'Image Expansion': [true, 'Expand images'], + 'Image Hover': [false, 'Show full image on mouseover'], + 'Sauce': [true, 'Add sauce to images'], + 'Reveal Spoilers': [false, 'Replace spoiler thumbnails by the original thumbnail'], + 'Don\'t Expand Spoilers': [true, 'Don\'t expand spoilers when using ImageExpand.'], + 'Expand From Current': [false, 'Expand images from current position to thread end.'], + 'Fappe Tyme': [false, 'Toggle display of posts without images.'], + 'Prefetch': [false, 'Prefetch images.'], + 'Replace GIF': [false, 'Replace thumbnail of gifs with its actual image.'], + 'Replace PNG': [false, 'Replace pngs.'], + 'Replace JPG': [false, 'Replace jpgs.'] + }, + Menu: { + 'Menu': [true, 'Add a drop-down menu in posts.'], + 'Report Link': [true, 'Add a report link to the menu.'], + 'Delete Link': [true, 'Add post and image deletion links to the menu.'], + 'Download Link': [true, 'Add a download with original filename link to the menu. Chrome-only currently.'], + 'Archive Link': [true, 'Add an archive link to the menu.'], + 'Embed Link': [true, 'Add an embed link to the menu to embed all supported formats in a post.'], + 'Thread Hiding Link': [true, 'Add a link to hide entire threads.'], + 'Reply Hiding Link': [true, 'Add a link to hide single replies.'] + }, + Monitoring: { + 'Thread Updater': [true, 'Update threads. Has more options in its own dialog.'], + 'Optional Increase': [false, 'Increase value of Updater over time.'], + 'Interval per board': [false, 'Change the intervals of updates on a board-by-board basis.'], + 'Unread Count': [true, 'Show unread post count in tab title'], + 'Unread Favicon': [true, 'Show a different favicon when there are unread posts'], + 'Post in Title': [true, 'Show the op\'s post in the tab title'], + 'Thread Stats': [true, 'Display reply and image count'], + 'Thread Watcher': [true, 'Bookmark threads'], + 'Auto Watch': [true, 'Automatically watch threads that you start'], + 'Auto Watch Reply': [false, 'Automatically watch threads that you reply to'], + 'Color user IDs': [false, 'Assign unique colors to user IDs on boards that use them'], + 'Mark Owned Posts': [true, 'Mark quotes to posts you\'ve authored.'], + 'Remove Spoilers': [false, 'Remove all spoilers in text.'], + 'Indicate Spoilers': [false, 'Indicate spoilers if Remove Spoilers is enabled.'] + }, + Posting: { + 'Cooldown': [true, 'Prevent "flood detected" errors.'], + 'Persistent QR': [true, 'The Quick reply won\'t disappear after posting.'], + 'Auto Hide QR': [false, 'Automatically hide the quick reply when posting.'], + 'Open Reply in New Tab': [false, 'Open replies in a new tab that are made from the main board.'], + 'Per Board Persona': [false, 'Remember Name, Email, Subject, etc per board instead of globally.'], + 'Remember QR size': [false, 'Remember the size of the Quick reply (Firefox only).'], + 'Remember Subject': [false, 'Remember the subject field, instead of resetting after posting.'], + 'Remember Spoiler': [false, 'Remember the spoiler state, instead of resetting after posting.'], + 'Remember Sage': [false, 'Remember email even if it contains sage.'], + 'Markdown': [false, 'Code, italic, bold, italic bold, double struck - `, *, **, ***, ||, respectively. _ can be used instead of *.'] + }, + Quoting: { + 'Quote Backlinks': [true, 'Add quote backlinks'], + 'OP Backlinks': [false, 'Add backlinks to the OP'], + 'Quote Highlighting': [true, 'Highlight the previewed post'], + 'Quote Inline': [true, 'Show quoted post inline on quote click'], + 'Quote Hash Navigation': [true, 'Show a "#" to jump around the thread as if Quote Inline were disabled.'], + 'Quote Preview': [true, 'Show quote content on hover'], + 'Resurrect Quotes': [true, 'Linkify dead quotes to archives'], + 'Indicate OP quote': [true, 'Add \'(OP)\' to OP quotes'], + 'Indicate Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes'], + 'Forward Hiding': [true, 'Hide original posts of inlined backlinks'] + } + }, + filter: { + name: "# Filter any namefags:\n#/^(?!Anonymous$)/", + uniqueid: "# Filter a specific ID:\n#/Txhvk1Tl/", + tripcode: "# Filter any tripfags\n#/^!/", + mod: "# 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", + country: '', + filename: '', + dimensions: "# Highlight potential wallpapers:\n#/1920x1080/;op:yes;highlight;top:no;boards:w,wg", + filesize: '', + md5: '' + }, + sauces: "http://iqdb.org/?url=$1\nhttp://www.google.com/searchbyimage?image_url=$1\n#http://tineye.com/search?url=$1\n#http://saucenao.com/search.php?db=999&url=$1\n#http://3d.iqdb.org/?url=$1\n#http://regex.info/exif.cgi?imgurl=$2\n# uploaders:\n#http://imgur.com/upload?url=$2;text:Upload to imgur\n#http://omploader.org/upload?url1=$2;text:Upload to omploader\n# \"View Same\" in archives:\n#http://archive.foolz.us/_/search/image/$3/;text:View same on foolz\n#http://archive.foolz.us/$4/search/image/$3/;text:View same on foolz /$4/\n#https://archive.installgentoo.net/$4/image/$3;text:View same on installgentoo /$4/", + time: '%m/%d/%y(%a)%H:%M', + backlink: '>>%id', + fileInfo: '%l (%p%s, %r)', + favicon: 'ferongr', + updateIncrease: '5,10,15,20,30,60,90,120,240,300', + updateIncreaseB: '5,10,15,20,30,60,90,120,240,300', + customCSS: "/* Tripcode Italics: */\n/*\nspan.postertrip {\n font-style: italic;\n}\n*/\n\n/* Add a rounded border to thumbnails (but not expanded images): */\n/*\n.fileThumb > img:first-child {\n border: solid 2px rgba(0,0,100,0.5);\n border-radius: 10px;\n}\n*/\n\n/* Make highlighted posts look inset on the page: */\n/*\ndiv.post:target,\ndiv.post.highlight {\n box-shadow: inset 2px 2px 2px rgba(0,0,0,0.2);\n}\n*/", + hotkeys: { + openQR: ['I', 'Open QR with post number inserted'], + openEmptyQR: ['i', 'Open QR without post number inserted'], + openOptions: ['ctrl+o', 'Open Options'], + close: ['Esc', 'Close Options or QR'], + spoiler: ['ctrl+s', 'Quick spoiler tags'], + math: ['ctrl+m', 'Quick math tags'], + eqn: ['ctrl+e', 'Quick eqn tags'], + code: ['alt+c', 'Quick code tags'], + sageru: ['alt+n', 'Sage keybind'], + submit: ['alt+s', 'Submit post'], + hideQR: ['h', 'Toggle hide status of QR'], + toggleCatalog: ['alt+t', 'Toggle links in nav bar'], + watch: ['w', 'Watch thread'], + update: ['u', 'Update now'], + unreadCountTo0: ['z', 'Mark thread as read'], + expandImage: ['m', 'Expand selected image'], + expandAllImages: ['M', 'Expand all images'], + zero: ['0', 'Jump to page 0'], + nextPage: ['L', 'Jump to the next page'], + previousPage: ['H', 'Jump to the previous page'], + nextThread: ['n', 'See next thread'], + previousThread: ['p', 'See previous thread'], + expandThread: ['e', 'Expand thread'], + openThreadTab: ['o', 'Open thread in new tab'], + openThread: ['O', 'Open thread in current tab'], + nextReply: ['J', 'Select next reply'], + previousReply: ['K', 'Select previous reply'], + hide: ['x', 'Hide thread'] + }, + updater: { + checkbox: { + 'Beep': [false, 'Beep on new post to completely read thread'], + 'Scrolling': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'], + 'Scroll BG': [false, 'Scroll background tabs'], + 'Verbose': [true, 'Show countdown timer, new post count'], + 'Auto Update': [true, 'Automatically fetch new posts'] + }, + Interval: 30, + BGInterval: 60 + }, + embedWidth: 640, + embedHeight: 390, + style: { + Interface: { + 'Single Column Mode': [true, 'Presents options in a single column, rather than in blocks.'], + 'Sidebar': ['normal', 'Alter the sidebar size. Completely hiding it can cause content to overlap, but with the correct option combinations can create a minimal 4chan layout that has more efficient screen real-estate than vanilla 4chan.', ['large', 'normal', 'minimal', 'hide']], + 'Sidebar Location': ['right', 'The side of the page the sidebar content is on. It is highly recommended that you do not hide the sidebar if you change this option.', ['left', 'right']], + 'Top Thread Padding': ['0', 'Add some spacing between the top edge of document and the threads.', 'text'], + 'Bottom Thread Padding': ['0', 'Add some spacing between the bottom edge of document and the threads.', 'text'], + 'Left Thread Padding': ['0', 'Add some spacing between the left edge of document and the threads.', 'text'], + 'Right Thread Padding': ['0', 'Add some spacing between the right edge of document and the threads.', 'text'], + 'Announcements': ['slideout', 'The style of announcements and the ability to hide them.', ['4chan default', 'slideout', 'hide']], + 'Board Title': ['at sidebar top', 'The positioning of the board\'s logo and subtitle.', ['at sidebar top', 'at sidebar bottom', 'at top', 'under post form', 'hide']], + 'Custom Board Titles': [false, 'Customize Board Titles by shift-clicking the board title or subtitle.'], + 'Board Subtitle': [true, 'Show the board subtitle.'], + '4chan Banner': ['at sidebar top', 'The positioning of 4chan\'s image banner.', ['at sidebar top', 'at sidebar bottom', 'under post form', 'at top', 'hide']], + '4chan Banner Reflection': [false, 'Adds reflection effects to 4chan\'s image banner.'], + 'Faded 4chan Banner': [true, 'Make 4chan\'s image banner translucent.'], + 'Icon Orientation': ['horizontal', 'Change the orientation of the appchan x icons.', ['horizontal', 'vertical']], + 'Slideout Watcher': [true, 'Adds an icon you can hover over to show the watcher, as opposed to having the watcher always visible.'], + 'Updater Position': ['top', 'The position of 4chan thread updater and stats', ['top', 'bottom', 'moveable']] + }, + Posts: { + 'Alternate Post Colors': [false, 'Make post background colors alternate every other post.'], + 'Color Reply Headings': [false, 'Give the post info a background.'], + 'Color File Info': [false, 'Give the file info a background.'], + 'OP Background': [false, 'Adds a border and background color to the OP Post, as if it were a reply.'], + 'Backlinks Position': ['default', 'The position of backlinks in relation to the post.', ['default', 'lower left', 'lower right']], + 'Sage Highlighting': ['image', 'Icons or text to highlight saged posts.', ['text', 'image', 'none']], + 'Sage Highlight Position': ['after', 'Position of Sage Highlighting', ['before', 'after']], + 'Filtered Backlinks': [true, 'Mark backlinks to filtered posts.'], + 'Force Reply Break': [false, 'Force replies to occupy their own line and not be adjacent to the OP image.'], + 'Fit Width Replies': [true, 'Replies fit the entire width of the page.'], + 'Hide Delete UI': [false, 'Hides vanilla report and delete functionality and UI. This does not affect Appchan\'s Menu functionality.'], + 'Post Spacing': ['2', 'The amount of space between replies.', 'text'], + 'Vertical Post Padding': ['5', 'The vertical padding around post content of replies.', 'text'], + 'Horizontal Post Padding': ['20', 'The horizontal padding around post content of replies.', 'text'], + 'Hide Horizontal Rules': [false, 'Hides lines between threads.'], + 'Images Overlap Post Form': [true, 'Images expand over the post form and sidebar content, usually used with "Expand images" set to "full".'] + }, + Aesthetics: { + '4chan SS Navigation': [false, 'Try to emulate the appearance of 4chan SS\'s Navigation.'], + '4chan SS Sidebar': [false, 'Try to emulate the appearance of 4chan SS\'s Sidebar.'], + 'Block Ads': [false, 'Block advertisements. It\'s probably better to use AdBlock for this.'], + 'Shrink Ads': [false, 'Make 4chan advertisements smaller.'], + 'Bolds': [true, 'Bold text for names and such.'], + 'Italics': [false, 'Give tripcodes italics.'], + 'Sidebar Glow': [false, 'Adds a glow to the sidebar\'s text.'], + 'Circle Checkboxes': [false, 'Make checkboxes circular.'], + 'Custom CSS': [false, 'Add (more) custom CSS to Appchan X'], + 'Emoji': ['enabled', 'Enable emoji', ['enabled', 'disable ponies', 'only ponies', 'disable']], + 'Emoji Position': ['before', 'Position of emoji icons, like sega and neko.', ['before', 'after']], + 'Emoji Spacing': ['5', 'Add some spacing between emoji and text.', 'text'], + 'Font': ['sans-serif', 'The font used by all elements of 4chan.', 'text'], + 'Font Size': ['12', 'The font size of posts and various UI. This changes most, but not all, font sizes.', 'text'], + 'Icons': ['oneechan', 'Icon theme which Appchan will use.', ['oneechan', '4chan SS']], + 'Invisible Icons': [false, 'Makes icons invisible unless hovered. Invisible really is "invisible", so don\'t use it if you don\'t have your icons memorized or don\'t use keybinds.'], + 'Quote Shadows': [true, 'Add shadows to the quote previews and inline quotes.'], + 'Rounded Edges': [false, 'Round the edges of various 4chan elements.'], + 'Underline Links': [false, 'Put lines under hyperlinks.'], + 'NSFW/SFW Themes': [false, 'Choose your theme based on the SFW status of the board you are viewing.'] + }, + Mascots: { + 'Mascots': [true, 'Add a pretty picture of your waifu to Appchan.'], + 'Mascot Location': ['sidebar', 'Change where your mascot is located.', ['sidebar', 'opposite']], + 'Mascot Position': ['default', 'Change where your mascot is placed in relation to the post form.', ['above post form', 'default', 'bottom']], + 'Mascots Overlap Posts': [true, 'Mascots overlap threads and posts.'], + 'NSFW/SFW Mascots': [false, 'Enable or disable mascots based on the SFW status of the board you are viewing.'], + 'Grayscale Mascots': [false, 'Force mascots to be monochrome.'], + 'Mascot Opacity': ['1.00', 'Make Mascots transparent.', 'text'], + 'Hide Mascots on Catalog': [false, 'Do not show mascots on the official catalog pages.'] + }, + Navigation: { + 'Boards Navigation': ['sticky top', 'The position of 4chan board navigation', ['sticky top', 'sticky bottom', 'top', 'hide']], + 'Navigation Alignment': ['center', 'Change the text alignment of the navigation.', ['left', 'center', 'right']], + 'Slideout Navigation': ['compact', 'How the slideout navigation will be displayed.', ['compact', 'list', 'hide']], + 'Pagination': ['sticky bottom', 'The position of 4chan page navigation', ['sticky top', 'sticky bottom', 'top', 'bottom', 'on side', 'hide']], + 'Pagination Alignment': ['center', 'Change the text alignment of the pagination.', ['left', 'center', 'right']], + 'Hide Navigation Decorations': [false, 'Hide non-link text in the board navigation and pagination. This also disables the delimiter in Custom Navigation'] + }, + 'Post Form': { + 'Compact Post Form Inputs': [true, 'Use compact inputs on the post form.'], + 'Hide Show Post Form': [false, 'Hides the "Show Post Form" button when Persistent QR is disabled.'], + 'Show Post Form Header': [false, 'Force the Post Form to have a header.'], + 'Post Form Style': ['tabbed slideout', 'How the post form will sit on the page.', ['fixed', 'slideout', 'tabbed slideout', 'transparent fade', 'float']], + 'Post Form Slideout Transitions': [true, 'Animate slideouts for the post form.'], + 'Post Form Decorations': [false, 'Add a border and background to the post form (does not apply to the "float" post form style.'], + 'Textarea Resize': ['vertical', 'Options to resize the post form\'s comment box.', ['both', 'horizontal', 'vertical', 'none']], + 'Tripcode Hider': [true, 'Intelligent name field hiding.'] + } + }, + theme: 'Yotsuba B', + mascot: '' + }; + + if (!/^[a-z]+\.4chan\.org$/.test(location.hostname)) { + return; + } + + Conf = {}; + + editTheme = {}; + + editMascot = {}; + + userNavigation = {}; + + d = document; + + g = {}; + + g.TYPE = 'sfw'; + + MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.OMutationObserver; + + /* + loosely follows the jquery api: + http://api.jquery.com/ + not chainable + */ + + + $ = function(selector, root) { + var result; + + root || (root = d.body); + if (result = root.querySelector(selector)) { + return result; + } + }; + + $.extend = function(object, properties) { + var key, val; + + for (key in properties) { + val = properties[key]; + object[key] = val; + } + }; + + $.extend(Array.prototype, { + add: function(object, position) { + var keep; + + keep = this.slice(position); + this.length = position; + this.push(object); + return this.pushArrays(keep); + }, + contains: function(object) { + return this.indexOf(object) > -1; + }, + indexOf: function(object) { + var i; + + i = this.length; + while (i--) { + if (this[i] === object) { + break; + } + } + return i; + }, + 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; + }, + remove: function(object) { + var index; + + if ((index = this.indexOf(object)) > -1) { + return this.splice(index, 1); + } else { + return false; + } + } + }); + + $.extend(String.prototype, { + capitalize: function() { + return this.charAt(0).toUpperCase() + this.slice(1); + }, + contains: function(string) { + return this.indexOf(string) > -1; + } + }); + + $.DAY = 24 * ($.HOUR = 60 * ($.MINUTE = 60 * ($.SECOND = 1000))); + + $.extend($, { + NBSP: '\u00A0', + minmax: function(value, min, max) { + return (value < min ? min : value > max ? max : value); + }, + log: typeof (_base = console.log).bind === "function" ? _base.bind(console) : void 0, + engine: /WebKit|Presto|Gecko/.exec(navigator.userAgent)[0].toLowerCase(), + ready: function(fc) { + var cb; + + if (['interactive', 'complete'].contains(d.readyState)) { + return setTimeout(fc); + } + if (!$.callbacks) { + $.callbacks = []; + cb = function() { + var callback, _i, _len, _ref; + + _ref = $.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + callback(); + } + return $.off(d, 'DOMContentLoaded', cb); + }; + $.on(d, 'DOMContentLoaded', cb); + } + $.callbacks.push(fc); + return $.on(d, 'DOMContentLoaded', cb); + }, + sync: function(key, cb) { + var parse; + + key = Main.namespace + key; + parse = JSON.parse; + return $.on(window, 'storage', function(e) { + if (e.key === key) { + return cb(parse(e.newValue)); + } + }); + }, + id: function(id) { + return d.getElementById(id); + }, + formData: function(arg) { + var fd, key, val; + + if (arg instanceof HTMLFormElement) { + fd = new FormData(arg); + } else { + fd = new FormData(); + for (key in arg) { + val = arg[key]; + if (val) { + fd.append(key, val); + } + } + } + return fd; + }, + ajax: function(url, callbacks, opts) { + var form, headers, key, r, type, upCallbacks, val; + + if (!opts) { + opts = {}; + } + type = opts.type, headers = opts.headers, upCallbacks = opts.upCallbacks, form = opts.form; + r = new XMLHttpRequest(); + r.overrideMimeType('text/html'); + type || (type = form && 'post' || 'get'); + r.open(type, url, true); + for (key in headers) { + val = headers[key]; + r.setRequestHeader(key, val); + } + $.extend(r, callbacks); + $.extend(r.upload, upCallbacks); + if (type === 'post') { + r.withCredentials = true; + } + r.send(form); + return r; + }, + cache: function(url, cb) { + var req; + + if (req = $.cache.requests[url]) { + if (req.readyState === 4) { + return cb.call(req); + } else { + return req.callbacks.push(cb); + } + } else { + req = $.ajax(url, { + onload: function() { + var _i, _len, _ref; + + _ref = this.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + cb = _ref[_i]; + cb.call(this); + } + }, + onabort: function() { + return delete $.cache.requests[url]; + }, + onerror: function() { + return delete $.cache.requests[url]; + } + }); + req.callbacks = [cb]; + return $.cache.requests[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; + } + }, + addStyle: function(css, identifier) { + var style; + + style = $.el('style', { + innerHTML: css, + id: identifier + }); + $.add(d.head, style); + return style; + }, + x: function(path, root) { + root || (root = d.body); + return d.evaluate(path, root, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue; + }, + X: function(path, root) { + root || (root = d.body); + return d.evaluate(path, root, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 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); + }, + rm: function(el) { + return el.parentNode.removeChild(el); + }, + tn: function(string) { + return d.createTextNode(string); + }, + 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]; + $.add(frag, node); + } + return frag; + }, + frag: function() { + return d.createDocumentFragment(); + }, + add: function(parent, children) { + return parent.appendChild($.nodes(children)); + }, + prepend: function(parent, children) { + return parent.insertBefore($.nodes(children), 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(el, e) { + return el.dispatchEvent(e); + }, + globalEval: function(code) { + var script; + + script = $.el('script', { + textContent: "(" + code + ")()" + }); + $.add(d.head, script); + return $.rm(script); + }, + shortenFilename: function(filename, isOP) { + var threshold; + + threshold = 30 + 10 * isOP; + if (filename.replace(/\.\w+$/, '').length > threshold) { + return "" + filename.slice(0, threshold - 5) + "(...)" + (filename.match(/\.\w+$/)); + } else { + return filename; + } + }, + 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]; + }, + hidden: function() { + return d.hidden || d.mozHidden || d.webkitHidden || d.oHidden; + } + }); + + $.cache.requests = {}; + + $.extend($, typeof GM_deleteValue !== "undefined" && GM_deleteValue !== null ? { + "delete": function(name) { + name = Main.namespace + name; + return GM_deleteValue(name); + }, + get: function(name, defaultValue) { + var value; + + name = Main.namespace + name; + if ((value = GM_getValue(name)) && value !== 'undefined') { + return JSON.parse(value); + } else { + return defaultValue; + } + }, + set: function(name, value) { + name = Main.namespace + name; + localStorage.setItem(name, JSON.stringify(value)); + return GM_setValue(name, JSON.stringify(value)); + }, + open: function(url) { + return GM_openInTab(location.protocol + url, true); + } + } : { + "delete": function(name) { + return localStorage.removeItem(Main.namespace + name); + }, + get: function(name, defaultValue) { + var value; + + if (value = localStorage.getItem(Main.namespace + name)) { + return JSON.parse(value); + } else { + return defaultValue; + } + }, + set: function(name, value) { + return localStorage.setItem(Main.namespace + name, JSON.stringify(value)); + }, + open: function(url) { + return window.open(location.protocol + url, '_blank'); + } + }); + + $$ = function(selector, root) { + var result; + + root || (root = d.body); + if (result = __slice.call(root.querySelectorAll(selector))) { + return result; + } + return null; + }; + + UI = { + dialog: function(id, position, html) { + var el, move; + + el = $.el('div', { + className: 'reply dialog', + innerHTML: html, + id: id + }); + el.style.cssText = $.get(id + ".position", position); + if (move = $('.move', el)) { + move.addEventListener('mousedown', UI.dragstart, false); + } + return el; + }, + dragstart: function(e) { + var el, rect; + + e.preventDefault(); + UI.el = el = this.parentNode; + d.addEventListener('mousemove', UI.drag, false); + d.addEventListener('mouseup', UI.dragend, false); + rect = el.getBoundingClientRect(); + UI.dx = e.clientX - rect.left; + UI.dy = e.clientY - rect.top; + UI.width = d.documentElement.clientWidth - rect.width; + return UI.height = d.documentElement.clientHeight - rect.height; + }, + drag: function(e) { + var left, style, top; + + left = e.clientX - UI.dx; + top = e.clientY - UI.dy; + left = left < 10 ? '0px' : UI.width - left < 10 ? null : left + 'px'; + top = top < 10 ? '0px' : UI.height - top < 10 ? null : top + 'px'; + style = UI.el.style; + style.left = left; + style.top = top; + style.right = left === null ? '0px' : null; + return style.bottom = top === null ? '0px' : null; + }, + dragend: function() { + $.set(UI.el.id + ".position", UI.el.style.cssText); + d.removeEventListener('mousemove', UI.drag, false); + d.removeEventListener('mouseup', UI.dragend, false); + return delete UI.el; + }, + hover: function(e, mode) { + var clientHeight, clientWidth, clientX, clientY, height, style, top, _ref; + + clientX = e.clientX, clientY = e.clientY; + style = UI.el.style; + _ref = d.documentElement, clientHeight = _ref.clientHeight, clientWidth = _ref.clientWidth; + height = UI.el.offsetHeight; + if ((mode || 'default') === 'default') { + top = clientY - 120; + style.top = "" + (clientHeight <= height || top <= 0 ? 0 : top + height >= clientHeight ? clientHeight - height : top) + "px"; + if (clientX <= clientWidth - 400) { + style.left = clientX + 45 + 'px'; + return style.right = null; + } else { + style.left = null; + style.right = clientWidth - clientX + 20 + 'px'; + return top = clientY - 120; + } + } else { + if (clientX <= clientWidth - 400) { + style.left = clientX + 20 + 'px'; + style.right = null; + top = clientY; + } else { + style.left = null; + style.right = clientWidth - clientX + 20 + 'px'; + top = clientY - 120; + } + return style.top = "" + (clientHeight <= height || top <= 0 ? 0 : top + height >= clientHeight ? clientHeight - height : top) + "px"; + } + }, + hoverend: function() { + $.rm(UI.el); + return delete UI.el; + } + }; + + Options = { + init: function() { + var a; + + if (!$.get('firstrun')) { + $.set('firstrun', true); + if (!Favicon.el) { + Favicon.init(); + } + Options.dialog(); + } + a = $.el('a', { + id: 'appchanOptions', + title: 'Appchan X Settings', + href: 'javascript:;' + }); + $.on(a, 'click', function() { + return Options.dialog(); + }); + return $.replace($.id('settingsWindowLink'), a); + }, + dialog: function(tab) { + var archiver, arr, back, category, checked, customCSS, description, dialog, div, favicon, fileInfo, filter, height, hiddenNum, hiddenThreads, input, key, label, li, liHTML, name, obj, optionname, optionvalue, overlay, sauce, selectoption, styleSetting, time, toSelect, tr, ul, updateIncrease, updateIncreaseB, value, width, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3, _ref4; + + if (Conf['editMode'] === "theme") { + if (confirm("Opening the options dialog will close and discard any theme changes made with the theme editor.")) { + ThemeTools.close(); + } + return; + } + if (Conf['editMode'] === "mascot") { + if (confirm("Opening the options dialog will close and discard any mascot changes made with the mascot editor.")) { + MascotTools.close(); + } + return; + } + d.body.style.overflow = 'hidden'; + dialog = Options.el = $.el('div', { + id: 'options', + className: 'reply dialog', + innerHTML: '
\ +
\ + \ + | AppChan X\ + | ' + Main.version + '\ + | Issues\ +
\ +
\ + \ +
\ +
\ +
\ + \ +
\ + \ +
\ +
Sauce is disabled.
\ + Lines starting with a # will be ignored.
\ + You can specify a certain display text by appending ;text:[text] to the url.\ +
    These parameters will be replaced by their corresponding values:\ +
  • $1: Thumbnail url.
  • \ +
  • $2: Full image url.
  • \ +
  • $3: MD5 hash.
  • \ +
  • $4: Current board.
  • \ +
\ + \ +
\ + \ +
\ +
Filter is disabled.
\ + \ +
\ + \ +
\ +
    \ + Archiver\ +
  • \ + Select an Archiver for this board:\ + \ +
  • \ +
\ +
Quote Backlinks are disabled.
\ +
    \ + Backlink formatting\ +
  • :
  • \ +
\ +
Time Formatting is disabled.
\ +
    \ + Time formatting\ +
  • :
  • \ +
  • Supported format specifiers:
  • \ +
  • Day: %a, %A, %d, %e
  • \ +
  • Month: %m, %b, %B
  • \ +
  • Year: %y, %Y
  • \ +
  • Hour: %k, %H, %l (lowercase L), %I (uppercase i), %p, %P
  • \ +
  • Minutes: %M
  • \ +
  • Seconds: %S
  • \ +
\ +
File Info Formatting is disabled.
\ +
    \ + File Info Formatting\ +
  • :
  • \ +
  • Link: %l (lowercase 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 on /po/, for PDFs)
  • \ +
\ +
    \ + Specify size of video embeds
    \ + Height: px\ + |\ + Width: px\ + \ +
\ +
    \ +
  • Amounts for Optional Increase
  • \ +
  • Visible tab
  • \ +
  • \ +
  • Background tab
  • \ +
  • \ +
\ +
Custom Navigation is disabled.
\ +
\ +
\ +
Per Board Persona is disabled.
\ +
\ + \ +
    \ +
  • \ +
    \ + Name:\ +
    \ +
  • \ +
  • \ +
    \ + \ +
    \ +
  • \ +
  • \ +
    \ + Email:\ +
    \ +
  • \ +
  • \ +
    \ + \ +
    \ +
  • \ +
  • \ +
    \ + Subject:\ +
    \ +
  • \ +
  • \ +
    \ + \ +
    \ +
  • \ +
  • \ + \ +
  • \ +
\ +
\ +
Custom CSS is disabled.
\ + Remove Comment blocks to use! ( "/*" and "*/" around CSS blocks )\ + \ +
    \ +
    Unread Favicon is disabled.
    \ + Unread favicons
    \ + \ + \ +
\ + \ +
\ + \ +
\ +
Keybinds are disabled.
\ +
Allowed keys: Ctrl, Alt, Meta, a-z, A-Z, 0-9, Up, Down, Right, Left.
\ + \ + \ +
ActionsKeybinds
\ +
\ + \ +
\ + \ +
\ + \ +
\ + \ +
Reloading page with new settings.
\ +
' + }); + _ref = $$('label[for]', dialog); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + label = _ref[_i]; + $.on(label, 'click', function() { + var previous; + + if (previous = $.id('selected_tab')) { + previous.id = ''; + } + return this.id = 'selected_tab'; + }); + } + _ref1 = Config.main; + for (key in _ref1) { + obj = _ref1[key]; + ul = $.el('ul', { + innerHTML: "

" + key + "

" + }); + for (key in obj) { + arr = obj[key]; + checked = $.get(key, Conf[key]) ? 'checked' : ''; + description = arr[1]; + li = $.el('li', { + innerHTML: "" + }); + $.on($('input', li), 'click', $.cb.checked); + $.on($(".optionlabel", li), 'mouseover', Options.mouseover); + $.add(ul, li); + } + $.add($('#main_tab + div', dialog), ul); + } + hiddenThreads = $.get("hiddenThreads/" + g.BOARD + "/", {}); + hiddenNum = Object.keys(g.hiddenReplies).length + Object.keys(hiddenThreads).length; + li = $.el('li', { + innerHTML: "
Forget all hidden posts. Useful if you accidentally hide a post and have \"Show Stubs\" disabled.
" + }); + $.on($('button', li), 'click', Options.clearHidden); + $.on($('.optionlabel', li), 'mouseover', Options.mouseover); + $.add($('ul:nth-child(3)', dialog), li); + filter = $('select[name=filter]', dialog); + $.on(filter, 'change', Options.filter); + archiver = $('select[name=archiver]', dialog); + toSelect = Redirect.select(g.BOARD); + if (!toSelect[0]) { + toSelect = ['No Archive Available']; + } + for (_j = 0, _len1 = toSelect.length; _j < _len1; _j++) { + name = toSelect[_j]; + $.add(archiver, $.el('option', { + textContent: name + })); + } + if (toSelect[1]) { + archiver.value = $.get(value = "archiver/" + g.BOARD + "/", toSelect[0]); + $.on(archiver, 'change', function() { + return $.set(value, this.value); + }); + } + sauce = $('#sauces', dialog); + sauce.value = $.get(sauce.name, Conf[sauce.name]); + $.on(sauce, 'change', $.cb.value); + (back = $('[name=backlink]', dialog)).value = $.get('backlink', Conf['backlink']); + (time = $('[name=time]', dialog)).value = $.get('time', Conf['time']); + (fileInfo = $('[name=fileInfo]', dialog)).value = $.get('fileInfo', Conf['fileInfo']); + $.on(back, 'input', $.cb.value); + $.on(back, 'input', Options.backlink); + $.on(time, 'input', $.cb.value); + $.on(time, 'input', Options.time); + $.on(fileInfo, 'input', $.cb.value); + $.on(fileInfo, 'input', Options.fileInfo); + this.persona.select = $('[name=personaboards]', dialog); + this.persona.button = $('#persona button', dialog); + this.persona.data = $.get('persona', { + global: {} + }); + if (!this.persona.data[g.BOARD]) { + this.persona.data[g.BOARD] = JSON.parse(JSON.stringify(this.persona.data.global)); + } + for (name in this.persona.data) { + this.persona.select.innerHTML += ""; + } + this.persona.select.value = Conf['Per Board Persona'] ? g.BOARD : 'global'; + this.persona.init(); + $.on(this.persona.select, 'change', Options.persona.change); + customCSS = $('#customCSS', dialog); + customCSS.value = $.get(customCSS.name, Conf[customCSS.name]); + $.on(customCSS, 'change', function() { + $.cb.value.call(this); + return Style.addStyle(); + }); + (width = $('[name=embedWidth]', dialog)).value = $.get('embedWidth', Conf['embedWidth']); + (height = $('[name=embedHeight]', dialog)).value = $.get('embedHeight', Conf['embedHeight']); + $.on(width, 'input', $.cb.value); + $.on(height, 'input', $.cb.value); + $.on($('[name=resetSize]', dialog), 'click', function() { + $.set('embedWidth', width.value = Config.embedWidth); + return $.set('embedHeight', height.value = Config.embedHeight); + }); + favicon = $('select[name=favicon]', dialog); + favicon.value = $.get('favicon', Conf['favicon']); + $.on(favicon, 'change', $.cb.value); + $.on(favicon, 'change', Options.favicon); + (updateIncrease = $('[name=updateIncrease]', dialog)).value = $.get('updateIncrease', Conf['updateIncrease']); + (updateIncreaseB = $('[name=updateIncreaseB]', dialog)).value = $.get('updateIncreaseB', Conf['updateIncreaseB']); + $.on(updateIncrease, 'input', $.cb.value); + $.on(updateIncreaseB, 'input', $.cb.value); + this.customNavigation.dialog(dialog); + _ref2 = Config.hotkeys; + for (key in _ref2) { + arr = _ref2[key]; + tr = $.el('tr', { + innerHTML: "" + arr[1] + "" + }); + input = $('input', tr); + input.value = $.get(key, Conf[key]); + $.on(input, 'keydown', Options.keybind); + $.add($('#keybinds_tab + div tbody', dialog), tr); + } + div = $.el('div', { + className: "suboptions" + }); + _ref3 = Config.style; + for (category in _ref3) { + obj = _ref3[category]; + ul = $.el('ul', { + innerHTML: "

" + category + "

" + }); + for (optionname in obj) { + arr = obj[optionname]; + description = arr[1]; + if (arr[2] === 'text') { + li = $.el('li', { + className: "styleoption", + innerHTML: "
" + optionname + "
" + description + "
" + }); + styleSetting = $("input[name='" + optionname + "']", li); + styleSetting.value = $.get(optionname, Conf[optionname]); + $.on(styleSetting, 'blur', function() { + $.cb.value.call(this); + return Style.addStyle(); + }); + } else if (arr[2]) { + liHTML = "
" + optionname + "
" + description + "
"; + li = $.el('li', { + innerHTML: liHTML, + className: "styleoption" + }); + styleSetting = $("select[name='" + optionname + "']", li); + styleSetting.value = $.get(optionname, Conf[optionname]); + $.on(styleSetting, 'change', function() { + $.cb.value.call(this); + return Style.addStyle(); + }); + } else { + checked = $.get(optionname, Conf[optionname]) ? 'checked' : ''; + li = $.el('li', { + className: "styleoption", + innerHTML: "" + }); + $.on($('input', li), 'click', function() { + $.cb.checked.call(this); + return Style.addStyle(); + }); + } + $.on($(".optionlabel", li), 'mouseover', Options.mouseover); + $.add(ul, li); + } + $.add(div, ul); + } + $.add($('#style_tab + div', dialog), div); + this.themeTab(dialog); + $.on($('#mascot_tab', Options.el), 'click', function() { + var el; + + if (el = $.id("mascotContainer")) { + $.rm(el); + } + return Options.mascotTab.dialog(Options.el); + }); + Options.indicators(dialog); + overlay = $.el('div', { + id: 'overlay' + }); + $.on(dialog, 'click', function(e) { + return e.stopPropagation(); + }); + $.on(overlay, 'click', Options.close); + $.add(overlay, dialog); + $.add(d.body, overlay); + if (tab) { + $("[for='" + tab + "_tab']", dialog).click(); + } + Options.filter.call(filter); + Options.backlink.call(back); + Options.time.call(time); + Options.fileInfo.call(fileInfo); + Options.favicon.call(favicon); + return Style.rice(dialog); + }, + indicators: function(dialog) { + var indicator, indicators, key, _i, _j, _len, _len1, _ref, _ref1; + + indicators = {}; + _ref = $$('.warning', dialog); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + indicator = _ref[_i]; + key = indicator.firstChild.textContent; + indicator.hidden = $.get(key, Conf[key]); + indicators[key] = indicator; + $.on($("[name='" + key + "']", dialog), 'click', function() { + return indicators[this.name].hidden = this.checked; + }); + } + _ref1 = $$('.disabledwarning', dialog); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + indicator = _ref1[_j]; + key = indicator.firstChild.textContent; + indicator.hidden = !$.get(key, Conf[key]); + indicators[key] = indicator; + $.on($("[name='" + key + "']", dialog), 'click', function() { + return Options.indicators(dialog); + }); + } + }, + themeTab: function(dialog, mode) { + var div, keys, name, parentdiv, suboptions, theme, _i, _j, _len, _len1; + + if (dialog == null) { + dialog = Options.el; + } + if (!mode) { + mode = 'default'; + } + parentdiv = $.el('div', { + id: "themeContainer" + }); + suboptions = $.el('div', { + className: "suboptions", + id: "themes" + }); + keys = Object.keys(Themes); + keys.sort(); + if (mode === "default") { + for (_i = 0, _len = keys.length; _i < _len; _i++) { + name = keys[_i]; + theme = Themes[name]; + if (!theme["Deleted"]) { + div = $.el('div', { + className: "theme " + (name === Conf['theme'] ? 'selectedtheme' : ''), + id: name, + innerHTML: "
" + name + " " + theme['Author'] + " (SAGE) " + theme['Author Tripcode'] + " No.27583594 >>edit >>export >>delete
>>27582902
Post content is right here.

Selected

" + }); + div.style.backgroundColor = theme['Background Color']; + $.on($('a.edit', div), 'click', function(e) { + e.preventDefault(); + e.stopPropagation(); + ThemeTools.init(this.name); + return Options.close(); + }); + $.on($('a.export', div), 'click', function(e) { + var exportTheme, exportedTheme; + + e.preventDefault(); + e.stopPropagation(); + exportTheme = Themes[this.name]; + exportTheme['Theme'] = this.name; + exportedTheme = "data:application/json," + encodeURIComponent(JSON.stringify(exportTheme)); + if (window.open(exportedTheme, "_blank")) { + + } else if (confirm("Your popup blocker is preventing Appchan X from exporting this theme. Would you like to open the exported theme in this window?")) { + return window.location(exportedTheme); + } + }); + $.on($('a.delete', div), 'click', function(e) { + var container, settheme, userThemes; + + e.preventDefault(); + e.stopPropagation(); + container = $.id(this.name); + if (!(container.previousSibling || container.nextSibling)) { + alert("Cannot delete theme (No other themes available)."); + return; + } + if (confirm("Are you sure you want to delete \"" + this.name + "\"?")) { + if (this.name === Conf['theme']) { + if (settheme = container.previousSibling || container.nextSibling) { + Conf['theme'] = settheme.id; + $.addClass(settheme, 'selectedtheme'); + $.set('theme', Conf['theme']); + } + } + Themes[this.name]["Deleted"] = true; + userThemes = $.get("userThemes", {}); + userThemes[this.name] = Themes[this.name]; + $.set('userThemes', userThemes); + return $.rm(container); + } + }); + $.on(div, 'click', Options.selectTheme); + $.add(suboptions, div); + } + } + div = $.el('div', { + id: 'addthemes', + innerHTML: "New Theme / Import Theme / Import from 4chan SS / Import from Oneechan / Undelete Theme " + }); + $.on($("#newtheme", div), 'click', function() { + ThemeTools.init("untitled"); + return Options.close(); + }); + $.on($("#import", div), 'click', function() { + return this.nextSibling.click(); + }); + $.on($("#importbutton", div), 'change', function(evt) { + return ThemeTools.importtheme("appchan", evt); + }); + $.on($("#OCimport", div), 'click', function() { + return this.nextSibling.click(); + }); + $.on($("#OCimportbutton", div), 'change', function(evt) { + return ThemeTools.importtheme("oneechan", evt); + }); + $.on($("#SSimportbutton", div), 'change', function(evt) { + return ThemeTools.importtheme("SS", evt); + }); + $.on($("#SSimport", div), 'click', function() { + return this.nextSibling.click(); + }); + $.on($('#tUndelete', div), 'click', function() { + $.rm($.id("themeContainer")); + return Options.themeTab(Options.el, 'undelete'); + }); + } else { + for (_j = 0, _len1 = keys.length; _j < _len1; _j++) { + name = keys[_j]; + theme = Themes[name]; + if (theme["Deleted"]) { + div = $.el('div', { + id: name, + className: theme, + innerHTML: "
" + name + " " + theme['Author'] + " (SAGE) " + theme['Author Tripcode'] + " No.27583594
>>27582902
I forgive you for using VLC to open me. ;__;
" + }); + $.on(div, 'click', function() { + var userThemes; + + if (confirm("Are you sure you want to undelete \"" + this.id + "\"?")) { + Themes[this.id]["Deleted"] = false; + userThemes = $.get("userThemes", {}); + userThemes[this.id] = Themes[this.id]; + $.set('userThemes', userThemes); + return $.rm(this); + } + }); + $.add(suboptions, div); + } + } + div = $.el('div', { + id: 'addthemes', + innerHTML: "Return" + }); + $.on($('a', div), 'click', function() { + $.rm($.id("themeContainer")); + return Options.themeTab(); + }); + } + $.add(parentdiv, suboptions); + $.add(parentdiv, div); + $.add($('#theme_tab + div', dialog), parentdiv); + return Options.indicators(dialog); + }, + mascotTab: { + dialog: function(dialog, mode) { + var batchmascots, categories, category, header, keys, li, mascot, mascotHide, name, option, parentdiv, suboptions, ul, _i, _j, _k, _len, _len1, _len2, _ref; + + dialog || (dialog = Options.el); + ul = {}; + categories = []; + if (!mode) { + mode = "default"; + } + parentdiv = $.el("div", { + id: "mascotContainer" + }); + suboptions = $.el("div", { + className: "suboptions", + innerHTML: "
Mascots are currently disabled. Please enable them in the Style tab to use mascot options.
" + }); + mascotHide = $.el("div", { + id: "mascot_hide", + className: "reply", + innerHTML: "Hide Categories
" + }); + keys = Object.keys(Mascots); + keys.sort(); + if (mode === 'default') { + _ref = MascotTools.categories; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + category = _ref[_i]; + ul[category] = $.el("ul", { + className: "mascots", + id: category + }); + if (Conf["Hidden Categories"].contains(category)) { + ul[category].hidden = true; + } + header = $.el("h3", { + className: "mascotHeader", + textContent: category + }); + categories.push(option = $.el("label", { + name: category, + innerHTML: "" + category + })); + $.on($('input', option), 'change', function() { + return Options.mascotTab.toggle.call(this); + }); + $.add(ul[category], header); + $.add(suboptions, ul[category]); + } + for (_j = 0, _len1 = keys.length; _j < _len1; _j++) { + name = keys[_j]; + if (!Conf["Deleted Mascots"].contains(name)) { + mascot = Mascots[name]; + li = $.el('li', { + className: 'mascot', + id: name, + innerHTML: "
" + (name.replace(/_/g, " ")) + "
" + }); + if (Conf[g.MASCOTSTRING].contains(name)) { + $.addClass(li, 'enabled'); + } + $.on($('a.edit', li), 'click', function(e) { + e.stopPropagation(); + MascotTools.dialog(this.name); + return Options.close(); + }); + $.on($('a.delete', li), 'click', function(e) { + var type, _k, _len2, _ref1; + + e.stopPropagation(); + if (confirm("Are you sure you want to delete \"" + this.name + "\"?")) { + if (Conf['mascot'] === this.name) { + MascotTools.init(); + } + _ref1 = ["Enabled Mascots", "Enabled Mascots sfw", "Enabled Mascots nsfw"]; + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + type = _ref1[_k]; + Conf[type].remove(this.name); + $.set(type, Conf[type]); + } + Conf["Deleted Mascots"].push(this.name); + $.set("Deleted Mascots", Conf["Deleted Mascots"]); + return $.rm($.id(this.name)); + } + }); + $.on($('a.export', li), 'click', function(e) { + var exportMascot, exportedMascot; + + e.stopPropagation(); + exportMascot = Mascots[this.name]; + exportMascot['Mascot'] = this.name; + exportedMascot = "data:application/json," + encodeURIComponent(JSON.stringify(exportMascot)); + if (window.open(exportedMascot, "_blank")) { + + } else if (confirm("Your popup blocker is preventing Appchan X from exporting this theme. Would you like to open the exported theme in this window?")) { + return window.location(exportedMascot); + } + }); + $.on(li, 'click', function() { + if (Conf[g.MASCOTSTRING].remove(this.id)) { + if (Conf['mascot'] === this.id) { + MascotTools.init(); + } + } else { + Conf[g.MASCOTSTRING].push(this.id); + MascotTools.init(this.id); + } + $.toggleClass(this, 'enabled'); + return $.set(g.MASCOTSTRING, Conf[g.MASCOTSTRING]); + }); + if (MascotTools.categories.contains(mascot.category)) { + $.add(ul[mascot.category], li); + } else { + $.add(ul[MascotTools.categories[0]], li); + } + } + } + $.add($('div', mascotHide), categories); + batchmascots = $.el('div', { + id: "mascots_batch", + innerHTML: "Clear All / Select All / Add Mascot / Import Mascot / Undelete Mascots / Get More Mascots!" + }); + $.on($('#clear', batchmascots), 'click', function() { + var enabledMascots, _k, _len2; + + enabledMascots = JSON.parse(JSON.stringify(Conf[g.MASCOTSTRING])); + for (_k = 0, _len2 = enabledMascots.length; _k < _len2; _k++) { + name = enabledMascots[_k]; + $.rmClass($.id(name), 'enabled'); + } + return $.set(g.MASCOTSTRING, Conf[g.MASCOTSTRING] = []); + }); + $.on($('#selectAll', batchmascots), 'click', function() { + for (name in Mascots) { + mascot = Mascots[name]; + if (!(Conf["Hidden Categories"].contains(mascot.category) || Conf[g.MASCOTSTRING].contains(name) || Conf["Deleted Mascots"].contains(name))) { + $.addClass($.id(name), 'enabled'); + Conf[g.MASCOTSTRING].push(name); + } + } + return $.set(g.MASCOTSTRING, Conf[g.MASCOTSTRING]); + }); + $.on($('#createNew', batchmascots), 'click', function() { + MascotTools.dialog(); + return Options.close(); + }); + $.on($("#importMascot", batchmascots), 'click', function() { + return this.nextSibling.click(); + }); + $.on($("#importMascotButton", batchmascots), 'change', function(evt) { + return MascotTools.importMascot(evt); + }); + $.on($('#undelete', batchmascots), 'click', function() { + if (!(Conf["Deleted Mascots"].length > 0)) { + alert("No mascots have been deleted."); + return; + } + $.rm($.id("mascotContainer")); + return Options.mascotTab.dialog(Options.el, 'undelete'); + }); + } else { + ul = $.el("ul", { + className: "mascots", + id: category + }); + for (_k = 0, _len2 = keys.length; _k < _len2; _k++) { + name = keys[_k]; + if (Conf["Deleted Mascots"].contains(name)) { + mascot = Mascots[name]; + li = $.el('li', { + className: 'mascot', + id: name, + innerHTML: "
" + (name.replace(/_/g, " ")) + "
" + }); + $.on(li, 'click', function() { + if (confirm("Are you sure you want to undelete \"" + this.id + "\"?")) { + Conf["Deleted Mascots"].remove(this.id); + $.set("Deleted Mascots", Conf["Deleted Mascots"]); + return $.rm(this); + } + }); + $.add(ul, li); + } + } + $.add(suboptions, ul); + batchmascots = $.el('div', { + id: "mascots_batch", + innerHTML: "Return" + }); + $.on($('#return', batchmascots), 'click', function() { + $.rm($.id("mascotContainer")); + return Options.mascotTab.dialog(); + }); + } + $.add(parentdiv, [suboptions, batchmascots, mascotHide]); + Style.rice(parentdiv); + $.add($('#mascot_tab + div', dialog), parentdiv); + return Options.indicators(dialog); + }, + toggle: function() { + var i, name, setting, type, _i, _len, _ref; + + if (this.checked) { + $.id(this.name).hidden = true; + Conf["Hidden Categories"].push(this.name); + _ref = ["Enabled Mascots", "Enabled Mascots sfw", "Enabled Mascots nsfw"]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + i = (setting = Conf[type]).length; + while (i--) { + name = setting[i]; + if (Mascot[name].category !== this.name) { + continue; + } + setting.remove(name); + if (type !== g.MASCOTSTRING) { + continue; + } + $.rmClass($.id(name), 'enabled'); + } + $.set(type, setting); + } + } else { + $.id(this.name).hidden = false; + Conf["Hidden Categories"].remove(this.name); + } + return $.set("Hidden Categories", Conf["Hidden Categories"]); + } + }, + customNavigation: { + dialog: function(dialog) { + var addLink, div, index, input, item, itemIndex, li, link, navOptions, removeLink, ul, _ref; + + div = $("#customNavigation", dialog); + ul = $.el("ul", { + textContent: "Custom Navigation" + }); + li = $.el("li", { + className: "delimiter", + textContent: "delimiter: " + }); + input = $.el("input", { + className: "field", + name: "delimiter" + }); + input.setAttribute("value", userNavigation.delimiter); + input.setAttribute("placeholder", "delimiter"); + input.setAttribute("type", "text"); + $.on(input, "change", function() { + if (this.value === "") { + alert("Custom Navigation options cannot be blank."); + return; + } + userNavigation.delimiter = this.value; + return $.set("userNavigation", userNavigation); + }); + $.add(li, input); + $.add(ul, li); + li = $.el("li", { + innerHTML: "Navigation Syntax:
Display Name | Title / Alternate Text | URL" + }); + $.add(ul, li); + navOptions = ["Display Name", "Title / Alt Text", "URL"]; + _ref = userNavigation.links; + for (index in _ref) { + link = _ref[index]; + if (typeof link !== 'object') { + continue; + } + li = $.el("li"); + input = $.el("input", { + className: "hidden", + value: index, + type: "hidden", + hidden: "hidden" + }); + $.add(li, input); + for (itemIndex in link) { + item = link[itemIndex]; + if (typeof item !== 'string') { + continue; + } + input = $.el("input", { + className: "field", + name: itemIndex, + value: item, + placeholder: navOptions[itemIndex], + type: "text" + }); + $.on(input, "change", function() { + if (this.value === "") { + alert("Custom Navigation options cannot be blank."); + return; + } + userNavigation.links[this.parentElement.firstChild.value][this.name] = this.value; + return $.set("userNavigation", userNavigation); + }); + $.add(li, [input, $.tn(' ')]); + } + addLink = $.el("a", { + textContent: " + ", + href: "javascript:;" + }); + $.on(addLink, "click", function() { + var blankLink; + + blankLink = ["ex", "example", "http://www.example.com/"]; + userNavigation.links.add(blankLink, this.parentElement.firstChild.value); + return Options.customNavigation.cleanup(); + }); + removeLink = $.el("a", { + textContent: " x ", + href: "javascript:;" + }); + $.on(removeLink, "click", function() { + userNavigation.links.remove(userNavigation.links[this.parentElement.firstChild.value]); + return Options.customNavigation.cleanup(); + }); + $.add(li, addLink); + $.add(li, removeLink); + $.add(ul, li); + } + li = $.el("li", { + innerHTML: "+ | Reset" + }); + $.on($('a[name=add]', li), "click", function() { + var blankLink; + + blankLink = ["ex", "example", "http://www.example.com/"]; + userNavigation.links.push(blankLink); + return Options.customNavigation.cleanup(); + }); + $.on($('a[name=reset]', li), "click", function() { + userNavigation = JSON.parse(JSON.stringify(Navigation)); + return Options.customNavigation.cleanup(); + }); + $.add(ul, li); + return $.add(div, ul); + }, + cleanup: function() { + $.set("userNavigation", userNavigation); + $.rm($("#customNavigation > ul", d.body)); + return Options.customNavigation.dialog($("#options", d.body)); + } + }, + persona: { + init: function() { + var input, item, key, _i, _len, _ref; + + key = Conf['Per Board Persona'] ? g.BOARD : 'global'; + Options.persona.newButton(); + _ref = Options.persona.array; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + item = _ref[_i]; + input = $("input[name=" + item + "]", Options.el); + input.value = this.data[key][item] || ""; + $.on(input, 'blur', function() { + var pers; + + pers = Options.persona; + pers.data[pers.select.value][this.name] = this.value; + return $.set('persona', pers.data); + }); + } + return $.on(Options.persona.button, 'click', Options.persona.copy); + }, + array: ['name', 'email', 'sub'], + change: function() { + var input, item, key, _i, _len, _ref; + + key = this.value; + Options.persona.newButton(); + _ref = Options.persona.array; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + item = _ref[_i]; + input = $("input[name=" + item + "]", Options.el); + input.value = Options.persona.data[key][item]; + } + }, + copy: function() { + var change, data, select, _ref; + + _ref = Options.persona, select = _ref.select, data = _ref.data, change = _ref.change; + if (select.value === 'global') { + data.global = JSON.parse(JSON.stringify(data[select.value])); + } else { + data[select.value] = JSON.parse(JSON.stringify(data.global)); + } + $.set('persona', Options.persona.data = data); + return change.call(select); + }, + newButton: function() { + return Options.persona.button.textContent = "Copy from " + (Options.persona.select.value === 'global' ? 'current board' : 'global'); + } + }, + close: function() { + d.body.style.overflow = ''; + $.rm($.id('options')); + $.rm($.id('overlay')); + return delete Options.el; + }, + clearHidden: function() { + $["delete"]("hiddenReplies/" + g.BOARD + "/"); + $["delete"]("hiddenThreads/" + g.BOARD + "/"); + this.textContent = "hidden: 0"; + return g.hiddenReplies = {}; + }, + 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); + }, + filter: function() { + var article, el, name, ta; + + el = this.nextSibling.nextSibling; + if ((name = this.value) !== 'guide') { + ta = $.el('textarea', { + name: name, + className: 'field', + value: $.get(name, Conf[name]) + }); + $.on(ta, 'change', $.cb.value); + $.replace(el, ta); + return; + } + article = $.el('article', { + innerHTML: "

Use regular expressions, one per line.
\n Lines starting with a # will be ignored.
\n For example, /weeaboo/i will filter posts containing the string `weeaboo`, case-insensitive.

\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
  • \n Filter OPs only along with their threads (`only`), replies only (`no`, this is default), or both (`yes`).
    \n For example: op:only;, op:no; or op:yes;.\n
  • \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
  • \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
  • \n Highlighted OPs will have their threads put on top of board pages by default.
    \n For example: top:yes; or top:no;.\n
  • \n
" + }); + if (el) { + return $.replace(el, article); + } else { + return $.after(this, article); + } + }, + time: function() { + Time.foo(); + Time.date = new Date(); + return $.id('timePreview').textContent = Time.funk(Time); + }, + backlink: function() { + return $.id('backlinkPreview').textContent = Conf['backlink'].replace(/%id/, '123456789'); + }, + fileInfo: function() { + FileInfo.data = { + link: '//images.4chan.org/g/src/1334437723720.jpg', + spoiler: true, + size: '276', + unit: 'KB', + resolution: '1280x720', + fullname: 'd9bb2efc98dd0df141a94399ff5880b7.jpg', + shortname: 'd9bb2efc98dd0df141a94399ff5880(...).jpg' + }; + FileInfo.setFormats(); + return $.id('fileInfoPreview').innerHTML = FileInfo.funk(FileInfo); + }, + favicon: function() { + Favicon["switch"](); + Unread.update(true); + return this.previousElementSibling.innerHTML = " "; + }, + selectTheme: function() { + var currentTheme; + + if (currentTheme = $.id(Conf['theme'])) { + $.rmClass(currentTheme, 'selectedtheme'); + } + if (Conf["NSFW/SFW Themes"]) { + $.set("theme_" + g.TYPE, this.id); + } else { + $.set("theme", this.id); + } + Conf['theme'] = this.id; + $.addClass(this, 'selectedtheme'); + return Style.addStyle(); + }, + mouseover: function(e) { + var child, children, mouseover, _i, _len; + + if (mouseover = $.id('mouseover')) { + if (children = mouseover.childNodes) { + for (_i = 0, _len = children.length; _i < _len; _i++) { + child = children[_i]; + $.rm(child); + } + } + } else { + mouseover = $.el('div', { + id: 'mouseover', + className: 'dialog' + }); + $.add(d.body, mouseover); + } + mouseover.innerHTML = this.nextElementSibling.innerHTML; + UI.el = mouseover; + $.on(this, 'mousemove', Options.hover); + $.on(this, 'mouseout', Options.mouseout); + }, + hover: function(e) { + return UI.hover(e, "menu"); + }, + mouseout: function(e) { + var child, mouseover, _i, _len, _ref; + + mouseover = UI.el; + _ref = mouseover.childNodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + $.rm(child); + } + delete UI.el; + return $.off(this, 'mousemove', Options.hover); + } + }; + + BanChecker = { + init: function() { + var reason; + + this.now = Date.now(); + if (!Conf['Check for Bans constantly'] && (reason = $.get('isBanned'))) { + return BanChecker.prepend(reason); + } else if (Conf['Check for Bans constantly'] || $.get('lastBanCheck', 0) < this.now - 6 * $.HOUR) { + return BanChecker.load(); + } + }, + load: function() { + this.url = 'https://www.4chan.org/banned'; + return $.ajax(this.url, { + onloadend: function() { + var doc, msg, reason; + + if (this.status === 200 || 304) { + if (!Conf['Check for Bans constantly']) { + $.set('lastBanCheck', BanChecker.now); + } + doc = d.implementation.createHTMLDocument(''); + doc.documentElement.innerHTML = this.response; + if (/no entry in our database/i.test((msg = $('.boxcontent', doc).textContent.trim()))) { + if ($.get('isBanned', false)) { + $["delete"]('isBanned'); + $.rm(BanChecker.el); + delete BanChecker.el; + } + return; + } + $.set('isBanned', reason = /This ban will not expire/i.test(msg) ? 'You are permabanned.' : 'You are banned.'); + return BanChecker.prepend(reason); + } + } + }); + }, + prepend: function(reason) { + var el; + + if (!BanChecker.el) { + Banchecker.el = el = $.el('h2', { + id: 'banmessage', + "class": 'warning', + innerHTML: " " + reason + " Click to find out why.", + title: 'Click to recheck.' + }, $.on(el.lastChild, 'click', function() { + if (!Conf['Check for Bans constantly']) { + $["delete"]('lastBanCheck'); + } + $["delete"]('isBanned'); + this.parentNode.style.opacity = '.5'; + return BanChecker.load(); + })); + return $.before($.id('delform'), el); + } else { + return Banchecker.el.firstChild.textContent = reason; + } + } + }; + + CatalogLinks = { + init: function() { + var a, el; + + el = $.el('span', { + id: 'toggleCatalog', + innerHTML: '[]' + }); + $.on((a = el.firstElementChild), 'click', this.toggle); + $.add($.id('boardNavDesktop'), [$.tn(' '), el]); + return this.toggle.call(a, true); + }, + toggle: function(onLoad) { + var a, board, useCatalog, _i, _len, _ref; + + if (onLoad === true) { + useCatalog = $.get('CatalogIsToggled', g.CATALOG); + } else { + $.set('CatalogIsToggled', useCatalog = this.textContent === 'Catalog Off'); + } + _ref = $$('a', $.id('boardNavDesktop')); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + board = a.pathname.split('/')[1]; + if (['f', 'status', '4chan'].contains(board) || !board) { + if (board === 'f') { + a.pathname = '/f/'; + } + continue; + } + if (Conf['External Catalog']) { + a.href = useCatalog ? CatalogLinks.external(board) : "//boards.4chan.org/" + board + "/"; + } else { + a.pathname = "/" + board + "/" + (useCatalog ? 'catalog' : ''); + } + a.title = useCatalog ? "" + a.title + " - Catalog" : a.title.replace(/\ -\ Catalog$/, ''); + } + this.textContent = "Catalog " + (useCatalog ? 'On' : 'Off'); + 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"); + } + }; + + CustomNavigation = { + init: function() { + var a, i, len, link, navNodes, navigation, node, nodes; + + navigation = $("#boardNavDesktop", d.body); + navNodes = navigation.childNodes; + i = navNodes.length; + nodes = Conf['Append Delimiters'] ? [$.tn("" + userNavigation.delimiter + " ")] : []; + while (i--) { + if ((node = navNodes[i]).id) { + continue; + } + $.rm(node); + } + len = userNavigation.links.length - 1; + while (i++ < len) { + link = userNavigation.links[i]; + a = $.el('a', { + textContent: link[0], + title: link[1], + href: link[2] + }); + if (a.href.contains("/" + g.BOARD + "/")) { + $.addClass(a, 'current'); + } + nodes[nodes.length] = a; + if (Conf['Append Delimiters'] || i !== len) { + nodes[nodes.length] = $.tn(" " + userNavigation.delimiter + " "); + } + } + $.prepend(navigation, nodes); + } + }; + + ExpandComment = { + init: function() { + var a, _i, _len, _ref; + + _ref = $$('.abbr'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + a = _ref[_i]; + $.on(a.firstElementChild, 'click', ExpandComment.expand); + } + }, + callbacks: [], + node: function(node) { + var callback, _i, _len, _ref; + + _ref = ExpandComment.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + callback(node); + } + }, + expand: function(e) { + var a, replyID, threadID, _, _ref; + + e.preventDefault(); + _ref = this.href.match(/(\d+)#p(\d+)/), _ = _ref[0], threadID = _ref[1], replyID = _ref[2]; + this.textContent = "Loading No." + replyID + "..."; + a = this; + return $.cache("//api.4chan.org" + this.pathname + ".json", function() { + return ExpandComment.parse(this, a, threadID, replyID); + }); + }, + parse: function(req, a, threadID, replyID) { + var bq, clone, href, post, posts, quote, quotes, spoilerRange, _conf, _i, _j, _len, _len1, _ref; + + _conf = Conf; + if (req.status !== 200) { + a.textContent = "" + req.status + " " + req.statusText; + return; + } + posts = JSON.parse(req.response).posts; + if (spoilerRange = posts[0].custom_spoiler) { + Build.spoilerRange[g.BOARD] = spoilerRange; + } + replyID = +replyID; + for (_i = 0, _len = posts.length; _i < _len; _i++) { + post = posts[_i]; + if (post.no === replyID) { + break; + } + } + if (post.no !== replyID) { + a.textContent = 'No.#{replyID} not found.'; + return; + } + bq = $.id("m" + replyID); + clone = bq.cloneNode(false); + clone.innerHTML = post.com; + _ref = quotes = clone.getElementsByClassName('quotelink'); + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + quote = _ref[_j]; + href = quote.getAttribute('href'); + if (href[0] === '/') { + continue; + } + quote.href = "res/" + href; + } + post = { + blockquote: clone, + threadID: threadID, + quotes: quotes, + backlinks: [] + }; + ExpandComment.node(post); + $.replace(bq, clone); + return Main.prettify(clone); + } + }; + + ExpandThread = { + init: function() { + var a, span, _i, _len, _ref; + + _ref = $$('.summary'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + span = _ref[_i]; + a = $.el('a', { + textContent: "+ " + span.textContent, + className: 'summary desktop', + href: 'javascript:;' + }); + $.on(a, 'click', function() { + return ExpandThread.toggle(this.parentNode); + }); + $.replace(span, a); + } + }, + toggle: function(thread) { + var a, num, replies, reply, url, _i, _len; + + url = "//api.4chan.org/" + g.BOARD + "/res/" + thread.id.slice(1) + ".json"; + a = $('.summary', thread); + switch (a.textContent[0]) { + case '+': + a.textContent = a.textContent.replace('+', '× Loading...'); + $.cache(url, function() { + return ExpandThread.parse(this, thread, a); + }); + break; + case 'X': + a.textContent = a.textContent.replace('× Loading...', '+'); + $.cache.requests[url].abort(); + break; + case '-': + a.textContent = a.textContent.replace('-', '+'); + num = (function() { + switch (g.BOARD) { + case 'b': + case 'vg': + case 'q': + return 3; + case 't': + return 1; + default: + return 5; + } + })(); + replies = $$('.replyContainer', thread); + replies.splice(replies.length - num, num); + for (_i = 0, _len = replies.length; _i < _len; _i++) { + reply = replies[_i]; + $.rm(reply); + } + } + }, + parse: function(req, thread, a) { + var backlink, frag, id, link, node, nodes, post, posts, replies, reply, spoilerRange, status, threadID, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _results; + + if ((status = req.status) !== 200) { + a.textContent = "" + status + " " + req.statusText; + $.off(a, 'click', ExpandThread.cb.toggle); + return; + } + a.textContent = a.textContent.replace('× Loading...', '-'); + posts = JSON.parse(req.response).posts; + if (spoilerRange = posts[0].custom_spoiler) { + Build.spoilerRange[g.BOARD] = spoilerRange; + } + replies = posts.slice(1); + threadID = thread.id.slice(1); + nodes = []; + for (_i = 0, _len = replies.length; _i < _len; _i++) { + reply = replies[_i]; + post = Build.postFromObject(reply, g.BOARD); + id = reply.no; + link = $('a[title="Highlight this post"]', post); + link.href = "res/" + threadID + "#p" + id; + link.nextSibling.href = "res/" + threadID + "#q" + id; + nodes.push(post); + } + _ref = $$('.summary ~ .replyContainer', a.parentNode); + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + post = _ref[_j]; + $.rm(post); + } + _ref1 = $$('.backlink', a.previousElementSibling); + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + backlink = _ref1[_k]; + if (!$.id(backlink.hash.slice(1))) { + $.rm(backlink); + } + } + _results = []; + for (_l = 0, _len3 = nodes.length; _l < _len3; _l++) { + node = nodes[_l]; + frag = $.frag(); + $.add(frag, node); + post = Main.preParse(node); + post.threadID = threadID; + Main.node(post); + _results.push($.add(thread, frag)); + } + return _results; + } + }; + + FileInfo = { + init: function() { + if (g.BOARD === 'f') { + return; + } + this.setFormats(); + QuotePreview.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var alt, filename, node, _ref; + + if (!post.fileInfo) { + return; + } + node = post.fileInfo.firstElementChild; + alt = post.img.alt; + filename = ((_ref = $('span', node)) != null ? _ref.title : void 0) || node.title; + FileInfo.data = { + link: post.img.parentNode.href, + spoiler: /^Spoiler/.test(alt), + size: alt.match(/\d+\.?\d*/)[0], + unit: alt.match(/\w+$/)[0], + resolution: node.textContent.match(/\d+x\d+|PDF/)[0], + fullname: filename, + shortname: Build.shortFilename(filename, post.ID === post.threadID) + }; + node.setAttribute('data-filename', filename); + return node.innerHTML = FileInfo.funk(FileInfo); + }, + setFormats: function() { + var code; + + code = Conf['fileInfo'].replace(/%(.)/g, function(s, c) { + if (c in FileInfo.formatters) { + return "' + f.formatters." + c + "() + '"; + } else { + return s; + } + }); + return this.funk = Function('f', "return '" + code + "'"); + }, + convertUnit: function(unitT) { + var i, size, unitF, units; + + size = this.data.size; + unitF = this.data.unit; + if (unitF !== unitT) { + units = ['B', 'KB', 'MB']; + i = units.indexOf(unitF) - units.indexOf(unitT); + if (unitT === 'B') { + unitT = 'Bytes'; + } + if (i > 0) { + while (i-- > 0) { + size *= 1024; + } + } else if (i < 0) { + while (i++ < 0) { + size /= 1024; + } + } + if (size < 1 && size.toString().length > size.toFixed(2).length) { + size = size.toFixed(2); + } + } + return "" + size + " " + unitT; + }, + formatters: { + t: function() { + return FileInfo.data.link.match(/\d+\..+$/)[0]; + }, + T: function() { + return "" + (this.t()) + ""; + }, + l: function() { + return "" + (this.n()) + ""; + }, + L: function() { + return "" + (this.N()) + ""; + }, + n: function() { + if (FileInfo.data.fullname === FileInfo.data.shortname) { + return FileInfo.data.fullname; + } else { + return "" + FileInfo.data.shortname + "" + FileInfo.data.fullname + ""; + } + }, + N: function() { + return FileInfo.data.fullname; + }, + p: function() { + if (FileInfo.data.spoiler) { + return 'Spoiler, '; + } else { + return ''; + } + }, + s: function() { + return "" + FileInfo.data.size + " " + FileInfo.data.unit; + }, + B: function() { + return FileInfo.convertUnit('B'); + }, + K: function() { + return FileInfo.convertUnit('KB'); + }, + M: function() { + return FileInfo.convertUnit('MB'); + }, + r: function() { + return FileInfo.data.resolution; + } + } + }; + + Keybinds = { + init: function() { + var node, _i, _len, _ref; + + this.bindings = this.bind(); + _ref = $$('[accesskey]'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + node.removeAttribute('accesskey'); + } + return $.on(d, 'keydown', Keybinds.keydown); + }, + bind: function() { + var keys, _conf; + + _conf = Conf; + keys = {}; + keys[_conf.openQR] = function(thread, target, nodeName) { + return Keybinds.qr(thread, true); + }; + keys[_conf.openEmptyQR] = function(thread, target, nodeName) { + return Keybinds.qr(thread); + }; + keys[_conf.openOptions] = function() { + if (!$.id('overlay')) { + return Options.dialog(); + } + }; + keys[_conf.close] = function() { + var o; + + if (o = $.id('overlay')) { + return Options.close.call(o); + } else if (QR.el) { + return QR.close(); + } + }; + keys[_conf.submit] = function() { + if (QR.el && !QR.status()) { + return QR.submit(); + } + }; + keys[_conf.hideQR] = function(thread, target, nodeName) { + if (QR.el) { + if (QR.el.hidden) { + return QR.el.hidden = false; + } + return QR.autohide.click(); + } else { + return QR.open(); + } + }; + keys[_conf.toggleCatalog] = function() { + return CatalogLinks.toggle(); + }; + keys[_conf.spoiler] = function(thread, target, nodeName) { + if (!(($('[name=spoiler]')) && nodeName === 'textarea')) { + return; + } + return Keybinds.tags('spoiler', target); + }; + keys[_conf.math] = function(thread, target, nodeName) { + if (!(g.BOARD === (!!$('script[src^="//boards.4chan.org/jsMath/"]', d.head)) && nodeName === 'textarea')) { + return; + } + return Keybinds.tags('math', target); + }; + keys[_conf.eqn] = function(thread, target, nodeName) { + if (!(g.BOARD === (!!$('script[src^="//boards.4chan.org/jsMath/"]', d.head)) && nodeName === 'textarea')) { + return; + } + return Keybinds.tags('eqn', target); + }; + keys[_conf.code] = function(thread, target, nodeName) { + if (!(g.BOARD === Main.hasCodeTags && nodeName === 'textarea')) { + return; + } + return Keybinds.tags('code', target); + }; + keys[_conf.sageru] = function() { + $("[name=email]", QR.el).value = "sage"; + return QR.selected.email = "sage"; + }; + keys[_conf.watch] = function(thread, target, nodeName) { + return Watcher.toggle(thread); + }; + keys[_conf.update] = function() { + return Updater.update(); + }; + keys[_conf.unreadCountTo0] = function() { + Unread.replies = []; + return Unread.update(true); + }; + keys[_conf.expandImage] = function(thread, target, nodeName) { + return Keybinds.img(thread); + }; + keys[_conf.expandAllImages] = function(thread, target, nodeName) { + return Keybinds.img(thread, true); + }; + keys[_conf.zero] = function() { + return window.location = "/" + g.BOARD + "/0#delform"; + }; + keys[_conf.nextPage] = function() { + var form; + + if (form = $('.next form')) { + return window.location = form.action; + } + }; + keys[_conf.previousPage] = function() { + var form; + + if (form = $('.prev form')) { + return window.location = form.action; + } + }; + keys[_conf.nextThread] = function() { + if (g.REPLY) { + return; + } + return Nav.scroll(+1); + }; + keys[_conf.previousThread] = function() { + if (g.REPLY) { + return; + } + return Nav.scroll(-1); + }; + keys[_conf.expandThread] = function(thread, target, nodeName) { + return ExpandThread.toggle(thread); + }; + keys[_conf.openThread] = function(thread, target, nodeName) { + return Keybinds.open(thread); + }; + keys[_conf.openThreadTab] = function(thread, target, nodeName) { + return Keybinds.open(thread, true); + }; + keys[_conf.nextReply] = function(thread, target, nodeName) { + return Keybinds.hl(+1, thread); + }; + keys[_conf.previousReply] = function(thread, target, nodeName) { + return Keybinds.hl(-1, thread); + }; + keys[_conf.hide] = function(thread, target, nodeName) { + if (/\bthread\b/.test(thread.className)) { + return ThreadHiding.toggle(thread); + } + }; + return keys; + }, + keydown: function(e) { + var bind, key, nodeName, target, thread; + + if (!(key = Keybinds.keyCode(e))) { + return; + } + target = e.target; + if ((nodeName = target.nodeName.toLowerCase()) === 'textarea' || nodeName === 'input') { + if (!((key === 'Esc') || (/\+/.test(key)))) { + return; + } + } + thread = Nav.getThread(); + if (!(bind = Keybinds.bindings[key])) { + return; + } + bind(thread, target, nodeName); + return e.preventDefault(); + }, + keyCode: function(e) { + var c, kc, key; + + key = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90].contains(kc = e.keyCode) ? (c = String.fromCharCode(kc), e.shiftKey ? c : c.toLowerCase()) : ((function() { + switch (kc) { + 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: + return null; + } + })()); + if (key) { + if (e.altKey) { + key = 'alt+' + key; + } + if (e.ctrlKey) { + key = 'ctrl+' + key; + } + if (e.metaKey) { + key = 'meta+' + key; + } + } + return key; + }, + 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(ta, new Event('input')); + }, + img: function(thread, all) { + var thumb; + + if (all) { + return $.id('imageExpand').click(); + } else { + thumb = $('img[data-md5]', $('.post.highlight', thread) || thread); + return ImageExpand.toggle(thumb.parentNode); + } + }, + qr: function(thread, quote) { + if (quote) { + QR.quote.call($('a[title="Quote this post"]', $('.post.highlight', thread) || thread)); + } else { + QR.open(); + } + return $('textarea', QR.el).focus(); + }, + open: function(thread, tab) { + var id, url; + + if (g.REPLY) { + return; + } + id = thread.id.slice(1); + url = "//boards.4chan.org/" + g.BOARD + "/res/" + id; + if (tab) { + return $.open(url); + } else { + return location.href = url; + } + }, + hl: function(delta, thread) { + var axis, next, post, rect, replies, reply, _i, _len; + + if (post = $('.reply.highlight', thread)) { + $.rmClass(post, 'highlight'); + rect = post.getBoundingClientRect(); + if (rect.bottom >= 0 && rect.top <= d.documentElement.clientHeight) { + axis = delta === +1 ? 'following' : 'preceding'; + next = $.x(axis + '::div[contains(@class,"post reply")][1]', post); + if (!next) { + return; + } + if (!(g.REPLY || $.x('ancestor::div[parent::div[@class="board"]]', next) === thread)) { + return; + } + rect = next.getBoundingClientRect(); + if (rect.top < 0 || rect.bottom > d.documentElement.clientHeight) { + next.scrollIntoView(delta === -1); + } + 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 >= 0 || delta === -1 && rect.bottom <= d.documentElement.clientHeight) { + this.focus(reply); + return; + } + } + }, + focus: function(post) { + $.addClass(post, 'highlight'); + return post.focus(); + } + }; + + Navigation = { + delimiter: "/", + links: [["a", "Anime & Manga", "//boards.4chan.org/a/"], ["b", "Random", "//boards.4chan.org/b/"], ["c", "Cute/Anime", "//boards.4chan.org/c/"], ["d", "Hentai/Alternative", "//boards.4chan.org/d/"], ["e", "Ecchi", "//boards.4chan.org/e/"], ["f", "Flash", "//boards.4chan.org/f/"], ["g", "Technology", "//boards.4chan.org/g/"], ["gif", "Animated Gifs", "//boards.4chan.org/gif/"], ["h", "Hentai", "//boards.4chan.org/h/"], ["hr", "High Resolution", "//boards.4chan.org/hr/"], ["k", "Weapons", "//boards.4chan.org/k/"], ["l", "Lolicon", "http://7chan.org/cake/"], ["m", "Mecha", "//boards.4chan.org/m/"], ["o", "Auto", "//boards.4chan.org/o/"], ["p", "Pictures", "//boards.4chan.org/p/"], ["r", "Requests", "//boards.4chan.org/r/"], ["s", "Sexy Beautiful Women", "//boards.4chan.org/s/"], ["t", "Torrents", "//boards.4chan.org/t/"], ["u", "Yuri", "//boards.4chan.org/u/"], ["v", "Video Games", "//boards.4chan.org/v/"], ["vg", "Video Game Generals", "//boards.4chan.org/vg/"], ["w", "Anime/Wallpapers", "//boards.4chan.org/w/"], ["wg", "Wallpapers/General", "//boards.4chan.org/wg/"], ["i", "Oekaki", "//boards.4chan.org/i/"], ["ic", "Artwork/Critique", "//boards.4chan.org/ic/"], ["r9k", "Robot 9K", "//boards.4chan.org/r9k/"], ["cm", "Cute/Male", "//boards.4chan.org/cm/"], ["hm", "Handsome Men", "//boards.4chan.org/hm/"], ["y", "Yaoi", "//boards.4chan.org/y/"], ["3", "3DCG", "//boards.4chan.org/3/"], ["adv", "Advice", "//boards.4chan.org/adv/"], ["an", "Animals", "//boards.4chan.org/an/"], ["cgl", "Cosplay & EGL", "//boards.4chan.org/cgl/"], ["ck", "Food & Cooking", "//boards.4chan.org/ck/"], ["co", "Comics & Cartoons", "//boards.4chan.org/co/"], ["diy", "Do It Yourself", "//boards.4chan.org/diy/"], ["fa", "Fashion", "//boards.4chan.org/fa/"], ["fit", "Health & Fitness", "//boards.4chan.org/fit/"], ["hc", "Hardcore", "//boards.4chan.org/hc/"], ["int", "International", "//boards.4chan.org/int/"], ["jp", "Otaku Culture", "//boards.4chan.org/jp/"], ["lit", "Literature", "//boards.4chan.org/lit/"], ["mlp", "My Little Pony", "//boards.4chan.org/mlp/"], ["mu", "Music", "//boards.4chan.org/mu/"], ["n", "Transportation", "//boards.4chan.org/n/"], ["po", "Papercraft & Origami", "//boards.4chan.org/po/"], ["pol", "Politically Incorrect", "//boards.4chan.org/pol/"], ["sci", "Science & Math", "//boards.4chan.org/sci/"], ["soc", "Social", "//boards.4chan.org/soc/"], ["sp", "Sports", "//boards.4chan.org/sp/"], ["tg", "Traditional Games", "//boards.4chan.org/tg/"], ["toy", "Toys", "//boards.4chan.org/toys/"], ["trv", "Travel", "//boards.4chan.org/trv/"], ["tv", "Television & Film", "//boards.4chan.org/tv/"], ["vp", "Pokémon", "//boards.4chan.org/vp/"], ["wsg", "Worksafe GIF", "//boards.4chan.org/wsg/"], ["x", "Paranormal", "//boards.4chan.org/x/"], ["rs", "Rapidshares", "http://rs.4chan.org/"], ["status", "4chan Status", "http://status.4chan.org/"], ["q", "4chan Discussion", "//boards.4chan.org/q/"], ["@", "4chan Twitter", "http://www.twitter.com/4chan"]] + }; + + Nav = { + init: function() { + var next, prev, span; + + span = $.el('span', { + id: 'navlinks' + }); + prev = $.el('a', { + href: 'javascript:;' + }); + next = $.el('a', { + href: 'javascript:;' + }); + $.on(prev, 'click', this.prev); + $.on(next, 'click', this.next); + $.add(span, [prev, next]); + return $.add(d.body, span); + }, + prev: function() { + if (g.REPLY) { + return window.scrollTo(0, 0); + } else { + return Nav.scroll(-1); + } + }, + next: function() { + if (g.REPLY) { + return window.scrollTo(0, d.body.scrollHeight); + } else { + return Nav.scroll(+1); + } + }, + getThread: function(full) { + var bottom, i, rect, thread, _i, _len, _ref; + + Nav.threads = $$('.thread:not(.hidden)'); + _ref = Nav.threads; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + thread = _ref[i]; + rect = thread.getBoundingClientRect(); + bottom = rect.bottom; + if (bottom > 0) { + if (full) { + return [thread, i, rect]; + } + return thread; + } + } + return $('.board'); + }, + scroll: function(delta) { + var i, rect, thread, top, _ref, _ref1; + + _ref = Nav.getThread(true), thread = _ref[0], i = _ref[1], rect = _ref[2]; + top = rect.top; + if (!((delta === -1 && Math.ceil(top) < 0) || (delta === +1 && top > 1))) { + i += delta; + } + top = (_ref1 = Nav.threads[i]) != null ? _ref1.getBoundingClientRect().top : void 0; + return window.scrollBy(0, top); + } + }; + + Redirect = { + image: function(board, filename) { + switch (board) { + case 'a': + case 'jp': + case 'm': + case 'q': + case 'sp': + case 'tg': + case 'vg': + case 'wsg': + return "//archive.foolz.us/" + board + "/full_image/" + filename; + case 'cgl': + case 'g': + case 'mu': + case 'w': + return "//rbt.asia/" + board + "/full_image/" + filename; + case 'an': + case 'k': + case 'toy': + case 'x': + return "http://archive.heinessen.com/" + board + "/full_image/" + filename; + case 'ck': + case 'lit': + return "//fuuka.warosu.org/" + board + "/full_image/" + filename; + case 'u': + return "//nsfw.foolz.us/" + board + "/full_image/" + filename; + case 'e': + return "//www.xn--clich-fsa.net/4chan/cgi-board.pl/" + board + "/img/" + filename; + case 'c': + return "//archive.nyafuu.org/" + board + "/full_image/" + filename; + } + }, + post: function(board, postID) { + var archive, name, _base1, _ref; + + if (Redirect.post[board] === void 0) { + _ref = this.archiver; + for (name in _ref) { + archive = _ref[name]; + if (archive.type === 'foolfuuka' && archive.boards.contains(board)) { + Redirect.post[board] = archive.base; + break; + } + } + (_base1 = Redirect.post)[board] || (_base1[board] = null); + } + if (Redirect.post[board]) { + return "" + Redirect.post[board] + "/_/api/chan/post/?board=" + board + "&num=" + postID; + } + return null; + }, + archiver: { + 'Foolz': { + base: '//archive.foolz.us', + boards: ['a', 'co', 'gd', 'jp', 'm', 'q', 'sp', 'tg', 'tv', 'v', 'vg', 'vp', 'vr', 'wsg', 'dev', 'foolz'], + type: 'foolfuuka' + }, + 'NSFWFoolz': { + base: '//nsfw.foolz.us', + boards: ['u', 'kuku'], + type: 'foolfuuka' + }, + 'TheDarkCave': { + base: 'http://archive.thedarkcave.org', + boards: ['c', 'int', 'out', 'po'], + type: 'foolfuuka' + }, + 'Warosu': { + base: '//fuuka.warosu.org', + boards: ['cgl', 'ck', 'fa', 'jp', 'lit', 'q', 's4s', 'tg', 'vr'], + type: 'fuuka' + }, + 'InstallGentoo': { + base: '//archive.installgentoo.net', + boards: ['diy', 'g', 'sci'], + type: 'fuuka' + }, + 'RebeccaBlackTech': { + base: '//rbt.asia', + boards: ['cgl', 'g', 'mu', 'w'], + type: 'fuuka_mail' + }, + 'Heinessen': { + base: 'http://archive.heinessen.com', + boards: ['an', 'fit', 'k', 'mlp', 'r9k', 'toy', 'x'], + type: 'fuuka' + }, + 'Cliche': { + base: '//www.xn--clich-fsa.net/4chan/cgi-board.pl', + boards: ['e'], + type: 'fuuka' + }, + 'NyaFuu': { + base: '//archive.nyafuu.org', + boards: ['c', 'w'], + type: 'fuuka' + } + }, + select: function(board) { + var archive, name; + + return (function() { + var _ref, _results; + + _ref = this.archiver; + _results = []; + for (name in _ref) { + archive = _ref[name]; + if (archive.boards.contains(board || g.BOARD)) { + _results.push(name); + } + } + return _results; + }).call(this); + }, + to: function(data) { + var archive, board, isSearch, threadID; + + board = data.board, threadID = data.threadID, isSearch = data.isSearch; + return ((archive = this.archiver[$.get("archiver/" + board + "/", this.select(board)[0])]) ? this.path(archive.base, archive.type, data) : threadID && !isSearch ? "//boards.4chan.org/" + board + "/" : null); + }, + path: function(base, archiver, data) { + var board, isSearch, postID, threadID, type, url, value; + + board = data.board, type = data.type, value = data.value, threadID = data.threadID, postID = data.postID, isSearch = data.isSearch; + if (isSearch) { + type = type === 'name' ? 'username' : type === 'md5' ? 'image' : type; + value = encodeURIComponent(value); + return ((url = archiver === 'foolfuuka' ? "search/" + type + "/" : type === 'image' ? "?task=search2&search_media_hash=" : type !== 'email' || archiver === 'fuuka_mail' ? "?task=search2&search_" + type + "=" : false) ? "" + base + "/" + board + "/" + url + value : url); + } + if (postID) { + postID = postID.match(/\d+/)[0]; + } + return base + "/" + board + "/" + (threadID ? "thread/" + threadID : "post/" + postID) + (threadID && postID ? "#" + (archiver === 'InstallGentoo' ? 'p' : '') + postID : ""); + } + }; + + Time = { + init: function() { + Time.foo(); + QuotePreview.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var node; + + node = $('.postInfo > .dateTime', post.el); + Time.date = new Date(node.dataset.utc * 1000); + return node.textContent = Time.funk(Time); + }, + foo: function() { + var code; + + code = Conf['time'].replace(/%([A-Za-z])/g, function(s, c) { + if (c in Time.formatters) { + return "' + Time.formatters." + c + "() + '"; + } else { + return s; + } + }); + return Time.funk = Function('Time', "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[Time.date.getDay()].slice(0, 3); + }, + A: function() { + return Time.day[Time.date.getDay()]; + }, + b: function() { + return Time.month[Time.date.getMonth()].slice(0, 3); + }, + B: function() { + return Time.month[Time.date.getMonth()]; + }, + d: function() { + return Time.zeroPad(Time.date.getDate()); + }, + e: function() { + return Time.date.getDate(); + }, + H: function() { + return Time.zeroPad(Time.date.getHours()); + }, + I: function() { + return Time.zeroPad(Time.date.getHours() % 12 || 12); + }, + k: function() { + return Time.date.getHours(); + }, + l: function() { + return Time.date.getHours() % 12 || 12; + }, + m: function() { + return Time.zeroPad(Time.date.getMonth() + 1); + }, + M: function() { + return Time.zeroPad(Time.date.getMinutes()); + }, + p: function() { + if (Time.date.getHours() < 12) { + return 'AM'; + } else { + return 'PM'; + } + }, + P: function() { + if (Time.date.getHours() < 12) { + return 'am'; + } else { + return 'pm'; + } + }, + S: function() { + return Time.zeroPad(Time.date.getSeconds()); + }, + y: function() { + return Time.date.getFullYear() % 100; + }, + Y: function() { + return Time.date.getFullYear(); + } + } + }; + + Anonymize = { + init: function() { + QuotePreview.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var name, parent, trip; + + name = $('.postInfo .name', post.el); + name.textContent = 'Anonymous'; + if ((trip = name.nextElementSibling) && trip.className === 'postertrip') { + $.rm(trip); + } + if ((parent = name.parentNode).className === 'useremail' && !/^mailto:sage$/i.test(parent.href)) { + return $.replace(parent, name); + } + } + }; + + Filter = { + filters: {}, + init: function() { + var boards, err, filter, hl, key, op, regexp, stub, top, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4; + + 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))) { + continue; + } + if (key === 'md5') { + regexp = regexp[1]; + } else { + try { + regexp = RegExp(regexp[1], regexp[2]); + } catch (_error) { + err = _error; + alert(err.message); + continue; + } + } + op = ((_ref2 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref2[1] : void 0) || 'no'; + 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['Show 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 Main.callbacks.push(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, isOP) { + if (isOP && op === 'no' || !isOP && op === 'only') { + return false; + } + if (!test(value)) { + return false; + } + return settings; + }; + }, + node: function(post) { + var filter, isOP, key, result, root, value, _i, _len, _ref; + + if (post.isInlined) { + return; + } + isOP = post.ID === post.threadID; + root = post.root; + for (key in Filter.filters) { + value = Filter[key](post); + if (value === false) { + continue; + } + _ref = Filter.filters[key]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + filter = _ref[_i]; + if (!(result = filter(value, isOP))) { + continue; + } + if (result.hide) { + if (isOP) { + if (!g.REPLY) { + ThreadHiding.hide(root.parentNode, result.stub); + } else { + continue; + } + } else { + ReplyHiding.hide(post.root, result.stub); + } + return; + } + $.addClass(root, result["class"]); + } + } + }, + name: function(post) { + return $('.name', post.el).textContent; + }, + uniqueid: function(post) { + var uid; + + if (uid = $('.posteruid', post.el)) { + return uid.textContent.slice(5, -1); + } + return false; + }, + tripcode: function(post) { + var trip; + + if (trip = $('.postertrip', post.el)) { + return trip.textContent; + } + return false; + }, + mod: function(post) { + var mod; + + if (mod = $('.capcode', post.el)) { + return mod.textContent; + } + return false; + }, + email: function(post) { + var mail; + + if (mail = $('.useremail', post.el)) { + return decodeURIComponent(mail.href.slice(7)); + } + return false; + }, + subject: function(post) { + var subject; + + if ((subject = $('.postInfo .subject', post.el)).textContent.length !== 0) { + return subject.textContent; + } + return false; + }, + comment: function(post) { + var content, data, i, nodes, text, _i, _ref; + + text = []; + nodes = d.evaluate('.//br|.//text()', post.blockquote, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (i = _i = 0, _ref = nodes.snapshotLength; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + text.push((data = nodes.snapshotItem(i).data) ? data : '\n'); + } + if ((content = text.join('')).length !== 0) { + return content; + } + return false; + }, + country: function(post) { + var flag; + + if (flag = $('.countryFlag', post.el)) { + return flag.title; + } + return false; + }, + filename: function(post) { + var file, fileInfo; + + fileInfo = post.fileInfo; + if (fileInfo) { + if (file = $('.fileText > span', fileInfo)) { + return file.title; + } else { + return fileInfo.firstElementChild.dataset.filename; + } + } + return false; + }, + dimensions: function(post) { + var fileInfo, match; + + fileInfo = post.fileInfo; + if (fileInfo && (match = fileInfo.textContent.match(/\d+x\d+/))) { + return match[0]; + } + return false; + }, + filesize: function(post) { + var img; + + img = post.img; + if (img) { + return img.alt.replace('Spoiler Image, ', ''); + } + return false; + }, + md5: function(post) { + var img; + + img = post.img; + if (img) { + return img.dataset.md5; + } + return false; + }, + menuInit: function() { + var div, entry, type, _i, _len, _ref; + + div = $.el('div', { + textContent: 'Filter' + }); + entry = { + el: div, + open: function() { + return true; + }, + children: [] + }; + _ref = [['Name', 'name'], ['Unique ID', 'uniqueid'], ['Tripcode', 'tripcode'], ['Admin/Mod', 'mod'], ['E-mail', 'email'], ['Subject', 'subject'], ['Comment', 'comment'], ['Country', 'country'], ['Filename', 'filename'], ['Image dimensions', 'dimensions'], ['Filesize', 'filesize'], ['Image MD5', 'md5']]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + entry.children.push(this.createSubEntry(type[0], type[1])); + } + return Menu.addEntry(entry); + }, + createSubEntry: function(text, type) { + var el, onclick, open; + + el = $.el('a', { + href: 'javascript:;', + textContent: text + }); + onclick = null; + open = function(post) { + var value; + + value = Filter[type](post); + if (value === false) { + return false; + } + $.off(el, 'click', onclick); + onclick = function() { + var re, save, select, ta, tl; + + re = type === 'md5' ? value : value.replace(/\/|\\|\^|\$|\n|\.|\(|\)|\{|\}|\[|\]|\?|\*|\+|\|/g, function(c) { + if (c === '\n') { + return '\\n'; + } else if (c === '\\') { + return '\\\\'; + } else { + return "\\" + c; + } + }); + re = type === 'md5' ? "/" + value + "/" : "/^" + re + "$/"; + if (/\bop\b/.test(post["class"])) { + re += ';op:yes'; + } + save = (save = $.get(type, '')) ? "" + save + "\n" + re : re; + $.set(type, save); + Options.dialog(); + select = $('select[name=filter]', $.id('options')); + select.value = type; + $.event(select, new Event('change')); + $.id('filter_tab').checked = true; + ta = select.nextElementSibling; + tl = ta.textLength; + ta.setSelectionRange(tl, tl); + return ta.focus(); + }; + $.on(el, 'click', onclick); + return true; + }; + return { + el: el, + open: open + }; + } + }; + + ReplyHiding = { + init: function() { + return Main.callbacks.push(this.node); + }, + node: function(post) { + var el, hide; + + if (post.isInlined || post.ID === post.threadID) { + return; + } + el = $('.postInfo', post.root); + hide = $.el('span', { + className: 'hide_reply_button', + innerHTML: "[ - ]" + }); + $.on(hide.firstElementChild, 'click', function() { + var button, id, root; + + return ReplyHiding.toggle(button = this.parentNode.parentNode, root = $.id("pc" + (id = this.id.slice(4))), id); + }); + $.add(el, hide); + if (post.ID in g.hiddenReplies) { + return ReplyHiding.hide(post.root); + } + }, + toggle: function(button, root, id) { + var quote, quotes, _i, _j, _len, _len1; + + quotes = $$(".quotelink[href$='#p" + id + "'], .backlink[href$='#p" + id + "']"); + if (/\bstub\b/.test(button.className)) { + ReplyHiding.show(root); + for (_i = 0, _len = quotes.length; _i < _len; _i++) { + quote = quotes[_i]; + $.rmClass(quote, 'filtered'); + } + delete g.hiddenReplies[id]; + } else { + ReplyHiding.hide(root); + for (_j = 0, _len1 = quotes.length; _j < _len1; _j++) { + quote = quotes[_j]; + $.addClass(quote, 'filtered'); + } + g.hiddenReplies[id] = Date.now(); + } + return $.set("hiddenReplies/" + g.BOARD + "/", g.hiddenReplies); + }, + hide: function(root) { + var a, id, menuButton, post, stub; + + post = $('.post', root); + if (post.hidden) { + return; + } + post.hidden = true; + $.addClass(root, 'hidden'); + if (!Conf['Show Stubs']) { + return; + } + stub = $.el('div', { + className: 'stub', + innerHTML: "" + (Conf['Anonymize'] ? 'Anonymous' : $('.desktop > .nameBlock', root).textContent) + " [ + ]" + }); + a = stub.firstChild; + if (Conf['Menu']) { + menuButton = Menu.a.cloneNode(true); + $.on(menuButton, 'click', Menu.toggle); + $.add(stub, [$.tn(' '), menuButton]); + } + $.on(a, 'click', function() { + var button; + + return ReplyHiding.toggle(button = this.parentNode, root = $.id("pc" + this.id.slice(4)), id); + }); + return $.prepend(root, stub); + }, + show: function(root) { + var post, stub; + + if ((stub = $('.stub', root))) { + $.rm(stub); + } + post = $('.post', root); + post.hidden = false; + return $.rmClass(root, 'hidden'); + }, + unhide: function(post) { + if (post.el.hidden) { + return ReplyHiding.show(post.root); + } + } + }; + + StrikethroughQuotes = { + init: function() { + return Main.callbacks.push(this.node); + }, + node: function(post) { + var el, quote, _i, _len, _ref; + + if (post.isInlined) { + return; + } + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (!(quote.hash && (el = $.id("p" + quote.hash.slice(2))) && quote.hostname === 'boards.4chan.org' && !/catalog$/.test(quote.pathname) && el.hidden)) { + continue; + } + $.addClass(quote, 'filtered'); + if (Conf['Recursive Filtering'] && post.ID !== post.threadID) { + ReplyHiding.hide(post.root); + } + } + } + }; + + ThreadHiding = { + init: function() { + var a, thread, _i, _len, _ref; + + this.hiddenThreads = $.get("hiddenThreads/" + g.BOARD + "/", {}); + ThreadHiding.sync(); + if (g.CATALOG) { + return; + } + _ref = $$('.thread'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thread = _ref[_i]; + a = $.el('a', { + className: 'hide_thread_button', + innerHTML: '[ - ]', + href: 'javascript:;' + }); + $.on(a, 'click', function() { + return ThreadHiding.toggle($.x('ancestor::div[@class="thread"][1]', this)); + }); + $.add($('.op .postInfo', thread), a); + if (thread.id.slice(1) in this.hiddenThreads) { + ThreadHiding.hide(thread); + } + } + }, + sync: function() { + var hiddenThreadsCatalog, id; + + hiddenThreadsCatalog = JSON.parse(localStorage.getItem("4chan-hide-t-" + g.BOARD)) || {}; + if (g.CATALOG) { + for (id in this.hiddenThreads) { + hiddenThreadsCatalog[id] = true; + } + return localStorage.setItem("4chan-hide-t-" + g.BOARD, JSON.stringify(hiddenThreadsCatalog)); + } else { + for (id in hiddenThreadsCatalog) { + if (!(id in this.hiddenThreads)) { + this.hiddenThreads[id] = Date.now(); + } + } + return $.set("hiddenThreads/" + g.BOARD + "/", this.hiddenThreads); + } + }, + toggle: function(thread) { + var id; + + id = thread.id.slice(1); + if (thread.hidden || /\bhidden_thread\b/.test(thread.firstChild.className)) { + ThreadHiding.show(thread); + delete ThreadHiding.hiddenThreads[id]; + } else { + ThreadHiding.hide(thread); + ThreadHiding.hiddenThreads[id] = Date.now(); + } + return $.set("hiddenThreads/" + g.BOARD + "/", ThreadHiding.hiddenThreads); + }, + hide: function(thread) { + var menuButton, num, opInfo, span, stub, text; + + if (!Conf['Show Stubs']) { + thread.hidden = true; + thread.nextElementSibling.hidden = true; + return; + } + if (/\bhidden_thread\b/.test(thread.firstChild.className)) { + return; + } + num = 0; + if (span = $('.summary', thread)) { + num = Number(span.textContent.match(/\d+/)); + } + num += $$('.opContainer ~ .replyContainer', thread).length; + text = num === 1 ? '1 reply' : "" + num + " replies"; + opInfo = $('.desktop > .nameBlock', thread).textContent; + stub = $.el('a', { + className: 'hidden_thread', + innerHTML: '[ + ]', + href: 'javascript:;' + }); + $.on(stub, 'click', function() { + return ThreadHiding.toggle(this.parentElement); + }); + $.add(stub, $.tn("" + opInfo + " (" + text + ")")); + if (Conf['Menu']) { + menuButton = Menu.a.cloneNode(true); + $.on(menuButton, 'click', Menu.toggle); + $.add(stub, [$.tn(' '), menuButton]); + } + return $.prepend(thread, stub); + }, + show: function(thread) { + var stub; + + if (stub = $('.hidden_thread', thread)) { + $.rm(stub); + } + thread.hidden = false; + return thread.nextElementSibling.hidden = false; + } + }; + + FappeTyme = { + init: function() { + var el; + + if (g.CATALOG || g.BOARD === 'f') { + return; + } + el = $.el('a', { + href: 'javascript:;', + id: 'fappeTyme', + title: 'Fappe Tyme' + }); + $.on(el, 'click', FappeTyme.toggle); + $.add($.id('navtopright'), el); + return Main.callbacks.push(this.node); + }, + node: function(post) { + if (post.img) { + return; + } + return post.el.parentElement.classList.add("noFile"); + }, + toggle: function() { + return $.toggleClass(d.body, 'fappeTyme'); + } + }; + + ImageExpand = { + init: function() { + if (g.BOARD === 'f') { + return; + } + QuoteInline.callbacks.push(this.node); + Main.callbacks.push(this.node); + return this.dialog(); + }, + node: function(post) { + var a; + + if (!post.img || post.hasPDF) { + return; + } + a = post.img.parentNode; + $.on(a, 'click', ImageExpand.cb.toggle); + if (Conf['Don\'t Expand Spoilers'] && !Conf['Reveal Spoilers'] && /^spoiler\ image/i.test(a.firstChild.alt)) { + return; + } + if (ImageExpand.on && !post.el.hidden) { + return ImageExpand.expand(post.img); + } + }, + cb: { + toggle: function(e) { + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button) { + return; + } + e.preventDefault(); + return ImageExpand.toggle(this); + }, + all: function() { + var i, thumb, thumbs, _i, _j, _k, _len, _len1, _len2, _ref; + + ImageExpand.on = this.checked; + if (ImageExpand.on) { + thumbs = $$('img[data-md5]'); + if (Conf['Expand From Current']) { + for (i = _i = 0, _len = thumbs.length; _i < _len; i = ++_i) { + thumb = thumbs[i]; + if (thumb.getBoundingClientRect().top > 0) { + break; + } + } + thumbs = thumbs.slice(i); + } + for (_j = 0, _len1 = thumbs.length; _j < _len1; _j++) { + thumb = thumbs[_j]; + if (Conf['Don\'t Expand Spoilers'] && !Conf['Reveal Spoilers'] && /^spoiler\ image/i.test(thumb.alt)) { + continue; + } + ImageExpand.expand(thumb); + } + } else { + _ref = $$('img[data-md5][hidden]'); + for (_k = 0, _len2 = _ref.length; _k < _len2; _k++) { + thumb = _ref[_k]; + ImageExpand.contract(thumb); + } + } + }, + typeChange: function() { + var klass; + + klass = (function() { + switch (this.value) { + case 'full': + return ''; + case 'fit width': + return 'fitwidth'; + case 'fit height': + return 'fitheight'; + case 'fit screen': + return 'fitwidth fitheight'; + } + }).call(this); + $.id('delform').className = klass; + if (/\bfitheight\b/.test(klass)) { + $.on(window, 'resize', ImageExpand.resize); + if (!ImageExpand.style) { + ImageExpand.style = $.addStyle(''); + } + return ImageExpand.resize(); + } else if (ImageExpand.style) { + return $.off(window, 'resize', ImageExpand.resize); + } + } + }, + toggle: function(a) { + var rect, thumb; + + thumb = a.firstChild; + if (thumb.hidden) { + rect = a.getBoundingClientRect(); + if (rect.bottom > 0) { + if ($.engine === 'webkit') { + if (rect.top < 0) { + d.body.scrollTop += rect.top - 42; + } + if (rect.left < 0) { + d.body.scrollLeft += rect.left; + } + } else { + if (rect.top < 0) { + d.documentElement.scrollTop += rect.top - 42; + } + if (rect.left < 0) { + d.documentElement.scrollLeft += rect.left; + } + } + } + return ImageExpand.contract(thumb); + } else { + return ImageExpand.expand(thumb); + } + }, + contract: function(thumb) { + thumb.hidden = false; + thumb.nextSibling.hidden = true; + return $.rmClass(thumb.parentNode.parentNode.parentNode.parentNode, 'image_expanded'); + }, + expand: function(thumb, src) { + var a, img; + + if ($.x('ancestor-or-self::*[@hidden]', thumb)) { + return; + } + a = thumb.parentNode; + src || (src = a.href); + if (/\.pdf$/.test(src)) { + return; + } + thumb.hidden = true; + $.addClass(thumb.parentNode.parentNode.parentNode.parentNode, 'image_expanded'); + if ((img = thumb.nextSibling) && img.tagName.toLowerCase() === 'img') { + img.hidden = false; + return; + } + img = $.el('img', { + src: src, + className: 'fullSize' + }); + $.on(img, 'error', ImageExpand.error); + return $.after(thumb, img); + }, + error: function() { + var src, thumb, timeoutID, url; + + thumb = this.previousSibling; + ImageExpand.contract(thumb); + $.rm(this); + src = this.src.split('/'); + if (!(src[2] === 'images.4chan.org' && (url = Redirect.image(src[3], src[5])))) { + if (g.dead) { + return; + } + url = "//images.4chan.org/" + src[3] + "/src/" + src[5]; + } + if ($.engine !== 'webkit' && url.split('/')[2] === 'images.4chan.org') { + return; + } + timeoutID = setTimeout(ImageExpand.expand, 10000, thumb, url); + if ($.engine !== 'webkit' || url.split('/')[2] !== 'images.4chan.org') { + return; + } + return $.ajax(url, { + onreadystatechange: (function() { + if (this.status === 404) { + return clearTimeout(timeoutID); + } + }) + }, { + type: 'head' + }); + }, + dialog: function() { + var controls, imageType, select; + + controls = $.el('div', { + id: 'imgControls', + innerHTML: "
" + }); + imageType = $.get('imageType', 'full'); + select = $('select', controls); + select.value = imageType; + ImageExpand.cb.typeChange.call(select); + $.on(select, 'change', $.cb.value); + $.on(select, 'change', ImageExpand.cb.typeChange); + $.on($('input', controls), 'click', ImageExpand.cb.all); + Style.rice(controls); + return $.prepend($.id('delform'), controls); + }, + resize: function() { + return ImageExpand.style.textContent = ".fitheight img[data-md5] + img {max-height:" + d.documentElement.clientHeight + "px;}"; + } + }; + + ImageHover = { + init: function() { + QuoteInline.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + if (!post.img || post.hasPDF) { + return; + } + return $.on(post.img, 'mouseover', ImageHover.mouseover); + }, + mouseover: function() { + var el; + + if (el = $.id('ihover')) { + if (el === UI.el) { + delete UI.el; + } + $.rm(el); + } + if (UI.el) { + return; + } + el = UI.el = $.el('img', { + id: 'ihover', + src: this.parentNode.href + }); + $.add(d.body, el); + $.on(el, 'load', ImageHover.load); + $.on(el, 'error', ImageHover.error); + $.on(this, 'mousemove', UI.hover); + return $.on(this, 'mouseout', ImageHover.mouseout); + }, + load: function() { + var style; + + if (!this.parentNode) { + return; + } + style = this.style; + return UI.hover({ + clientX: -45 + parseInt(style.left), + clientY: 120 + parseInt(style.top) + }); + }, + error: function() { + var src, timeoutID, url, + _this = this; + + src = this.src.split('/'); + if (!(src[2] === 'images.4chan.org' && (url = Redirect.image(src[3], src[5])))) { + if (g.dead) { + return; + } + url = "//images.4chan.org/" + src[3] + "/src/" + src[5]; + } + if ($.engine !== 'webkit' && url.split('/')[2] === 'images.4chan.org') { + return; + } + timeoutID = setTimeout((function() { + return _this.src = url; + }), 3000); + if ($.engine !== 'webkit' || url.split('/')[2] !== 'images.4chan.org') { + return; + } + return $.ajax(url, { + onreadystatechange: (function() { + if (this.status === 404) { + return clearTimeout(timeoutID); + } + }) + }, { + type: 'head' + }); + }, + mouseout: function() { + UI.hoverend(); + $.off(this, 'mousemove', UI.hover); + return $.off(this, 'mouseout', ImageHover.mouseout); + } + }; + + ImageReplace = { + init: function() { + if (g.BOARD === 'f') { + return; + } + QuoteInline.callbacks.push(this.node); + QuotePreview.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var el, href, img, type; + + img = post.img; + if (post.el.hidden || !img || /spoiler/.test(img.src)) { + return; + } + if (Conf["Replace " + ((type = ((href = img.parentNode.href).match(/\w{3}$/))[0].toUpperCase()) === 'PEG' ? 'JPG' : type)]) { + el = $.el('img'); + el.setAttribute('data-id', post.ID); + $.on(el, 'load', function() { + return img.src = el.src; + }); + return el.src = href; + } + } + }; + + Prefetch = { + init: function() { + if (g.BOARD === 'f') { + return; + } + return this.dialog(); + }, + dialog: function() { + var controls, first, input; + + controls = $.el('label', { + id: 'prefetch', + innerHTML: "Prefetch Images" + }); + input = $('input', controls); + $.on(input, 'change', Prefetch.change); + first = $.id('delform').firstElementChild; + if (first.id === 'imgControls') { + $.after(first, controls); + } else { + $.before(first, controls); + } + return Style.rice(controls); + }, + change: function() { + var thumb, _i, _len, _ref; + + $.off(this, 'change', Prefetch.change); + _ref = $$('a.fileThumb'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thumb = _ref[_i]; + $.el('img', { + src: thumb.href + }); + } + return Main.callbacks.push(Prefetch.node); + }, + node: function(post) { + var img; + + img = post.img; + if (post.el.hidden || !img) { + return; + } + return $.el('img', { + src: img.parentNode.href + }); + } + }; + + RevealSpoilers = { + init: function() { + QuotePreview.callbacks.push(this.node); + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var img, s; + + img = post.img; + if (!(img && /^Spoiler/.test(img.alt)) || post.isArchived) { + return; + } + img.removeAttribute('style'); + s = img.style; + s.maxHeight = s.maxWidth = /\bop\b/.test(post["class"]) ? '250px' : '125px'; + return img.src = "//thumbs.4chan.org" + (img.parentNode.pathname.replace(/src(\/\d+).+$/, 'thumb$1s.jpg')); + } + }; + + Sauce = { + init: function() { + var link, _i, _len, _ref; + + if (g.BOARD === 'f') { + return; + } + this.links = []; + _ref = Conf['sauces'].split('\n'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + if (link[0] === '#') { + continue; + } + this.links.push(this.createSauceLink(link.trim())); + } + if (!this.links.length) { + return; + } + return Main.callbacks.push(this.node); + }, + createSauceLink: function(link) { + var domain, el, href, m; + + link = link.replace(/(\$\d)/g, function(parameter) { + switch (parameter) { + case '$1': + return "' + (isArchived ? img.firstChild.src : 'http://thumbs.4chan.org' + img.pathname.replace(/src(\\/\\d+).+$/, 'thumb$1s.jpg')) + '"; + case '$2': + return "' + img.href + '"; + case '$3': + return "' + encodeURIComponent(img.firstChild.dataset.md5) + '"; + case '$4': + return g.BOARD; + default: + return parameter; + } + }); + domain = (m = link.match(/;text:(.+)$/)) ? m[1] : link.match(/(\w+)\.\w+\//)[1]; + href = link.replace(/;text:.+$/, ''); + href = Function('img', 'isArchived', "return '" + href + "'"); + el = $.el('a', { + target: '_blank', + textContent: domain + }); + return function(img, isArchived) { + var a; + + a = el.cloneNode(true); + a.href = href(img, isArchived); + return a; + }; + }, + node: function(post) { + var img, link, nodes, _i, _len, _ref; + + img = post.img; + if (!img) { + return; + } + img = img.parentNode; + nodes = []; + _ref = Sauce.links; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + nodes.push($.tn('\u00A0'), link(img, post.isArchived)); + } + return $.add(post.fileInfo, nodes); + } + }; + + Linkify = { + init: function() { + if (Conf['Embedding']) { + QuoteInline.callbacks.push(function(post) { + var embed, _i, _len, _ref; + + _ref = $$('.embed', post.blockquote); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + embed = _ref[_i]; + $.on(embed, 'click', Linkify.toggle); + } + }); + } + QuotePreview.callbacks.push(this.node); + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + regString: /(\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, + cypher: $.el('div'), + node: function(post) { + var a, child, cypher, cypherText, data, i, index, len, link, links, lookahead, name, next, node, nodes, snapshot, spoiler, text, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _results; + + snapshot = $.X('.//text()', post.blockquote); + cypher = Linkify.cypher; + i = -1; + len = snapshot.snapshotLength; + _results = []; + 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 (_i = 0, _len = links.length; _i < _len; _i++) { + link = links[_i]; + index = data.indexOf(link); + if (text = data.slice(0, index)) { + cypher.innerHTML = text; + _ref = __slice.call(cypher.childNodes); + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + child = _ref[_j]; + $.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; + _ref1 = __slice.call(cypher.childNodes); + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + child = _ref1[_k]; + $.add(nodes, child); + } + } + _results.push($.replace(node, nodes)); + } + return _results; + }, + 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)'; + } else { + el = (type = Linkify.types[this.getAttribute("data-service")]).el.call(this); + el.style.cssText = (style = type.style) ? style : "border: 0; width: " + ($.get('embedWidth', Config['embedWidth'])) + "px; height: " + ($.get('embedHeight', Config['embedHeight'])) + "px"; + this.textContent = '(unembed)'; + } + $.replace(embed, el); + return $.toggleClass(this, 'embedded'); + }, + types: { + YouTube: { + regExp: /.*(?:youtu.be\/|youtube.*v=|youtube.*\/embed\/|youtube.*\/v\/|youtube.*videos\/)([^#\&\?]*).*/, + el: function() { + return $.el('iframe', { + src: "//www.youtube.com/embed/" + this.name + }); + }, + 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 + }); + }, + 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('iframe', { + src: "http://www.liveleak.com/e/" + this.name + "?autostart=true" + }); + } + }, + audio: { + regExp: /(.*\.(mp3|ogg|wav))$/, + el: function() { + return $.el('audio', { + controls: 'controls', + preload: 'auto', + src: this.name + }); + } + }, + 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=" + (this.getAttribute('data-originalURL')) + "&color=" + (Style.colorToHex(Themes[Conf['theme']]['Background Color'])), { + div: div, + onloadend: function() { + return this.div.innerHTML = JSON.parse(this.responseText).html; + } + }, false); + return div; + } + }, + pastebin: { + regExp: /.*(?:pastebin.com\/)([^#\&\?]*).*/, + el: function() { + var div; + + return div = $.el('iframe', { + src: "http://pastebin.com/embed_iframe.php?i=" + this.name + }); + } + } + }, + embedder: function(a) { + var callbacks, embed, err, key, match, service, title, titles, type, _ref; + + if (!Conf['Embedding']) { + return [a]; + } + callbacks = function() { + var title; + + return a.textContent = (function() { + switch (this.status) { + case 200: + case 304: + title = "[" + (embed.getAttribute('data-service')) + "] " + (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]), + className: 'embed', + href: 'javascript:;', + textContent: '(embed)' + }); + embed.setAttribute('data-service', key); + embed.setAttribute('data-originalURL', a.href); + $.on(embed, 'click', Linkify.toggle); + if (Conf['Link Title'] && (service = type.title)) { + titles = $.get('CachedTitles', {}); + if (title = titles[match[1]]) { + a.textContent = title[0]; + embed.setAttribute('data-title', title[0]); + } else { + try { + $.cache(service.api.call(a), callbacks); + } catch (_error) { + err = _error; + a.innerHTML = "[" + key + "] Title Link Blocked (are you using NoScript?)"; + } + } + } + return [a, $.tn(' '), embed]; + } + return [a]; + } + }; + + ArchiveLink = { + init: function() { + var div, entry, key, type, _ref; + + div = $.el('div', { + textContent: 'Archive' + }); + entry = { + el: div, + open: function(post) { + var path; + + path = $('a[title="Highlight this post"]', post.el).pathname.split('/'); + if ((Redirect.to({ + board: path[1], + threadID: path[3], + postID: post.ID + })) === ("//boards.4chan.org/" + path[1] + "/")) { + return false; + } + post.info = [path[1], path[3]]; + return true; + }, + children: [] + }; + _ref = { + Post: 'apost', + Name: 'name', + Tripcode: 'tripcode', + 'E-mail': 'email', + Subject: 'subject', + Filename: 'filename', + 'Image MD5': 'md5' + }; + for (key in _ref) { + type = _ref[key]; + entry.children.push(this.createSubEntry(key, type)); + } + return Menu.addEntry(entry); + }, + createSubEntry: function(text, type) { + var el, open; + + el = $.el('a', { + textContent: text, + target: '_blank' + }); + open = function(post) { + var value; + + if (type === 'apost') { + el.href = Redirect.to({ + board: post.info[0], + threadID: post.info[1], + postID: post.ID + }); + return true; + } + value = Filter[type](post); + if (!value) { + return false; + } + return el.href = Redirect.to({ + board: post.info[0], + type: type, + value: value, + isSearch: true + }); + }; + return { + el: el, + open: open + }; + } + }; + + DeleteLink = { + init: function() { + var aImage, aPost, children, div; + + div = $.el('div', { + className: 'delete_link', + textContent: 'Delete' + }); + aPost = $.el('a', { + className: 'delete_post', + href: 'javascript:;' + }); + aImage = $.el('a', { + className: 'delete_image', + href: 'javascript:;' + }); + children = []; + children.push({ + el: aPost, + open: function() { + aPost.textContent = 'Post'; + $.on(aPost, 'click', DeleteLink["delete"]); + return true; + } + }); + children.push({ + el: aImage, + open: function(post) { + if (!post.img) { + return false; + } + aImage.textContent = 'Image'; + $.on(aImage, 'click', DeleteLink["delete"]); + return true; + } + }); + Menu.addEntry({ + el: div, + open: function(post) { + var node, seconds; + + if (post.isArchived) { + return false; + } + node = div.firstChild; + if (seconds = DeleteLink.cooldown[post.ID]) { + node.textContent = "Delete (" + seconds + ")"; + DeleteLink.cooldown.el = node; + } else { + node.textContent = 'Delete'; + delete DeleteLink.cooldown.el; + } + return true; + }, + children: children + }); + return $.on(d, 'QRPostSuccessful', this.cooldown.start); + }, + "delete": function() { + var board, form, id, m, menu, pwd, self; + + menu = $.id('menu'); + id = menu.dataset.id; + if (DeleteLink.cooldown[id]) { + return; + } + $.off(this, 'click', DeleteLink["delete"]); + this.textContent = 'Deleting...'; + pwd = (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : $.id('delPassword').value; + board = $('a[title="Highlight this post"]', $.id(menu.dataset.rootid)).pathname.split('/')[1]; + self = this; + form = { + mode: 'usrdel', + onlyimgdel: /\bdelete_image\b/.test(this.className), + pwd: pwd + }; + form[id] = 'delete'; + return $.ajax($.id('delform').action.replace("/" + g.BOARD + "/", "/" + board + "/"), { + onload: function() { + return DeleteLink.load(self, this.response); + }, + onerror: function() { + return DeleteLink.error(self); + } + }, { + form: $.formData(form) + }); + }, + load: function(self, html) { + var doc, msg, s; + + doc = d.implementation.createHTMLDocument(''); + doc.documentElement.innerHTML = html; + if (doc.title === '4chan - Banned') { + s = 'Banned!'; + } else if (msg = doc.getElementById('errmsg')) { + s = msg.textContent; + $.on(self, 'click', DeleteLink["delete"]); + } else { + s = 'Deleted'; + } + return self.textContent = s; + }, + error: function(self) { + self.textContent = 'Connection error, please retry.'; + return $.on(self, 'click', DeleteLink["delete"]); + }, + cooldown: { + start: function(e) { + var seconds; + + seconds = g.BOARD === 'q' ? 600 : 30; + return DeleteLink.cooldown.count(e.detail.postID, seconds, seconds); + }, + count: function(postID, seconds, length) { + var el; + + if (!((0 <= seconds && seconds <= length))) { + return; + } + setTimeout(DeleteLink.cooldown.count, 1000, postID, seconds - 1, length); + el = DeleteLink.cooldown.el; + if (seconds === 0) { + if (el != null) { + el.textContent = 'Delete'; + } + delete DeleteLink.cooldown[postID]; + delete DeleteLink.cooldown.el; + return; + } + if (el != null) { + el.textContent = "Delete (" + seconds + ")"; + } + return DeleteLink.cooldown[postID] = seconds; + } + } + }; + + DownloadLink = { + init: function() { + var a; + + if ($.el('a').download == null) { + return; + } + a = $.el('a', { + className: 'download_link', + textContent: 'Download file' + }); + return Menu.addEntry({ + el: a, + open: function(post) { + var fileText; + + if (!post.img) { + return false; + } + a.href = post.img.parentNode.href; + fileText = post.fileInfo.firstElementChild; + a.download = Conf['File Info Formatting'] ? fileText.dataset.filename : $('span', fileText).title; + return true; + } + }); + } + }; + + EmbedLink = { + init: function() { + var a; + + a = $.el('a', { + className: 'embed_link', + textContent: 'Embed all in post' + }); + $.on(a, 'click', EmbedLink.toggle); + return Menu.addEntry({ + el: a, + open: function(post) { + var quote; + + if ($('.embed', (quote = post.blockquote))) { + if ($('.embedded', quote)) { + this.el.textContent = 'Unembed all in post'; + EmbedLink[post.id] = true; + } + $.on(this.el, 'click', this.toggle); + return true; + } + return false; + } + }); + }, + toggle: function() { + var embed, id, menu, root, _i, _len, _ref; + + menu = $.id('menu'); + id = menu.dataset.id; + root = $.id("m" + id); + _ref = $$('.embed', root); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + embed = _ref[_i]; + if ((!EmbedLink[id] && embed.className.contains('embedded')) || (EmbedLink[id] && !embed.className.contains('embedded'))) { + continue; + } + embed.click(); + } + return EmbedLink[id] = !EmbedLink[id]; + } + }; + + Menu = { + entries: [], + init: function() { + this.a = $.el('a', { + className: 'menu_button', + href: 'javascript:;', + innerHTML: '[]' + }); + this.el = $.el('div', { + className: 'reply dialog', + id: 'menu', + tabIndex: 0 + }); + $.on(this.el, 'click', function(e) { + return e.stopPropagation(); + }); + $.on(this.el, 'keydown', this.keybinds); + $.on(d, 'AddMenuEntry', function(e) { + return Menu.addEntry(e.detail); + }); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var a; + + if (post.isInlined && !post.isCrosspost) { + a = $('.menu_button', post.el); + } else { + a = Menu.a.cloneNode(true); + $.add($('.postInfo', post.el), [$.tn('\u00A0'), a]); + } + return $.on(a, 'click', Menu.toggle); + }, + toggle: function(e) { + var lastOpener, post; + + e.preventDefault(); + e.stopPropagation(); + if (Menu.el.parentNode) { + lastOpener = Menu.lastOpener; + Menu.close(); + if (lastOpener === this) { + return; + } + } + Menu.lastOpener = this; + post = /\bhidden_thread\b/.test(this.parentNode.className) ? $.x('ancestor::div[parent::div[@class="board"]]/child::div[contains(@class,"opContainer")]', this) : $.x('ancestor::div[contains(@class,"postContainer")][1]', this); + return Menu.open(this, Main.preParse(post)); + }, + open: function(button, post) { + var bLeft, bRect, bTop, el, entry, funk, mRect, _i, _len, _ref; + + el = Menu.el; + el.setAttribute('data-id', post.ID); + el.setAttribute('data-rootid', post.root.id); + funk = function(entry, parent) { + var child, children, subMenu, _i, _len; + + children = entry.children; + if (!entry.open(post)) { + return; + } + $.add(parent, entry.el); + if (!children) { + return; + } + if (subMenu = $('.subMenu', entry.el)) { + $.rm(subMenu); + } + subMenu = $.el('div', { + className: 'reply dialog subMenu' + }); + $.add(entry.el, subMenu); + for (_i = 0, _len = children.length; _i < _len; _i++) { + child = children[_i]; + funk(child, subMenu); + } + }; + _ref = Menu.entries; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + entry = _ref[_i]; + funk(entry, el); + } + Menu.focus($('.entry', Menu.el)); + $.on(d, 'click', Menu.close); + $.add(d.body, el); + mRect = el.getBoundingClientRect(); + bRect = button.getBoundingClientRect(); + bTop = d.documentElement.scrollTop + d.body.scrollTop + bRect.top; + bLeft = d.documentElement.scrollLeft + d.body.scrollLeft + bRect.left; + el.style.top = bRect.top + bRect.height + mRect.height < d.documentElement.clientHeight ? bTop + bRect.height + 2 + 'px' : bTop - mRect.height - 2 + 'px'; + el.style.left = bRect.left + mRect.width < d.documentElement.clientWidth ? bLeft + 'px' : bLeft + bRect.width - mRect.width + 'px'; + return el.focus(); + }, + close: function() { + var el, focused, _i, _len, _ref; + + el = Menu.el; + $.rm(el); + _ref = $$('.focused.entry', el); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + focused = _ref[_i]; + $.rmClass(focused, 'focused'); + } + el.innerHTML = null; + el.removeAttribute('style'); + delete Menu.lastOpener; + delete Menu.focusedEntry; + return $.off(d, 'click', Menu.close); + }, + keybinds: function(e) { + var el, next, subMenu; + + el = Menu.focusedEntry; + switch (Keybinds.keyCode(e) || e.keyCode) { + case 'Esc': + Menu.lastOpener.focus(); + Menu.close(); + break; + case 13: + case 32: + el.click(); + break; + case 'Up': + if (next = el.previousElementSibling) { + Menu.focus(next); + } + break; + case 'Down': + if (next = el.nextElementSibling) { + Menu.focus(next); + } + break; + case 'Right': + if ((subMenu = $('.subMenu', el)) && (next = subMenu.firstElementChild)) { + Menu.focus(next); + } + break; + case 'Left': + if (next = $.x('parent::*[contains(@class,"subMenu")]/parent::*', el)) { + Menu.focus(next); + } + break; + default: + return; + } + e.preventDefault(); + return e.stopPropagation(); + }, + focus: function(el) { + var focused, _i, _len, _ref; + + if (focused = $.x('parent::*/child::*[contains(@class,"focused")]', el)) { + $.rmClass(focused, 'focused'); + } + _ref = $$('.focused', el); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + focused = _ref[_i]; + $.rmClass(focused, 'focused'); + } + Menu.focusedEntry = el; + return $.addClass(el, 'focused'); + }, + addEntry: function(entry) { + var funk; + + funk = function(entry) { + var child, children, el, _i, _len; + + el = entry.el, children = entry.children; + $.addClass(el, 'entry'); + $.on(el, 'focus mouseover', function(e) { + e.stopPropagation(); + return Menu.focus(this); + }); + if (!children) { + return; + } + $.addClass(el, 'hasSubMenu'); + for (_i = 0, _len = children.length; _i < _len; _i++) { + child = children[_i]; + funk(child); + } + }; + funk(entry); + return Menu.entries.push(entry); + } + }; + + ReplyHideLink = { + init: function() { + var a; + + if (!Conf['Reply Hiding']) { + Main.callbacks.push(this.node); + } + a = $.el('a', { + className: 'reply_hide_link', + href: 'javascript:;', + textContent: 'Hide / Restore Post' + }); + $.on(a, 'click', function() { + var button, id, menu, root; + + menu = Menu.el; + id = menu.dataset.id; + root = $.id("pc" + id); + button = root.firstChild; + ReplyHiding.toggle(button, root, id); + return Menu.close(); + }); + return Menu.addEntry({ + el: a, + open: function(post) { + if (post.isInlined || post.el.classList.contains('op')) { + return false; + } else { + return true; + } + } + }); + }, + node: function(post) { + if (post.isInlined || post.ID === post.threadID) { + return; + } + if (post.ID in g.hiddenReplies) { + return ReplyHiding.hide(post.root); + } + } + }; + + ReportLink = { + init: function() { + var a; + + a = $.el('a', { + className: 'report_link', + href: 'javascript:;', + textContent: 'Report this post' + }); + $.on(a, 'click', this.report); + return Menu.addEntry({ + el: a, + open: function(post) { + return post.isArchived === false; + } + }); + }, + report: function() { + var a, id, set, url; + + a = $('a[title="Highlight this post"]', $.id(this.parentNode.dataset.rootid)); + url = "//sys.4chan.org/" + (a.pathname.split('/')[1]) + "/imgboard.php?mode=report&no=" + this.parentNode.dataset.id; + 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); + } + }; + + ThreadHideLink = { + init: function() { + var a; + + if (!Conf['Thread Hiding']) { + $.ready(this.iterate); + } + a = $.el('a', { + className: 'thread_hide_link', + href: 'javascript:;', + textContent: 'Hide / Restore Thread' + }); + $.on(a, 'click', function() { + var menu, thread; + + menu = Menu.el; + thread = $.id("t" + menu.dataset.id); + ThreadHiding.toggle(thread); + return Menu.close(); + }); + return Menu.addEntry({ + el: a, + open: function(post) { + if (post.el.classList.contains('op')) { + return true; + } else { + return false; + } + } + }); + }, + iterate: function() { + var thread, _i, _len, _ref; + + ThreadHiding.hiddenThreads = $.get("hiddenThreads/" + g.BOARD + "/", {}); + _ref = $$('.thread'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thread = _ref[_i]; + if (thread.id.slice(1) in ThreadHiding.hiddenThreads) { + ThreadHiding.hide(thread); + } + } + } + }; + + Favicon = { + init: function() { + var href; + + if (this.el) { + return; + } + this.el = $('link[rel="shortcut icon"]', d.head); + this.el.type = 'image/x-icon'; + href = this.el.href; + this.SFW = /ws.ico$/.test(href); + this["default"] = href; + return this["switch"](); + }, + "switch": function() { + this.unreadDead = this.unreadSFW = this.unreadNSFW = Icons.header.png; + switch (Conf['favicon']) { + case 'ferongr': + this.unreadDead += 'BAAAAAQBAMAAADt3eJSAAAAD1BMVEWrVlbpCwJzBQD/jIzlCgLerRyUAAAAAXRSTlMAQObYZgAAAFhJREFUeF5Fi8ENw0AMw6gNZHcCXbJAkw2C7D9Tz68KJKAP+a8MKtAK9DJ9X9ZxB+WT/rbpt9L1Bq3lEapGgBqY3hvYfTagY6rLKHPa6DzTz2PothJAApsfXPUIxXEAtJ4AAAAASUVORK5CYII='; + this.unreadNSFW += 'BAAAAAQCAMAAAAoLQ9TAAAAFVBMVEWJq3ho/gooegBJ3ABU/QBW/wHV/8Hz/s/JAAAAAnRSTlMAscr1TiIAAABVSURBVBjTZY5LDgAxCEKNovc/8mgozq9d+CQRMPs/AC+Auz8BXlUfyGzoPZN7xNDoEVR0u2Zy3ziTsEV0oj5eTCn1KaVQGTpCHiH64wzegKZYV8M9Lia0Aj8l3NBcAAAAAElFTkSuQmCC'; + this.unreadSFW += 'BAAAAAQCAMAAAAoLQ9TAAAAFVBMVEUAS1QAnbAAsseF5vMA2fMA1/EAb37J/JegAAAAA3RSTlMAmPz35Xr7AAAAUUlEQVQY02WOCQ4AIQgDSUr5/5Pl9NjVhE6bYBX5H5IP0MxuoAH4gKqDe9XyZFDkPlirt+bjjyae2X2cWR7VgvkPpqWSoA60g7wtMsmWTIRHFpbuAyerdnAvAAAAAElFTkSuQmCC'; + break; + case 'xat-': + this.unreadDead += 'BAAAAAQBAMAAADt3eJSAAAAG1BMVEXzZmTzZGLzZGLzZGIAAAD/AAD/lJX4bWz/0tMaHcyBAAAABHRSTlMAm8l+71ABtwAAAFpJREFUeF5ty9EJgDAQA9B8dIGKC1gcoQNUm+ICvRWKAwjdwLklCAXBfD2SO/yE2ftIwFkNoVgCih2XVTWCGrI1EsDUz7svH2gSoo4zxruwry/KNlfBOSAljDwk8xZR3HxWZAAAAABJRU5ErkJggg=='; + this.unreadNSFW += 'BAAAAAQBAMAAADt3eJSAAAAIVBMVEVirGJdqF9dqF9dqF9dqF9082JmzDOq/5oAAACR/33Z/9JztnAYAAAABXRSTlMAyZ2Ses9C/CQAAABjSURBVHhebcsxDkBAFATQKbddGq1otJxij8AFJnsFqiVr8x1AuIFr8iMRhaleZv7HTyS2lRPA0FubGIDEpaPXhutBbUT2QQRA2Y/nln3R6JQDcHoc8b4rpuJBmmuvMAYIAW8utWkfv3LWVYEAAAAASUVORK5CYII='; + this.unreadSFW += 'BAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAABde6Zde6Zde6Zde6aQz/8umMNquPcAAADQ6/+nHRY3AAAABXRSTlMAyZ16kvc074oAAABfSURBVHhebcuxCYAwFIThv0yrWNgKFo6QVnewcIFHNohlNBDfAu4rDyFYeNXHHcdPNC+jV3ASmqZIgiLXLsEagzWq66oKDHG7Y/vFbFMHeHtl6t1w9C/KOQWDc5ASNQ9glx6N+XFPbgAAAABJRU5ErkJggg=='; + break; + case 'Mayhem': + this.unreadDead += 'BAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAAAAAAAAAAAAAAAAAAATExMBAQEAAAD/AAD///+gujywAAAACHRSTlMPJRcbLzEcM37+zgIAAAB9SURBVHheRcu9DoJAEATgcX0B+Wns7uAFRGgoCVhQ0phca8K77JXEI+6+rUujU32ZzOAXanLAFw5e91cdNEfPcVmF3+iEt8BxtOaANV51WdU2VE5FMw0O1B0YDaUOD30aZk6Bd4eT8Mfulz/OIinEeANd5yxLmwPqtqraO75dUSZT40SwmAAAAABJRU5ErkJggg=='; + this.unreadNSFW += 'BAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9mzDPTSEsdAAAACHRSTlMaDCUeLg4zKeknoAsAAACHSURBVHheJcqxCsIwEMbxLw2CY27oLiSCYwioeyjS0Sp9Ah26d+koUtrkDXJv6xXhhj+/70B9R1T3BBN8V2urUKXV6ykdsOcSXeYPLpnXictLZAuRKqXokvzc3duGW9zBXBsbmlHBuG2KEi3PcgrPzMvA5YzHP44ieW6LiDkNNixfBYIHNOgHHmcn+8KfmKQAAAAASUVORK5CYII='; + this.unreadSFW += 'BAAAAAQBAMAAADt3eJSAAAAG1BMVEUAAAAAAAABAwMAAAAAAAAAAAAAAAAumMP///+/4sWwAAAAB3RSTlMVJxQdMSkcONaevAAAAIJJREFUeF4lirEKgzAURa9PcBai4PjI0NlA6y61kFXawVHq4h+8rEI0+ewmdLqHcw80SGtOw2Yg3hShiGdfLrHGLm5ug1y4Bzk6cc9kMiRTxDi3MTVVMykzjSv48VLm8yZwk6+RcFvEWzm/KEMG16P4Q51M8NYlw51Vxh8EXQ3AtuofzNIkEO8Bb0kAAAAASUVORK5CYII='; + break; + case '4chanJS': + this.unreadDead += 'BAAAAAQCAMAAAAoLQ9TAAAAD1BMVEUBAAAAAAD/AABnZ2f///8nFk05AAAAAXRSTlMAQObYZgAAAEFJREFUeNqNjgEKACAMAjvX/98cAkkxgmSgO8Bt/Ai4ApJ6KKhzF3OiEMDASrGB/QWgPEHsUpN+Ng9xAETMYhDrWmeHAMcmvycWAAAAAElFTkSuQmCC'; + this.unreadNSFW += 'BAAAAAQCAMAAAAoLQ9TAAAAElBMVEUBAAAAAABmzDNlyjJnZ2f///+6o7dfAAAAAXRSTlMAQObYZgAAAERJREFUeF6NjkEKADEIA51o///lJZfQxUsHITogWi8AvwZJuxmYa25xDooBLEwOWFTYAsYVhdorLZt9Ng9xCUTCUCQ2H3F4ANrZ2WNiAAAAAElFTkSuQmCC'; + this.unreadSFW += 'BAAAAAQCAMAAAAoLQ9TAAAAD1BMVEUBAAAAAAAul8NnZ2f////82iC9AAAAAXRSTlMAQObYZgAAAEFJREFUeNqNjgEKACAMAjvX/98cAkkxgmSgO8Bt/Ai4ApJ6KKhzF3OiEMDASrGB/QWgPEHsUpN+Ng9xAETMYhDrWmeHAMcmvycWAAAAAElFTkSuQmCC'; + break; + case 'Original': + this.unreadDead += 'BAAAAAQCAMAAAAoLQ9TAAAAD1BMVEWYmJiYmJj///8AAAD/AACKRYF4AAAAAnRSTlMAvLREMp8AAABFSURBVBjTbY7BDgAgCEIZ+P/f3MGgXHkR3wYCvENyCEq6BVVVPzFvg03sTZjT8w4GKWKL+8ih7jPffoEaKB52KJMKnrUA5kwBxesBDg0AAAAASUVORK5CYII='; + this.unreadNSFW += 'BAAAAAQCAMAAAAoLQ9TAAAADFBMVEWYmJj///9mzDMAAAADduU3AAAAAXRSTlMAQObYZgAAAERJREFUGNNtjkESACAIAkH+/+cOBuWUF3FnQIB3SA5BSbegquon5m2wib0Jc3rewSBFbHEfOdR95tsvUAPFww5lUsGzFpsgATH7KrmBAAAAAElFTkSuQmCC'; + this.unreadSFW += 'BAAAAAQCAMAAAAoLQ9TAAAADFBMVEWYmJj///8umMMAAACriBKaAAAAAXRSTlMAQObYZgAAAERJREFUGNNtjkESACAIAkH+/+cOBuWUF3FnQIB3SA5BSbegquon5m2wib0Jc3rewSBFbHEfOdR95tsvUAPFww5lUsGzFpsgATH7KrmBAAAAAElFTkSuQmCC'; + } + this.unread = this.SFW ? this.unreadSFW : this.unreadNSFW; + }, + empty: 'data:image/gif;base64,R0lGODlhEAAQAJEAAAAAAP///9vb2////yH5BAEAAAMALAAAAAAQABAAAAIvnI+pq+D9DBAUoFkPFnbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==', + dead: 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAP8AAP///////yH5BAEKAAIALAAAAAAQABAAAAIvlI+pq+D9DAgUoFkPDlbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==' + }; + + IDColor = { + init: function() { + QuotePreview.callbacks.push(this.node); + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var str, uid; + + if (!(uid = $('.postInfo .hand', post.el))) { + return; + } + str = uid.textContent; + if (uid.nodeName === 'SPAN') { + uid.style.cssText = IDColor.apply.call(str); + } + if (!IDColor.highlight[str]) { + IDColor.highlight[str] = []; + } + if (str === $.get("highlightedID/" + g.BOARD + "/")) { + IDColor.highlight.current.push(post); + $.addClass(post.el, 'highlight'); + } + IDColor.highlight[str].push(post); + return $.on(uid, 'click', function() { + return IDColor.idClick(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;" : "white;"); + }, + 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; + }, + highlight: { + current: [] + }, + idClick: function(str) { + var last, post, value, _i, _j, _len, _len1, _ref, _ref1; + + _ref = this.highlight.current; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + post = _ref[_i]; + $.rmClass(post.el, 'highlight'); + } + last = $.get(value = "highlightedID/" + g.BOARD + "/", false); + if (str === last) { + this.highlight.current = []; + return $["delete"](value); + } + _ref1 = this.highlight[str]; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + post = _ref1[_j]; + if (post.isInlined) { + continue; + } + $.addClass(post.el, 'highlight'); + this.highlight.current.push(post); + } + return $.set(value, str); + } + }; + + MarkOwn = { + init: function() { + Main.callbacks.push(this.node); + return this.posts = $.get('ownedPosts', {}); + }, + node: function(post) { + var owned, posts, quote, _i, _len, _ref; + + posts = MarkOwn.posts; + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (!(quote.hash && posts[quote.hash.slice(2)])) { + continue; + } + owned = true; + $.addClass(quote, 'ownpost'); + quote.textContent += " (You)"; + } + if (owned) { + $.addClass(post.el, 'quotedYou'); + } + } + }; + + ThreadStats = { + init: function() { + var container, dialog, move; + + ThreadStats.postcount = $.el('span', { + id: 'postcount', + textContent: '0' + }); + ThreadStats.imagecount = $.el('span', { + id: 'imagecount', + textContent: '0' + }); + if (Conf['Thread Updater'] && (move = Updater.count.parentElement)) { + container = $.el('span'); + $.add(container, [$.tn('['), ThreadStats.postcount, $.tn(' / '), ThreadStats.imagecount, $.tn('] ')]); + $.prepend(move, container); + } else { + dialog = UI.dialog('stats', 'bottom: 0; left: 0;', '
'); + dialog.className = 'dialog'; + $.add($(".move", dialog), ThreadStats.postcount); + $.add($(".move", dialog), $.tn(" / ")); + $.add($(".move", dialog), ThreadStats.imagecount); + $.add(d.body, dialog); + } + this.posts = this.images = 0; + this.imgLimit = (function() { + switch (g.BOARD) { + case 'a': + case 'b': + case 'v': + case 'co': + case 'mlp': + return 251; + case 'vg': + return 376; + default: + return 151; + } + })(); + return Main.callbacks.push(this.node); + }, + node: function(post) { + if (post.isInlined) { + return; + } + ThreadStats.postcount.textContent = ++ThreadStats.posts; + if (!post.img) { + return; + } + ThreadStats.imagecount.textContent = ++ThreadStats.images; + if (ThreadStats.images > ThreadStats.imgLimit) { + return $.addClass(ThreadStats.imagecount, 'warning'); + } + } + }; + + TitlePost = { + init: function() { + return d.title = Get.title(); + } + }; + + Unread = { + init: function() { + this.title = d.title; + $.on(d, 'QRPostSuccessful', this.post); + this.update(); + $.on(window, 'scroll', Unread.scroll); + $.on(window, 'focus', Unread.focus); + return Main.callbacks.push(this.node); + }, + replies: [], + foresee: [], + post: function(e) { + return Unread.foresee.push(e.detail.postID); + }, + node: function(post) { + var count, el, index, root; + + if ((index = Unread.foresee.indexOf(post.ID)) !== -1) { + Unread.foresee.splice(index, 1); + return; + } + el = post.el, root = post.root; + if (el.hidden || /\bop\b/.test(post["class"]) || post.isInlined) { + return; + } + count = Unread.replies.push(el); + return Unread.update(count === 1); + }, + focus: function() { + if (Unread.replies !== 0) { + return Unread.count(); + } + }, + scroll: function() { + if (!($.hidden() || Unread.replies === 0)) { + return Unread.count(); + } + }, + count: function() { + var bottom, height, i, reply, _i, _len, _ref; + + height = d.documentElement.clientHeight; + _ref = Unread.replies; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + reply = _ref[i]; + bottom = reply.getBoundingClientRect().bottom; + if (bottom > height) { + break; + } + } + if (i === 0) { + return; + } + Unread.replies = Unread.replies.slice(i); + return Unread.update(Unread.replies.length === 0); + }, + setTitle: function(count) { + if (this.scheduled) { + clearTimeout(this.scheduled); + delete Unread.scheduled; + this.setTitle(count); + return; + } + return this.scheduled = setTimeout((function() { + return d.title = "(" + count + ") " + Unread.title; + }), 5); + }, + update: function(updateFavicon) { + var count; + + if (!g.REPLY) { + return; + } + count = this.replies.length; + if (Conf['Unread Count']) { + this.setTitle(count); + } + if (!(Conf['Unread Favicon'] && updateFavicon)) { + return; + } + if ($.engine === 'presto') { + $.rm(Favicon.el); + } + Favicon.el.href = g.dead ? count ? Favicon.unreadDead : Favicon.dead : count ? Favicon.unread : Favicon["default"]; + if (g.dead) { + $.addClass(Favicon.el, 'dead'); + } else { + $.rmClass(Favicon.el, 'dead'); + } + if (count) { + $.addClass(Favicon.el, 'unread'); + } else { + $.rmClass(Favicon.el, 'unread'); + } + if ($.engine !== 'webkit') { + return $.add(d.head, Favicon.el); + } + } + }; + + Updater = { + init: function() { + var checkbox, checked, dialog, html, input, name, title, _i, _len, _ref; + + html = '
'; + checkbox = Config.updater.checkbox; + for (name in checkbox) { + title = checkbox[name][1]; + checked = Conf[name] ? 'checked' : ''; + html += "
"; + } + checked = Conf['Auto Update'] ? 'checked' : ''; + html += "
"; + dialog = UI.dialog('updater', 'bottom: 0; right: 0;', html); + this.count = $('#count', dialog); + this.timer = $('#timer', dialog); + this.thread = $.id("t" + g.THREAD_ID); + this.save = []; + this.checkPostCount = 0; + this.unsuccessfulFetchCount = 0; + this.lastModified = '0'; + _ref = $$('input', dialog); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + input = _ref[_i]; + if (input.type === 'checkbox') { + $.on(input, 'click', $.cb.checked); + } + switch (input.name) { + case 'Scroll BG': + $.on(input, 'click', this.cb.scrollBG); + this.cb.scrollBG.call(input); + break; + case 'Verbose': + $.on(input, 'click', this.cb.verbose); + this.cb.verbose.call(input); + break; + case 'Auto Update This': + $.on(input, 'click', this.cb.autoUpdate); + this.cb.autoUpdate.call(input); + break; + case 'Interval': + case 'BGInterval': + case "Interval_" + g.BOARD: + case "BGInterval_" + g.BOARD: + input.value = Conf[input.name]; + $.on(input, 'change', this.cb.interval); + this.cb.interval.call(input); + break; + case 'Update Now': + $.on(input, 'click', this.update); + } + } + Style.rice(dialog); + $.add(d.body, dialog); + $.on(d, 'QRPostSuccessful', this.cb.post); + return $.on(d, 'visibilitychange ovisibilitychange mozvisibilitychange webkitvisibilitychange', this.cb.visibility); + }, + /* + beep1.wav + http://freesound.org/people/pierrecartoons1979/sounds/90112 + + This work is licensed under the Attribution Noncommercial License. + http://creativecommons.org/licenses/by-nc/3.0/ + */ + + audio: $.el('audio', { + src: '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: { + post: function() { + if (!Conf['Auto Update This']) { + return; + } + Updater.unsuccessfulFetchCount = 0; + return setTimeout(Updater.update, 500); + }, + checkpost: function(status) { + if (!(status === 404 || Updater.foundPost || Updater.checkPostCount >= 10)) { + return setTimeout(Updater.update, ++Updater.checkPostCount * 500); + } + Updater.checkPostCount = 0; + delete Updater.foundPost; + return delete Updater.postID; + }, + visibility: function() { + if ($.hidden()) { + return; + } + Updater.unsuccessfulFetchCount = 0; + if (Updater.timer.textContent < (Conf['Interval per board'] ? -Conf['Interval_' + g.BOARD] : -Conf['Interval'])) { + return Updater.set('timer', -Updater.getInterval()); + } + }, + interval: function() { + var val; + + val = parseInt(this.value, 10); + this.value = val > 0 ? val : 30; + $.cb.value.call(this); + return Updater.set('timer', -Updater.getInterval()); + }, + verbose: function() { + if (Conf['Verbose']) { + Updater.set('count', '+0'); + return Updater.timer.hidden = false; + } else { + Updater.set('count', '+0'); + Updater.count.className = ''; + return Updater.timer.hidden = true; + } + }, + autoUpdate: function() { + if (Conf['Auto Update This'] = this.checked) { + return Updater.timeoutID = setTimeout(Updater.timeout, 1000); + } else { + return clearTimeout(Updater.timeoutID); + } + }, + scrollBG: function() { + return Updater.scrollBG = this.checked ? function() { + return true; + } : function() { + return !$.hidden(); + }; + }, + load: function() { + switch (this.status) { + case 404: + Updater.set('timer', ''); + Updater.set('count', 404); + Updater.count.className = 'warning'; + clearTimeout(Updater.timeoutID); + g.dead = true; + if (Conf['Unread Count']) { + Unread.title = Unread.title.match(/^.+-/)[0] + ' 404'; + } else { + d.title = d.title.match(/^.+-/)[0] + ' 404'; + } + Unread.update(true); + QR.abort(); + break; + case 0: + case 304: + /* + 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. + */ + + Updater.unsuccessfulFetchCount++; + Updater.set('timer', -Updater.getInterval()); + if (Conf['Verbose']) { + Updater.set('count', '+0'); + Updater.count.className = null; + } + break; + case 200: + Updater.lastModified = this.getResponseHeader('Last-Modified'); + Updater.cb.update(JSON.parse(this.response).posts); + Updater.set('timer', -Updater.getInterval()); + break; + default: + Updater.unsuccessfulFetchCount++; + Updater.set('timer', -Updater.getInterval()); + if (Conf['Verbose']) { + Updater.set('count', this.statusText); + Updater.count.className = 'warning'; + } + } + if (Updater.postID) { + Updater.cb.checkpost(this.status); + } + return delete Updater.request; + }, + update: function(posts) { + var count, frag, id, lastPost, node, nodes, post, scroll, spoilerRange, _i, _len, _ref; + + if (spoilerRange = posts[0].custom_spoiler) { + Build.spoilerRange[g.BOARD] = spoilerRange; + } + lastPost = Updater.thread.lastElementChild; + id = +lastPost.id.slice(2); + nodes = (function() { + var _i, _len, _ref, _results; + + _ref = posts.reverse(); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + post = _ref[_i]; + if (post.no <= id) { + break; + } + if (Updater.postID) { + if (("" + post.no) === Updater.postID) { + Updater.foundPost = true; + } + } + _results.push(Build.postFromObject(post, g.BOARD)); + } + return _results; + })(); + count = nodes.length; + if (Conf['Verbose']) { + Updater.set('count', "+" + count); + Updater.count.className = count ? 'new' : null; + } + if (count) { + if (Conf['Beep'] && $.hidden() && (Unread.replies.length === 0)) { + Updater.audio.play(); + } + Updater.unsuccessfulFetchCount = 0; + } else { + Updater.unsuccessfulFetchCount++; + return; + } + scroll = Conf['Scrolling'] && Updater.scrollBG() && lastPost.getBoundingClientRect().bottom - d.documentElement.clientHeight < 25; + _ref = nodes.reverse(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + frag = $.frag(); + $.add(frag, node); + Main.node(Main.preParse(node)); + $.add(Updater.thread, frag); + } + if (scroll && (nodes != null)) { + return nodes[0].scrollIntoView(); + } + } + }, + set: function(name, text) { + var el, node; + + el = Updater[name]; + if (node = el.firstChild) { + return node.data = text; + } else { + return el.textContent = text; + } + }, + getInput: function(input) { + var i, number, _i, _len, _results; + + while ((i = input.length) < 10) { + input[i] = input[i - 1]; + } + _results = []; + for (_i = 0, _len = input.length; _i < _len; _i++) { + number = input[_i]; + _results.push(parseInt(number, 10)); + } + return _results; + }, + getInterval: function() { + var count, i, increase, increaseString, j, string; + + string = "Interval" + (Conf['Interval per board'] ? "_" + g.BOARD : ""); + increaseString = "updateIncrease"; + if ($.hidden()) { + string = "BG" + string; + increaseString += "B"; + } + i = +Conf[string]; + j = (count = this.unsuccessfulFetchCount) > 9 ? 9 : count; + return (Conf['Optional Increase'] ? (i > (increase = Updater.getInput(Conf[increaseString].split(','))[j]) ? i : increase) : i); + }, + timeout: function() { + var n; + + Updater.timeoutID = setTimeout(Updater.timeout, 1000); + n = 1 + parseInt(Updater.timer.firstChild.data, 10); + if (n === 0) { + return Updater.update(); + } else if (n >= Updater.getInterval()) { + Updater.unsuccessfulFetchCount++; + Updater.set('count', 'Retry'); + Updater.count.className = null; + return Updater.update(); + } else { + return Updater.set('timer', n); + } + }, + update: function() { + var request, url; + + Updater.set('timer', 0); + request = Updater.request; + if (request) { + request.onloadend = null; + request.abort(); + } + url = "//api.4chan.org/" + g.BOARD + "/res/" + g.THREAD_ID + ".json"; + return Updater.request = $.ajax(url, { + onloadend: Updater.cb.load + }, { + headers: { + 'If-Modified-Since': Updater.lastModified + } + }); + } + }; + + Watcher = { + init: function() { + var favicon, html, input, _i, _len, _ref; + + html = '
Thread Watcher
'; + this.dialog = UI.dialog('watcher', 'top: 50px; left: 0px;', html); + $.add(d.body, this.dialog); + _ref = $$('.op input'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + input = _ref[_i]; + favicon = $.el('img', { + className: 'favicon' + }); + $.on(favicon, 'click', this.cb.toggle); + $.before(input, favicon); + } + if (g.THREAD_ID === $.get('autoWatch', 0)) { + this.watch(g.THREAD_ID); + $["delete"]('autoWatch'); + } else { + this.refresh(); + } + $.on(d, 'QRPostSuccessful', this.cb.post); + return $.sync('watched', this.refresh); + }, + refresh: function(watched) { + var board, div, favicon, id, link, nodes, props, watchedBoard, x, _i, _j, _len, _len1, _ref, _ref1, _ref2; + + watched || (watched = $.get('watched', {})); + nodes = []; + for (board in watched) { + _ref = watched[board]; + for (id in _ref) { + props = _ref[id]; + x = $.el('a', { + textContent: '×', + href: 'javascript:;' + }); + $.on(x, 'click', Watcher.cb.x); + link = $.el('a', props); + link.title = link.textContent; + div = $.el('div'); + $.add(div, [x, $.tn(' '), link]); + nodes.push(div); + } + } + _ref1 = $$('div:not(.move)', Watcher.dialog); + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + div = _ref1[_i]; + $.rm(div); + } + $.add(Watcher.dialog, nodes); + watchedBoard = watched[g.BOARD] || {}; + _ref2 = $$('.favicon'); + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + favicon = _ref2[_j]; + id = favicon.nextSibling.name; + if (id in watchedBoard) { + favicon.src = Favicon["default"]; + } else { + favicon.src = Favicon.empty; + } + } + }, + cb: { + toggle: function() { + return Watcher.toggle(this.parentNode); + }, + x: function() { + var thread; + + thread = this.nextElementSibling.pathname.split('/'); + return Watcher.unwatch(thread[3], thread[1]); + }, + post: function(e) { + var postID, threadID, _ref; + + _ref = e.detail, postID = _ref.postID, threadID = _ref.threadID; + if (threadID === '0') { + if (Conf['Auto Watch']) { + return $.set('autoWatch', postID); + } + } else if (Conf['Auto Watch Reply']) { + return Watcher.watch(threadID); + } + } + }, + toggle: function(thread) { + var id; + + id = $('.favicon + input', thread).name; + return Watcher.watch(id) || Watcher.unwatch(id, g.BOARD); + }, + unwatch: function(id, board) { + var watched; + + watched = $.get('watched', {}); + delete watched[board][id]; + $.set('watched', watched); + return Watcher.refresh(); + }, + watch: function(id) { + var thread, watched, _name; + + thread = $.id("t" + id); + if ($('.favicon', thread).src === Favicon["default"]) { + return false; + } + watched = $.get('watched', {}); + watched[_name = g.BOARD] || (watched[_name] = {}); + watched[g.BOARD][id] = { + href: "/" + g.BOARD + "/res/" + id, + textContent: Get.title(thread) + }; + $.set('watched', watched); + Watcher.refresh(); + return true; + } + }; + + Markdown = { + format: function(text) { + var pattern, tag, tag_patterns; + + tag_patterns = { + bi: /(\*\*\*|___)(?=\S)([^\r\n]*?\S)\1/g, + b: /(\*\*|__)(?=\S)([^\r\n]*?\S)\1/g, + i: /(\*|_)(?=\S)([^\r\n]*?\S)\1/g, + code: /(`)(?=\S)([^\r\n]*?\S)\1/g, + ds: /(\|\||__)(?=\S)([^\r\n]*?\S)\1/g + }; + for (tag in tag_patterns) { + pattern = tag_patterns[tag]; + text = text ? text.replace(pattern, Markdown.unicode_convert) : '\u0020'; + } + return text; + }, + unicode_convert: function(str, tag, inner) { + var c, charcode, charcodes, codepoints, codes, fmt, i, unicode_text; + + fmt = (function() { + switch (tag) { + case '_': + case '*': + return 'i'; + case '__': + case '**': + return 'b'; + case '___': + case '***': + return 'bi'; + case '||': + return 'ds'; + case '`': + case '```': + return 'code'; + } + })(); + codepoints = { + b: [0x1D7CE, 0x1D400, 0x1D41A], + i: [0x1D7F6, 0x1D434, 0x1D44E], + bi: [0x1D7CE, 0x1D468, 0x1D482], + code: [0x1D7F6, 0x1D670, 0x1D68A], + ds: [0x1D7D8, 0x1D538, 0x1D552] + }; + charcodes = (function() { + var _i, _len, _results; + + _results = []; + for (i = _i = 0, _len = inner.length; _i < _len; i = ++_i) { + c = inner[i]; + _results.push(inner.charCodeAt(i)); + } + return _results; + })(); + codes = (function() { + var _i, _len, _results; + + _results = []; + for (_i = 0, _len = charcodes.length; _i < _len; _i++) { + charcode = charcodes[_i]; + if (charcode >= 48 && charcode <= 57) { + _results.push(charcode - 48 + codepoints[fmt][0]); + } else if (charcode >= 65 && charcode <= 90) { + _results.push(charcode - 65 + codepoints[fmt][1]); + } else if (charcode >= 97 && charcode <= 122) { + if (charcode === 104 && tag === 'i') { + _results.push(0x210E); + } else { + _results.push(charcode - 97 + codepoints[fmt][2]); + } + } else { + _results.push(charcode); + } + } + return _results; + })(); + unicode_text = codes.map(Markdown.ucs2_encode).join(''); + if (tag === 'code') { + unicode_text = unicode_text.replace(/\x20/g, '\xA0'); + } + return unicode_text; + }, + ucs2_encode: function(value) { + /* + From Punycode.js: https://github.com/bestiejs/punycode.js + + Copyright Mathias Bynens + + 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. + */ + + var output; + + output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += String.fromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + return output += String.fromCharCode(value); + } + }; + + QR = { + init: function() { + if (!$.id('postForm')) { + return; + } + QuoteInline.callbacks.push(this.node); + Main.callbacks.push(this.node); + return setTimeout(this.asyncInit); + }, + asyncInit: function() { + var link; + + if (!Conf['Persistent QR']) { + link = $.el('a', { + innerHTML: "Open Post Form", + id: "showQR", + href: "javascript:;" + }); + $.on(link, 'click', function() { + QR.open(); + if (!g.REPLY) { + QR.threadSelector.value = g.BOARD !== 'f' ? '9999' : 'new'; + } + return $('textarea', QR.el).focus(); + }); + $.before($.id('postForm'), link); + if (Conf['Check for Bans']) { + BanChecker.init(); + } + } + if (Conf['Persistent QR']) { + QR.dialog(); + } + $.on(d, 'dragover', QR.dragOver); + $.on(d, 'drop', QR.dropFile); + return $.on(d, 'dragstart dragend', QR.drag); + }, + node: function(post) { + return $.on($('a[title="Quote this post"]', $('.postInfo', post.el)), 'click', QR.quote); + }, + open: function() { + if (QR.el) { + QR.el.hidden = false; + return QR.unhide(); + } else { + return QR.dialog(); + } + }, + close: function() { + var i, spoiler, _i, _len, _ref; + + QR.el.hidden = true; + QR.abort(); + d.activeElement.blur(); + $.rmClass(QR.el, 'dump'); + _ref = QR.replies; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + i = _ref[_i]; + QR.replies[0].rm(); + } + QR.cooldown.auto = false; + QR.status(); + QR.resetFileInput(); + if (!Conf['Remember Spoiler'] && (spoiler = $.id('spoiler')).checked) { + spoiler.click(); + } + return QR.cleanError(); + }, + hide: function() { + d.activeElement.blur(); + $.addClass(QR.el, 'autohide'); + return QR.autohide.checked = true; + }, + unhide: function() { + $.rmClass(QR.el, 'autohide'); + return QR.autohide.checked = false; + }, + toggleHide: function() { + return this.checked && QR.hide() || QR.unhide(); + }, + error: function(err) { + if (typeof err === 'string') { + QR.warning.textContent = err; + } else { + QR.warning.innerHTML = null; + $.add(QR.warning, err); + } + QR.open(); + if (QR.captcha.isEnabled && /captcha|verification/i.test(QR.warning.textContent)) { + $('[autocomplete]', QR.el).focus(); + } + if ($.hidden()) { + return alert(QR.warning.textContent); + } + }, + cleanError: function() { + return QR.warning.textContent = null; + }, + status: function(data) { + var disabled, input, value; + + if (data == null) { + data = {}; + } + if (!QR.el) { + return; + } + if (g.dead) { + value = 404; + disabled = true; + QR.cooldown.auto = false; + } + value = data.progress || QR.cooldown.seconds || value; + input = QR.status.input; + input.value = QR.cooldown.auto && Conf['Cooldown'] ? value ? "Auto " + value : 'Auto' : value || 'Submit'; + return input.disabled = disabled || false; + }, + cooldown: { + init: function() { + if (!Conf['Cooldown']) { + return; + } + QR.cooldown.types = { + thread: (function() { + switch (g.BOARD) { + case 'q': + return 86400; + case 'b': + case 'soc': + case 'r9k': + return 600; + default: + return 300; + } + })(), + sage: 60, + file: g.BOARD === 'q' ? 300 : 30, + post: g.BOARD === 'q' ? 60 : 30 + }; + QR.cooldown.cooldowns = $.get("" + g.BOARD + ".cooldown", {}); + QR.cooldown.start(); + return $.sync("" + g.BOARD + ".cooldown", QR.cooldown.sync); + }, + start: function() { + 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, hasFile, isReply, isSage, start, type; + + if (!Conf['Cooldown']) { + return; + } + start = Date.now(); + if (data.delay) { + cooldown = { + delay: data.delay + }; + } else { + isSage = /sage/i.test(data.post.email); + hasFile = !!data.post.file; + isReply = data.isReply; + 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("" + g.BOARD + ".cooldown", QR.cooldown.cooldowns); + return QR.cooldown.start(); + }, + unset: function(id) { + delete QR.cooldown.cooldowns[id]; + return $.set("" + g.BOARD + ".cooldown", QR.cooldown.cooldowns); + }, + count: function() { + var cooldown, cooldowns, elapsed, hasFile, isReply, isSage, now, post, seconds, start, type, types, update, _ref; + + if (Object.keys(QR.cooldown.cooldowns).length) { + setTimeout(QR.cooldown.count, 1000); + } else { + $["delete"]("" + g.BOARD + ".cooldown"); + delete QR.cooldown.isCounting; + delete QR.cooldown.seconds; + QR.status(); + return; + } + if ((isReply = g.REPLY ? true : QR.threadSelector.value !== 'new')) { + post = QR.replies[0]; + isSage = /sage/i.test(post.email); + hasFile = !!post.file; + } + now = Date.now(); + seconds = null; + _ref = QR.cooldown, types = _ref.types, cooldowns = _ref.cooldowns; + 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) / 1000); + if (elapsed >= 0) { + seconds = Math.max(seconds, types[type] - elapsed); + } + } + 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) { + return QR.submit(); + } + } + }, + quote: function(e) { + var caretPos, id, range, s, sel, ta, text, _ref; + + if (e != null) { + e.preventDefault(); + } + QR.open(); + if (!g.REPLY) { + QR.threadSelector.value = $.x('ancestor::div[parent::div[@class="board"]]', this).id.slice(1); + } + id = this.previousSibling.hash.slice(2); + text = ">>" + id + "\n"; + sel = d.getSelection(); + if ((s = sel.toString().trim()) && id === ((_ref = $.x('ancestor-or-self::blockquote', sel.anchorNode)) != null ? _ref.id.match(/\d+$/)[0] : void 0)) { + s = s.replace(/\n/g, '\n>'); + text += ">" + s + "\n"; + } + ta = $('textarea', QR.el); + caretPos = ta.selectionStart; + ta.value = ta.value.slice(0, caretPos) + text + ta.value.slice(ta.selectionEnd); + range = caretPos + text.length; + ta.setSelectionRange(range, range); + ta.focus(); + return $.event(ta, new Event('input')); + }, + characterCount: function() { + var count, counter; + + counter = QR.charaCounter; + count = this.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.call(e.dataTransfer); + return $.addClass(QR.el, 'dump'); + }, + fileInput: function() { + var file, _i, _len, _ref; + + QR.cleanError(); + if (this.files.length === 1) { + file = this.files[0]; + if (file.size > this.max) { + QR.error('File too large.'); + QR.resetFileInput(); + } else if (!QR.mimeTypes.contains(file.type)) { + QR.error('Unsupported file type.'); + QR.resetFileInput(); + } else { + QR.selected.setFile(file); + } + return; + } + _ref = this.files; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + file = _ref[_i]; + if (file.size > this.max) { + QR.error("File " + file.name + " is too large."); + break; + } else if (!QR.mimeTypes.contains(file.type)) { + QR.error("" + file.name + ": Unsupported file type."); + break; + } + if (!QR.replies[QR.replies.length - 1].file) { + QR.replies[QR.replies.length - 1].setFile(file); + } else { + new QR.reply().setFile(file); + } + } + $.addClass(QR.el, 'dump'); + return QR.resetFileInput(); + }, + resetFileInput: function() { + QR.fileEl.value = null; + return QR.riceFile.innerHTML = QR.defaultMessage; + }, + replies: [], + reply: (function() { + function _Class() { + var key, persona, prev, + _this = this; + + prev = QR.replies[QR.replies.length - 1]; + persona = $.get('persona', { + global: {} + }); + if (!persona[key = Conf['Per Board Persona'] ? g.BOARD : 'global']) { + persona[key] = JSON.parse(JSON.stringify(persona.global)); + } + this.name = prev ? prev.name : persona[key].name || null; + this.email = prev && (Conf["Remember Sage"] || !/^sage$/.test(prev.email)) ? prev.email : persona[key].email || null; + this.sub = prev && Conf['Remember Subject'] ? prev.sub : Conf['Remember Subject'] ? persona[key].sub : null; + this.spoiler = prev && Conf['Remember Spoiler'] ? prev.spoiler : false; + this.com = null; + this.el = $.el('a', { + className: 'thumbnail', + draggable: true, + href: 'javascript:;', + innerHTML: '×' + }); + $('input', this.el).checked = this.spoiler; + $.on(this.el, 'click', function() { + return _this.select(); + }); + $.on($('.remove', this.el), 'click', function(e) { + e.stopPropagation(); + return _this.rm(); + }); + $.on($('label', this.el), 'click', function(e) { + return e.stopPropagation(); + }); + $.on($('input', this.el), 'change', function(e) { + _this.spoiler = e.target.checked; + if (_this.el.id === 'selected') { + return $.id('spoiler').checked = _this.spoiler; + } + }); + $.before($('#addReply', QR.el), this.el); + $.on(this.el, 'dragstart', this.dragStart); + $.on(this.el, 'dragenter', this.dragEnter); + $.on(this.el, 'dragleave', this.dragLeave); + $.on(this.el, 'dragover', this.dragOver); + $.on(this.el, 'dragend', this.dragEnd); + $.on(this.el, 'drop', this.drop); + QR.replies.push(this); + } + + _Class.prototype.setFile = function(file) { + var fileUrl, img, url, + _this = this; + + this.file = file; + this.el.title = "" + file.name + " (" + ($.bytesToString(file.size)) + ")"; + if (QR.spoiler) { + $('label', this.el).hidden = false; + } + if (!/^image/.test(file.type)) { + this.el.style.backgroundImage = null; + return; + } + if (!(url = window.URL || window.webkitURL)) { + return; + } + url.revokeObjectURL(this.url); + fileUrl = url.createObjectURL(file); + img = $.el('img'); + $.on(img, 'load', function() { + var c, data, i, l, s, ui8a, _i; + + s = 90 * 3; + if (img.height < s || img.width < s) { + _this.url = fileUrl; + _this.el.style.backgroundImage = "url(" + _this.url + ")"; + return; + } + if (img.height <= img.width) { + img.width = s / img.height * img.width; + img.height = s; + } else { + img.height = s / img.width * img.height; + img.width = s; + } + c = $.el('canvas', { + height: img.height, + width: img.width + }); + c.getContext('2d').drawImage(img, 0, 0, img.width, img.height); + data = atob(c.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); + } + _this.url = url.createObjectURL(new Blob([ui8a], { + type: 'image/png' + })); + _this.el.style.backgroundImage = "url(" + _this.url + ")"; + return typeof url.revokeObjectURL === "function" ? url.revokeObjectURL(fileUrl) : void 0; + }); + return img.src = fileUrl; + }; + + _Class.prototype.rmFile = function() { + var _base1; + + QR.resetFileInput(); + delete this.file; + this.el.title = null; + this.el.style.backgroundImage = null; + if (QR.spoiler) { + $('label', this.el).hidden = true; + } + return typeof (_base1 = window.URL || window.webkitURL).revokeObjectURL === "function" ? _base1.revokeObjectURL(this.url) : void 0; + }; + + _Class.prototype.select = function() { + var check, data, field, rectEl, rectList, _i, _len, _ref, _ref1; + + if (QR.selected === this) { + return; + } + if ((_ref = QR.selected) != null) { + _ref.el.removeAttribute('id'); + } + QR.selected = this; + this.el.id = 'selected'; + rectEl = this.el.getBoundingClientRect(); + rectList = this.el.parentNode.getBoundingClientRect(); + this.el.parentNode.scrollLeft += rectEl.left + rectEl.width / 2 - rectList.left - rectList.width / 2; + _ref1 = ['name', 'email', 'sub', 'com']; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + data = _ref1[_i]; + field = $("[name=" + data + "]", QR.el); + field.value = this[data]; + if (Conf['Tripcode Hider']) { + if (data === 'name') { + check = /^.*##?.+/.test(this[data]); + if (check) { + $.addClass(field, 'tripped'); + } + $.on(field, 'blur', function() { + check = /^.*##?.+/.test(this.value); + if (check && !this.className.match("\\btripped\\b")) { + return $.addClass(this, 'tripped'); + } else if (!check && this.className.match("\\btripped\\b")) { + return $.rmClass(this, 'tripped'); + } + }); + } + } + } + QR.characterCount.call($('textarea', QR.el)); + return $('#spoiler', QR.el).checked = this.spoiler; + }; + + _Class.prototype.dragStart = function() { + return $.addClass(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, reply; + + el = $('.drag', this.parentNode); + index = function(el) { + return __slice.call(el.parentNode.children).indexOf(el); + }; + oldIndex = index(el); + newIndex = index(this); + if (oldIndex < newIndex) { + $.after(this, el); + } else { + $.before(this, el); + } + reply = QR.replies.splice(oldIndex, 1)[0]; + return QR.replies.splice(newIndex, 0, reply); + }; + + _Class.prototype.dragEnd = function() { + var el; + + $.rmClass(this, 'drag'); + if (el = $('.over', this.parentNode)) { + return $.rmClass(el, 'over'); + } + }; + + _Class.prototype.rm = function() { + var index, _base1; + + QR.resetFileInput(); + $.rm(this.el); + index = QR.replies.indexOf(this); + if (QR.replies.length === 1) { + new QR.reply().select(); + $.rmClass(QR.el, 'dump'); + } else if (this.el.id === 'selected') { + (QR.replies[index - 1] || QR.replies[index + 1]).select(); + } + QR.replies.splice(index, 1); + return typeof (_base1 = window.URL || window.webkitURL).revokeObjectURL === "function" ? _base1.revokeObjectURL(this.url) : void 0; + }; + + return _Class; + + })(), + captcha: { + init: function() { + var observer, onMutationObserver, + _this = this; + + if (d.cookie.contains('pass_enabled=') || !(this.isEnabled = !!$.id('captchaFormPart'))) { + return; + } + if ($.id('recaptcha_challenge_field_holder')) { + return this.ready(); + } else { + if (MutationObserver) { + observer = new MutationObserver(onMutationObserver = function() { + if ($.id('recaptcha_challenge_field_holder')) { + _this.ready(); + return observer.disconnect(); + } + }); + return observer.observe($.id('recaptcha_widget_div'), { + childList: true, + subtree: true + }); + } else { + return $.on($.id('recaptcha_widget_div'), 'DOMNodeInserted', this.ready); + } + } + }, + ready: function() { + var observer, + _this = this; + + if (this.challenge = $.id('recaptcha_challenge_field_holder')) { + $.off($.id('recaptcha_widget_div'), 'DOMNodeInserted', this.onready); + delete this.onready; + } else { + return; + } + $.addClass(QR.el, 'captcha'); + $.after($('.textarea', QR.el), $.el('div', { + className: 'captchaimg', + title: 'Reload', + innerHTML: '' + })); + $.after($('.captchaimg', QR.el), $.el('div', { + className: 'captchainput', + innerHTML: '' + })); + this.img = $('.captchaimg > img', QR.el); + this.input = $('.captchainput > input', QR.el); + $.on(this.img.parentNode, 'click', this.reload); + $.on(this.input, 'keydown', this.keydown); + $.on(this.input, 'focus', function() { + return QR.el.classList.add('focus'); + }); + $.on(this.input, 'blur', function() { + return QR.el.classList.remove('focus'); + }); + if (MutationObserver) { + observer = new MutationObserver(function() { + return _this.load(); + }); + observer.observe(this.challenge, { + childList: true, + subtree: true + }); + } else { + $.on(this.challenge, 'DOMNodeInserted', function() { + return _this.load(); + }); + } + $.sync('captchas', function(arr) { + return _this.count(arr.length); + }); + this.count($.get('captchas', []).length); + return this.reload(); + }, + save: function() { + var captcha, captchas, response; + + if (!(response = this.input.value)) { + return; + } + captchas = $.get('captchas', []); + while ((captcha = captchas[0]) && captcha.time < Date.now()) { + captchas.shift(); + } + captchas.push({ + challenge: this.challenge.firstChild.value, + response: response, + time: this.timeout + }); + $.set('captchas', captchas); + this.count(captchas.length); + return this.reload(); + }, + load: function() { + var challenge; + + this.timeout = Date.now() + 4 * $.MINUTE; + challenge = this.challenge.firstChild.value; + this.img.alt = challenge; + this.img.src = "//www.google.com/recaptcha/api/image?c=" + challenge; + return this.input.value = null; + }, + count: function(count) { + this.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.input.alt = count; + }, + reload: function(focus) { + $.globalEval('Recaptcha.reload("t")'); + if (focus) { + return QR.captcha.input.focus(); + } + }, + keydown: function(e) { + var c; + + c = QR.captcha; + if (e.keyCode === 8 && !c.input.value) { + c.reload(); + } else if (e.keyCode === 13 && e.shiftKey) { + c.save(); + } else { + return; + } + return e.preventDefault(); + } + }, + dialog: function() { + var i, id, mimeTypes, name, size, spoiler, ta, thread, threads, _i, _j, _len, _len1, _ref, _ref1; + + QR.el = UI.dialog('qr', 'bottom: 0; right: 0;', '\ +
\ + \ + × \ +
\ +
\ +
\ +
\ +
+
\ +
\ +
\ +
\ + \ +
'); + if (Conf['Remember QR size']) { + $.on(ta = $('textarea', QR.el), 'mouseup', function() { + return $.set('QR.size', this.style.cssText); + }); + ta.style.cssText = $.get('QR.size', ''); + } + QR.autohide = $('#autohide', QR.el); + mimeTypes = $('ul.rules').firstElementChild.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(''); + QR.fileEl = $('input[type=file]', QR.el); + QR.fileEl.max = $('input[name=MAX_FILE_SIZE]').value; + if ($.engine !== 'presto') { + QR.fileEl.accept = mimeTypes; + } + QR.warning = $('.warning', QR.el); + QR.spoiler = !!$('input[name=spoiler]'); + spoiler = $('#spoilerLabel', QR.el); + spoiler.hidden = !QR.spoiler; + QR.charaCounter = $('#charCount', QR.el); + ta = $('textarea', QR.el); + if (!g.REPLY) { + threads = ''; + _ref = $$('.thread'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + thread = _ref[_i]; + id = thread.id.slice(1); + threads += ""; + } + QR.threadSelector = g.BOARD === 'f' ? $('select[name=filetag]').cloneNode(true) : $.el('select', { + innerHTML: threads, + title: 'Create a new thread / Reply to a thread' + }); + QR.threadSelector.className = null; + $.prepend($('#threadselect', QR.el), QR.threadSelector); + $.on(QR.threadSelector, 'mousedown', function(e) { + return e.stopPropagation(); + }); + } + QR.riceFile = $("#file", QR.el); + i = 0; + size = QR.fileEl.max; + while (i++ < 2) { + size /= 1024; + } + QR.riceFile.innerHTML = QR.defaultMessage = "Browse..."; + QR.riceFile.title = "Max: " + size + "MB, Shift+Click to Clear."; + $.on(QR.riceFile, 'click', function(e) { + if (e.shiftKey) { + return QR.selected.rmFile() || e.preventDefault(); + } else { + return QR.fileEl.click(); + } + }); + $.on(QR.fileEl, 'change', $.on(QR.fileEl, 'change', function() { + QR.riceFile.textContent = QR.fileEl.value; + return QR.fileInput.call(this); + })); + $.on(QR.fileEl, 'click', function(e) { + if (e.shiftKey) { + return QR.selected.rmFile() || e.preventDefault(); + } + }); + Style.rice(QR.el); + $.on(QR.autohide, 'change', QR.toggleHide); + $.on($('.close', QR.el), 'click', QR.close); + $.on($('#dump', QR.el), 'click', function() { + return $.toggleClass(QR.el, 'dump'); + }); + $.on($('#addReply', QR.el), 'click', function() { + return new QR.reply().select(); + }); + $.on($('form', QR.el), 'submit', QR.submit); + $.on(ta, 'input', function() { + return QR.selected.el.lastChild.textContent = this.value; + }); + $.on(ta, 'input', QR.characterCount); + $.on(spoiler.firstChild, 'change', function() { + return $('input', QR.selected.el).click(); + }); + $.on(QR.warning, 'click', QR.cleanError); + new QR.reply().select(); + _ref1 = ['name', 'email', 'sub', 'com']; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + name = _ref1[_j]; + $.on($("[name=" + name + "]", QR.el), 'focus', function() { + return QR.el.classList.add('focus'); + }); + $.on($("[name=" + name + "]", QR.el), 'blur', function() { + return QR.el.classList.remove('focus'); + }); + $.on($("[name=" + name + "]", QR.el), 'input', function() { + var _ref2; + + QR.selected[this.name] = this.value; + if (QR.cooldown.auto && QR.selected === QR.replies[0] && (0 < (_ref2 = QR.cooldown.seconds) && _ref2 <= 5)) { + return QR.cooldown.auto = false; + } + }); + $.on(QR.fileEl, 'focus', function() { + return QR.el.classList.add('focus'); + }); + $.on(QR.fileEl, 'blur', function() { + return QR.el.classList.remove('focus'); + }); + } + QR.status.input = $('input[type=submit]', QR.el); + QR.status(); + QR.cooldown.init(); + QR.captcha.init(); + $.add(d.body, QR.el); + return $.event(QR.el, new CustomEvent('QRDialogCreation', { + bubbles: true + })); + }, + submit: function(e) { + var callbacks, captcha, captchas, challenge, err, filetag, m, opts, post, reply, response, textOnly, threadID; + + if (e != null) { + e.preventDefault(); + } + if (QR.cooldown.seconds) { + QR.cooldown.auto = !QR.cooldown.auto; + QR.status(); + return; + } + QR.abort(); + reply = QR.replies[0]; + if (!g.REPLY && g.BOARD === 'f') { + filetag = QR.threadSelector.value; + threadID = 'new'; + } else { + threadID = g.THREAD_ID || QR.threadSelector.value; + } + if (threadID === 'new') { + threadID = null; + if (['vg', 'q'].contains(g.BOARD) && !reply.sub) { + err = 'New threads require a subject.'; + } else if (!(reply.file || (textOnly = !!$('input[name=textonly]', $.id('postForm'))))) { + err = 'No file selected.'; + } else if (g.BOARD === 'f' && filetag === '9999') { + err = 'Invalid tag specified.'; + } + } else if (!(reply.com || reply.file)) { + err = 'No file selected.'; + } + if (QR.captcha.isEnabled && !err) { + captchas = $.get('captchas', []); + while ((captcha = captchas[0]) && captcha.time < Date.now()) { + captchas.shift(); + } + if (captcha = captchas.shift()) { + challenge = captcha.challenge; + response = captcha.response; + } else { + challenge = QR.captcha.img.alt; + if (response = QR.captcha.input.value) { + QR.captcha.reload(); + } + } + $.set('captchas', captchas); + QR.captcha.count(captchas.length); + if (!response) { + err = 'No valid captcha.'; + } else { + response = response.trim(); + if (!/\s/.test(response)) { + response = "" + response + " " + response; + } + } + } + if (err) { + QR.cooldown.auto = false; + QR.status(); + QR.error(err); + return; + } + QR.cleanError(); + QR.cooldown.auto = QR.replies.length > 1; + if (Conf['Auto Hide QR'] && !QR.cooldown.auto && Conf['Post Form Style'] === "float") { + QR.hide(); + } + if (!QR.cooldown.auto && $.x('ancestor::div[@id="qr"]', d.activeElement)) { + d.activeElement.blur(); + } + QR.status({ + progress: '...' + }); + post = { + resto: threadID, + name: reply.name, + email: reply.email, + sub: reply.sub, + com: Conf['Markdown'] ? Markdown.format(reply.com) : reply.com, + upfile: reply.file, + filetag: filetag, + spoiler: reply.spoiler, + textonly: textOnly, + mode: 'regist', + pwd: (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : $('input[name=pwd]').value, + recaptcha_challenge_field: challenge, + recaptcha_response_field: response + }; + callbacks = { + onload: function() { + return QR.response(this.response); + }, + onerror: function() { + QR.cooldown.auto = false; + QR.status(); + QR.error($.el('a', { + href: '//www.4chan.org/banned', + target: '_blank', + textContent: 'Connection error, or you are banned.' + })); + if (Conf['Check for Bans']) { + $["delete"]('lastBanCheck'); + return BanChecker.init(); + } + } + }; + opts = { + form: $.formData(post), + upCallbacks: { + onload: function() { + return QR.status({ + progress: '...' + }); + }, + onprogress: function(e) { + return QR.status({ + progress: "" + (Math.round(e.loaded / e.total * 100)) + "%" + }); + } + } + }; + return QR.ajax = $.ajax($.id('postForm').parentNode.action, callbacks, opts); + }, + response: function(html) { + var ban, board, doc, el, err, key, persona, postID, reply, threadID, _, _ref; + + doc = d.implementation.createHTMLDocument(''); + doc.documentElement.innerHTML = html; + if (ban = $('.banType', doc)) { + board = $('.board', doc).innerHTML; + err = $.el('span', ban.textContent.toLowerCase() === 'banned' ? (Conf['Check for Bans'] ? ($["delete"]('lastBanCheck'), BanChecker.init()) : void 0, err.innerHTML = "You are banned on " + board + "! ;_;
\nClick here to see the reason.") : err.innerHTML = "You were issued a warning on " + board + " as " + ($('.nameBlock', doc).innerHTML) + ".
\nReason: " + ($('.reason', doc).innerHTML)); + } else if (err = doc.getElementById('errmsg')) { + if (el = $('a', err)) { + el.target = '_blank'; + } + } else if (doc.title !== 'Post successful!') { + err = 'Connection error with sys.4chan.org.'; + } + if (err) { + if (/captcha|verification/i.test(err.textContent) || err === 'Connection error with sys.4chan.org.') { + if (/mistyped/i.test(err.textContent)) { + err.textContent = 'You seem to have mistyped the CAPTCHA.'; + } + QR.cooldown.auto = QR.captcha.isEnabled ? !!$.get('captchas', []).length : err === 'Connection error with sys.4chan.org.' ? true : false; + QR.cooldown.set({ + delay: 2 + }); + } else { + QR.cooldown.auto = false; + } + QR.status(); + QR.error(err); + return; + } + reply = QR.replies[0]; + persona = $.get('persona', { + global: {} + }); + if (!persona[key = Conf['Per Board Persona'] ? g.BOARD : 'global']) { + persona[key] = JSON.parse(JSON.stringify(persona.global)); + } + persona[key] = { + name: reply.name, + email: !Conf["Remember Sage"] && /^sage$/.test(reply.email) ? /^sage$/.test(persona[key].email) ? null : persona[key].email : reply.email, + sub: Conf['Remember Subject'] ? reply.sub : null + }; + $.set('persona', persona); + _ref = doc.body.lastChild.textContent.match(/thread:(\d+),no:(\d+)/), _ = _ref[0], threadID = _ref[1], postID = _ref[2]; + Updater.postID = postID; + if (!MarkOwn.posts) { + MarkOwn.posts = $.get('ownedPosts', {}); + } + MarkOwn.posts[postID] = Date.now(); + $.set('ownedPosts', MarkOwn.posts); + $.event(QR.el, new CustomEvent('QRPostSuccessful', { + bubbles: true, + detail: { + threadID: threadID, + postID: postID + } + })); + if ($.get('isBanned')) { + if (BanChecker.el) { + $.rm(BanChecker.el); + delete BanChecker.el; + } + $["delete"]('isBanned'); + } + QR.cooldown.set({ + post: reply, + isReply: threadID !== '0' + }); + if (threadID === '0') { + location.pathname = "/" + g.BOARD + "/res/" + postID; + } else { + QR.cooldown.auto = QR.replies.length > 1; + if (Conf['Open Reply in New Tab'] && !g.REPLY && !QR.cooldown.auto) { + $.open("//boards.4chan.org/" + g.BOARD + "/res/" + threadID + "#p" + postID); + } + } + if (Conf['Persistent QR'] || QR.cooldown.auto) { + reply.rm(); + } else { + QR.close(); + } + QR.status(); + return QR.resetFileInput(); + }, + abort: function() { + var _ref; + + if ((_ref = QR.ajax) != null) { + _ref.abort(); + } + delete QR.ajax; + return QR.status(); + } + }; + + QuoteBacklink = { + init: function() { + var format; + + format = Conf['backlink'].replace(/%id/g, "' + id + '"); + this.funk = Function('id', "return '" + format + "'"); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var a, container, el, link, nodes, owned, qid, quote, quotes, _i, _len, _ref, _ref1; + + if (post.isInlined) { + return; + } + quotes = {}; + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (quote.parentNode.parentNode.className === 'capcodeReplies') { + break; + } + if (quote.hostname === 'boards.4chan.org' && !/catalog$/.test(quote.pathname) && (qid = (_ref1 = quote.hash) != null ? _ref1.slice(2) : void 0)) { + quotes[qid] = true; + } + } + a = $.el('a', { + href: "/" + g.BOARD + "/res/" + post.threadID + "#p" + post.ID, + className: post.el.hidden ? 'filtered backlink' : 'backlink', + textContent: QuoteBacklink.funk(post.ID) + }); + if (Conf['Mark Owned Posts']) { + if (MarkOwn.posts[post.ID]) { + $.addClass(a, 'ownpost'); + a.textContent += " (You)"; + owned = true; + } + } + for (qid in quotes) { + if (!(el = $.id("pi" + qid)) || !Conf['OP Backlinks'] && /\bop\b/.test(el.parentNode.className)) { + continue; + } + link = a.cloneNode(true); + nodes = $.nodes([$.tn(' '), link]); + if (Conf['Quote Preview']) { + $.on(link, 'mouseover', QuotePreview.mouseover); + } + if (Conf['Quote Inline']) { + $.on(link, 'click', QuoteInline.toggle); + if (Conf['Quote Hash Navigation']) { + QuoteInline.qiQuote(link); + } + } + if (!(container = $.id("blc" + qid))) { + $.addClass(el.parentNode, 'quoted'); + if (owned) { + $.addClass(el.parentNode, 'youQuoted'); + } + container = $.el('span', { + className: 'container', + id: "blc" + qid + }); + $.add(el, container); + } + $.add(container, nodes); + if (!(Conf["Backlinks Position"] === "default" || /\bop\b/.test(el.parentNode.className))) { + el.parentNode.style.paddingBottom = "" + container.offsetHeight + "px"; + } + } + } + }; + + QuoteCT = { + init: function() { + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var path, quote, _i, _len, _ref; + + if (post.isInlined && !post.isCrosspost) { + return; + } + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (!(quote.hash && quote.hostname === 'boards.4chan.org' && !/catalog$/.test(quote.pathname))) { + continue; + } + path = quote.pathname.split('/'); + if (path[1] === g.BOARD && path[3] !== post.threadID) { + $.add(quote, $.tn('\u00A0(Cross-thread)')); + } + } + } + }; + + QuoteInline = { + init: function() { + this.callbacks.push(this.node); + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + callbacks: [], + cb: function(post, root) { + var callback, _i, _len, _ref; + + post.isCrosspost = post.isInlined = true; + post.threadID = $.x('ancestor::div[parent::div[@class="board"]]', root).id.match(/\d+$/)[0]; + _ref = Main.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + callback(post); + } + }, + cb2: function(post) { + var callback, _i, _len, _ref; + + post.isInlined = true; + _ref = QuoteInline.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + callback(post); + } + }, + node: function(post) { + var quote, _i, _j, _len, _len1, _ref, _ref1; + + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (!(quote.hash && quote.hostname === 'boards.4chan.org' && !/catalog$/.test(quote.pathname) || /\bdeadlink\b/.test(quote.className))) { + continue; + } + $.on(quote, 'click', QuoteInline.toggle); + if (Conf['Quote Hash Navigation'] && !post.isInlined) { + QuoteInline.qiQuote(quote); + } + } + _ref1 = post.backlinks; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + quote = _ref1[_j]; + $.on(quote, 'click', QuoteInline.toggle); + } + }, + qiQuote: function(quote) { + return $.after(quote, [ + $.tn(' '), $.el('a', { + className: 'qiQuote', + textContent: '#', + href: quote.href + }) + ]); + }, + toggle: function(e) { + var id; + + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) { + return; + } + e.preventDefault(); + id = this.dataset.id || this.hash.slice(2); + if (/\binlined\b/.test(this.className)) { + QuoteInline.rm(this, id); + } else { + if ($.x("ancestor::div[contains(@id,'p" + id + "')]", this)) { + return; + } + QuoteInline.add(this, id); + } + return $.toggleClass(this, 'inlined'); + }, + add: function(q, id) { + var board, el, i, inline, isBacklink, path, postID, root, threadID; + + if (q.host === 'boards.4chan.org') { + path = q.pathname.split('/'); + board = path[1]; + threadID = path[3]; + postID = id; + } else { + board = q.dataset.board; + threadID = 0; + postID = q.dataset.id; + } + el = board === g.BOARD ? $.id("p" + postID) : false; + inline = $.el('div', { + id: "i" + postID, + className: el ? 'inline' : 'inline crosspost' + }); + root = (isBacklink = /\bbacklink\b/.test(q.className)) ? q.parentNode : $.x('ancestor-or-self::*[parent::blockquote][1]', q); + if (Conf['Quote Hash Navigation'] && !isBacklink && root === q) { + $.after(root.nextElementSibling, inline); + } else { + $.after(root, inline); + } + Get.post(board, threadID, postID, inline, QuoteInline.cb, QuoteInline.cb2); + if (!el) { + return; + } + if (isBacklink && Conf['Forward Hiding']) { + $.addClass(el.parentNode, 'forwarded'); + ++el.dataset.forwarded || (el.dataset.forwarded = 1); + } + if ((i = Unread.replies.indexOf(el)) !== -1) { + Unread.replies.splice(i, 1); + Unread.update(true); + } + if (Conf['Color user IDs'] && ['b', 'q', 'soc'].contains(board)) { + return setTimeout(function() { + return $.rmClass($('.reply.highlight', inline), 'highlight'); + }); + } + }, + rm: function(q, id) { + var div, inlined, _i, _len, _ref; + + div = $.x("following::div[@id='i" + id + "']", q); + $.rm(div); + if (!Conf['Forward Hiding']) { + return; + } + _ref = $$('.backlink.inlined', div); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + inlined = _ref[_i]; + div = $.id(inlined.hash.slice(1)); + if (!--div.dataset.forwarded) { + $.rmClass(div.parentNode, 'forwarded'); + } + } + if (/\bbacklink\b/.test(q.className)) { + div = $.id("p" + id); + if (!--div.dataset.forwarded) { + return $.rmClass(div.parentNode, 'forwarded'); + } + } + } + }; + + QuoteOP = { + init: function() { + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var quote, _i, _len, _ref; + + if (post.isInlined && !post.isCrosspost) { + return; + } + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (quote.hash.slice(2) === post.threadID) { + $.add(quote, $.tn('\u00A0(OP)')); + } + } + } + }; + + QuotePreview = { + init: function() { + QuoteInline.callbacks.push(this.node); + ExpandComment.callbacks.push(this.node); + Main.callbacks.push(this.node); + return $.ready(function() { + return $.add(d.body, QuotePreview.el = $.el('div', { + id: 'qp', + className: 'reply dialog' + })); + }); + }, + callbacks: [], + callback: function(node) { + var callback, _i, _len, _ref; + + _ref = QuotePreview.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + callback(node); + } + }, + node: function(post) { + var quote, _i, _j, _len, _len1, _ref, _ref1; + + _ref = post.quotes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + quote = _ref[_i]; + if (!(quote.hostname === 'boards.4chan.org' && quote.hash && !/catalog$/.test(quote.pathname) || /\bdeadlink\b/.test(quote.className))) { + continue; + } + $.on(quote, 'mouseover', QuotePreview.mouseover); + } + _ref1 = post.backlinks; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + quote = _ref1[_j]; + $.on(quote, 'mouseover', QuotePreview.mouseover); + } + }, + mouseover: function(e) { + var board, child, children, el, path, postID, qp, quote, quoterID, threadID, _conf, _i, _j, _len, _len1, _ref; + + if (UI.el || /\binlined\b/.test(this.className)) { + return; + } + qp = QuotePreview.el; + if (children = qp.children) { + for (_i = 0, _len = children.length; _i < _len; _i++) { + child = children[_i]; + $.rm(child); + } + } + if (this.host === 'boards.4chan.org') { + path = this.pathname.split('/'); + board = path[1]; + threadID = path[3]; + postID = this.hash.slice(2); + } else { + board = this.dataset.board; + threadID = 0; + postID = this.dataset.id; + } + UI.el = qp; + UI.hover(e); + Get.post(board, threadID, postID, qp, function(post) { + Main.prettify(post.blockquote); + post.isArchived = qp.className.contains('archivedPost'); + return QuotePreview.callback(post); + }); + $.on(this, 'mousemove', UI.hover); + $.on(this, 'mouseout click', QuotePreview.mouseout); + _conf = Conf; + if (el = $.id("p" + postID)) { + _conf = Conf; + if (_conf['Quote Highlighting']) { + if (/\bop\b/.test(el.className)) { + $.addClass(el.parentNode, 'qphl'); + } else { + $.addClass(el, 'qphl'); + } + } + quoterID = $.x('ancestor::*[@id][1]', this).id.match(/\d+$/)[0]; + _ref = $$('.quotelink, .backlink', qp); + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + quote = _ref[_j]; + if (quote.hash.slice(2) === quoterID) { + $.addClass(quote, 'forwardlink'); + } + } + } + }, + mouseout: function(e) { + var el, hash; + + delete UI.el; + $.rm(QuotePreview.el.firstChild); + if ((hash = this.hash) && (el = $.id(hash.slice(1)))) { + $.rmClass(el.parentNode, 'qphl'); + $.rmClass(el, 'qphl'); + } + $.off(this, 'mousemove', UI.hover); + return $.off(this, 'mouseout click', QuotePreview.mouseout); + } + }; + + Quotify = { + init: function() { + QuotePreview.callbacks.push(this.node); + ExpandComment.callbacks.push(this.node); + return Main.callbacks.push(this.node); + }, + node: function(post) { + var a, board, deadlink, id, m, postBoard, quote, _i, _len, _ref; + + if (post.isInlined && !post.isCrosspost) { + return; + } + _ref = $$('.deadlink', post.blockquote); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + deadlink = _ref[_i]; + quote = deadlink.textContent; + a = $.el('a', { + textContent: "" + quote + "\u00A0(Dead)" + }); + if (!(id = quote.match(/\d+$/))) { + continue; + } + id = id[0]; + if (m = quote.match(/^>>>\/([a-z\d]+)/)) { + board = m[1]; + } else if (postBoard) { + board = postBoard; + } else { + board = postBoard = $('a[title="Highlight this post"]', post.el).pathname.split('/')[1]; + } + if (board === g.BOARD && $.id("p" + id)) { + a.href = "#p" + id; + a.className = 'quotelink'; + } else { + a.href = Redirect.to({ + board: board, + threadID: 0, + postID: id + }); + a.className = 'deadlink'; + a.target = '_blank'; + if (Redirect.post(board, id)) { + $.addClass(a, 'quotelink'); + a.setAttribute('data-board', board); + a.setAttribute('data-id', id); + } + } + $.replace(deadlink, a); + } + } + }; + + Emoji = { + pony: [['Pinkie', 'BAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA3dJREFUGBlNwUtoXFUcB+Df/zzuY553pp2MmUwSk5TGpnamiokWRdNCSkCrUChKCnVZQUEUdy5sQZC6cyd2VWgoutCFXWTjIyp1UdqmEDBRsSZNmkmaZF6Zx32ccyzowu8j/M883pH5A9kBYfNkFOpu0OiulyqXmnhkDmdYHYJexzX1Ef51EQDhP9fxpjU0PDCd7IldYIxGVag3/KZ/ZX1p8/P0k/0U47qs291M2NS3f6ncuLeFeQ3A8KuYoNPoY/3e2Ej6scSnqUJ8gksmhC2y3OJHpSUHU0/3HU+WCuddyV6VSpVyYv/aUuPefWAP4iDG8AhJWyYYo972tg8DQ1wyWHGZSfcmZmQ+YeKTw1bQ70H8uJw3xtDp6NzG15VLf/DLWMBZHGPkwuWGyq7njLoZyzAiCtqRIddioifBxYBHIpeE0oaw0yoG7WA755dvi8Xih66BOSZj4rwds45bSQkuOeOCQYWG2PjjcEq94JwjQgQ+kCW+tBl3H7Ym4jnbE/nDmamwqz9mnEaYoBgiZaJIGW5zEIHEPheykMD2w12ztPIXCrZHec+GdOVAUI8ygjvifeHQESiNoKtMlIoRxSV0owMjAeY5+P3BKrbTDq3n02B/7yDTDkBANSXiewKgjFbahEwQe34IiVIfRNqCv1qDanQR9Di4+tU16N409o2WMXnyJeNWb9PO4s6WroZawOiSiozCoR7lPFUQezICCzXF+pPGYRna6/rotNqY/eJLUzh4mM5dP4Va0YXV45x0O9F9FhkN5auq4eznaq3WmP1pDkuibW5uraNaqyNh23ihPA6v7wAVS+PwXAGkbYiUnU3kYm8JzvgGpJGdG6vzm15+ce6H79/9bnnBhCxG702dwnTaw4nyM/jsiTHsHx+DEyjKWnGEUpBOyjTTgbpsNHyLojPe7PK3qci58NvNu0Gl0YA8NIxWp4MkdzCdK2Ci6iNYXIV6UEfUDBC2Q/A3WqVbUUfVucWftYhP9fLiFf7yRPGVmZmhE88dJVmpGRMqRH4E3emSbnQR3lkzaqNB3br/J39tb1ibJglGfJDZbMReb37Td/bFhcnB/iNppXNUbZEKFGBJ6FBT+9cVo5c3yd/trDV3OxdFDDHFOV8IffVJtNNOC+J3xtYqATWw0Mm6RIJ9YAy9rdtt07q1ZtjdVXCYFRBG4Bv8A+lliGhzN164AAAAAElFTkSuQmCC'], ['Applejack', 'A4AAAAQCAYAAAAmlE46AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAv9JREFUOE9dkmtIU2EYx88Roi9FfahkfQmS6kNGEBRlZWSY5tylTKepqR8MHYGl2R1POm2u5bCVlzbog2Ze591pzZPZxUskDZLMMLSWzcIca3MXt7N/55woqhf+PC8Pz+99n+fPQxAEQf6vhINb1nG5/ISdobWXo+9eSd4tyM7OJimKImmaJhsaGjjmX/DGqfDQmkvRg1x+9YrlZPd18fdupXiu6mxkOAcqlUqyuLiYB/+cayfD1rKFH0w3pYEHV4/omhTCyieVcYEB7TEYSyX21Mita/6u/91qUBMV00JrjmKwMg4zI2fgnlfD90PLx+nhMyinIrb91SFBFqaHBevPHb7G/fS06jhs0wXwO8rBOLXws2Kct/k4//HKRE+jZD0Pl2buD2FnmOlVSUFrpJg15/JFgcWKP0Bg8Q6fs1sVs+11wmAebKaEuiG1CC81Yozci+cL4KoC3JUIuCp4+R23+Ee4Dr5bisZmJi7fJzpLRJZPOin8vSlwdSXDO54Hz+vT8LzLh3uuCIuzBfDa1DzMPcrJMVfkIHpVEu94uYgH/aaTvOxdJzDZkI76smhY2mVwDmfg8zM5RukcvH8pbx96mLiPMBTG0nSpGK7mePg6k+DsSUZbSQwem02oba3DRsFKzNQfx9sHSdi1dzve5Ow4xM+ozorY1K2U2MY0IrhbEuB7lIqB6gxY7B9R3XoHAoEAivN74O5LAaXNwvNLe9PlcjlJACANRaIRztFh1iRvfRyYx5kIOCwY+GCE9GIUOjrzwZjS4H16FV80UT1WqzWIWFhYIBsLhDf7y46Ck1UvATNKgXlxHgHbJDyub2DGVPC2s+bVyGDTx74ym80kwe2fKvNASN8NySK3NeayWNagNPj7WaP62Uhn8HdPkwyWW3IoEjdv0Ol0JGE0GvmV0+dFpj9SS5kOKuahr01Wwbb2lXV6aakjkfF1p8DXlwHnaB5yTm1bbzAYfs34e/+0pyNic+N2ruIWmQWXcdE1dUEGd9UYq6kle1mXqVW6imWIn290AGVZutJTAAAAAElFTkSuQmCC'], ['Fluttershy', 'BAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA2xJREFUOE9dU91PWmcYP2uybDfrxdIlu9vN/oglverWNN3Fmu1iN7vY2q4utnE2Nu26ukyrUUGwExGpn3xY+TyACjrskFrcEYoWnCAM4YAgcJjROkFA1q789nJczNaTPHnfk+f5/d7n4/dQ1Cvf3Ut3Xp//Qnze36gYCt56kIgJpyqRFvrvcIvxMNxhSa9eV993XJK/+yqO/zdf7j7tbRz1RdstLzOKReRoLxJSOzb7HyKtdCEumgErmEbwO03U2aR8738kzq8ln8e6bXlWYMWmZA6Z8SUk5U5ytyPeY0Oy1w5O50FO+wQ5jbtG4lK19L5BGehzb9sE19+JtFt2c8ZlJPvmwAqtSA06EWs3g+2aQnacwdbwAmLknuiZxaZ4FiTD6tLFvi+pBeenb/3mvvo4Yu3D5v1ZsP1axHpUiAo0iPyg41/dGiNgiQI5PXmdXkai92dkVItYbZ6YpVZWLrrKFSOynBip9W6U/7LwViqZ8SykRWpcR8BqJNlmJCZp1LLMkIxSAw6s39WHqUCo/mDnWTdKhwRUMaNMzvLh5NFZsaBIbD+rJ34jgsxtcLQH3IQbKakDoVZDmnpk+irA/fEjCkXlv+AawX+MEJQJcaFEY8bWAJdMgYxyESn5PILNumUqJNVVA4EG7OXlx8Bf3T2QyRuh0X2P5ad9pCQTcjtqDI3UwTMuReIeaaKagb9u6B6VVi9Wg1YRUhkhH1g6NKFf3gD/2gAYz08YVd5AdltDfDS2d2QIrH6DcNcwUjLHc+aC8AMqLrW/4EwesBoligUTCgc05h52IH9gwu6+ERwBb+9pkc0IwLJNWHPXIyrUIdysW2POd52gopIZjtOSpgzOI2NToVAmwD0D9osmvvZSxcCXtr5wA08627Ah0yHZ74D3ysBNXokR8XQ8q2SQM3gQbZtAPm1AiZRyNIUawZGFl5qIRqbBdk4Sndjy1iviIymzIquXldirWRXDzzdOZr63q8J66OqOf+2yL8be+nMr3fry91A9NlRjvKT9tx88Pt6Djdaps0RZxQRZmCzpbHrMBV9b5/YM/dn7tSCT/cNTvpauFdasR5xkkCaS9n07Kj0mIKm+GbujP5OQ/vI8Ofyomhx0sOmxhU9W6wYp5uOO12qB3guik2TuI2QPXmwpXLGnjSMf3RRdO1Hz/QNneMt7Iqmg5QAAAABJRU5ErkJggg=='], ['Twilight', 'BIAAAAQCAYAAAAbBi9cAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA6lJREFUOE+VlF9Mk1cYxj+Kc3+yXWimFxuk2zTIn4bQFkppF0hDNmBpBtgKixhhQZAhbSkFBp1uZWg3ZLRMxFKE0qKtrMy2E2ztn2+1tLQgbuJiorvQ7c5pgplZNjfmePZ9nwtZMm52kufqvOeX5zznfQ9B/M9l/8CXPP2R/6ajy+u0amZeoI8D2PpfTLqMlZQpT9vE2fPOc9l73302q7rs6Sz5K6zM3ZuJzD2EVf1VytejC4hNXoWj2/vlF71+FgVKIsZVHrbnEzLoPkYOqqtPNm7j1l1J4R9Y4wgVkOR3Qcvrg+uNXmTnt9zfmdcUFRd1XqQhC+eWMXP8MiwKdyUDOqMLEG49qYtYlhA+vQi7zocGmQHFYi2UnM9wq/RzNEsOQyDWMBIWtjNurjivw2ucg+toyM+A6LWZU72vvsqwFjwVZwrmrEvoq7DBLDDiltQAobidgeRRUipMTA0t32AU3hNzD7zGSANBZMi2UFe5nyZohrREB9dxEnMTS+jgnUBYMghv2afrbhhHb3aAnFxkQMHhOALDid8p0EHiKU6VklvQil0UiJakqBsf77dCmTmASPEAhoqPIEN4CGmCJvAkauzKfw/5pRr4J+JUTtfo693zGSM7iBdzan10sE9gh5AragNXoEKtvB+93ZMY0TthGraB92oJVlYewDTgQJ96DKTtiStXb8jvNoafIV7i19+lndC2X+bXPyqXffj4kmV+PYexY1aQMwnkv1YGWUUljryvQ0/dqfV9+Vs9zVTYLILKZ5UGsXMbb2/llJaWCN8OnzNMrxda9JNYjt+ENL0RrQol0nekQVtlRHA8gsWpZQhEmrviws5yIpXfcG87t+52UpY8NZXN3lIjPRiOReZxfugCA7s4EsCN727ArHChQiKDYGchRrumELbFEbQmkFvQ+ofg9TYX8Xx2zfnkLDmHbgM2m00M1tortQf06FC2Y2HqGgMjvSR+WfkVplYPzCoX3EOziDmuwjMSRk6BajVP1PYT/fzb/j0nZ7tmN+n3mUlpUTmCo1EGFHJE8NvDR/g+egd0fj5LDN6xKHo6bOAL1D/niTTRDUd2rMW13VBj/zFu/5YZBaYBp69j0blMPfs8zhj9KCjspPNZ+6fjd28IGld4MgIn5x/HJr9ByJRYDz5oS2B6KIT9Nf3IEaj+pCBrXFELOTERZm0Ichy+lHy2czZlpv+y80JfmILFVwPDsTvmo26SJ1I9zBU1/UVBfqAk35ujpb+RpL8BJjxIUjyXvSgAAAAASUVORK5CYII='], ['Rainbow', 'A8AAAAQCAYAAADJViUEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA3tJREFUGBk9wV9MG3UAB/Dv7+531971aKGMlr+OwjoGBUZwRDrRBJwj0bHEmeiS6Xwyxn8x8UVNzHAPPvliFhMzsy0m8uDD5h/QZWoUNxYMBoZbZCBjZTBoKRwtLde7cv9+bg/6+ZDnzk6C44lw6f6whdOnETpzla+0803RMD3ZGSH95V62lzGQtMH9M7MhfpPUyIX5HE1uvNXDaCQgtykB70cR/4unrn3aqzYkZt7v18ZfezyTkfy0HlJ7FMWKEBJFpYMSVq7bngMlGvvc/OTiLzRYLp8K1waObaS16MDIRfupG9c6SuwCsSt2kJ+/B+3HMdC6MBofa0N1a2sVJTWj02mh4BFCCpV84jN4oHyX3KYEJAi2BWYR2CkPmMlBiOgwE0mYiymo1Qu0Mx4/8VLVnrtnF4VxfuCN9z5mDBA9FJt7mzDe3oXkjou69CqoxkA4gC9xQAggankMa7uTm3m32SLKD+Sz6XXGGCDJAv6j7di4MzqBo199Adk2EIqkQGQHDy3Ij2Q+bHr9g3UxyFHLdFyvJHAg+J/ipYgdjuMyzwELCfRsTWG/NQEwhqCVC0YLy/qKGJzmD77w9pHSoFyjbWWxtjAH5jIIHi8EKkCpq8JteCD2H0F2u4BwZhE+x8BEWbt6i6df8kr/s0+H/HKMc1yo02MYaG9APjGLxJ+T2NxYRV7fxu66GqjwYyrn2AG7YFGw4FygeYiXjva/KoipxoaKGPY1N+PJfRHEauvQaIj47vsLSN67i87ew6hOLGFeTS38FO45XhR8lQlffS0tmGViwbmCdKEb3tJSGLYLieMwMfQr1tZSqOzqheCVkDWIk7i/vvJ7WdVVxd96XWBU4kzb55qOiZvqJazmCxhLGzBFiqbnuzD71xyij8bxEN/XzXccf7PyxJ6+lkxuwknnftP4vorBd9O1mXBAnsbfaQW6VQadcWC7gmiIH0JlrBWuw+DYgFyiSGqu+O2NjZllPMBJRUevuH4Ipu1DyOefrS6RzmQN211iFGUtzSAcD8dh2Ll8cyStai8vra/8MQhgEADvjx/bX78c6rgT1ddl722/btSelEz69eaWoZqms1kwrGVt27xV1I1zgdWfRw6Ww8lmswQAo6QR2dnM6JC6HT3PEfvctjSsnx+3J1uob6qt6gAtSgEu4BbdV2KO80T3O0QQBFiWRQRBwL/txI3OlzkSKwAAAABJRU5ErkJggg=='], ['Rarity', 'BMAAAAQCAYAAAD0xERiAAAEEElEQVR4Xm2SW2xURRyHfzPnsmcvlO4ulN1uF2sLrIpdJNS0KUZFUq1t0AiKkpASbyQSjRKENEGrPuCTiUoTjSENKAnFYKokbZOmIBaoTRXB1AjbWmrabmVpt3SvZ899PFnTxAe+ZF7+D998mf/gbmwt30131B58YM+WTw7vbTnW/+oTHZda6490723uPP1KY0fna40dh/Y0fFz/4pq3XRFEsATB/2i71EauvDcplHN173p8of2gnI8KPHLxm/AEqwgIARUEeywyS1dVPZ+9kJ6OHdB/uzF2BmcYXRIdHxkhO/0vR/e9+c4p7+pIO+92+wlHaGE+QV1lYWpLCe90kdKVTvJo80rqDTic4nJfk7c62kM3rltfgQpSLGOM4ZfR0apQIPQTpSR04uhVqhUYSkoItLyMVFaEIjNENpTg8ZbVyGYK6PpyHIYGBhCmLiYHZ2NDzxZlpwYHaX3V2mMet3sPpZSbjc/B5y+Fw8GDgWEukcbURBLR2jB0TcPpz4cwO5aBBQJuWSnsbC09eeN50tnZSYy0s6p5V+MwIVghSQ4iFwqQHBIIIcVjGEaxXtd1XO2P4dr3N6EqCvJyFoqmgvqDlqZqp+jxD4/z8etKGxjxm6ZJxmIxnB8YwNDQEGITE5iemQHHcRAEATYIVPvB8ZQRQu05D45QGPNx2PYNNFxWV21y/h0AiCiKkGUZcwsZnDjTg7cOtuOr098hYxLYQJIklK8ps5hoaAyM2ZeAFwRQEJi5FEclT/BpxZBKFhdkQimFx+NBTbQG+1pfQFZ34tZtFd29PTAtC+N2dU9vH/t18sKCwPP4r46DQ3QySzcGKBGERzRFpYl4CkubPdd3Fj1nu5GduAxvdQNIPgNV1zBw/hy6+y+D510xUZQYzwlM5CXT5iID+5RailLNDINN/ZUCoQTLlnkQj8dx8uRJW2DA7V2F6H0RGJoGt8vFgqF7c2vD0T4wMANgd0yjP2Mqb+Ty2RkqMrhhmbh+JYnk7TSWl/pwuP0DrIvWoX73EWx/LIIV3lKIgoitT21Dy7aWPzU125/JpbOLukrA8U1ly8uGwxWVz1CXwOvE0qHIGq4NJ4qPHApVoKurC4defw6bKigCwfLiRkMBPzavL39w5/tPChk5vV+ZvzVHUknm4DhB13RKeZ5LlthlzDAQG00jkykU/5VTYKgJiTANE6LkhKIqTNW0nKqpvYauj89PzX5jcqxG0/WmeGK6bj6V+IHPy7nfV/hWbS5kM0gnC5iMLWBjXfhnAA0FRQGz0XVtzmJsZEHOH52a+uPirubtOmw2BfYmg9cSP2YsJ7uIbxlpfaitdk3l/Q/rlv7FnVzucmXdPS+1HtjyD8dzWCIvy76/Z6bY5MTs4tfjn7HBjwZxN/4Fq6rr1ZuF0oUAAAAASUVORK5CYII='], ['Spike', 'A4AAAAQCAYAAAAmlE46AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAsFJREFUOE+Fk1tM0nEUx/9QPtCD7z30nE9sbbVeXJJR6j8DkVsIhg6HTqSXnBHSMMEbEy+AgPwVQpcgNy+kKLc/lCgF09Wquaab67kHX1pulif+mHRdne3sd3Z2Pt/fOee3H4J8N/ow2lrj4H64OljRfEXBIZ/k/3lWquXIrQl2ROAVA98jOro2XKUtvV9Dpj/iFV/ppwvLVfzThEBZGRWh0S4hmFx+rId2ysmMSU6WAAUeMfDcdYe0gUrGdUOl7rZXBDRdRQtRp1PeIRlVctIzk+lHR6itJnwC1nkbgOXgZlhO3h6RY9rZKYT7W9NUKpUklUqRKjPDQADEjYTz3SLgzQjzMWua/5E5xLpQrqOX/jEzamTc4LqEX/KQRwRMBwfEDgnUOyXAdgk+1zr5e0w7J/vA15OfN28PW5SnZlRuVT3WeMia5oHW1AthawSS40mIjcWhW98HfF89Ifa6qb+hqAA6FA5xzIp/dVncYDc/hkQOiI/jBcctCegwdRJgsERWcszpZTrKU/3S7s+Ff4vn9UG4aWbGyofoaB60d05dDJuiR/8DcXMCpLY24GPsrlRWcxZxKmaqF0aCsDy8ArgtAVFL/Jc2C4LWBEwFNLCUbt9PZrpEiEk2VjbmMYIdm4TQ6Cq4RmYB02CwZAlB2ByBkHEVYhYcEmEreNZl4F+/C8F0+0vE2x1IL3qDsDgZhKg5Bt7ULAgHa+HVzlt4v7MHMQyHpM8LrlQzuNdaIfJCub+R0Z5DfNrAxsJAEHJbhXhue5nQJmS3t2D73S6suVK5XBKiYQMs4B3xSEbZ83xTc3ljq5eMmNts5/3d82/8jicQDc0Cbo8BjiVyQsez4rYkeNRzfqfadUYgEJBRFCVRKBQS0tTUSM7BxaauUelyenwunnZ+SnhXDkKG0EGgb+5g4p5dpa5TFEkk1bmfQSu8/TfTXs+Z8UbptgAAAABJRU5ErkJggg==']], + not: [['Plan9', 'AwAAAAPCAYAAAGn5h7fAAAABmJLR0QA/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', 'BMAAAARCAMAAAAIRmf1AAACoFBMVEUAAABnUFZoUVddU1T6+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', 'BQAAAAPCAMAAADTRh9nAAAALVBMVEUAAAC3iopWLTtWPkHnvqUcBxx5GCZyAAARERGbdXJrRUyGRUyYbY23coZFGDRFGEYfAAAAAXRSTlMAQObYZgAAAGhJREFUeF5Vy1kOQyEMQ1Fshzd12P9y61AixLX4yJFo1cvVUfT23GaflF0HPLln6bhnZVKCcrIWGqpCUcKYSP3JSIRySKTtULPNwMaD8/NC8tsyqsd1hR+6qeqIDHc3LD0B3KdtV1f2A+LJBBIHSgcEAAAAAElFTkSuQmCC'], ['Sega', 'CwAAAALBAMAAAD2A3K8AAAAMFBMVEUAAACMjpOChImytLmdnqMrKzDIyM55dnkODQ94foQ7PkXm5Olsb3VUUVVhZmw8Sl6klHLxAAAAAXRSTlMAQObYZgAAANFJREFUGJVjYIACRiUlJUUGDHBk4syTkxQwhO3/rQ/4ZYsuymi3YEFUqAhC4LCJZJGIi1uimKKjk3KysbOxsaMnAwNLyqoopaXhttf2it1anrJqke1pr1DlBAZhicLnM5YXZ4RWlIYoezx0zrjYqG6czCDsYRzxIko6Q/qFaKy0690Ij0MxN8K2MIhJXF+hsfxJxuwdpYGVaUU3Mm5bqgKFOZOFit3Vp23J3pgsqLxFUXpLtlD5bgcGBs45794dn6mkOVFQUOjNmXPPz8ysOcAAANw6SHLtrqolAAAAAElFTkSuQmCC'], ['Sakamoto', 'BEAAAAQCAYAAADwMZRfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAxVJREFUOE+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', 'BAAAAAQCAYAAAAf8/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', 'BAAAAAQCAYAAAAf8/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', 'BIAAAAQCAYAAAAbBi9cAAAD/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', 'BAAAAAQCAMAAAAoLQ9TAAABCFBMVEUAAAAA//8rqtVAqtUQj88tpdIYks46otwVldUbktEaldMjldM2qNcXk9IWktQZkdIYlc8mnNUXlNEZktEZlNIYktIWlNMXktE7o9klmdMXktFHqdkXk9EWk9EYk9IlmtQXlNEXktAWk9AWlNEYlNFDptkZldMYk9E4otg/p9kXktEXk9AXlNA4otclmdQXk9IYktEXlNEwn9YXk9IXk9FFp9o3otgXk9FPrdwXk9E2otdCptkXk9E/ptkcldIXk9Edl9IXk9EjmdUXk9EXk9EXk9EbldIcldIjmdMmmtQsndUvntYyn9YyoNYzoNc0odc1odc2odc6pNg7pNg9pdlDp9pJqttOrdzlYlFbAAAARXRSTlMAAQYMEBEVFhgcHR0mLS8zNTY3PT4/RU1kdXp6e3+Cg4WIiYqMjZGXl5mbnqSnrbS3zMzV3OPk7Ozv8fT29vf4+fz8/f7SyXIjAAAAmUlEQVR4XlXI1WLCUBQF0YM3SHB3a1B3l7Bx1///E6ANkDtva0jKbCW2XIH1z2hiZEZ4uUgxo7JedTQye/KN/Sb5tbJ+7V9OXd1n+O+38257TL+tah3mADAwSMM7wzQWF4Hff6ubQIZIAIb6vxEF4CZyATXhZa4HwEnEA+2QgoiyQDnIEWkjVSBBZBqXbCRlKYo8+Rwkyx54AOYfFe7HhFa7AAAAAElFTkSuQmCC'], ['CentOS', 'BAAAAAQCAMAAAAoLQ9TAAAB5lBMVEUAAADy8tng4Ovs9tnk5O3c7bX44LLduNO1tdDh7r/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', 'A0AAAAQCAYAAADNo/U5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAZ5JREFUOE+Nkk0oBHEYxv8fu5GQj3JwcaDkIAc5IpR87M7MKnIVJVKclaIQ5Sy5OLkgR7n5OigcSNpmd2c2Vyfl4KT8/muWiVU79TTv+7zv837NCBF6PG1X+NpZyEYSD9mIc+tHnBPe23B9xKrCuTmbQA/JKfABrhBswa1hH4A38IwfOxPdX1qcjiCQxO5NyrjKV70TnSbeRPwJvGN3i4yyqnEucPY8ZZX9GSEgGK+RvFfyjk2VKZxzBNG8wJWWgh/xtDOeUXZ7Slr6TrSLYL9N4SMgYTTcwdc2ArvJcElhSVcM6mCNSV8n9hA59yTU5UWMG6HIbLhIWlglgWiC2L4Z79qTdo40D6ISuOWwKCWHyk9Fv8ldpUHOuGTuynwSBUynddPdlbEosVpP9Eu4FnOsRzUYNTsdmZN/d5LDiqM0w+2CMdAFFsFGWgfXxZnheqe/z+0puwEM0HHYV3Z9Sgz8TEz7GkQvpuJ/36ggj2AaHLrSlkULWV5x+h2E8xkZL16YVjGNaAUscfZ/f6c/k9ywLKI2MMcRWl0RLy007idmRbQJ7RIfDAAAAABJRU5ErkJggg=='], ['Fedora', 'BAAAAAQCAMAAAAoLQ9TAAABPlBMVEUAAAApQXIpQXIpQXIqQ3UpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIpQXIqQ3QpQXIpQXIqRHYpQXIpQXIqQ3QqRHYpQXI8brT///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', 'BAAAAAQCAYAAAAf8/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', 'BAAAAAQCAMAAAAoLQ9TAAAB9VBMVEUAAAD///+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', 'BAAAAAQCAMAAAAoLQ9TAAACVVBMVEUAAADh4eEAAAAAAAAAAAAAAAAAAAAsLCyXl5dgYGCnp6eTk5N3d3fBwcGqqqq8vLzNzc3Ozs7Ozs7Pz8/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', 'BAAAAAQCAMAAAAoLQ9TAAABrVBMVEUAAAD///////+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', 'BAAAAAQCAMAAAAoLQ9TAAABj1BMVEUAAAD///////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', 'BAAAAAQCAMAAAAoLQ9TAAABvFBMVEUAAAAcUaYdVKwAAAAAAAUABAwWRY4YSZYhZtIhaNYHDx0KCgoFDBcKCgoRMmYSNm0fXL0fXb8AAAAYS5gaTp8fXLwgXsEGBgYFBQUZSpgZTZ4JFSgODg4IEiIOJkwOKVIkW7EnXbQLGzUTExMKGC8LHjwMIkITExMiIiIPEBEPJ00QEhMXOXAaPncOJEgoXbApXbEcHBwwMDAEAgAfHRgQDgo3NC8AAAAHBwcKCgoLCwsJCQkaGhofHx8lJSUwMDA0NDQ4ODiRkZEICQocHBweHh4GBgYHCg8mJiYnJycpKSkrKystLS0uLi4ICAgODg43NzcRERF1dXUUFBSjo6O1tbUbGxsEBAMLGS8MDA0iIiIjIyMkJCQNDQ0NHTYKCQkoKCgPDw8QEBArMDkKCgkRERIREhMxMTEyMjISIz00Njk1NTU2NjYCAgIVFRU5OTo5P0c8PD0+Pj4/QURAQEBHR0dKSkpMTExSUlJiYmJlZWVnZ2cWFhZ2dnZ4eHh8fHx9fX2FhYUXFxeVlZWXl5eYmJiZmZmcnJwZGRmlpaWrq6usrKyvr68KFiq/v7/FxcXY2Nji4uLn5+ft7e0yif9uAAAAN3RSTlMAAAApKSkqKioqg4OEhISEhoa1tra3t7y9vr7S09PT09TU+Pj5+fn5+/v7+/v7+/v7/v7+/v7+70RY/wAAAPpJREFUeF4dyWNjw2AUBeC7dfYyorM6rx1exKltzLZt2/rDa/J8OgBVVlFDX39jcTZoUqCse251a2dvu6ccUtWlanLQ4Vpel+ThlWq1l3wEz58tx4dOt1dMlAJk9A5gMjG75LHwo46hzkwosGOMbejumoRvubC9EOrMviT0E0Us9fvN9dA6zxJCNv6+ECGsb6oNWsgmpZT9/UTUZo3Em6AW34guTL4jiAudiCM1kLcw8/SmHERfT1/eueBiDqR1GK1n9w+K8nglxYxd6QAML4ztXoQuj8YFgWcgqdJp8qzty26vaboCNIxBCshyQDKov0aXr29v1ufq1PwPx5Q7bCoh6eoAAAAASUVORK5CYII='], ['Slackware', 'BAAAAAQCAYAAAAf8/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', 'BAAAAAQCAMAAAAoLQ9TAAABjFBMVEX///8AAAAAAAAAAAAAADMAAGYAAAAAHFUAGWYAF10AImYAIGAAHloAHGMAKGsAGmYAJmYAJGEAKnUAJ1gAMXYAJnEAJGQAI2EAK28AK3cAGTEAMHgALXEALXgALG0AFUAAI2oAK3EAMngANoYALXMANIAAM4IANIIAL3gANIcANokANoQANYQAOY0ANIYANooAN4kAN40AOY0APZMANIUAOY0AO5AAPZUAPJAAP5MAPpQAQJUAOYsAPpYANoUAPpoAPpUAM4AAQJkAPZIAPJEAQpgAN4cAPpQAPZUAPJEAO4oAOosAOo8AQJoAOYsAO44AQpsAO48AQp0AP5UAQpoARJwAQ58ARaAAQZgAQ54AQ50AQpgARaIARqMARaMARaIAR6QARaIARaEASakARKEAR6MASqsARKEASKcAR6MARqYAR6UATbEATa8ARqUARKAAR6oARqMASKgATK8AR6QATbIATbAASq0AR6cASKgASqwAR6UASKcATa8ASqoASqwAS6wASKoAS60ATbHn4CTpAAAAhHRSTlMAAQIFBQUGCQoLDxAREhMUFBUYGhobHB0eHh8gIiIjJCQkJCYoLC0xMTE0NDo6Oz1BQUNHSUxOVFVVVldaWl5iY2RkZWZoamtsb3FycnR1ent9f4KDhIiJioyNkJGYm5+foqOkpqamqKmqrKytsLKzs7e4uLy8v8TFxcXGx8rO0NXY2eZc4XYcAAAA00lEQVR4XkWN1VoCUQAG/3NWtwh7CTsQJOyk7BaDxuxA6bbrxf32gt25m7kZqDRYxziooDV7+1AalMUavQh2AsEZoWvzigLun+T17/c8QiJZ7qu2QKiNmyZthdcR1/as353jIeU1GxMHo5XHdqPFeX8IaDMdHPYN6dRN7LR4qQewdTa35HWkyh+fbxERAMjwlAWJv3CPSKDQ+H7XvHdkV4Pua3Gtm4sPKIF/WV8dop4VKBw/NU33B3x1JbTt+XwhkJQoqRfWvHOy28uqH8JIdomR/R+s9yR3Cso77AAAAABJRU5ErkJggg=='], ['Ubuntu', 'BAAAAAQCAMAAAAoLQ9TAAABKVBMVEX////ojFzplGf1zbnqnHLvs5P10b3yuZv1xKrytZXvtJXys5LysI32waT0n3HxiVHwg0jxhk31kFn0h0zxf0P0hUrveTv2iU3yfkD1hEfyejv5eDLybSX0aR7zZxvyayH6ZxnxZBj4YhH7XAb5WALlUQLeTwHgUAHeTgHfTwD65NzdTQDdTQHdTgD31MfcTgLcTADcTQD////xt5/31Mf54dfmfE/dUAbeVQ/jcUDcTgHeWBnnflHohFvpjGbqkGztnX342Mz53dLgXiP65d399PHdUgrtoYLyu6Xzvaf76eLfXB/rkm/fWhvupojwrpTeVhTgYSfgYynzwa30xbL1ybnngFT31snngljhZS3539XhZzDiajbibDn77OX88Ovrl3X99vTjbz1fisGCAAAAMHRSTlMABgYGBwcHJiorMDA1NXGHjY2Nl5mZmZyfn6O5u8XHzc3X193j9fj4+vr6/f39/f08OUojAAAAx0lEQVR4Xi3HZVbDYBhGwQctWqzFPXiQ+36pu+LubvtfBKcN82/UEhld2vWXxyL6F92gbTPabse8hU/uHMx1SZoyyJWPTwq1Rs7GpYE9+Cg+OJcs1MHvU9y4fnrN31yUm18vMCIPjtw3QMndw4rs8ieVzAAcBlewpe1KM3uaBuD3Dda1BhWXAsi6AFY1a2SqifxZ+rnxWYcJDRkUS3fO1R5vwe+XZgw4D4L3RAJiknoXCVX3WeiUpJ5pIxTvVmg45pl5k4Ot/AGV2iqZBWgJJAAAAABJRU5ErkJggg=='], ['Windows', 'BIAAAAQCAYAAAAbBi9cAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAA+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', 'BAAAAAQCAYAAAFo9M/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', 'BAAAAAQCAYAAAFo9M/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', 'BYAAAAQCAQAAAC45EetAAAA8ElEQVR4XnWOsUpCYQBGz1TIHYu2Qix6g0DEtSeQu/UIISJtUS8gJq61F1wcdMohcBDxKUR8hsz1xA/y44/cs3znbB+RJ0Skl3pSkeFQbUs79VAPzrwPFRmN1Ja0Ug/16I93+1oi4lKte+zMXv32WuoAm43lXMrqzbFncgWw21lORf4+/PREKpAhYqZuPXZ+T/3yXbZEajV1JavUQ104sRcq0myqc5mnHurWqc/7yhExVwuPncl+C4Bu13L60ueAwcByOtLhgAIRCzU38fRGTmSxUBvSSD3Ui1NvQkXWa7Uq1dRD9R17HiqyRUSy1NP6B7e1Yu2GtlUKAAAAAElFTkSuQmCC'], ['Yuno', 'BgAAAAPCAYAAAD+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==']] + }; + + Emoji.not.push(['PlanNine', Emoji.not[0][1]]); + + Icons = { + header: { + png: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA' + }, + themes: { + oneechan: 'A8AAACWBAMAAADzkc/yAAAAMFBMVEVoaGhsbGxsbGxsbGxsbGxsbGxsbGxsbGxqampsbGxsbGxsbGxlZWVsbGxsbGxsbGzdpWE1AAAAD3RSTlMAfEDYHcNYkhP0pz8MJYTrg0d+AAACwElEQVR4Xp3RT2gTaRjH8W9r/rVJNTl42UvHvYinVGLR7SoZ6+JBD0kpsafVgJale4m67r/DkgEp7EEMsqy2KEwEUdjt0kBZqovY3oQedEBE8GA9iV42TQaTVm0f33lfCAgLZfuDgc/85n2f5zDAonnYIQ5LIwCykrj5hyqc5dWlz35QaMr7c3eKEBGReVVASaRZBOCxiKfRJ7KuMV4x1eGvE7pKjHo8bvwDXXsh0Xqu4AGP/mKT7DRgwTc4IgaXRSSTeQ2i0zbNv2UBjonP9gDMGQC7DQAiGbacbwpjRYB7rsh0DSLN+pnSqxbk7reIfEjb7Iyvwvtw0jSrC7Y6Uy6WzreAPVl1y+rM2STjmaGa3uX/+PNbB+JrHqSnoDJAfy3mQ92hbJG2GFS26KnSIHjtHaClUCM6wBA8RX0KDtf14coUp73YdDDQgvRb4ImMnRJxgPnRsXFZwaTbAl4UTnoASzKYbTsQy14gVD4AvS0g0oblsxCvztrUbUKztVySUSi12ZanQEg+EM6rpleK9OTptxd+AnUmV/0TULeies5GMPmWun8AeCS/uxsOwOHCiM0nOV4zWBp5Y2ncJnYIIJSHeYB4EsIaL2ESgH3wSmPOutzQCH1/ov8gJmF/0SCWXTfgYtuAvl/4jyyLzzYRj5xcJ+6KrfBucbsEcKVaF9dm8oH48u5vB6iLzJhN4qMzIWtF4OFR95p79dkilS+kOLGWdajIVSKuBDhEKKuQkzZRUUj8ekk/MPy5io2qg7Qhd8GGr8o2aRsgZ5EeloZB9zqwQ6PrxkkN8QanTEMpaRD7TTfDsnFwv7rVmdOZ3NnV2a6KZL/Iyv9DKpWydqVSSTrpNFsbCN9mpk8ATIrKWWA2QAsiEqQBYY0Z6FG4cheIytBEC4AE4TUP0GXeoEvaBnG1xSgrTYOS+Hz6M2PffclH1wyYp51t8R8AAAAASUVORK5CYII=', + "4chan SS": 'A8AAACWBAMAAADzkc/yAAAAMFBMVEVmZmZnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NkZGRnZ2dnZ2dnZ2eHsc5jAAAAD3RSTlMAgEDLkve+G+dSqwcRdCZzKH/3AAACz0lEQVR4Xp2PQWhTdxzHP0vTliQvMaE4NjdoutMOA6NrpeghQaazp4R1XkL15VDR4UbeKiJ4UXCuzG7kgd2lONLbGNmWgKwqGyMQN0QRqruIuKYXi9iDtkmeaaD97Z9/2nfy0n0u+fDl//3+XnA5E+XIoA30bPDnVceC0EfgkynAl6AyulICHhjDi/kYEHx7Ab8NhPpW0bxfbRQAfEcfSasEVGv3RTIQlMlAVlagv7lIRcSi+An05hy4awN3f+a1TKNhqbFvfAG4LW1+BVNLI0pRNDE8cS0p8F364bEpF4FbkJdZAIxs0wIIvSU/AuAdPci2GRj6ooz+jpp8A4RyzvKSFOCZrB46KLUyWUmZKVMybuK+cVvAwAm1s12MXUP73wXYKSKNMHhF0iJ1qIpMqWyebEcymCJjSi4SFzmuk6p+LPP8JXKs0zI3dx7eePOyWn4900ODNsD5xmC8ZUHv5Se/B81J8Lf6xkdOpSE/kmvtWq7aJK0Xze/KNxN8iNeZpyfGpwT+vYc3xT4I/GP7YxwqQTL9W4J8GO6sqJb/OHSPpNvL7/C8OKlvjZ9Qt9zrEDx1Rf+G4iKtMtAlIzOSAKprUF0FsgmV1oGcDW84W9ICirNwfQ3IrxNIvgL8sqdPVgAjKYow4Dn805c6AujXEaq/JURg/BpgTGdINhbhqSTI10pQEZs78dMY8eEyvXNOqeLcAALZkyoEmGs4JS295hiaik5Qlc+zpwFPxSnNqRZncwVVVDt6+brYFJubt36Jbl5n4j2FBV5pU4cLH1twLmmx2wK4EGX3hKx3xLMB7NASHBvUIstff9tJyM93xLg0tkO36lNfqZa74y67t9zrKgj3i7zcnkQikehAJBLGxU3+3yDMDB/9DOBvUSSAYlvWwSeb0qWlAN1Kjn0AeOXK9+sA/EFXYxHQ4QE0QamjCakraOKyiqYqNTQ9W2Ic2ct/3c/SAwz13v8AAAAASUVORK5CYII=' + } + }; + + JSColor = { + bind: function(el) { + if (!el.color) { + return el.color = new JSColor.color(el); + } + }, + fetchElement: function(mixed) { + if (typeof mixed === "string") { + return $.id(mixed); + } else { + return mixed; + } + }, + fireEvent: function(el, evnt) { + var ev; + + if (!el) { + return; + } + ev = document.createEvent('HTMLEvents'); + ev.initEvent(evnt, true, true); + return el.dispatchEvent(ev); + }, + getRelMousePos: function(e) { + var x, y; + + if (e == null) { + e = window.event; + } + x = 0; + y = 0; + if (typeof e.offsetX === 'number') { + x = e.offsetX; + y = e.offsetY; + } else if (typeof e.layerX === 'number') { + x = e.layerX; + y = e.layerY; + } + return { + x: x, + y: y + }; + }, + color: function(target) { + var HSV_RGB, RGB_HSV, THIS, abortBlur, blurTarget, blurValue, drawPicker, holdPad, holdSld, isPickerOwner, leavePad, leaveSld, leaveStyle, leaveValue, redrawPad, redrawSld, removePicker, setPad, setSld, styleElement, valueElement; + + this.hsv = [0, 0, 1]; + this.rgb = [1, 1, 1]; + this.valueElement = this.styleElement = target; + abortBlur = holdPad = holdSld = false; + this.hidePicker = function() { + if (isPickerOwner()) { + return removePicker(); + } + }; + this.showPicker = function() { + if (!isPickerOwner()) { + return drawPicker(); + } + }; + this.importColor = function() { + if (!valueElement) { + return this.exportColor(); + } else { + if (!this.fromString(valueElement.value, leaveValue)) { + styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; + return this.exportColor(leaveValue | leaveStyle); + } + } + }; + this.exportColor = function(flags) { + var value; + + if (!(flags & leaveValue) && valueElement) { + value = '#' + this.toString(); + valueElement.value = value; + valueElement.previousSibling.value = value; + editTheme[valueElement.previousSibling.name] = value; + setTimeout(function() { + return Style.themeCSS.textContent = Style.theme(editTheme); + }); + } + if (!(flags & leaveStyle) && styleElement) { + styleElement.style.backgroundColor = '#' + this.toString(); + } + if (!(flags & leavePad) && isPickerOwner()) { + redrawPad(); + } + if (!(flags & leaveSld) && isPickerOwner()) { + return redrawSld(); + } + }; + this.fromHSV = function(h, s, v, flags) { + this.hsv = [h = h ? $.minmax(h, 0.0, 6.0) : this.hsv[0], s = s ? $.minmax(s, 0.0, 1.0) : this.hsv[1], v = v ? $.minmax(v, 0.0, 1.0) : this.hsv[2]]; + this.rgb = HSV_RGB(h, s, v); + return this.exportColor(flags); + }; + this.fromRGB = function(r, g, b, flags) { + var hsv; + + r = r != null ? $.minmax(r, 0.0, 1.0) : this.rgb[0]; + g = g != null ? $.minmax(g, 0.0, 1.0) : this.rgb[1]; + b = b != null ? $.minmax(b, 0.0, 1.0) : this.rgb[2]; + hsv = RGB_HSV(r, g, b); + if (hsv[0] != null) { + this.hsv[0] = $.minmax(hsv[0], 0.0, 6.0); + } + if (hsv[2] !== 0) { + this.hsv[1] = hsv[1] == null ? null : $.minmax(hsv[1], 0.0, 1.0); + } + this.hsv[2] = hsv[2] == null ? null : $.minmax(hsv[2], 0.0, 1.0); + this.rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]); + return this.exportColor(flags); + }; + this.fromString = function(number, flags) { + var m, val; + + m = number.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i); + if (!m) { + return false; + } else { + if (m[1].length === 6) { + this.fromRGB(parseInt(m[1].substr(0, 2), 16) / 255, parseInt(m[1].substr(2, 2), 16) / 255, parseInt(m[1].substr(4, 2), 16) / 255, flags); + } else { + this.fromRGB(parseInt((val = m[1].charAt(0)) + val, 16) / 255, parseInt((val = m[1].charAt(1)) + val, 16) / 255, parseInt((val = m[1].charAt(2)) + val, 16) / 255, flags); + } + return true; + } + }; + this.toString = function() { + return (0x100 | Math.round(255 * this.rgb[0])).toString(16).substr(1) + (0x100 | Math.round(255 * this.rgb[1])).toString(16).substr(1) + (0x100 | Math.round(255 * this.rgb[2])).toString(16).substr(1); + }; + RGB_HSV = function(r, g, b) { + var h, m, n, v; + + n = (n = r < g ? r : g) < b ? n : b; + v = (v = r > g ? r : g) > b ? v : b; + m = v - n; + if (m === 0) { + return [null, 0, v]; + } + h = r === n ? 3 + (b - g) / m : g === n ? 5 + (r - b) / m : 1 + (g - r) / m; + return [h === 6 ? 0 : h, m / v, v]; + }; + HSV_RGB = function(h, s, v) { + var f, i, m, n; + + if (h == null) { + return [v, v, v]; + } + i = Math.floor(h); + f = i % 2 ? h - i : 1 - (h - i); + m = v * (1 - s); + n = v * (1 - s * f); + switch (i) { + case 6: + case 0: + return [v, n, m]; + case 1: + return [n, v, m]; + case 2: + return [m, v, n]; + case 3: + return [m, n, v]; + case 4: + return [n, m, v]; + case 5: + return [v, m, n]; + } + }; + removePicker = function() { + delete JSColor.picker.owner; + return $.rm(JSColor.picker.boxB); + }; + drawPicker = function(x, y) { + var box, boxB, btn, btnS, elements, item, p, pad, padB, padM, sld, sldB, sldM, _i, _len; + + if (!(p = JSColor.picker)) { + elements = ['box', 'boxB', 'pad', 'padB', 'padM', 'sld', 'sldB', 'sldM', 'btn']; + p = {}; + for (_i = 0, _len = elements.length; _i < _len; _i++) { + item = elements[_i]; + p[item] = $.el('div', { + className: "jsc" + (item.capitalize()) + }); + } + p.btnS = $.el('span', { + className: 'jscBtnS' + }); + p.btnT = $.tn('Close'); + JSColor.picker = p; + $.add(p.box, [p.sldB, p.sldM, p.padB, p.padM, p.btn]); + $.add(p.sldB, p.sld); + $.add(p.padB, p.pad); + $.add(p.btnS, p.btnT); + $.add(p.btn, p.btnS); + $.add(p.boxB, p.box); + } + box = p.box, boxB = p.boxB, btn = p.btn, btnS = p.btnS, pad = p.pad, padB = p.padB, padM = p.padM, sld = p.sld, sldB = p.sldB, sldM = p.sldM; + box.onmouseup = box.onmouseout = function() { + return target.focus(); + }; + box.onmousedown = function() { + return abortBlur = true; + }; + box.onmousemove = function(e) { + if (holdPad || holdSld) { + holdPad && setPad(e); + holdSld && setSld(e); + if (d.selection) { + return d.selection.empty(); + } else if (window.getSelection) { + return window.getSelection().removeAllRanges(); + } + } + }; + padM.onmouseup = padM.onmouseout = function() { + if (holdPad) { + holdPad = false; + return JSColor.fireEvent(valueElement, 'change'); + } + }; + padM.onmousedown = function(e) { + if (THIS.hsv[2] === 0) { + THIS.fromHSV(null, null, 1.0); + } + holdPad = true; + return setPad(e); + }; + sldM.onmouseup = sldM.onmouseout = function() { + if (holdSld) { + holdSld = false; + return JSColor.fireEvent(valueElement, 'change'); + } + }; + sldM.onmousedown = function(e) { + holdSld = true; + return setSld(e); + }; + btn.onmousedown = function() { + return THIS.hidePicker(); + }; + redrawPad(); + redrawSld(); + JSColor.picker.owner = THIS; + return $.add(ThemeTools.dialog, p.boxB); + }; + redrawPad = function() { + var rgb; + + JSColor.picker.padM.style.backgroundPosition = "" + (4 + Math.round((THIS.hsv[0] / 6) * 180)) + "px " + (4 + Math.round((1 - THIS.hsv[1]) * 100)) + "px"; + rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1); + JSColor.picker.sld.style.backgroundColor = "rgb(" + (rgb[0] * 100) + "%, " + (rgb[1] * 100) + "%, " + (rgb[2] * 100) + "%)"; + }; + redrawSld = function() { + return JSColor.picker.sldM.style.backgroundPosition = "0 " + (6 + Math.round((1 - THIS.hsv[2]) * 100)) + "px"; + }; + isPickerOwner = function() { + return JSColor.picker && JSColor.picker.owner === THIS; + }; + blurTarget = function() { + if (valueElement === target) { + return THIS.importColor(); + } + }; + blurValue = function() { + if (valueElement !== target) { + return THIS.importColor(); + } + }; + setPad = function(e) { + var mpos, x, y; + + mpos = JSColor.getRelMousePos(e); + x = mpos.x - 11; + y = mpos.y - 11; + return THIS.fromHSV(x * (1 / 30), 1 - y / 100, null, leaveSld); + }; + setSld = function(e) { + var mpos, y; + + mpos = JSColor.getRelMousePos(e); + y = mpos.y - 9; + return THIS.fromHSV(null, null, 1 - y / 100, leavePad); + }; + THIS = this; + valueElement = JSColor.fetchElement(this.valueElement); + styleElement = JSColor.fetchElement(this.styleElement); + leaveValue = 1 << 0; + leaveStyle = 1 << 1; + leavePad = 1 << 2; + leaveSld = 1 << 3; + $.on(target, 'focus', function() { + return THIS.showPicker(); + }); + $.on(target, 'blur', function() { + if (!abortBlur) { + return window.setTimeout(function() { + abortBlur || blurTarget(); + return abortBlur = false; + }); + } else { + return abortBlur = false; + } + }); + if (valueElement) { + $.on(valueElement, 'keyup input', function() { + return THIS.fromString(valueElement.value, leaveValue); + }); + $.on(valueElement, 'blur', blurValue); + valueElement.setAttribute('autocomplete', 'off'); + } + if (styleElement) { + styleElement.jscStyle = { + backgroundColor: styleElement.style.backgroundColor + }; + } + return this.importColor(); + } + }; + + MascotTools = { + init: function(mascot) { + var el, filters, location, position; + + if (mascot == null) { + mascot = Conf[g.MASCOTSTRING][Math.floor(Math.random() * Conf[g.MASCOTSTRING].length)]; + } + Conf['mascot'] = mascot; + this.el = el = $('#mascot img', d.body); + if (!Conf['Mascots'] || (g.CATALOG && Conf['Hide Mascots on Catalog'])) { + if (el) { + return el.src = ""; + } else { + return null; + } + } + position = "" + (Conf['Mascot Position'] === 'bottom' || !(Conf['Mascot Position'] === "default" && Conf['Post Form Style'] === "fixed") ? 0 + ((!g.REPLY || Conf['Boards Navigation'] === 'sticky bottom') && Conf['4chan SS Navigation'] ? 1.6 : 0) : 20.3 + (!g.REPLY || !!$('#postForm input[name=spoiler]') ? 1.4 : 0) + (Conf['Show Post Form Header'] ? 1.5 : 0) + (Conf['Post Form Decorations'] ? 0.2 : 0)) + "em"; + if (Conf['editMode']) { + if (!(mascot = editMascot || (mascot = Mascots[Conf["mascot"]]))) { + return; + } + } else { + if (!Conf["mascot"]) { + if (el) { + return el.src = ""; + } else { + return null; + } + } + if (!(mascot = Mascots[Conf["mascot"]])) { + Conf[g.MASCOTSTRING].remove(Conf["mascot"]); + return this.init(); + } + this.addMascot(mascot); + } + if (Conf["Sidebar Location"] === 'left') { + if (Conf["Mascot Location"] === "sidebar") { + location = 'left'; + } else { + location = 'right'; + } + } else if (Conf["Mascot Location"] === "sidebar") { + location = 'right'; + } else { + location = 'left'; + } + filters = []; + if (Conf["Grayscale Mascots"]) { + filters.push(''); + } + return Style.mascot.textContent = "#mascot img {\n position: fixed;\n z-index: " + (Conf['Mascots Overlap Posts'] ? '3' : '-1') + ";\n " + (Style.sidebarLocation[0] === "left" ? "" + Style.agent + "transform: scaleX(-1);" : "") + "\n bottom: " + (mascot.position === 'top' ? 'auto' : (mascot.position === 'bottom' && Conf['Mascot Position'] === 'default') || !$.id('postForm') ? '0' : position) + ";\n " + location + ": " + ((mascot.hOffset || 0) + (Conf['Sidebar'] === 'large' && mascot.center ? 25 : 0)) + "px;\n top: " + (mascot.position === 'top' ? '0' : 'auto') + ";\n height: " + (mascot.height && isNaN(parseFloat(mascot.height)) ? mascot.height : mascot.height ? parseInt(mascot.height, 10) + 'px' : 'auto') + ";\n width: " + (mascot.width && isNaN(parseFloat(mascot.width)) ? mascot.width : mascot.width ? parseInt(mascot.width, 10) + 'px' : 'auto') + ";\n margin-" + location + ": " + (mascot.hOffset || 0) + "px;\n margin-bottom: " + (mascot.vOffset || 0) + "px;\n opacity: " + Conf['Mascot Opacity'] + ";\n pointer-events: none;\n " + (filters.length > 0 ? "filter: url('data:image/svg+xml," + filters.join("") + "#filters');" : "") + "\n}"; + }, + categories: ['Anime', 'Ponies', 'Questionable', 'Silhouette', 'Western'], + dialog: function(key) { + var dialog, div, fileInput, input, item, layout, name, option, optionHTML, setting, value, _i, _len, _ref; + + Conf['editMode'] = 'mascot'; + if (Mascots[key]) { + editMascot = JSON.parse(JSON.stringify(Mascots[key])); + } else { + editMascot = {}; + } + editMascot.name = key || ''; + MascotTools.addMascot(editMascot); + Style.addStyle(); + layout = { + name: ["Mascot Name", "", "text"], + image: ["Image", "", "text"], + category: ["Category", MascotTools.categories[0], "select", MascotTools.categories], + position: ["Position", "default", "select", ["default", "top", "bottom"]], + height: ["Height", "auto", "text"], + width: ["Width", "auto", "text"], + vOffset: ["Vertical Offset", "0", "number"], + hOffset: ["Horizontal Offset", "0", "number"], + center: ["Center Mascot", false, "checkbox"] + }; + dialog = $.el("div", { + id: "mascotConf", + className: "reply dialog", + innerHTML: "

" + }); + for (name in layout) { + item = layout[name]; + switch (item[2]) { + case "text": + div = this.input(item, name); + input = $('input', div); + if (name === 'image') { + $.on(input, 'blur', function() { + editMascot[this.name] = this.value; + MascotTools.addMascot(editMascot); + return Style.addStyle(); + }); + fileInput = $.el('input', { + type: "file", + accept: "image/*", + title: "imagefile", + hidden: "hidden" + }); + $.on(input, 'click', function(evt) { + if (evt.shiftKey) { + return this.nextSibling.click(); + } + }); + $.on(fileInput, 'change', function(evt) { + return MascotTools.uploadImage(evt, this); + }); + $.after(input, fileInput); + } + if (name === 'name') { + $.on(input, 'blur', function() { + this.value = this.value.replace(/[^a-z-_0-9]/ig, "_"); + if (!/^[a-z]/i.test(this.value)) { + return alert("Mascot names must start with a letter."); + } + editMascot[this.name] = this.value; + MascotTools.addMascot(editMascot); + return Style.addStyle(); + }); + } else { + $.on(input, 'blur', function() { + editMascot[this.name] = this.value; + MascotTools.addMascot(editMascot); + return Style.addStyle(); + }); + } + break; + case "number": + div = this.input(item, name); + $.on($('input', div), 'blur', function() { + editMascot[this.name] = parseInt(this.value); + MascotTools.addMascot(editMascot); + return Style.addStyle(); + }); + break; + case "select": + value = editMascot[name] || item[1]; + optionHTML = "
" + item[0] + "
"; + div = $.el('div', { + className: "mascotvar", + innerHTML: optionHTML + }); + setting = $("select", div); + setting.value = value; + $.on($('select', div), 'change', function() { + editMascot[this.name] = this.value; + MascotTools.addMascot(editMascot); + return Style.addStyle(); + }); + break; + case "checkbox": + value = editMascot[name] || item[1]; + div = $.el("div", { + className: "mascotvar", + innerHTML: "" + }); + $.on($('input', div), 'click', function() { + editMascot[this.name] = this.checked ? true : false; + MascotTools.addMascot(editMascot); + return Style.addStyle(); + }); + } + $.add($("#mascotcontent", dialog), div); + } + $.on($('#save > a', dialog), 'click', function() { + return MascotTools.save(editMascot); + }); + $.on($('#close > a', dialog), 'click', MascotTools.close); + Style.rice(dialog); + return $.add(d.body, dialog); + }, + input: function(item, name) { + var div, value; + + if (Array.isArray(editMascot[name])) { + if (Style.lightTheme) { + value = editMascot[name][1]; + } else { + value = editMascot[name][0]; + } + } else { + value = editMascot[name] || item[1]; + } + editMascot[name] = value; + div = $.el("div", { + className: "mascotvar", + innerHTML: "
" + item[0] + "
" + }); + return div; + }, + uploadImage: function(evt, el) { + var file, reader; + + file = evt.target.files[0]; + reader = new FileReader(); + reader.onload = function(evt) { + var val; + + val = evt.target.result; + el.previousSibling.value = val; + editMascot.image = val; + return Style.addStyle(); + }; + return reader.readAsDataURL(file); + }, + addMascot: function(mascot) { + var el; + + if (el = this.el) { + return el.src = Array.isArray(mascot.image) ? (Style.lightTheme ? mascot.image[1] : mascot.image[0]) : mascot.image; + } else { + this.el = el = $.el('div', { + id: "mascot", + innerHTML: "" + }); + return $.add(d.body, el); + } + }, + save: function(mascot) { + var image, name, type, userMascots, _i, _len, _ref; + + name = mascot.name, image = mascot.image; + if ((name == null) || name === "") { + alert("Please name your mascot."); + return; + } + if ((image == null) || image === "") { + alert("Your mascot must contain an image."); + return; + } + if (!mascot.category) { + mascot.category = MascotTools.categories[0]; + } + if (Mascots[name]) { + if (Conf["Deleted Mascots"].contains(name)) { + Conf["Deleted Mascots"].remove(name); + $.set("Deleted Mascots", Conf["Deleted Mascots"]); + } else { + if (confirm("A mascot named \"" + name + "\" already exists. Would you like to over-write?")) { + delete Mascots[name]; + } else { + return alert("Creation of \"" + name + "\" aborted."); + } + } + } + _ref = ["Enabled Mascots", "Enabled Mascots sfw", "Enabled Mascots nsfw"]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + type = _ref[_i]; + if (!Conf[type].contains(name)) { + Conf[type].push(name); + $.set(type, Conf[type]); + } + } + Mascots[name] = JSON.parse(JSON.stringify(mascot)); + Conf["mascot"] = name; + delete Mascots[name].name; + userMascots = $.get("userMascots", {}); + userMascots[name] = Mascots[name]; + $.set('userMascots', userMascots); + return alert("Mascot \"" + name + "\" saved."); + }, + close: function() { + Conf['editMode'] = false; + editMascot = {}; + $.rm($("#mascotConf", d.body)); + Style.addStyle(); + return Options.dialog("mascot"); + }, + importMascot: function(evt) { + var file, reader; + + file = evt.target.files[0]; + reader = new FileReader(); + reader.onload = function(e) { + var err, imported, name, userMascots; + + try { + imported = JSON.parse(e.target.result); + } catch (_error) { + err = _error; + alert(err); + return; + } + if (!imported["Mascot"]) { + alert("Mascot file is invalid."); + } + name = imported["Mascot"]; + delete imported["Mascot"]; + if (Mascots[name] && !Conf["Deleted Mascots"].remove(name)) { + if (!confirm("A mascot with this name already exists. Would you like to over-write?")) { + return; + } + } + Mascots[name] = imported; + userMascots = $.get("userMascots", {}); + userMascots[name] = Mascots[name]; + $.set('userMascots', userMascots); + alert("Mascot \"" + name + "\" imported!"); + $.rm($("#mascotContainer", d.body)); + return Options.mascotTab.dialog(); + }; + return reader.readAsText(file); + } + }; + + Mascots = { + 'Akiyama_Mio': { + category: 'Anime', + image: 'https://i.minus.com/ibrWLbKvjRnHZS.png' + }, + 'Akiyama_Mio_2': { + category: 'Anime', + image: 'https://i.minus.com/ibmZgHvl3ZSxYk.png' + }, + 'Akiyama_Mio_3': { + category: 'Anime', + image: 'https://i.minus.com/irFbpefCFt1cT.png', + center: true + }, + 'Akiyama_Mio_sitting': { + category: 'Questionable', + image: 'https://i.minus.com/ibnnAPmolhTfE7.png' + }, + 'Anime_Girl_in_Bondage': { + category: 'Questionable', + image: 'https://i.minus.com/ibbfIrZEoNLmiU.png', + center: true + }, + 'Anime_Girl_in_Bondage_2': { + category: 'Questionable', + image: 'http://i.minus.com/iGRED5sHh4RMs.png', + center: true + }, + 'Applejack': { + category: 'Ponies', + image: 'https://i.minus.com/inZ8jSVsEhfnC.png', + center: true + }, + 'Asuka_Langley_Soryu': { + category: 'Anime', + image: 'https://i.minus.com/ib2z9ME9QKEBaS.png', + center: true + }, + 'Asuka_Langley_Soryu_2': { + category: 'Anime', + image: 'https://i.minus.com/iI3QR5SywNfg9.png', + center: true + }, + 'Asuka_Langley_Soryu_3': { + category: 'Anime', + image: 'https://i.minus.com/ibwjj4dLtiADla.png', + center: true + }, + 'Asuka_Langley_Soryu_4': { + category: 'Anime', + image: 'https://i.minus.com/ibiiInQGLGnYNj.png', + center: true + }, + 'Asuka_Langley_Soryu_5': { + category: 'Questionable', + image: 'https://i.minus.com/iJq4VXY1Gw8ZE.png', + center: true + }, + 'Asuka_Langley_Soryu_6': { + category: 'Anime', + image: 'https://i.minus.com/ibzbnBcaEtoqck.png', + position: 'bottom' + }, + 'Ayanami_Rei': { + category: 'Anime', + image: 'https://i.minus.com/ib0ft5OmqRZx2r.png', + center: true + }, + 'Ayase_Yue': { + category: 'Questionable', + image: 'https://i.minus.com/ign5fGOZWTx5o.png' + }, + 'Ayase': { + category: 'Anime', + image: 'https://i.minus.com/ibmArq5Wb4Po4v.png', + center: true + }, + 'Ayase_2': { + category: 'Questionable', + image: 'https://i.minus.com/ibjUbDLSU5pwhK.png', + center: true + }, + 'BLACK_ROCK_SHOOTER': { + category: 'Anime', + image: 'https://i.minus.com/ibMe9MrTMdvAT.png', + center: true + }, + 'Blue_Rose': { + category: 'Questionable', + image: 'https://i.minus.com/ibiq1joMemfzeM.png', + center: true + }, + 'Brioche_d_Arquien': { + category: 'Anime', + image: 'https://i.minus.com/ibobXYJ2k3JXK.png', + center: true + }, + 'CC': { + category: 'Anime', + image: 'https://i.minus.com/iwndO4Pn6SO0X.png', + center: true + }, + 'CC2': { + category: 'Questionable', + image: 'https://i.minus.com/iVT3TjJ7lBRpl.png', + center: true + }, + 'Chie': { + category: 'Anime', + image: 'https://i.minus.com/ib0HI16h9FSjSp.png', + center: true + }, + 'Cirno': { + category: 'Questionable', + image: 'https://i.minus.com/ibffjW5v0zrSGa.png', + center: true + }, + 'Cirno_2': { + category: 'Anime', + image: 'https://i.minus.com/iSZ06ZxrcqAKq.png', + center: true + }, + 'Dawn_Hikari': { + category: 'Anime', + image: 'https://i.minus.com/iL3J1EmcDkFzE.png', + center: true + }, + 'Doppleganger': { + category: 'Anime', + image: 'https://i.minus.com/iPvv86W9r3Rxm.png' + }, + 'Dragonkid': { + category: 'Anime', + image: 'https://i.minus.com/iq9fuyWSjIDWf.png', + center: true + }, + 'Dragonkid_2': { + category: 'Anime', + image: 'https://i.minus.com/i7sdxK3G12RB6.png', + center: true + }, + 'Eclair': { + category: 'Anime', + image: 'https://i.minus.com/ibsk5mMYVR5zuA.png', + center: true + }, + 'Erio_Touwa': { + category: 'Questionable', + image: 'https://i.minus.com/in8bF152Y9qVB.png' + }, + 'Evangeline_AK_McDowell': { + category: 'Anime', + image: 'https://i.minus.com/ibuq7a8zWKi2gl.png', + center: true + }, + 'Fluttershy': { + category: 'Ponies', + image: 'https://i.minus.com/ibwEFEGlRm0Uxy.png' + }, + 'Fluttershy_2': { + category: 'Ponies', + image: 'https://i.minus.com/ibjtz6EU2OFPgh.png', + center: true + }, + 'Fluttershy_Cutiemark': { + category: 'Ponies', + image: 'https://i.minus.com/i5WVpIAlHQdhs.png', + center: true + }, + 'Fujiwara_no_Mokou': { + category: 'Anime', + image: 'https://i.minus.com/ibpwDyMGodvni6.png' + }, + 'Furudo_Erika': { + category: 'Anime', + image: 'https://i.minus.com/iCrRzQ8WvHiSM.png', + center: true + }, + 'Gally': { + category: 'Anime', + image: 'https://i.minus.com/iblWZGuSlWtDI6.png', + center: true + }, + 'Gasai_Yuno': { + category: 'Anime', + image: 'https://i.minus.com/iEQsK6K85jX2n.png' + }, + 'Gasai_Yuno_2': { + category: 'Questionable', + image: 'https://i.minus.com/ifyPk7Yeo1JA7.png' + }, + 'George_Costanza': { + category: 'Western', + image: 'https://i.minus.com/iFWdpFGfzLs6v.png' + }, + 'Hanako': { + category: 'Anime', + image: 'https://i.minus.com/iRLF8gCIZbGjo.png', + center: true + }, + 'Hasekura_Youko': { + category: 'Anime', + image: 'https://i.minus.com/iqBTFZf5UhLpR.png', + center: true + }, + 'Hatsune_Miku': { + category: 'Questionable', + image: 'https://i.minus.com/iHuUwYVywpp3Z.png' + }, + 'Hatsune_Miku_2': { + category: 'Questionable', + image: 'https://i.minus.com/iclhgYeHDD77I.png', + center: true + }, + 'Hatsune_Miku_3': { + category: 'Anime', + image: 'https://i.minus.com/iLJ4uDTcg1T8r.png', + center: true + }, + 'Hatsune_Miku_4': { + category: 'Anime', + image: 'https://i.minus.com/ibjkPMLT8Uxitp.png', + center: true + }, + 'Hatsune_Miku_5': { + category: 'Anime', + image: 'https://i.minus.com/i9Evu9dyvok4G.png', + center: true + }, + 'Hatsune_Miku_6': { + category: 'Questionable', + image: 'https://i.minus.com/iQzx9fPFgPUNl.png', + center: true + }, + 'Hatsune_Miku_7': { + category: 'Questionable', + image: 'https://i.minus.com/iDScshaEZqUuy.png', + center: true + }, + 'Hirasawa_Yui': { + category: 'Anime', + image: 'https://i.minus.com/iuGe5uDaTNmhR.png', + center: true + }, + 'Homura_Akemi': { + category: 'Anime', + image: 'https://i.minus.com/iPtrwFEEtPLhn.png' + }, + 'Horo': { + category: 'Silhouette', + image: ['https://i.minus.com/i429JguITUibN.png', 'https://i.minus.com/icpvfMuZEQCtS.png'] + }, + 'Horo_2': { + category: 'Silhouette', + image: ['https://i.minus.com/ibv270koIdRjm7.png', 'https://i.minus.com/iPM4lDD53yB5n.png'] + }, + 'Horo_3': { + category: 'Questionable', + image: 'http://i.minus.com/ibyT9dlTe1HN5P.png' + }, + 'Horo_4': { + category: 'Questionable', + image: 'http://i.minus.com/ibbMKiznORGJ00.png' + }, + 'Ika_Musume': { + category: 'Anime', + image: 'https://i.minus.com/ibqVu5GNfKx5bC.png', + center: true + }, + 'Ika_Musume_2': { + category: 'Anime', + image: 'https://i.minus.com/ibhnEiE8HabEqC.png', + center: true + }, + 'Ika_Musume_3': { + category: 'Questionable', + image: 'https://i.minus.com/iby8LyjXffukaI.png', + center: true + }, + 'Inori': { + category: 'Questionable', + image: 'https://i.minus.com/ibpHKNPxcFqRxs.png' + }, + 'Inori_2': { + category: 'Questionable', + image: 'https://i.minus.com/ibzM531DBaHYXD.png' + }, + 'Iwakura_Lain': { + category: 'Anime', + image: 'https://i.minus.com/iBXRRT19scoHf.png', + center: true + }, + 'Iwakura_Lain_2': { + category: 'Anime', + image: 'https://i.minus.com/ioMltWNYUWeJ3.png', + center: true + }, + 'KOn_Girls': { + category: 'Anime', + image: 'https://i.minus.com/ibndVLiH09uINs.png', + center: true + }, + 'Kagamine_Rin': { + category: 'Questionable', + image: 'https://i.minus.com/iVPKJeDXKPKeV.png', + center: true + }, + 'Kagamine_Rin_2': { + category: 'Anime', + image: 'https://i.minus.com/jbkL01TIeJwEN6.png' + }, + 'Kagari_Izuriha': { + category: 'Anime', + image: 'https://i.minus.com/ihaFHsvFfL0vH.png' + }, + 'Kaname_Madoka': { + category: 'Anime', + image: 'https://i.minus.com/iRuEFK8cdAHxB.png', + center: true + }, + 'Karina': { + category: 'Anime', + image: 'https://i.minus.com/iUADBOpQYPfeP.png', + center: true + }, + 'Kigurumi_Harokitei': { + category: 'Anime', + image: 'https://i.minus.com/ibb17W5i3rQvut.png', + center: true + }, + 'Kinomoto_Sakura': { + category: 'Anime', + image: 'https://i.minus.com/iVmsLKa4zLwZR.png', + center: true + }, + 'Kinomoto_Sakura_2': { + category: 'Questionable', + image: 'https://i.minus.com/ibklztjz3Ua747.png', + center: true + }, + 'Kirisame_Marisa': { + category: 'Anime', + image: 'https://i.minus.com/ibikDZH5CZ0V30.png' + }, + 'Kirino_Kosaka_and_Ruri_Goko': { + category: 'Questionable', + image: 'https://i.minus.com/isIzggtfUo4ql.png', + center: true + }, + 'Koiwai_Yotsuba': { + category: 'Anime', + image: 'https://i.minus.com/iKFKyVVBato2N.png', + center: true + }, + 'Koko': { + category: 'Anime', + image: 'https://i.minus.com/ieVyNMSjXpBs2.png', + center: true + }, + 'Konjiki_no_Yami': { + category: 'Questionable', + image: 'https://i.minus.com/imy7iv5fuym8b.png', + position: 'bottom' + }, + 'Kotobuki_Tsumugi': { + category: 'Anime', + image: 'https://i.minus.com/i6doAUnM6jMAY.png', + center: true + }, + 'Kurisu_Makise': { + category: 'Anime', + image: 'https://i.minus.com/ib1eMtRHdvc9ix.png' + }, + 'Kuroko_Shirai': { + category: 'Anime', + image: 'https://i.minus.com/i3K8F7lu2SHfn.png' + }, + 'Kyouko_Sakura': { + category: 'Anime', + image: 'https://i.minus.com/iMrFOS1mfzIJP.png', + center: true + }, + 'Kyubee': { + category: 'Anime', + image: 'https://i.minus.com/iD0SEJPeZa0Dw.png' + }, + 'Kyubee_2': { + category: 'Anime', + image: 'https://i.minus.com/iGlKiDZvM3xi8.png', + center: true + }, + 'Leonmitchelli': { + category: 'Questionable', + image: 'https://i.minus.com/ibgUFGlOpedfbs.png', + center: true + }, + 'Li_Syaoran': { + category: 'Anime', + image: 'https://i.minus.com/ib0IWPBRSHyiDe.png' + }, + 'Link': { + category: 'Anime', + image: 'https://i.minus.com/ibd1JShAMTdJBH.png', + center: true + }, + 'Lizardgirl': { + category: 'Anime', + image: 'https://i.minus.com/is7h27Q6lsmyx.png' + }, + 'Luka': { + category: 'Anime', + image: 'https://i.minus.com/inds5h2BOmVBy.png' + }, + 'Madotsuki': { + category: 'Anime', + image: 'https://i.minus.com/ik6QYfTfgx9Za.png' + }, + 'Makoto': { + category: 'Anime', + image: 'https://i.minus.com/i7q6aOuUqqA9F.png', + center: true + }, + 'Mantis': { + category: 'Anime', + image: 'https://i.minus.com/iBmluUJOZivY2.png' + }, + 'Megurine_Luka': { + category: 'Anime', + image: 'https://i.minus.com/ibxe63yidpz9Gz.png', + center: true + }, + 'Mei_Sunohara': { + category: 'Anime', + image: 'https://i.minus.com/i7ElzNY4xQHHz.png', + center: true + }, + 'Millefiori': { + category: 'Anime', + image: 'https://i.minus.com/ifVzPtH8JHXjl.png', + center: true + }, + 'Millefiori_2': { + category: 'Anime', + image: 'https://i.minus.com/iMSUiQxRBylQG.png', + center: true + }, + 'Millefiori_3': { + category: 'Anime', + image: 'https://i.minus.com/iDOe3ltSvOYXZ.png', + center: true + }, + 'Misaki_Mei': { + category: 'Anime', + image: 'https://i.minus.com/icmYGJ9vIOFjr.png', + center: true + }, + 'Mizunashi_Akari': { + category: 'Anime', + image: 'https://i.minus.com/iNy9kHlNsUoVK.png', + center: true + }, + 'Motoko': { + category: 'Anime', + image: 'https://i.minus.com/irFtkWWyMChSA.png', + center: true + }, + 'Nagato_Yuki': { + category: 'Anime', + image: 'https://i.minus.com/it3pEawWIxY84.png', + center: true + }, + 'Nagato_Yuki_2': { + category: 'Anime', + image: 'https://i.minus.com/iuspcZbLvmqpb.png', + center: true + }, + 'Nagato_Yuki_3': { + category: 'Anime', + image: 'https://i.minus.com/ibndIkldw4njbD.png', + center: true + }, + 'Nagato_Yuki_4': { + category: 'Questionable', + image: 'https://i.minus.com/i92tUr90OVZGD.png', + center: true + }, + 'Nagato_Yuki_5': { + category: 'Silhouette', + image: ['https://i.minus.com/iW0iHUkHwu44d.png', 'https://i.minus.com/i859zL9JXZLbD.png'], + center: true + }, + 'Nagato_Yuki_6': { + category: 'Silhouette', + image: ['https://i.minus.com/iJdxNEMekrQjp.png', 'https://i.minus.com/ibbHeuocMgN5Eu.png'], + center: true + }, + 'Nagato_Yuki_7': { + category: 'Questionable', + image: 'http://i.minus.com/iFQQPEaC3aEV7.png' + }, + 'Nakano_Azusa': { + category: 'Anime', + image: 'https://i.minus.com/iiptfoMlr4v1k.png' + }, + 'Nodoka_Miyazaki': { + category: 'Questionable', + image: 'http://i.minus.com/iDX5mImKBzrXK.png' + }, + 'Nichijou': { + category: 'Anime', + image: 'https://i.minus.com/iE8lbZ5f3OT2B.png' + }, + 'Noir_VinoCacao': { + category: 'Anime', + image: 'https://i.minus.com/ibo8aCWF0OwNwP.png', + center: true + }, + 'Pinkie_Pie': { + category: 'Ponies', + image: 'https://i.minus.com/ib1kcpqxvsyZWG.png', + center: true + }, + 'Pinkie_Pie_2': { + category: 'Ponies', + image: 'https://i.minus.com/i8QRRgE7iKpw7.png', + center: true + }, + 'Oshino_Shinobu': { + category: 'Anime', + image: 'https://i.minus.com/ibwhAyR6D7OBAB.png' + }, + 'Oshino_Shinobu_2': { + category: 'Anime', + image: 'https://i.minus.com/ibqoNiWzynsVvg.png', + position: 'bottom' + }, + 'Patchouli_Knowledge': { + category: 'Anime', + image: 'https://i.minus.com/ibnOEAxXaKlctB.png', + center: true + }, + 'Patchouli_Knowledge_2': { + category: 'Anime', + image: 'https://i.minus.com/i1MOPTmohOsMD.png' + }, + 'Pink_Doggy': { + category: 'Anime', + image: 'https://i.minus.com/i1SpWAzfcIEQc.png', + center: true + }, + 'Pink_Hair': { + category: 'Anime', + image: 'https://i.minus.com/ibdwMaIPwdscao.png', + center: true + }, + 'Pixie': { + category: 'Questionable', + image: 'https://i.minus.com/ipRzX1YsTyhgZ.png', + center: true + }, + 'Railgun': { + category: 'Questionable', + image: 'https://i.minus.com/iysolfmvz6WKs.png', + center: true + }, + 'Railgun_2': { + category: 'Anime', + image: 'https://i.minus.com/iNhpDDO0GSTeM.png', + center: true + }, + 'Railgun_3': { + category: 'Anime', + image: 'https://i.minus.com/iiW02dmqUwRcy.png' + }, + 'Railgun_4': { + category: 'Anime', + image: 'https://i.minus.com/iR3j0mGgd1927.png', + center: true + }, + 'Rainbow_Dash': { + category: 'Ponies', + image: 'https://i.minus.com/ibthr5EDMZHV9j.png', + center: true + }, + 'Rarity': { + category: 'Ponies', + image: 'https://i.minus.com/ibkraGhhUh25CU.png', + center: true + }, + 'Revi': { + category: 'Anime', + image: 'https://i.minus.com/ivUMKcy5ow6Ab.png', + position: 'bottom', + center: true + }, + 'Ruri_Gokou': { + category: 'Anime', + image: 'https://i.minus.com/ibtZo1fdOk8NCB.png', + position: 'bottom', + center: true + }, + 'Ryuu': { + category: 'Anime', + image: 'https://i.minus.com/iecVz4p2SuqK4.png', + position: 'bottom' + }, + 'Saber': { + category: 'Questionable', + image: 'https://i.minus.com/i62cv3csQaqgk.png', + center: true + }, + 'Sakurazaki_Setsuna': { + category: 'Questionable', + image: 'https://i.minus.com/iHS6559NMU1tS.png' + }, + 'Samus_Aran': { + category: 'Anime', + image: 'https://i.minus.com/iWG1GFJ89A05p.png', + center: true + }, + 'Samus_Aran_2': { + category: 'Anime', + image: 'http://i.minus.com/ibl4efsNtHpkXg.png' + }, + 'Seraphim': { + category: 'Questionable', + image: 'https://i.minus.com/ivHaKIFHRpPFP.png', + center: true + }, + 'Shana': { + category: 'Anime', + image: 'https://i.minus.com/ib2cTJMF0cYIde.png', + center: true + }, + 'Shana_2': { + category: 'Anime', + image: 'https://i.minus.com/ioRICGu0Ipzj9.png', + center: true + }, + 'Shiki': { + category: 'Anime', + image: 'https://i.minus.com/iIZm1JxxDIDQ1.png' + }, + 'Shinji_and_Girls': { + category: 'Anime', + image: 'https://i.minus.com/itMrEn56GzvzE.png', + center: true + }, + 'Shinonome_Hakase': { + category: 'Anime', + image: 'https://i.minus.com/iocCwDCnNgI19.png', + center: true + }, + 'Shirakiin_Ririchiyo': { + category: 'Anime', + image: 'https://i.minus.com/i1m0rdzmVLYLa.png', + position: 'bottom', + center: true + }, + 'Shirohibe': { + category: 'Anime', + image: 'https://i.minus.com/iGu91k3KZeg00.png', + position: 'bottom' + }, + 'Suruga_Kanbaru': { + category: 'Anime', + image: 'https://i.minus.com/irEL7AgC80qKD.png', + center: true + }, + 'Suzumiya_Haruhi': { + category: 'Anime', + image: 'https://i.minus.com/iM9qMfUNh9Qi9.png', + center: true + }, + 'Suzumiya_Haruhi_2': { + category: 'Anime', + image: 'https://i.minus.com/ibnomd5iasjceY.png', + center: true + }, + 'Tardis': { + category: 'Western', + image: 'https://i.minus.com/iQL2bwpDfOgk.png', + center: true + }, + 'Teletha_Tessa_Testarossa': { + category: 'Questionable', + image: 'https://i.minus.com/iQKrg7Pq7Y6Ed.png' + }, + 'Rukia_Nia_and_Asa': { + category: 'Questionable', + image: 'http://i.minus.com/icECBJR5D5U4S.png' + }, + 'Tewi_Inaba': { + category: 'Anime', + image: 'https://i.minus.com/ib2k9lwQIkmb66.png' + }, + 'Tifa': { + category: 'Questionable', + image: 'https://i.minus.com/inDzKQ0Wck4ef.png', + center: true + }, + 'Tomozo_Kaoru': { + category: 'Anime', + image: 'https://i.minus.com/islUcBaPRYAgv.png', + center: true + }, + 'Twilight_Sparkle': { + category: 'Ponies', + image: 'https://i.minus.com/ibnMYVTZEykrKU.png', + center: true + }, + 'Udine': { + category: 'Questionable', + image: 'https://i.minus.com/iiycujRmhn6QK.png', + position: 'bottom' + }, + 'Wanwan': { + category: 'Questionable', + image: 'https://i.minus.com/iTdBWYMCXULLT.png', + center: true + }, + 'White_Curious': { + category: 'Anime', + image: 'https://i.minus.com/ibfkj5osu99axe.png', + center: true + }, + 'Yakumo_Ran': { + category: 'Anime', + image: 'https://i.minus.com/ivKqn8vL9A8cQ.png' + }, + 'Yin': { + category: 'Anime', + image: 'https://i.minus.com/iL9DlVtaAGFdq.png' + }, + 'Yin_2': { + category: 'Anime', + image: 'https://i.minus.com/izkTpyjr1XlLR.png', + center: true + }, + 'Yoko_Littner': { + category: 'Questionable', + image: 'https://i.minus.com/i0mtOEsBC9GlY.png' + }, + 'Yoko_Littner_2': { + category: 'Anime', + image: 'https://i.minus.com/i7aUDY4h9uB1T.png', + center: true + }, + 'Yoko_Littner_3': { + category: 'Anime', + image: 'https://i.minus.com/iYVd5DhCmB7VJ.png', + center: true + }, + 'Yozora_Mikazuki': { + category: 'Anime', + image: 'https://i.minus.com/iIFEsDzoDALQd.png' + }, + 'Yuzuki_Yukari': { + category: 'Anime', + image: 'https://i.minus.com/iYQOz0iGM9ygq.png', + center: true + }, + 'Yukkikaze': { + category: 'Anime', + image: 'https://i.minus.com/ioQJAnyXebHDJ.png', + center: true + }, + 'Yukkihaze_2': { + category: 'Anime', + image: 'https://i.minus.com/inpgaDlJtZ9Sc.png', + center: true + } + }; + + Style = { + init: function() { + this.agent = { + 'gecko': '-moz-', + 'webkit': '-webkit-', + 'presto': '-o-' + }[$.engine]; + this.sizing = "" + ($.engine === 'gecko' ? this.agent : '') + "box-sizing"; + $.ready(function() { + var catalogLink; + + Style.rice(d.body); + if (!$.id('navtopright')) { + return; + } + Style.banner(); + Style.trimGlobalMessage(); + Style.padding.nav = $("#boardNavDesktop", d.body); + Style.padding.pages = $(".pagelist", d.body); + Style.padding(); + $.on(window || unsafeWindow, "resize", Style.padding); + if (catalogLink = $('.pages.cataloglink a', d.body) || $('[href=".././catalog"]', d.body)) { + if (!g.REPLY) { + $.add(d.body, catalogLink); + } + catalogLink.id = 'catalog'; + } + return setTimeout((function() { + var exLink; + + Style.iconPositions(); + if (exLink = $("#navtopright .exlinksOptionsLink", d.body)) { + return $.on(exLink, "click", function() { + return setTimeout(Style.rice, 100); + }); + } + }), 500); + }); + Main.callbacks.push(this.node); + return this.setup(); + }, + setup: function() { + if (d.head) { + this.addStyleReady(); + this.remStyle(); + if (!Style.headCount) { + return this.cleanup(); + } + } + return this.observe(); + }, + observe: function() { + var onMutationObserver; + + if (MutationObserver) { + Style.observer = new MutationObserver(onMutationObserver = this.wrapper); + return Style.observer.observe(d, { + childList: true, + subtree: true + }); + } else { + return $.on(d, 'DOMNodeInserted', this.wrapper); + } + }, + wrapper: function() { + if (d.head) { + if (Style.addStyleReady) { + Style.addStyleReady(); + } + Style.remStyle(); + if (!Style.headCount || d.readyState === 'complete') { + if (Style.observer) { + Style.observer.disconnect(); + } else { + $.off(d, 'DOMNodeInserted', Style.wrapper); + } + return Style.cleanup(); + } + } + }, + cleanup: function() { + delete Style.observe; + delete Style.wrapper; + delete Style.remStyle; + delete Style.headCount; + return delete Style.cleanup; + }, + addStyle: function(theme) { + var _conf; + + _conf = Conf; + if (!theme) { + theme = Themes[_conf['theme']]; + } + MascotTools.init(_conf["mascot"]); + Style.layoutCSS.textContent = Style.layout(); + Style.themeCSS.textContent = Style.theme(theme); + return Style.iconPositions(); + }, + headCount: 12, + addStyleReady: function() { + var theme; + + theme = Themes[Conf['theme']]; + $.extend(Style, { + layoutCSS: $.addStyle(Style.layout(), 'layout'), + themeCSS: $.addStyle(Style.theme(theme), 'theme'), + icons: $.addStyle("", 'icons'), + paddingSheet: $.addStyle("", 'padding'), + mascot: $.addStyle("", 'mascotSheet') + }); + $.addStyle(Style.jsColorCSS(), 'jsColor'); + return delete Style.addStyleReady; + }, + remStyle: function() { + var i, node, nodes; + + nodes = d.head.children; + i = nodes.length; + while (i--) { + if (!Style.headCount) { + break; + } + node = nodes[i]; + if ((node.nodeName === 'STYLE' && !node.id) || (("" + node.rel).contains('stylesheet') && node.href.slice(0, 4) !== 'data')) { + Style.headCount--; + $.rm(node); + continue; + } + } + }, + emoji: function(position) { + var category, css, icon, key, margin, name, _conf, _i, _len; + + _conf = Conf; + css = []; + margin = "margin-" + (position === "before" ? "right" : "left") + ": " + (parseInt(_conf['Emoji Spacing'])) + "px;"; + for (key in Emoji) { + category = Emoji[key]; + if ((_conf['Emoji'] !== "disable ponies" && key === "pony") || (_conf['Emoji'] !== "only ponies" && key === "not")) { + for (_i = 0, _len = category.length; _i < _len; _i++) { + icon = category[_i]; + name = icon[0]; + css[css.length] = "a.useremail[href*='" + name + "']:last-of-type::" + position + ",\na.useremail[href*='" + (name.toLowerCase()) + "']:last-of-type::" + position + ",\na.useremail[href*='" + (name.toUpperCase()) + "']:last-of-type::" + position + " {\n content: url('" + (Icons.header.png + icon[1]) + "');\n vertical-align: top;\n " + margin + "\n}\n"; + } + } + } + return css.join(""); + }, + node: function(post) { + return Style.rice(post.el); + }, + rice: function(source) { + var checkbox, checkboxes, click, div, select, selects, _i, _j, _len, _len1; + + checkboxes = $$('[type=checkbox]:not(.riced)', source); + click = function() { + return this.check.click(); + }; + for (_i = 0, _len = checkboxes.length; _i < _len; _i++) { + checkbox = checkboxes[_i]; + $.addClass(checkbox, 'riced'); + div = $.el('div', { + className: 'rice' + }); + div.check = checkbox; + $.after(checkbox, div); + if (div.parentElement.tagName.toLowerCase() !== 'label') { + $.on(div, 'click', click); + } + } + selects = $$('select:not(.riced)', source); + for (_j = 0, _len1 = selects.length; _j < _len1; _j++) { + select = selects[_j]; + $.addClass(select, 'riced'); + div = $.el('div', { + className: 'selectrice', + innerHTML: "
" + (select.options[select.selectedIndex].textContent || null) + "
" + }); + $.on(div, "click", function(e) { + var clientHeight, li, nodes, option, rect, style, ul, _k, _len2, _ref; + + e.stopPropagation(); + if (!(ul = Style.ul)) { + Style.ul = ul = $.el('ul', { + id: "selectrice" + }); + $.add(d.body, ul); + } + if (ul.children.length > 0) { + return Style.rmOption(); + } + rect = this.getBoundingClientRect(); + clientHeight = d.documentElement.clientHeight; + style = ul.style; + style.cssText = ("width: " + rect.width + "px; left: " + rect.left + "px;") + (clientHeight - rect.bottom < 200 ? "bottom: " + (clientHeight - rect.top) + "px" : "top: " + rect.bottom + "px"); + Style.select = this.previousSibling; + nodes = []; + _ref = Style.select.options; + for (_k = 0, _len2 = _ref.length; _k < _len2; _k++) { + option = _ref[_k]; + li = $.el('li', { + textContent: option.textContent + }); + li.setAttribute('data-value', option.value); + $.on(li, 'click', function(e) { + var container, ev; + + e.stopPropagation(); + select = Style.select; + container = select.nextElementSibling; + container.firstChild.textContent = this.textContent; + select.value = this.getAttribute('data-value'); + ev = document.createEvent('HTMLEvents'); + ev.initEvent("change", true, true); + $.event(select, ev); + return Style.rmOption(); + }); + nodes.push(li); + } + $.add(ul, nodes); + $.on(ul, 'click scroll blur', function(e) { + return e.stopPropagation(); + }); + return $.on(d, 'click scroll blur resize', Style.rmOption); + }); + $.after(select, div); + } + }, + rmOption: function() { + var child, _i, _len, _ref, _results; + + $.off(d, 'click scroll blur resize', Style.rmOption); + _ref = __slice.call(Style.ul.children); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push($.rm(child)); + } + return _results; + }, + filter: function(text, background) { + var bgHex, css, fgHex; + + css = function(fg, bg) { + return "filter: url(\"data:image/svg+xml,#filters\");"; + }; + fgHex = Style.colorToHex(text); + bgHex = Style.colorToHex(background); + return css({ + r: parseInt(fgHex.substr(0, 2), 16) / 255, + g: parseInt(fgHex.substr(2, 2), 16) / 255, + b: parseInt(fgHex.substr(4, 2), 16) / 255 + }, { + r: parseInt(bgHex.substr(0, 2), 16) / 255, + g: parseInt(bgHex.substr(2, 2), 16) / 255, + b: parseInt(bgHex.substr(4, 2), 16) / 255 + }); + }, + banner: function() { + var banner, child, children, i, title; + + banner = $(".boardBanner", d.body); + title = $.el("div", { + id: "boardTitle" + }); + children = banner.children; + i = children.length; + while (i--) { + child = children[i]; + if (child.tagName.toLowerCase() === "img") { + child.id = "Banner"; + continue; + } + if (Conf['Custom Board Titles']) { + child.innerHTML = $.get("" + g.BOARD + child.className, child.innerHTML); + $.on(child, 'click', function(e) { + if (e.shiftKey) { + return this.contentEditable = true; + } + }); + $.on(child, 'keydown', function(e) { + return e.stopPropagation(); + }); + $.on(child, 'focus', function() { + return this.textContent = this.innerHTML; + }); + $.on(child, 'blur', function() { + $.set("" + g.BOARD + this.className, this.textContent); + this.innerHTML = this.textContent; + return this.contentEditable = false; + }); + } + $.prepend(title, child); + } + return $.after(banner, title); + }, + padding: function() { + var css, sheet, _conf; + + if (!(sheet = Style.paddingSheet)) { + return; + } + _conf = Conf; + Style.padding.nav.property = _conf["Boards Navigation"].split(" "); + Style.padding.nav.property = Style.padding.nav.property[Style.padding.nav.property.length - 1]; + if (Style.padding.pages) { + Style.padding.pages.property = _conf["Pagination"].split(" "); + Style.padding.pages.property = Style.padding.pages.property[Style.padding.pages.property.length - 1]; + } + css = "body::before {\n"; + if (_conf["4chan SS Emulation"]) { + if (Style.padding.pages && (_conf["Pagination"] === "sticky top" || _conf["Pagination"] === "sticky bottom")) { + css += " " + Style.padding.pages.property + ": " + Style.padding.pages.offsetHeight + "px !important;\n"; + } + if (_conf["Boards Navigation"] === "sticky top" || _conf["Boards Navigation"] === "sticky bottom") { + css += " " + Style.padding.nav.property + ": " + Style.padding.nav.offsetHeight + "px !important;\n"; + } + } + css += "}\nbody {\n padding-bottom: 0;\n"; + if ((Style.padding.pages != null) && (_conf["Pagination"] === "sticky top" || _conf["Pagination"] === "sticky bottom" || _conf["Pagination"] === "top")) { + css += " padding-" + Style.padding.pages.property + ": " + Style.padding.pages.offsetHeight + "px;\n"; + } + if (_conf["Boards Navigation"] !== "hide") { + css += " padding-" + Style.padding.nav.property + ": " + Style.padding.nav.offsetHeight + "px;\n"; + } + css += "}"; + return sheet.textContent = css; + }, + trimGlobalMessage: function() { + var child, el, _i, _len, _ref; + + if (el = $("#globalMessage", d.body)) { + _ref = el.children; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + child.style.color = ""; + } + } + }, + color: function(hex) { + this.hex = "#" + hex; + this.calc_rgb = function(hex) { + hex = parseInt(hex, 16); + return [(hex >> 16) & 0xFF, (hex >> 8) & 0xFF, hex & 0xFF]; + }; + this.private_rgb = this.calc_rgb(hex); + this.rgb = this.private_rgb.join(","); + this.isLight = function() { + var rgb; + + rgb = this.private_rgb; + return (rgb[0] + rgb[1] + rgb[2]) >= 400; + }; + this.shiftRGB = function(shift, smart) { + var minmax, rgb; + + minmax = function(base) { + return Math.min(Math.max(base, 0), 255); + }; + rgb = this.private_rgb.slice(0); + shift = smart ? (this.isLight(rgb) ? -1 : 1) * Math.abs(shift) : shift; + return [minmax(rgb[0] + shift), minmax(rgb[1] + shift), minmax(rgb[2] + shift)].join(","); + }; + return this.hover = this.shiftRGB(16, true); + }, + colorToHex: function(color) { + var digits, hex; + + if (color.substr(0, 1) === '#') { + return color.slice(1, color.length); + } + if (digits = color.match(/(.*?)rgba?\((\d+), ?(\d+), ?(\d+)(.*?)\)/)) { + hex = ((parseInt(digits[2], 10) << 16) | (parseInt(digits[3], 10) << 8) | (parseInt(digits[4], 10))).toString(16); + while (hex.length < 6) { + hex = "0" + hex; + } + return hex; + } else { + return false; + } + }, + jsColorCSS: function() { + var agent; + + agent = Style.agent; + return ".jscBox {\n width: 251px;\n height: 155px;\n}\n.jscBoxB,\n.jscPadB,\n.jscPadM,\n.jscSldB,\n.jscSldM,\n.jscBtn {\n position: absolute;\n clear: both;\n}\n.jscBoxB {\n left: 320px;\n bottom: 20px;\n z-index: 30;\n border: 1px solid;\n border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;\n background: ThreeDFace;\n}\n.jscPad {\n width: 181px;\n height: 101px;\n background-image: " + agent + "linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1)), " + agent + "linear-gradient(left, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00);\n background-repeat: no-repeat;\n background-position: 0 0;\n}\n.jscPadB {\n left: 10px;\n top: 10px;\n border: 1px solid;\n border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;\n}\n.jscPadM {\n left: 0;\n top: 0;\n width: 200px;\n height: 121px;\n cursor: crosshair;\n background-image: url('data:image/gif;base64,R0lGODlhDwAPAKEBAAAAAP///////////yH5BAEKAAIALAAAAAAPAA8AAAIklB8Qx53b4otSUWcvyiz4/4AeQJbmKY4p1HHapBlwPL/uVRsFADs=');\n background-repeat: no-repeat;\n}\n.jscSld {\n width: 16px;\n height: 101px;\n background-image: " + agent + "linear-gradient(rgba(0,0,0,0), rgba(0,0,0,1));\n}\n.jscSldB {\n right: 10px;\n top: 10px;\n border: 1px solid;\n border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;\n}\n.jscSldM {\n right: 0;\n top: 0;\n width: 36px;\n height: 121px;\n cursor: pointer;\n background-image: url('data:image/gif;base64,R0lGODlhBwALAKECAAAAAP///6g8eKg8eCH5BAEKAAIALAAAAAAHAAsAAAITTIQYcLnsgGxvijrxqdQq6DRJAQA7');\n background-repeat: no-repeat;\n}\n.jscBtn {\n right: 10px;\n bottom: 10px;\n padding: 0 15px;\n height: 18px;\n border: 1px solid;\n border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;\n color: ButtonText;\n text-align: center;\n cursor: pointer;\n}\n.jscBtnS {\n line-height: 10px;\n}"; + }, + iconPositions: function() { + var align, aligner, css, i, iconOffset, navlinks, notCatalog, notEither, position, _conf; + + css = "#navtopright .exlinksOptionsLink::after,\n#appchanOptions,\nbody > div.navLinks > a:first-of-type::after,\n" + (Conf['Slideout Watcher'] ? '#watcher::after,' : '') + "\n" + (Conf['Announcements'] === 'slideout' ? '#globalMessage::after,' : '') + "\n#boardNavDesktopFoot::after,\nbody > a[style=\"cursor: pointer; float: right;\"]::after,\n#imgControls label:first-of-type::after,\n#catalog::after,\n#fappeTyme {\n z-index: 18;\n position: fixed;\n display: block;\n width: 15px;\n height: 15px;\n content: \"\";\n overflow: hidden;\n opacity: " + (Conf['Invisible Icons'] ? 0 : 0.5) + ";\n}\n#navtopright .exlinksOptionsLink,\nbody > div.navLinks > a:first-of-type,\n" + (Conf['Slideout Watcher'] ? '#watcher,' : '') + "\n" + (Conf['Announcements'] === 'slideout' ? '#globalMessage,' : '') + "\n#boardNavDesktopFoot,\nbody > a[style=\"cursor: pointer; float: right;\"],\n#catalog {\n z-index: 16;\n}\n#navtopright .exlinksOptionsLink:hover,\nbody > div.navLinks > a:first-of-type:hover,\n" + (Conf['Slideout Watcher'] ? '#watcher:hover,' : '') + "\n" + (Conf['Announcements'] === 'slideout' ? '#globalMessage:hover,' : '') + "\n#boardNavDesktopFoot:hover,\nbody > a[style=\"cursor: pointer; float: right;\"]:hover,\n#catalog:hover {\n z-index: 17;\n}\n#imgControls {\n z-index: 19;\n}\n#imgControls {\n position: fixed;\n}\n#appchanOptions {\n visibility: visible;\n background-position: 0 0;\n}\nbody > div.navLinks > a:first-of-type::after {\n cursor: pointer;\n background-position: 0 -15px;\n}\n#watcher::after {\n background-position: 0 -30px;\n}\n#globalMessage::after {\n background-position: 0 -45px;\n}\n#boardNavDesktopFoot::after {\n background-position: 0 -60px;\n}\nbody > a[style=\"cursor: pointer; float: right;\"]::after {\n visibility: visible;\n cursor: pointer;\n background-position: 0 -75px;\n}\n#imgControls label:first-of-type::after {\n position: static;\n background-position: 0 -90px;\n}\n#navtopright .exlinksOptionsLink::after {\n background-position: 0 -105px;\n}\n#catalog::after {\n visibility: visible;\n background-position: 0 -120px;\n}\n#fappeTyme {\n background-position: 0 -135px;\n}\n#boardNavDesktopFoot:hover::after,\n#globalMessage:hover::after,\n#imgControls label:hover:first-of-type::after,\n#navlinks a:hover,\n#appchanOptions:hover,\n#navtopright .exlinksOptionsLink:hover::after,\n#qr #qrtab,\n#watcher:hover::after,\n.thumbnail#selected,\nbody > a[style=\"cursor: pointer; float: right;\"]:hover::after,\ndiv.navLinks > a:first-of-type:hover::after,\n#catalog:hover::after,\n#fappeTyme:hover {\n opacity: 1;\n}"; + i = 0; + align = Style.sidebarLocation[0]; + _conf = Conf; + notCatalog = !g.CATALOG; + notEither = notCatalog && g.BOARD !== 'f'; + aligner = function(first, checks) { + var enabled, position, _i, _len; + + position = [first]; + for (_i = 0, _len = checks.length; _i < _len; _i++) { + enabled = checks[_i]; + position[position.length] = enabled ? first += 19 : first; + } + return position; + }; + if (_conf["Icon Orientation"] === "horizontal") { + position = aligner(2, [notCatalog, _conf['Slideout Navigation'] !== 'hide', _conf['Announcements'] === 'slideout' && $('#globalMessage', d.body), notCatalog && _conf['Slideout Watcher'] && _conf['Thread Watcher'], $('#navtopright .exlinksOptionsLink', d.body), notCatalog && $('body > a[style="cursor: pointer; float: right;"]', d.body), notEither && _conf['Image Expansion'], notEither, g.REPLY, notEither && _conf['Fappe Tyme'], navlinks = ((!g.REPLY && _conf['Index Navigation']) || (g.REPLY && _conf['Reply Navigation'])) && notCatalog, navlinks]); + iconOffset = position[position.length - 1] - (_conf['4chan SS Navigation'] ? 0 : Style.sidebar + parseInt(_conf["Right Thread Padding"], 10)); + if (iconOffset < 0) { + iconOffset = 0; + } + css += "/* 4chan X Options */\n#appchanOptions {\n " + align + ": " + position[i++] + "px;\n}\n/* Slideout Navigation */\n#boardNavDesktopFoot::after {\n " + align + ": " + position[i++] + "px;\n}\n/* Global Message */\n#globalMessage::after {\n " + align + ": " + position[i++] + "px;\n}\n/* Watcher */\n#watcher::after {\n " + align + ": " + position[i++] + "px;\n}\n/* ExLinks */\n#navtopright .exlinksOptionsLink::after {\n " + align + ": " + position[i++] + "px;\n}\n/* 4sight */\nbody > a[style=\"cursor: pointer; float: right;\"]::after {\n " + align + ": " + position[i++] + "px;\n}\n/* Expand Images */\n#imgControls {\n " + align + ": " + position[i++] + "px;\n}\n/* 4chan Catalog */\n#catalog::after {\n " + align + ": " + position[i++] + "px;\n}\n/* Back */\ndiv.navLinks > a:first-of-type::after {\n " + align + ": " + position[i++] + "px;\n}\n/* Fappe Tyme */\n#fappeTyme {\n " + align + ": " + position[i++] + "px;\n}\n/* Thread Navigation Links */\n#navlinks a {\n margin: 2px;\n top: 2px;\n}\n#navlinks a:last-of-type {\n " + align + ": " + position[i++] + "px;\n}\n#navlinks a:first-of-type {\n " + align + ": " + position[i++] + "px;\n}\n#prefetch {\n width: " + (248 + Style.sidebarOffset.W) + "px;\n " + align + ": 2px;\n top: 1.6em;\n text-align: " + Style.sidebarLocation[1] + ";\n}\n#boardNavDesktopFoot::after,\n#navtopright .exlinksOptionsLink::after,\n#appchanOptions,\n#watcher::after,\n#globalMessage::after,\n#imgControls,\n#fappeTyme,\ndiv.navLinks > a:first-of-type::after,\n#catalog::after,\nbody > a[style=\"cursor: pointer; float: right;\"]::after {\n top: 2px !important;\n}\n" + (_conf["Announcements"] === "slideout" ? "#globalMessage," : "") + "\n" + (_conf["Slideout Watcher"] ? "#watcher," : "") + "\n#boardNavDesktopFoot {\n top: 17px !important;\n}\n" + (_conf['Boards Navigation'] === 'top' || _conf['Boards Navigation'] === 'sticky top' ? '#boardNavDesktop' : _conf['Pagination'] === 'top' || _conf['Pagination'] === 'sticky top' ? '.pagelist' : void 0) + " {\n " + (_conf['4chan SS Navigation'] ? "padding-" + align + ": " + iconOffset + "px;" : "margin-" + align + ": " + iconOffset + "px;") + "\n}\n"; + if (_conf["Updater Position"] !== 'moveable') { + css += "/* Updater + Stats */\n#updater,\n#stats {\n " + align + ": " + (_conf["Updater Position"] === "bottom" && !_conf["Hide Delete UI"] ? 24 : 2) + "px !important;\n " + Style.sidebarLocation[1] + ": auto !important;\n top: auto !important;\n bottom: auto !important;\n " + (_conf["Updater Position"] === 'top' ? "top: 1.6em !important" : "bottom: 0 !important") + ";\n}"; + } + } else { + position = aligner(2 + (_conf["4chan Banner"] === "at sidebar top" ? Style.logoOffset + 19 : 0), [notEither && _conf['Image Expansion'], notCatalog, _conf['Slideout Navigation'] !== 'hide', _conf['Announcements'] === 'slideout' && $('#globalMessage', d.body), notCatalog && _conf['Slideout Watcher'] && _conf['Thread Watcher'], notCatalog && $('body > a[style="cursor: pointer; float: right;"]', d.body), $('#navtopright .exlinksOptionsLink', d.body), notEither, g.REPLY, notEither && _conf['Fappe Tyme'], navlinks = ((!g.REPLY && _conf['Index Navigation']) || (g.REPLY && _conf['Reply Navigation'])) && notCatalog, navlinks]); + iconOffset = (g.REPLY && _conf['Prefetch'] ? 250 + Style.sidebarOffset.W : 20 + (g.REPLY && _conf['Updater Position'] === 'top' ? 100 : 0)) - (_conf['4chan SS Navigation'] ? 0 : Style.sidebar + parseInt(_conf[align.capitalize() + " Thread Padding"], 10)); + css += "/* Image Expansion */\n#imgControls {\n top: " + position[i++] + "px;\n}\n/* 4chan X Options */\n#appchanOptions {\n top: " + position[i++] + "px;\n}\n/* Slideout Navigation */\n#boardNavDesktopFoot,\n#boardNavDesktopFoot::after {\n top: " + position[i++] + "px;\n}\n/* Global Message */\n#globalMessage,\n#globalMessage::after {\n top: " + position[i++] + "px;\n}\n/* Watcher */\n" + (_conf["Slideout Watcher"] ? "#watcher, #watcher::after" : "") + " {\n top: " + position[i++] + "px !important;\n}\n/* 4sight */\nbody > a[style=\"cursor: pointer; float: right;\"]::after {\n top: " + position[i++] + "px;\n}\n/* ExLinks */\n#navtopright .exlinksOptionsLink::after {\n top: " + position[i++] + "px;\n}\n/* 4chan Catalog */\n#catalog::after {\n top: " + position[i++] + "px;\n}\n/* Back */\ndiv.navLinks > a:first-of-type::after {\n top: " + position[i++] + "px;\n}\n/* Fappe Tyme */\n#fappeTyme {\n top: " + position[i++] + "px;\n}\n/* Thread Navigation Links */\n#navlinks a:first-of-type {\n top: " + position[i++] + "px !important;\n}\n#navlinks a:last-of-type {\n top: " + position[i++] + "px !important;\n}\n#prefetch {\n width: " + (248 + Style.sidebarOffset.W) + "px;\n " + align + ": 2px;\n top: 0;\n text-align: " + Style.sidebarLocation[1] + ";\n}\n#navlinks a,\n#navtopright .exlinksOptionsLink::after,\n#appchanOptions,\n#boardNavDesktopFoot::after,\n#globalMessage::after,\n#imgControls,\n#fappeTyme,\n" + (_conf["Slideout Watcher"] ? "#watcher::after," : "") + "\nbody > a[style=\"cursor: pointer; float: right;\"]::after,\n#catalog::after,\ndiv.navLinks > a:first-of-type::after {\n " + align + ": 3px !important;\n}\n#boardNavDesktopFoot,\n#globalMessage,\n#watcher {\n width: " + (233 + Style.sidebarOffset.W) + "px !important;\n " + align + ": 18px !important;\n}\n" + (_conf['Boards Navigation'] === 'top' || _conf['Boards Navigation'] === 'sticky top' ? '#boardNavDesktop' : _conf['Pagination'] === 'top' || _conf['Pagination'] === 'sticky top' ? '.pagelist' : void 0) + " {\n " + (_conf['4chan SS Navigation'] ? "padding-" + align + ": " + iconOffset + "px;" : "margin-" + align + ": " + iconOffset + "px;") + "\n}"; + if (_conf["Updater Position"] !== 'moveable') { + css += "/* Updater + Stats */\n#updater,\n#stats {\n " + align + ": " + (_conf["Updater Position"] === "top" || !_conf["Hide Delete UI"] ? 24 : 2) + "px !important;\n " + Style.sidebarLocation[1] + ": auto !important;\n top: " + (_conf["Updater Position"] === "top" ? "-1px" : "auto") + " !important;\n bottom: " + (_conf["Updater Position"] === "bottom" ? "-2px" : "auto") + " !important;\n}"; + } + } + return Style.icons.textContent = css; + }, + layout: function() { + var agent, css, editSpace, position, width, xOffset, _conf; + + _conf = Conf; + agent = Style.agent; + xOffset = _conf["Sidebar Location"] === "left" ? '' : '-'; + position = { + right: { + hide: parseInt(_conf['Right Thread Padding'], 10) < 100 ? "right" : "left", + minimal: "right" + }[_conf["Sidebar"]] || "left", + left: parseInt(_conf['Right Thread Padding'], 10) < 100 ? "right" : "left" + }[_conf["Sidebar Location"]]; + Style['sidebarOffset'] = _conf["Sidebar"] === "large" ? { + W: 51, + H: 17 + } : { + W: 0, + H: 0 + }; + Style.logoOffset = _conf["4chan Banner"] === "at sidebar top" ? 83 + Style.sidebarOffset.H : 0; + width = 248 + Style.sidebarOffset.W; + Style.sidebarLocation = _conf["Sidebar Location"] === "left" ? ["left", "right"] : ["right", "left"]; + if (_conf['editMode'] === "theme") { + editSpace = {}; + editSpace[Style.sidebarLocation[1]] = 300; + editSpace[Style.sidebarLocation[0]] = 0; + } else { + editSpace = { + left: 0, + right: 0 + }; + } + Style.sidebar = { + minimal: 20, + hide: 2 + }[_conf.Sidebar] || (252 + Style.sidebarOffset.W); + Style.replyMargin = _conf["Post Spacing"]; + return css = "/* Cleanup */\n#absbot,\n#delPassword,\n#delform > hr:last-of-type,\n#navbotright,\n#postForm,\n#styleSwitcher,\n.boardBanner > div,\n.mobile,\n.postingMode,\n.riced,\n.sideArrows,\n.stylechanger,\nbody > br,\nbody > div[style^=\"text-align\"],\nbody > hr {\n display: none;\n}\n/* Empties */\n#qr .warning:empty,\n#threadselect:empty {\n display: none;\n}\n/* File Name Trunctuate */\n.fileText:hover .fntrunc,\n.fileText:not(:hover) .fnfull {\n display: none;\n}\n/* Unnecessary */\n#qp input,\n#qp .rice,\n.inline .rice {\n display: none !important;\n}\n/* Hidden Content */\n.forwarded,\n.hidden_thread ~ div,\n.hidden_thread ~ a,\n[hidden] {\n display: none !important;\n}\n/* Hidden UI */\n#catalog,\n#navlinks,\n#navtopright,\n.cataloglink,\n.navLinks,\na[style=\"cursor: pointer; float: right;\"] {\n position: fixed;\n top: 100%;\n left: 100%;\n}\n/* Hide last horizontal rule, keep clear functionality. */\n.board > hr:last-of-type {\n visibility: hidden;\n}\n/* Fappe Tyme */\n.fappeTyme .thread > .noFile {\n display: none;\n}\n/* Defaults */\na {\n text-decoration: " + (_conf["Underline Links"] ? "underline" : "none") + ";\n outline: none;\n}\nbody, html {\n min-height: 100%;\n " + Style.sizing + ": border-box;\n}\nbody {\n outline: none;\n font-size: " + (parseInt(_conf["Font Size"], 10)) + "px;\n font-family: " + _conf["Font"] + ";\n min-height: 100%;\n margin-top: 0;\n margin-bottom: 0;\n margin-" + Style.sidebarLocation[0] + ": " + (/^boards\.4chan\.org$/.test(location.hostname) ? Style.sidebar : '2') + "px;\n margin-" + Style.sidebarLocation[1] + ": 2px;\n padding: 0 " + (parseInt(_conf["Right Thread Padding"], 10) + editSpace["right"]) + "px 0 " + (parseInt(_conf["Left Thread Padding"], 10) + editSpace["left"]) + "px;\n}\n" + (_conf["4chan SS Sidebar"] && /^boards\.4chan\.org$/.test(location.hostname) ? "body::before { content: ''; position: fixed; top: 0; bottom: 0; " + Style.sidebarLocation[0] + ": 0; width: " + (_conf["Sidebar"] === 'large' ? 305 : _conf['Sidebar'] === 'normal' ? 254 : _conf['Sidebar'] === 'minimal' ? 27 : 0) + "px; z-index: 1; " + Style.sizing + ": border-box; display: block;}body { padding-" + Style.sidebarLocation[0] + ": 2px;}" : "") + "\nbutton,\ninput,\ntextarea {\n font-size: " + (parseInt(_conf["Font Size"], 10)) + "px;\n font-family: " + _conf["Font"] + ";\n}\nhr {\n clear: both;\n border: 0;\n padding: 0;\n margin: 0 0 1px;\n " + (_conf['Hide Horizontal Rules'] ? 'visibility: hidden;' : '') + "\n}\n.center {\n text-align: center;\n}\n/* Symbols */\n.dropmarker {\n vertical-align: middle;\n display: inline-block;\n margin: 2px 2px 3px;\n border-top: .5em solid;\n border-right: .3em solid transparent;\n border-left: .3em solid transparent;\n}\n/* Thread / Reply Nav */\n#navlinks a {\n position: fixed;\n z-index: 12;\n opacity: 0.5;\n display: inline-block;\n border-right: 6px solid transparent;\n border-left: 6px solid transparent;\n margin: 1.5px;\n}\n/* Navigation */\n#boardNavDesktop {\n z-index: 6;\n border-width: 1px;\n" + { + "sticky top": " position: fixed; top: 0; border-top-width: 0; " + (_conf["Rounded Edges"] ? "border-radius: 0 0 3px 3px;" : ""), + "sticky bottom": " position: fixed; bottom: 0; border-bottom-width: 0; " + (_conf["Rounded Edges"] ? "border-radius: 3px 3px 0 0;" : ""), + "top": " position: absolute; top: 0; border-top-width: 0; " + (_conf["Rounded Edges"] ? "border-radius: 0 0 3px 3px;" : ""), + "hide": " position: fixed; top: 110%;" + }[_conf['Boards Navigation']] + "\n" + (_conf['4chan SS Navigation'] ? " left: 0; right: 0; border-left: 0; border-right: 0; border-radius: 0 !important;" : " " + Style.sidebarLocation[0] + ": " + (Style.sidebar + parseInt(_conf["Right Thread Padding"], 10) + editSpace["right"]) + "px; " + Style.sidebarLocation[1] + ": " + (parseInt(_conf["Left Thread Padding"], 10) + editSpace["left"] + 2) + "px;") + "\n" + (_conf["Hide Navigation Decorations"] ? " font-size: 0; color: transparent; word-spacing: 2px;" : "") + "\n text-align: " + _conf["Navigation Alignment"] + ";\n}\n/* Pagination */\n.pagelist {\n border-width: 1px;\n text-align: " + _conf["Pagination Alignment"] + ";\n" + (_conf['4chan SS Navigation'] ? " left: 0; right: 0; border-left: 0; border-right: 0; border-radius: 0 !important;" : " " + Style.sidebarLocation[0] + ": " + (Style.sidebar + parseInt(_conf["Right Thread Padding"], 10) + editSpace["right"]) + "px; " + Style.sidebarLocation[1] + ": " + (parseInt(_conf["Left Thread Padding"], 10) + editSpace["left"] + 2) + "px;") + "\n" + { + "sticky top": " position: fixed; top: 0; border-top-width: 0; " + (_conf["Rounded Edges"] ? "border-radius: 0 0 3px 3px;" : ""), + "sticky bottom": " position: fixed; bottom: 0; border-bottom-width: 0; " + (_conf["Rounded Edges"] ? "border-radius: 3px 3px 0 0;" : ""), + "top": " position: absolute; top: 0; border-top-width: 0; " + (_conf["Rounded Edges"] ? "border-radius: 0 0 3px 3px;" : ""), + "bottom": " position: static; " + (_conf["Rounded Edges"] ? "border-radius: 3px 3px 0 0;" : ""), + "hide": " display: none;", + "on side": " position: fixed; padding: 0; top: auto; bottom: " + (['fixed', 'transparent fade'].contains(_conf['Post Form Style']) ? 21.6 + (Conf['Show Post Form Header'] ? 1.5 : 0) + (Conf['Post Form Decorations'] ? 0.2 : 0) : .5) + "em; " + Style.sidebarLocation[1] + ": auto; " + Style.sidebarLocation[0] + ": " + (250 + Style.sidebarOffset.W) + "px position: fixed;" + (Style.sidebarLocation[0] === 'right' ? " " + agent + "transform: rotate(90deg); " + agent + "transform-origin: bottom right;" : " " + agent + "transform: rotate(-90deg); " + agent + "transform-origin: bottom left;") + " z-index: 6; margin: 0; background: none transparent !important; border: 0 none !important; text-align: right;" + }[_conf['Pagination']] + "\n" + (_conf["Hide Navigation Decorations"] ? " font-size: 0; color: transparent; word-spacing: 0;" : "") + "\n z-index: 6;\n}\n.pagelist input,\n.pagelist div {\n vertical-align: middle;\n}\n#boardNavDesktop a {\n font-size: " + (parseInt(_conf["Font Size"], 10)) + "px;\n}\n" + (_conf["Hide Navigation Decorations"] ? ".pages a { margin: 0 1px; font-size: " + (parseInt(_conf["Font Size"], 10)) + "px;}" : "") + "\n.next,\n.pages,\n.prev {\n display: inline-block;\n margin: 0 3px;\n}\n/* Banner */\n.boardBanner {\n line-height: 0;\n}\n" + (_conf["Faded 4chan Banner"] ? ".boardBanner { opacity: 0.5; " + agent + "transition: opacity 0.3s ease-in-out .5s;}.boardBanner:hover { opacity: 1; " + agent + "transition: opacity 0.3s ease-in;}" : "") + "\n" + (_conf["4chan Banner Reflection"] ? "/* From 4chan SS / OneeChan */.gecko .boardBanner::after { background-image: -moz-element(#Banner); bottom: -100%; content: ''; left: 0; mask: url(\"data:image/svg+xml, #mask\"); opacity: 0.3; position: absolute; right: 0; top: 100%; -moz-transform: scaleY(-1); z-index: -1;}.webkit #Banner { -webkit-box-reflect: below 0 -webkit-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,0) 10%, rgba(255,255,255,.5));}" : "") + "\n" + { + "at sidebar top": ".boardBanner { position: fixed; top: 18px; " + Style.sidebarLocation[0] + ": 2px;}.boardBanner img { width: " + width + "px;}", + "at sidebar bottom": ".boardBanner { position: fixed; bottom: 270px; " + Style.sidebarLocation[0] + ": 2px;}.boardBanner img { width: " + width + "px;}", + "under post form": " .boardBanner { position: fixed; bottom: 130px; " + Style.sidebarLocation[0] + ": 2px;}.boardBanner img { width: " + width + "px;}", + "at top": ".boardBanner { position: relative; display: table; margin: 12px auto; text-align: center;}", + "hide": ".boardBanner { display: none;}" + }[_conf["4chan Banner"]] + "\n/* Board Title */\n#boardTitle {\n font-size: " + (parseInt(_conf["Font Size"], 10) + 10) + "px;\n text-align: center;\n z-index: 4;\n" + { + "at sidebar top": " position: fixed; " + Style.sidebarLocation[0] + ": 2px; top: " + ((Style.logoOffset === 0 && _conf["Icon Orientation"] !== "vertical" ? 40 : 21) + Style.logoOffset) + "px; width: " + width + "px;", + "at sidebar bottom": " position: fixed; " + Style.sidebarLocation[0] + ": 2px; bottom: 280px; width: " + width + "px;", + "under post form": " position: fixed; " + Style.sidebarLocation[0] + ": 2px; bottom: 140px; width: " + width + "px;", + "at top": " margin: 12px 0;", + "hide": " display: none;" + }[_conf["Board Title"]] + "\n}\n.boardTitle a {\n font-size: " + (parseInt(_conf["Font Size"], 10) + 10) + "px;\n}\n.boardSubtitle,\n.boardSubtitle a {\n font-size: " + (parseInt(_conf["Font Size"], 10) - 1) + "px;\n}\n/* Dialogs */\n.move {\n cursor: pointer;\n}\n#ihover {\n position: fixed;\n max-height: 97%;\n max-width: 75%;\n padding: 10px;\n z-index: 22;\n}\n#qp {\n position: fixed;\n z-index: 22;\n}\n#qp .postMessage::after {\n clear: both;\n display: block;\n content: \"\";\n}\n#qp .fullSize {\n max-height: 300px;\n max-width: 500px;\n}\n#menu {\n position: absolute;\n outline: none;\n z-index: 22;\n}\n/* Updater */\n#updater {\n position: fixed;\n z-index: 10;\n padding: 0 1px 1px;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n#updater:hover {\n z-index: 30;\n}\n#updater:not(:hover) > div:not(.move) {\n display: none;\n}\n#updater input {\n text-align: right;\n}\n#updater .rice {\n float: left;\n clear: left;\n}\n#updater .field {\n width: 50px;\n}\n/* Stats */\n#stats {\n position: fixed;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n z-index: 10;\n}\n/* Image Expansion */\n#imgControls .rice {\n display: none;\n}\n#imgControls {\n width: 15px;\n overflow-x: hidden;\n overflow-y: visible;\n}\n#imgContainer {\n float: " + Style.sidebarLocation[0] + ";\n}\n#imgContainer,\n#imgControls:hover {\n width: 110px;\n}\n#imgControls label {\n float: " + Style.sidebarLocation[0] + ";\n}\n#imgControls .selectrice {\n float: " + Style.sidebarLocation[1] + ";\n width: 90px;\n}\n.fitwidth .fullSize {\n max-width: 100%;\n width: 100%;\n}\n\n" + (_conf['Images Overlap Post Form'] ? ".fullSize { position: relative; z-index: 22;}" : "") + "\n/* Prefetcher */\n#prefetch {\n z-index: 9;\n position: fixed;\n}\n/* Delete Buttons */\n" + (_conf['Hide Delete UI'] ? ".deleteform,.post .rice { display: none;}.postInfo { padding: 0 0 0 3px;}" : ".deleteform { position: fixed; z-index: 18; width: 0; bottom: 0; right: 0; border-width: 1px 0 0 1px; border-style: solid; font-size: 0; color: transparent;}.deleteform:hover { width: auto;}.deleteform::before { z-index: 18; border-width: 1px 0 0 1px; border-style: solid; content: 'X'; display: block; position: fixed; bottom: 0; right: 0; font-size: " + _conf['Font Size'] + "px; " + Style.sizing + ": border-box; height: 1.6em; width: 1.4em; text-align: center;}.deleteform:hover::before { display: none;}.deleteform input { margin: 0 1px 0 0;}") + "\n/* Slideout Navigation */\n#boardNavDesktopFoot {\n position: fixed;\n width: " + width + "px;\n " + Style.sidebarLocation[0] + ": 2px;\n text-align: center;\n font-size: 0;\n color: transparent;\n overflow: hidden;\n " + Style.sizing + ": border-box;\n}\n#boardNavDesktopFoot a,\n#boardNavDesktopFoot a::after,\n#boardNavDesktopFoot a::before {\n font-size: " + _conf['Font Size'] + "px;\n}\n#boardNavDesktopFoot:hover {\n overflow-y: auto;\n padding: 2px;\n}\n#boardNavDesktopFoot:not(:hover) {\n border-color: transparent;\n background-color: transparent;\n height: 0;\n overflow: hidden;\n padding: 0;\n border: 0 none;\n}\n" + { + compact: "#boardNavDesktopFoot { word-spacing: 1px;}", + list: "#boardNavDesktopFoot a { display: block;}#boardNavDesktopFoot:hover { max-height: 400px;}#boardNavDesktopFoot a::after { content: ' - ' attr(title);}#boardNavDesktopFoot a[href*='//boards.4chan.org/']::after,#boardNavDesktopFoot a[href*='//rs.4chan.org/']::after { content: '/ - ' attr(title);}#boardNavDesktopFoot a[href*='//boards.4chan.org/']::before,#boardNavDesktopFoot a[href*='//rs.4chan.org/']::before { content: '/';}", + hide: "#boardNavDesktopFoot { display: none;}" + }[_conf["Slideout Navigation"]] + "\n/* Watcher */\n#watcher {\n position: fixed;\n z-index: 14;\n padding: 2px;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n#watcher > div {\n max-height: 1.3em;\n overflow: hidden;\n}\n" + (_conf['Slideout Watcher'] ? "#watcher { width: " + width + "px; " + Style.sidebarLocation[0] + ": 2px !important; " + Style.sidebarLocation[1] + ": auto !important; " + Style.sizing + ": border-box;}#watcher .move { cursor: default; text-decoration: " + (_conf["Underline Links"] ? "underline" : "none") + ";}#watcher > div { max-height: 1.6em; overflow: hidden;}#watcher:hover { overflow-y: auto;}#watcher:not(:hover) { height: 0; overflow: hidden; border: 0 none; padding: 0;}" : "#watcher { width: 200px;}#watcher:not(:hover) { max-height: 200px; overflow: hidden;}") + "\n/* Announcements */\n#globalMessage {\n text-align: center;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n" + ({ + 'slideout': "#globalMessage { position: fixed; padding: 2px; width: " + width + "px; " + Style.sidebarLocation[0] + ": 2px !important; " + Style.sidebarLocation[1] + ": auto !important;}#globalMessage h3 { margin: 0;}#globalMessage:hover { " + Style.sizing + ": border-box; overflow-y: auto;}#globalMessage:not(:hover) { height: 0; overflow: hidden; padding: 0; border: 0 none;}", + 'hide': "#globalMessage { display: none !important;}" + }[_conf['Announcements']] || "") + "\n/* Threads */\n.thread {\n margin: " + (parseInt(_conf["Top Thread Padding"], 10)) + "px 0 " + (parseInt(_conf["Bottom Thread Padding"], 10)) + "px 0;\n " + (_conf["Rounded Edges"] ? "border-radius: 4px;" : "") + "\n}\n/* Thread Clearfix */\n.thread > div:last-of-type::after {\n display: block;\n content: ' ';\n clear: both;\n}\n/* Posts */\n.summary {\n margin-bottom: " + Style.replyMargin + "px;\n}\n.post {\n margin-bottom: " + Style.replyMargin + "px;\n}\n.replyContainer:last-of-type .post {\n margin-bottom: 0;\n}\n.menu_button,\n.hide_thread_button,\n.hide_reply_button {\n float: right;\n margin: 0 3px;\n opacity: 0;\n " + agent + "transition: opacity .3s ease-out 0s;\n}\n.post:hover .hide_reply_button,\n.post:hover .menu_button,\n.post:hover .hide_thread_button,\n.hidden_thread .hide_thread_button,\n.hidden_thread .menu_button,\n.inline .hide_reply_button,\n.inline .menu_button {\n opacity: 1;\n}\n.hidden_thread {\n text-align: right;\n}\n" + (_conf['Color user IDs'] ? ".posteruid .hand { padding: .1em .3em; border-radius: 1em; font-size: 80%;}" : "") + "\n.postInfo > span {\n vertical-align: bottom;\n}\n.subject,\n.name {\n " + (_conf["Bolds"] ? 'font-weight: 600;' : '') + "\n}\n.postertrip {\n " + (_conf["Italics"] ? 'font-style: italic;' : '') + "\n}\n.replylink {\n text-decoration: " + (_conf["Underline Links"] ? "underline" : "none") + ";\n}\n.fileInfo {\n padding: 0 3px;\n}\n.fileThumb {\n float: left;\n margin: 3px 20px;\n outline: none;\n}\n.reply.post {\n " + Style.sizing + ": border-box;\n}\n" + (_conf["Fit Width Replies"] ? ".reply.post { display: block; overflow: hidden;}.image_expanded .reply.post { width: 100%;}" : ".reply.post { display: inline-block;}") + "\n.image_expanded .reply.post {\n display: inline-block;\n overflow: visible;\n clear: both;\n}\n.post {\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n.postMessage {\n margin: " + _conf['Vertical Post Padding'] + "px " + _conf['Horizontal Post Padding'] + "px;\n}\n.spoiler,\ns {\n text-decoration: none;\n}\n/* Reply Clearfix */\n.reply.post .postMessage {\n clear: right;\n}\n" + (_conf['Force Reply Break'] || _conf["OP Background"] ? ".op.post .postMessage::after { display: block; content: ' '; clear: both;}" : "") + "\n/* OP */\n.favicon {\n vertical-align: bottom;\n}\n" + (_conf["OP Background"] ? ".op.post { " + Style.sizing + ": border-box;}" : "") + "\n/* Summary */\n" + (_conf["Force Reply Break"] ? ".summary { clear: both; float: left; }" : "") + "\n/* Inlined */\n.inline {\n margin: 2px 8px 2px 2px;\n}\n.post .inline {\n margin: 2px;\n}\n.inline .replyContainer {\n display: inline-block;\n}\n/* Inlined Clearfix */\n.inline .postMessage::after {\n clear: both;\n display: block;\n content: \"\";\n}\n/* Quotes */\n.inlined {\n font-style: italic;\n " + (_conf["Bolds"] ? 'font-weight: 800;' : '') + "\n}\n.quotelink {\n text-decoration: " + (_conf["Underline Links"] ? "underline" : "none") + ";\n}\n.filtered,\n.quotelink.filtered {\n text-decoration: underline;\n text-decoration: line-through !important;\n}\n/* Backlinks */\n.backlink {\n text-decoration: " + (_conf["Underline Links"] ? "underline" : "none") + ";\n}\n.backlink.dead {\n text-decoration: none;\n}\n" + { + "lower left": ".container { padding: 0 5px; max-width: 100%;}.reply.quoted { position: relative; padding-bottom: 1.7em;}.reply .container { position: absolute; left: 0; bottom: 0; padding: 0 5px;}.reply .container::before { content: 'REPLIES: ';}#qp .container { position: static; max-width: 100%;}#qp .container::before { content: '';}.inline .container { position: static; max-width: 100%;}.inline .container::before { content: '';}", + 'lower right': ".reply.quoted { position: relative; padding-bottom: 1.7em;}.reply .container { position: absolute; right: 0; bottom: 0;}.container::before { content: 'REPLIES: ';}.container { max-width: 100%; padding: 0 5px;}#qp .container { position: static; max-width: 100%;}#qp .container::before { content: '';}.inline .container { position: static; float: none;}.inline .container::before { content: '';}", + 'default': "" + }[_conf["Backlinks Position"]] + "\n/* Code */\n.prettyprint {\n " + Style.sizing + ": border-box;\n font-family: monospace;\n display: inline-block;\n margin-right: auto;\n white-space: pre-wrap;\n border-radius: 2px;\n overflow-x: auto;\n padding: 3px;\n max-width: 100%;\n}\n/* Menu */\n.entry {\n border-bottom: 1px solid rgba(0,0,0,.25);\n cursor: pointer;\n display: block;\n outline: none;\n padding: 3px 7px;\n position: relative;\n text-decoration: none;\n white-space: nowrap;\n}\n.entry:last-child {\n border-bottom: 0;\n}\n.hasSubMenu::after {\n content: \"\";\n border-" + position + ": .5em solid;\n border-top: .3em solid transparent;\n border-bottom: .3em solid transparent;\n display: inline-block;\n margin: .3em;\n position: absolute;\n right: 3px;\n}\n.subMenu {\n display: none;\n position: absolute;\n " + position + ": 100%;\n top: -1px;\n}\n.focused .subMenu {\n display: block;\n}\n/* Stubs */\n" + (_conf['Fit Width Replies'] ? ".stub { float: right; clear: both;}" : "") + "\n/* Emoji */\n" + (_conf["Emoji"] !== "disable" ? Style.emoji(_conf["Emoji Position"]) : "") + "\n/* Element Replacing */\n/* Checkboxes */\n.rice {\n cursor: pointer;\n width: 9px;\n height: 9px;\n margin: 2px 3px 3px;\n display: inline-block;\n vertical-align: bottom;\n " + (_conf["Rounded Edges"] ? "border-radius: 2px;" : "") + "\n " + (_conf["Circle Checkboxes"] ? "border-radius: 6px;" : "") + "\n}\ninput:checked + .rice {\n background-attachment: scroll;\n background-repeat: no-repeat;\n background-position: bottom right;\n}\n/* Selects */\n.selectrice {\n position: relative;\n cursor: default;\n overflow: hidden;\n text-align: left;\n}\n.selectrice::after {\n content: \"\";\n border-right: .25em solid transparent;\n border-left: .25em solid transparent;\n position: absolute;\n right: .4em;\n top: .5em;\n}\n.selectrice::before {\n content: \"\";\n height: 1.6em;\n position: absolute;\n right: 1.3em;\n top: 0;\n}\n/* Select Dropdown */\n#selectrice {\n padding: 0;\n margin: 0;\n position: fixed;\n max-height: 120px;\n overflow-y: auto;\n overflow-x: hidden;\n z-index: 32;\n}\n#selectrice:empty {\n display: none;\n}\n/* Post Form */\n#qr {\n z-index: 20;\n position: fixed;\n padding: 1px;\n border: 1px solid transparent;\n min-width: " + width + "px;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px 3px 0 0;" : "") + "\n}\n#qrtab {\n " + (_conf["Rounded Edges"] ? "border-radius: 3px 3px 0 0;" : "") + "\n}\n\n" + ({ + "fixed": "#qr { top: auto !important; bottom: 1.7em !important; " + Style.sidebarLocation[0] + ": 0 !important; " + Style.sidebarLocation[1] + ": auto !important;}", + "slideout": "#qr { top: auto !important; bottom: 1.7em !important; " + Style.sidebarLocation[0] + ": -" + (233 + Style.sidebarOffset.W) + "px !important; " + Style.sidebarLocation[1] + ": auto !important;}#qr:hover,#qr.focus,#qr.dump { " + agent + "transform: translate(" + (xOffset + (233 + Style.sidebarOffset.W)) + "px);}", + "tabbed slideout": "#qr { top: auto !important; bottom: 1.7em !important; " + Style.sidebarLocation[0] + ": -" + (252 + Style.sidebarOffset.W) + "px !important; " + Style.sidebarLocation[1] + ": auto !important;}#qr:hover,#qr.focus,#qr.dump { " + agent + "transform: translate(" + (xOffset + (252 + Style.sidebarOffset.W)) + "px);}#qr #qrtab { " + agent + "transform: rotate(" + (Style.sidebarLocation[0] === "left" ? "" : "-") + "90deg); " + agent + "transform-origin: bottom " + Style.sidebarLocation[0] + "; position: absolute; top: 0; " + Style.sidebarLocation[0] + ": 100%; width: 110px; text-align: center; border-width: 1px 1px 0 1px; cursor: default;}#qr:hover #qrtab,#qr.focus #qrtab,#qr.dump #qrtab { opacity: 0; " + Style.sidebarLocation[0] + ": " + (252 + Style.sidebarOffset.W) + "px;}#qrtab input,#qrtab .rice,#qrtab span { display: none;}", + "transparent fade": "#qr { overflow: visible; top: auto !important; bottom: 1.7em !important; " + Style.sidebarLocation[0] + ": 2px !important; " + Style.sidebarLocation[1] + ": auto !important; opacity: 0.2; " + agent + "transition: opacity .3s ease-in-out 1s;}#qr:hover,#qr.focus,#qr.dump { opacity: 1; " + agent + "transition: opacity .3s linear;}" + }[_conf['Post Form Style']] || "") + "\n\n" + (_conf['Post Form Style'] !== 'tabbed slideout' ? (!(_conf['Post Form Style'] === 'float' || _conf['Show Post Form Header']) ? "#qrtab { display: none; }" : _conf['Post Form Style'] !== 'slideout' ? ".autohide:not(:hover) > form { display: none !important; }" : "") + "#qrtab { margin-bottom: 1px; }" : "") + "\n\n" + (_conf['Post Form Style'] !== 'float' && _conf["Post Form Slideout Transitions"] ? "#qr { " + agent + "transition: " + agent + "transform .3s ease-in-out 1s;}#qr:hover,#qr.focus,#qr.dump { " + agent + "transition: " + agent + "transform .3s linear;}#qrtab { " + agent + "transition: opacity .3s ease-in-out 1s;}#qr:hover #qrtab { " + agent + "transition: opacity .3s linear;}" : "") + "\n\n#qr .close {\n float: right;\n padding: 0 3px;\n}\n#qr .warning {\n min-height: 1.6em;\n vertical-align: middle;\n padding: 0 1px;\n border-width: 1px;\n border-style: solid;\n}\n.userInfo {\n width: 248px;\n max-width: 100%;\n min-width: 100%;\n}\n#dump {\n width: 10%;\n margin: 0;\n}\n\n" + (_conf['Compact Post Form Inputs'] ? ".userInfo input.field { width: 29.6%; margin: 0 0 0 0.4%;}#qr textarea.field { height: 14.8em; min-height: 9em;}#qr.captcha textarea.field { height: 9em;}" : ".userInfo input.field { width: 100%;}.userInfo input.field[name='name'] { width: 89.6%; margin: 0 0 0 0.4%;}#qr textarea.field { height: 11.6em; min-height: 6em;}#qr.captcha textarea.field { height: 6em;}") + "\n\n" + (_conf["Tripcode Hider"] ? "input.field.tripped:not(:hover):not(:focus) { color: transparent !important; text-shadow: none !important;}" : "") + "\n\n#qr textarea {\n resize: " + _conf['Textarea Resize'] + ";\n}\n.captchaimg {\n margin: 1px 0 0;\n text-align: center;\n}\n.captchaimg img {\n width: 100%;\n height: 4em;\n width: 246px;\n}\n.captchainput .field {\n width: 100%;\n margin: 1px 0 0;\n}\n.field,\n.selectrice,\nbutton,\ninput:not([type=radio]) {\n " + Style.sizing + ": border-box;\n font-size: " + (parseInt(_conf['Font Size'], 10)) + "px;\n height: 1.6em;\n margin: 1px 0 0;\n vertical-align: bottom;\n padding: 0 1px;\n}\n#qr textarea {\n min-width: 100%;\n}\n#qr [type='submit'] {\n width: 25%;\n}\n[type='file'] {\n position: absolute;\n opacity: 0;\n z-index: -1;\n}\n#showQR {\n display: " + (_conf["Hide Show Post Form"] ? "none" : "block") + ";\n z-index: 4;\n " + Style.sidebarLocation[0] + ": 2px;\n width: " + width + "px;\n background-color: transparent;\n text-align: center;\n position: fixed;\n top: auto;\n}\n/* Fake File Input */\n#file {\n " + Style.sizing + ": border-box;\n display: inline-block;\n width: 100px;\n min-width: 74.6%;\n max-width: 74.6%;\n margin-right: 0.4%;\n overflow: hidden;\n}\n/* Thread Select / Spoiler Label */\n#threadselect {\n vertical-align: bottom;\n width: 49%;\n display: inline-block;\n}\n#spoilerLabel {\n vertical-align: bottom;\n width: 49%;\n display: inline-block;\n text-align: right;\n}\n#threadselect:empty + #spoilerLabel {\n display: inline-block;\n width: 100%;\n}\n/* Dumping UI */\n.dump #replies {\n display: block;\n}\n#replies {\n display: none;\n height: 90px;\n position: relative;\n}\n#replies > div {\n counter-reset: thumbnails;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: hidden;\n position: absolute;\n white-space: pre;\n}\n#replies > div:hover {\n overflow-x: auto;\n}\n.thumbnail {\n " + Style.sizing + ": border-box;\n cursor: move;\n border: 1px solid transparent;\n background: rgba(0,0,0,.2) 50% 20% cover;\n display: inline-block;\n height: 90px;\n width: 90px;\n padding: 2px;\n opacity: .5;\n overflow: hidden;\n position: relative;\n text-shadow: 0 1px 1px #000;\n " + agent + "transition: opacity .25s ease-in-out;\n vertical-align: top;\n}\n.thumbnail:hover,\n.thumbnail:focus {\n opacity: .9;\n}\n.thumbnail::before {\n counter-increment: thumbnails;\n content: counter(thumbnails);\n color: #fff;\n position: absolute;\n top: 3px;\n right: 3px;\n text-shadow: 0 0 3px #000, 0 0 8px #000;\n}\n.thumbnail#selected {\n opacity: 1;\n}\n.thumbnail.drag {\n box-shadow: 0 0 10px rgba(0,0,0,.5);\n}\n.thumbnail.over {\n border-color: #fff;\n}\n.thumbnail > span {\n color: #fff;\n}\n.remove {\n background: none;\n color: #e00;\n font-weight: 700;\n padding: 3px;\n}\na:only-of-type > .remove {\n display: none;\n}\n.remove:hover::after {\n content: \" Remove\";\n}\n.thumbnail > label {\n background: rgba(0,0,0,.5);\n color: #fff;\n right: 0; bottom: 0; left: 0;\n position: absolute;\n text-align: center;\n}\n.thumbnail > label > input {\n margin: 0;\n}\n#addReply {\n cursor: pointer;\n font-size: 3.5em;\n line-height: 90px;\n margin: 0 0.5em;\n}\n/* Ads */\n.topad img,\n.middlead img,\n.bottomad img {\n opacity: 0.3;\n " + agent + "transition: opacity .3s linear;\n}\n.topad img:hover,\n.middlead img:hover,\n.bottomad img:hover {\n opacity: 1;\n}\n" + (_conf["Block Ads"] ? "/* AdBlock Minus */.bottomad + hr,.topad img,.middlead img,.bottomad img { display: none;}" : "") + "\n" + (_conf["Shrink Ads"] ? ".topad a img,.middlead a img,.bottomad a img { width: 500px; height: auto;}" : "") + "\n/* Options */\n#overlay {\n position: fixed;\n z-index: 30;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n background: rgba(0,0,0,.5);\n}\n#options {\n width: auto;\n left: 15%;\n right: 15%;\n top: 15%;\n bottom: 15%;\n position: absolute;\n padding: .3em;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n#options h3,\n.keybinds_tab,\n.mascots_tab,\n.main_tab,\n.style_tab {\n text-align: center;\n}\n.keybinds_tab table,\n.main_tab ul,\n.style_tab ul {\n text-align: left;\n}\n#options ul {\n padding: 0;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n#optionsContent {\n overflow: auto;\n position: absolute;\n top: 1.7em;\n right: 5px;\n bottom: 5px;\n left: 5px;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n#optionsbar {\n padding: 0 3px;\n}\n#optionsbar label {\n cursor: pointer;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px 3px 0 0;" : "") + "\n}\n.tabs label {\n position: relative;\n padding: 0 4px;\n z-index: 1;\n height: 1.4em;\n display: inline-block;\n border-width: 1px 1px 0 1px;\n border-color: transparent;\n border-style: solid;\n}\n#credits {\n float: right;\n}\n#optionsContent > input:not(:checked) + div {\n display: none;\n}\n#options h3 {\n margin: 0;\n}\n.main_tab li,\n.style_tab li,\n.rice_tab li {\n overflow: visible;\n padding: 0 5px 0 7px;\n list-style-type: none;\n}\n#options tr:nth-of-type(2n+1),\n.main_tab li:nth-of-type(2n+1),\n.rice_tab li:nth-of-type(2n+1),\n.style_tab li:nth-of-type(2n+1),\n.keybinds_tab li:nth-of-type(2n+1),\n#selectrice li:nth-of-type(2n+1) {\n background-color: rgba(0, 0, 0, 0.05);\n}\narticle li {\n margin: 10px 0 10px 2em;\n}\n#options .option {\n width: 50%;\n display: inline-block;\n vertical-align: bottom;\n}\n.optionlabel {\n padding-left: 18px;\n}\n.rice + .optionlabel {\n padding-left: 0;\n}\n#options .style_tab ul,\n#options .main_tab ul {\n vertical-align: top;\n " + (_conf["Single Column Mode"] ? "margin: 0 auto 6px;" : "margin: 0 3px 6px;\n display: inline-block;") + "\n}\n.main_tab li,\n.styleoption {\n text-align: left;\n}\n.style_tab .suboptions ul {\n width: 370px;\n}\n.main_tab ul {\n width: 200px;\n}\n.suboptions,\n#mascotcontent,\n#themecontent {\n overflow: auto;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 1.7em;\n left: 0;\n}\n.mAlign {\n height: 250px;\n vertical-align: middle;\n display: table-cell;\n}\n#themecontent {\n top: 1.7em;\n}\n#save,\n.stylesettings {\n position: absolute;\n right: 10px;\n bottom: 0;\n}\n.style_tab .suboptions {\n bottom: 0;\n}\n#optionsContent textarea {\n font-family: monospace;\n min-height: 350px;\n resize: vertical;\n width: 100%;\n}\n/* Hover Functionality */\n#mouseover {\n z-index: 32;\n position: fixed;\n max-width: 70%;\n}\n#mouseover:empty {\n display: none;\n}\n/* Mascot Tab */\n#mascot_hide {\n padding: 3px;\n position: absolute;\n top: 2px;\n right: 18px;\n}\n#mascot_hide .rice {\n float: left;\n}\n#mascot_hide > div {\n height: 0;\n text-align: right;\n overflow: hidden;\n}\n#mascot_hide:hover > div {\n height: auto;\n}\n#mascot_hide label {\n width: 100%;\n display: block;\n clear: both;\n text-decoration: none;\n}\n.mascots {\n padding: 0;\n text-align: center;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n.mascot,\n.mascotcontainer {\n overflow: hidden;\n}\n.mascot {\n position: relative;\n border: none;\n margin: 5px;\n padding: 0;\n width: 200px;\n display: inline-block;\n background-color: transparent;\n}\n.mascotcontainer {\n height: 250px;\n border: 0;\n margin: 0;\n max-height: 250px;\n cursor: pointer;\n bottom: 0;\n border-width: 0 1px 1px;\n border-style: solid;\n border-color: transparent;\n overflow: hidden;\n}\n.mascot img {\n max-width: 200px;\n}\n.mascotname,\n.mascotoptions {\n padding: 0;\n width: 100%;\n}\n.mascot .mascotoptions {\nopacity: 0;\n " + agent + "transition: opacity .3s linear;\n}\n.mascot:hover .mascotoptions {\n opacity: 1;\n}\n.mascotoptions {\n position: absolute;\n bottom: 0;\n right: 0;\n left: 0;\n}\n.mascotoptions a {\n display: inline-block;\n width: 33%;\n}\n#upload {\n position: absolute;\n width: 100px;\n left: 50%;\n margin-left: -50px;\n text-align: center;\n bottom: 0;\n}\n#mascots_batch {\n position: absolute;\n left: 10px;\n bottom: 0;\n}\n/* Themes Tab */\n.theme_tab h1 {\n position: absolute;\n right: 300px;\n bottom: 10px;\n margin: 0;\n " + agent + "transition: all .2s ease-in-out;\n opacity: 0;\n}\n.theme_tab .selectedtheme h1 {\n right: 11px;\n opacity: 1;\n}\n#themeContainer {\n margin-bottom: 3px;\n}\n#addthemes {\n position: absolute;\n left: 10px;\n bottom: 0;\n}\n.theme {\n margin: 1em;\n}\n/* Theme Editor */\n#themeConf {\n position: fixed;\n " + Style.sidebarLocation[1] + ": 2px;\n " + Style.sidebarLocation[0] + ": auto;\n top: 0;\n bottom: 0;\n width: 296px;\n z-index: 10;\n}\n#themebar input {\n width: 30%;\n}\n.color {\n width: 10%;\n border-left: none !important;\n color: transparent !important;\n}\n.colorfield {\n width: 90%;\n}\n.themevar textarea {\n min-width: 100%;\n max-width: 100%;\n height: 20em;\n resize: vertical;\n}\n/* Mascot Editor */\n#mascotConf {\n position: fixed;\n height: 17em;\n bottom: 0;\n left: 50%;\n width: 500px;\n margin-left: -250px;\n overflow: auto;\n z-index: 10;\n}\n#mascotConf .option,\n#mascotConf .optionlabel {\n " + Style.sizing + ": border-box;\n width: 50%;\n display: inline-block;\n vertical-align: middle;\n}\n#mascotConf .option input {\n width: 100%;\n}\n#close {\n position: absolute;\n left: 10px;\n bottom: 0;\n}\n/* Catalog */\n#content .navLinks,\n#info .navLinks,\n.btn-wrap {\n display: block;\n}\n.navLinks > .btn-wrap:not(:first-of-type)::before {\n content: ' - ';\n}\n.button {\n cursor: pointer;\n}\n#content .btn-wrap,\n#info .btn-wrap {\n display: inline-block;\n}\n#settings .selectrice {\n width: 100px;\n display: inline-block;\n}\n#post-preview {\n position: absolute;\n z-index: 22;\n " + (_conf["Rounded Edges"] ? "border-radius: 3px;" : "") + "\n}\n#settings,\n#threads,\n#info .navLinks,\n#content .navLinks {\n text-align: center;\n}\n#threads .thread {\n vertical-align: top;\n display: inline-block;\n word-wrap: break-word;\n overflow: hidden;\n margin-top: 5px;\n padding: 5px 0 3px;\n text-align: center;\n}\n.extended-small .thread,\n.small .thread {\n width: 165px;\n max-height: 320px;\n}\n.small .teaser,\n.large .teaser {\n display: none;\n}\n.extended-large .thread,\n.large .thread {\n width: 270px;\n max-height: 410px;\n}\n.extended-small .thumb,\n.small .thumb {\n max-width: 150px;\n max-height: 150px;\n}\n/* Front Page */\n#logo {\n text-align: center;\n}\n#doc {\n margin: 0 auto;\n width: 1000px;\n position: relative;\n}\n#boards .boxcontent {\n vertical-align: top;\n text-align: center;\n}\n#filter-container,\n#options-container {\n float: right;\n position: relative;\n}\n#optionsmenu {\n top: 100% !important;\n left: 0 !important;\n}\n#boards .column {\n " + Style.sizing + ": border-box;\n display: inline-block;\n width: 16em;\n text-align: left;\n vertical-align: top;\n}\n.bd ul,\n.boxcontent ul {\n vertical-align: top;\n padding: 0;\n}\n.right-box .boxcontent ul {\n padding: 0 10px;\n}\n.yuimenuitem,\n.boxcontent li {\n list-style-type: none;\n}\n.bd ul {\n margin: 0;\n}\n.yuimenuitem::before {\n content: \" [ ] \";\n font-family: monospace;\n}\n.yuimenuitem-checked::before {\n content: \" [x] \"\n}\n.yui-u {\n display: inline-block;\n vertical-align: top;\n width: 475px;\n margin: 10px;\n}\n#recent-images .boxcontent {\n text-align: center;\n}\n#ft {\n text-align: center;\n}\n#ft ul {\n padding: 0;\n}\n#ft li {\n list-style-type: none;\n display: inline-block;\n width: 100px;\n}\n#preview-tooltip-nws,\n#preview-tooltip-ws,\n#ft .fill,\n.clear-bug {\n display: none;\n}\n" + (Conf["Custom CSS"] ? Conf["customCSS"] : ""); + }, + theme: function(theme) { + var agent, background, backgroundC, bgColor, css, fileHeading, icons, replyHeading, _conf; + + _conf = Conf; + agent = Style.agent; + bgColor = new Style.color(Style.colorToHex(backgroundC = theme["Background Color"])); + Style.lightTheme = bgColor.isLight(); + icons = Icons.header.png + Icons.themes[_conf["Icons"]]; + css = ".hide_thread_button span > span,\n.hide_reply_button span > span {\n background-color: " + theme["Links"] + ";\n}\n#mascot_hide label {\n border-bottom: 1px solid " + theme["Reply Border"] + ";\n}\n#content .thumb {\n box-shadow: 0 0 5px " + theme["Reply Border"] + ";\n}\n.mascotname,\n.mascotoptions {\n background: " + theme["Dialog Background"] + ";\n border: 1px solid " + theme["Buttons Border"] + ";\n}\n.opContainer.filter_highlight {\n box-shadow: inset 5px 0 " + theme["Backlinked Reply Outline"] + ";\n}\n.filter_highlight > .reply {\n box-shadow: -5px 0 " + theme["Backlinked Reply Outline"] + ";\n}\n::" + agent + "selection {\n background: " + theme["Text"] + ";\n color: " + backgroundC + ";\n}\nhr {\n border-bottom: 1px solid " + theme["Reply Border"] + ";\n}\na[style=\"cursor: pointer; float: right;\"] + div[style^=\"width: 100%;\"] > table > tbody > tr > td {\n background: " + backgroundC + " !important;\n border: 1px solid " + theme["Reply Border"] + " !important;\n}\n#fs_status {\n background: " + theme["Dialog Background"] + " !important;\n}\n#fs_data tr[style=\"background-color: #EA8;\"] {\n background: " + theme["Reply Background"] + " !important;\n}\n#fs_data,\n#fs_data * {\n border-color: " + theme["Reply Border"] + " !important;\n}\nhtml {\n background: " + (backgroundC || '') + ";\n background-image: " + (theme["Background Image"] || '') + ";\n background-repeat: " + (theme["Background Repeat"] || '') + ";\n background-attachment: " + (theme["Background Attachment"] || '') + ";\n background-position: " + (theme["Background Position"] || '') + ";\n}\n#optionsContent,\n#exlinks-options-content,\n#mascotcontent,\n#themecontent {\n background: " + backgroundC + ";\n border: 1px solid " + theme["Reply Border"] + ";\n padding: 5px;\n}\n#selected_tab {\n background: " + backgroundC + ";\n border-color: " + theme["Reply Border"] + ";\n border-style: solid;\n}\n.captchaimg img {\n " + (Style.filter(theme["Text"], theme["Input Background"])) + "\n}\n#boardTitle,\n#prefetch,\n#showQR,\n" + (!_conf["Post Form Decorations"] ? '#spoilerLabel,' : '') + "\n#stats {\n text-shadow:\n 1px 1px 0 " + backgroundC + ",\n -1px -1px 0 " + backgroundC + ",\n 1px -1px 0 " + backgroundC + ",\n -1px 1px 0 " + backgroundC + ",\n 0 1px 0 " + backgroundC + ",\n 0 -1px 0 " + backgroundC + ",\n 1px 0 0 " + backgroundC + ",\n -1px 0 0 " + backgroundC + "\n " + (_conf["Sidebar Glow"] ? ", 0 2px 5px " + theme['Text'] + ";" : ";") + "\n}\n/* Fixes text spoilers */\n" + (_conf['Remove Spoilers'] && _conf['Indicate Spoilers'] ? ".spoiler::before,s::before { content: '[spoiler]';}.spoiler::after,s::after { content: '[/spoiler]';}" : !_conf['Remove Spoilers'] ? ".spoiler:not(:hover) *,s:not(:hover) * { color: rgb(0,0,0) !important; text-shadow: none !important;}.spoiler:not(:hover),s:not(:hover) { background-color: rgb(0,0,0); color: rgb(0,0,0) !important; text-shadow: none !important;}" : "") + "\n#exlinks-options,\n#options,\n#qrtab,\n" + (_conf["Post Form Decorations"] ? "#qr," : "") + "\n#updater,\ninput[type=\"submit\"],\ninput[value=\"Report\"],\nspan[style=\"left: 5px; position: absolute;\"] a {\n background: " + theme["Buttons Background"] + ";\n border: 1px solid " + theme["Buttons Border"] + ";\n}\n.enabled .mascotcontainer {\n background: " + theme["Buttons Background"] + ";\n border-color: " + theme["Buttons Border"] + ";\n}\n#dump,\n#file,\n#options input,\n.captchaimg,\n.dump #dump:not(:hover):not(:focus),\n.selectrice,\nbutton,\ninput,\ntextarea {\n background: " + theme["Input Background"] + ";\n border: 1px solid " + theme["Input Border"] + ";\n color: " + theme["Inputs"] + ";\n}\n#dump:hover,\n#file:hover,\n#selectrice li:hover,\n#selectrice li:nth-of-type(2n+1):hover,\n.selectrice:hover,\ninput:hover,\ntextarea:hover {\n background: " + theme["Hovered Input Background"] + ";\n border-color: " + theme["Hovered Input Border"] + ";\n color: " + theme["Inputs"] + ";\n}\n#dump:active,\n#dump:focus,\n#selectrice li:focus,\n.selectrice:focus,\ninput:focus,\ntextarea:focus,\ntextarea.field:focus {\n background: " + theme["Focused Input Background"] + ";\n border-color: " + theme["Focused Input Border"] + ";\n color: " + theme["Inputs"] + ";\n}\n#mouseover,\n#post-preview,\n#qp .post,\n#xupdater,\n.reply.post {\n border-width: 1px;\n border-style: solid;\n border-color: " + theme["Reply Border"] + ";\n background: " + theme["Reply Background"] + ";\n}\n.thread > .replyContainer > .reply.post {\n border-width: " + (_conf['Post Spacing'] === "0" ? "1px 1px 0 1px" : '1px') + ";\n}\n.exblock.reply,\n.reply.post.highlight,\n.reply.post:target {\n background: " + theme["Highlighted Reply Background"] + ";\n border: 1px solid " + theme["Highlighted Reply Border"] + ";\n}\n#boardNavDesktop,\n.pagelist {\n background: " + theme["Navigation Background"] + ";\n border-style: solid;\n border-color: " + theme["Navigation Border"] + ";\n}\n.thread {\n background: " + theme["Thread Wrapper Background"] + ";\n border: 1px solid " + theme["Thread Wrapper Border"] + ";\n}\n#boardNavDesktopFoot,\n#mascotConf,\n#mascot_hide,\n#menu,\n#selectrice,\n#themeConf,\n#watcher,\n#watcher:hover,\n.subMenu,\na[style=\"cursor: pointer; float: right;\"] ~ div[style^=\"width: 100%;\"] > table {\n background: " + theme["Dialog Background"] + ";\n border: 1px solid " + theme["Dialog Border"] + ";\n}\n.deleteform::before,\n.deleteform,\n#qr .warning {\n background: " + theme["Input Background"] + ";\n border-color: " + theme["Input Border"] + ";\n}\n.disabledwarning,\n.warning {\n color: " + theme["Warnings"] + ";\n}\n#navlinks a:first-of-type {\n border-bottom: 11px solid rgb(" + (Style.lightTheme ? "130,130,130" : "152,152,152") + ");\n}\n#navlinks a:last-of-type {\n border-top: 11px solid rgb(" + (Style.lightTheme ? "130,130,130" : "152,152,152") + ");\n}\n#charCount {\n color: " + (Style.lightTheme ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.7)") + ";\n}\n.postNum a {\n color: " + theme["Post Numbers"] + ";\n}\n.subject {\n color: " + theme["Subjects"] + " !important;\n}\n.dateTime,\n.post-ago {\n color: " + theme["Timestamps"] + " !important;\n}\n#fs_status a,\n#imgControls label::after,\n#updater #count:not(.new)::after,\n#showQR,\n#updater,\n.abbr,\n.boxbar,\n.boxcontent,\n.deleteform::before,\n.pages strong,\n.pln,\n.reply,\n.reply.highlight,\n.summary,\nbody,\nbutton,\nspan[style=\"left: 5px; position: absolute;\"] a,\ninput,\ntextarea {\n color: " + theme["Text"] + ";\n}\n#exlinks-options-content > table,\n#options ul,\n#selectrice {\n border-bottom: 1px solid " + theme["Reply Border"] + ";\n box-shadow: inset " + theme["Shadow Color"] + " 0 0 5px;\n}\n.quote + .spoiler:hover,\n.quote {\n color: " + theme["Greentext"] + ";\n}\n.forwardlink {\n text-decoration: " + (_conf["Underline Links"] ? "underline" : "none") + ";\n border-bottom: 1px dashed " + theme["Backlinks"] + ";\n}\n.container::before {\n color: " + theme["Timestamps"] + ";\n}\n#menu,\n#post-preview,\n#qp .opContainer,\n#qp .replyContainer,\n.subMenu {\n box-shadow: " + (_conf['Quote Shadows'] ? "5px 5px 5px " + theme['Shadow Color'] : "") + ";\n}\n.rice {\n background: " + theme["Checkbox Background"] + ";\n border: 1px solid " + theme["Checkbox Border"] + ";\n}\n.selectrice::before {\n border-left: 1px solid " + theme["Input Border"] + ";\n}\n.selectrice::after {\n border-top: .45em solid " + theme["Inputs"] + ";\n}\n#updater input,\n.bd {\n background: " + theme["Buttons Background"] + ";\n border: 1px solid " + theme["Buttons Border"] + ";\n}\n.pages a,\n#boardNavDesktop a {\n color: " + theme["Navigation Links"] + ";\n}\ninput[type=checkbox]:checked + .rice {\n background: " + theme["Checkbox Checked Background"] + ";\n background-image: url(" + (Icons.header.png + (Style.lightTheme ? "AkAAAAJCAMAAADXT/YiAAAAWlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLSV5RAAAAHXRSTlMAgVHwkF11LdsM9vm9n5x+ye0qMOfk/GzqSMC6EsZzJYoAAABBSURBVHheLcZHEoAwEMRArcHknNP8/5u4MLqo+SszcBMwFyt57cFXamjV0UtyDBotIIVFiiAJ33aijhOA67bnwwuZdAPNxckOUgAAAABJRU5ErkJggg==" : "AkAAAAJCAMAAADXT/YiAAAAWlBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9jZLFEAAAAHXRSTlMAgVHwkF11LdsM9vm9n5x+ye0qMOfk/GzqSMC6EsZzJYoAAABBSURBVHheLcZHEoAwEMRArcHknNP8/5u4MLqo+SszcBMwFyt57cFXamjV0UtyDBotIIVFiiAJ33aijhOA67bnwwuZdAPNxckOUgAAAABJRU5ErkJggg==")) + ");\n}\n#addReply,\n#dump,\n.button,\n.entry,\n.replylink,\na {\n color: " + theme["Links"] + ";\n}\n.backlink {\n color: " + theme["Backlinks"] + ";\n}\n.qiQuote,\n.quotelink {\n color: " + theme["Quotelinks"] + ";\n}\n#addReply:hover,\n#dump:hover,\n.entry:hover,\n.sideArrows a:hover,\n.replylink:hover,\n.qiQuote:hover,\n.quotelink:hover,\na .name:hover,\na .postertrip:hover,\na:hover {\n color: " + theme["Hovered Links"] + ";\n}\n#boardNavDesktop a:hover,\n#boardTitle a:hover {\n color: " + theme["Hovered Navigation Links"] + ";\n}\n#boardTitle {\n color: " + theme["Board Title"] + ";\n}\n.name,\n.post-author {\n color: " + theme["Names"] + " !important;\n}\n.post-tripcode,\n.postertrip,\n.trip {\n color: " + theme["Tripcodes"] + " !important;\n}\na .postertrip,\na .name {\n color: " + theme["Emails"] + ";\n}\n.post.reply.qphl,\n.post.op.qphl {\n border-color: " + theme["Backlinked Reply Outline"] + ";\n background: " + theme["Highlighted Reply Background"] + ";\n}\n.inline .post {\n box-shadow: " + (_conf['Quote Shadows'] ? "5px 5px 5px " + theme['Shadow Color'] : "") + ";\n}\n.placeholder,\n#qr input::" + agent + "placeholder,\n#qr textarea::" + agent + "placeholder {\n color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important;\n}\n#qr input:" + agent + "placeholder,\n#qr textarea:" + agent + "placeholder,\n.placeholder {\n color: " + (Style.lightTheme ? "rgba(0,0,0,0.3)" : "rgba(255,255,255,0.2)") + " !important;\n}\n#options ul,\n.boxcontent dd,\n#selectrice {\n border-color: " + (Style.lightTheme ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)") + ";\n}\n#options li,\n#selectrice li:not(:first-of-type) {\n border-top: 1px solid " + (Style.lightTheme ? "rgba(0,0,0,0.05)" : "rgba(255,255,255,0.025)") + ";\n}\n#navtopright .exlinksOptionsLink::after,\n#appchanOptions,\n.navLinks > a:first-of-type::after,\n#watcher::after,\n#globalMessage::after,\n#boardNavDesktopFoot::after,\na[style=\"cursor: pointer; float: right;\"]::after,\n#imgControls label:first-of-type::after,\n#catalog::after,\n#fappeTyme {\n background-image: url('" + icons + "');\n" + (!Style.lightTheme ? "filter: url(\"data:image/svg+xml,#filters\");" : "") + "\n}\n" + theme["Custom CSS"]; + css += (Style.lightTheme ? ".prettyprint {\n background-color: #e7e7e7;\n border: 1px solid #dcdcdc;\n}\n.com {\n color: #dd0000;\n}\n.str,\n.atv {\n color: #7fa61b;\n}\n.pun {\n color: #61663a;\n}\n.tag {\n color: #117743;\n}\n.kwd {\n color: #5a6F9e;\n}\n.typ,\n.atn {\n color: #9474bd;\n}\n.lit {\n color: #368c72;\n}\n" : ".prettyprint {\n background-color: rgba(0,0,0,.1);\n border: 1px solid rgba(0,0,0,0.5);\n}\n.tag {\n color: #96562c;\n}\n.pun {\n color: #5b6f2a;\n}\n.com {\n color: #a34443;\n}\n.str,\n.atv {\n color: #8ba446;\n}\n.kwd {\n color: #987d3e;\n}\n.typ,\n.atn {\n color: #897399;\n}\n.lit {\n color: #558773;\n}\n"); + if (_conf["Alternate Post Colors"]) { + css += ".replyContainer:not(.hidden):nth-of-type(2n+1) .post {\n background-image: " + agent + "linear-gradient(" + (Style.lightTheme ? "rgba(0,0,0,0.05), rgba(0,0,0,0.05)" : "rgba(255,255,255,0.02), rgba(255,255,255,0.02)") + ");\n}\n"; + } + if (_conf["Color Reply Headings"]) { + css += ".postInfo {\n background: " + ((replyHeading = new Style.color(Style.colorToHex(theme["Reply Background"]))) ? "rgba(" + (replyHeading.shiftRGB(-12, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + ";\n border-bottom: 1px solid " + theme["Reply Border"] + "\n}\n"; + } + if (_conf["Color File Info"]) { + css += ".file {\n background: " + ((fileHeading = new Style.color(Style.colorToHex(theme["Reply Background"]))) ? "rgba(" + (fileHeading.shiftRGB(-8, false)) + ",0.8)" : "rgba(0,0,0,0.1)") + ";\n border-bottom: 1px solid " + theme["Reply Border"] + "\n}\n"; + } + if (_conf["OP Background"]) { + css += ".op.post {\n background: " + theme["Reply Background"] + ";\n border: 1px solid " + theme["Reply Border"] + ";\n}\n.op.post:target\n.op.post.highlight {\n background: " + theme["Highlighted Reply Background"] + ";\n border: 1px solid " + theme["Highlighted Reply Border"] + ";\n}\n"; + } + if (_conf["4chan SS Sidebar"]) { + background = new Style.color(Style.colorToHex(theme["Reply Background"])); + css += "body::before {\n z-index: -1;\n background: none repeat scroll 0% 0% rgba(" + (background.shiftRGB(-18)) + ", 0.8);\n border-" + Style.sidebarLocation[1] + ": 2px solid " + backgroundC + ";\n box-shadow:\n " + (_conf["Sidebar Location"] === "right" ? "inset" : "") + " 1px 0 0 " + theme["Thread Wrapper Border"] + ",\n " + (_conf["Sidebar Location"] === "left" ? "inset" : "") + " -1px 0 0 " + theme["Thread Wrapper Border"] + ";\n}\n"; + } + css += { + text: "a.useremail[href*=\"sage\"]:last-of-type::" + _conf["Sage Highlight Position"] + ",\na.useremail[href*=\"Sage\"]:last-of-type::" + _conf["Sage Highlight Position"] + ",\na.useremail[href*=\"SAGE\"]:last-of-type::" + _conf["Sage Highlight Position"] + " {\n content: \" (sage) \";\n color: " + theme["Sage"] + ";\n}\n", + image: "a.useremail[href*=\"sage\"]:last-of-type::" + _conf["Sage Highlight Position"] + ",\na.useremail[href*=\"Sage\"]:last-of-type::" + _conf["Sage Highlight Position"] + ",\na.useremail[href*=\"SAGE\"]:last-of-type::" + _conf["Sage Highlight Position"] + " {\n content: url(\"" + Icons.header.png + "A4AAAAOCAMAAAAolt3jAAABa1BMVEUAAACqrKiCgYIAAAAAAAAAAACHmX5pgl5NUEx/hnx4hXRSUVMiIyKwrbFzn19SbkZ1d3OvtqtpaWhcX1ooMyRsd2aWkZddkEV8vWGcpZl+kHd7jHNdYFuRmI4bHRthaV5WhUFsfGZReUBFZjdJazpGVUBnamYfHB9TeUMzSSpHgS1cY1k1NDUyOC8yWiFywVBoh1lDSEAZHBpucW0ICQgUHhBjfFhCRUA+QTtEQUUBAQFyo1praWspKigWFRZHU0F6j3E9Oz5VWFN0j2hncWONk4sAAABASDxJWkJKTUgAAAAvNC0fJR0DAwMAAAA9QzoWGhQAAAA8YytvrFOJsnlqyT9oqExqtkdrsExpsUsqQx9rpVJDbzBBbi5utk9jiFRuk11iqUR64k5Wf0JIZTpadk5om1BkyjmF1GRNY0FheFdXpjVXhz86XSp2yFJwslR3w1NbxitbtDWW5nNnilhFXTtYqDRwp1dSijiJ7H99AAAAUnRSTlMAJTgNGQml71ypu3cPEN/RDh8HBbOwQN7wVg4CAQZ28vs9EDluXjo58Ge8xwMy0P3+rV8cT73sawEdTv63NAa3rQwo4cUdAl3hWQSWvS8qqYsjEDiCzAAAAIVJREFUeNpFx7GKAQAYAOD/A7GbZVAWZTBZFGQw6LyCF/MIkiTdcOmWSzYbJVE2u1KX0J1v+8QDv/EkyS0yXF/NgeEILiHfyc74mICTQltqYXBeAWU9HGxU09YqqEvAElGjyZYjPyLqitjzHSEiGkrsfMWr0VLe+oy/djGP//YwfbeP8bN3Or0bkqEVblAAAAAASUVORK5CYII=\");\n vertical-align: top;\n margin-" + (_conf["Sage Highlight Position"] === "before" ? "right" : "left") + ": " + (parseInt(_conf['Emoji Spacing'])) + "px;\n}\n", + none: "" + }[_conf["Sage Highlighting"]]; + if (_conf["Announcements"] === "slideout") { + css += "#globalMessage {\n background: " + theme["Dialog Background"] + ";\n border: 1px solid " + theme["Dialog Border"] + ";\n}\n"; + } + if (_conf["Post Form Decorations"]) { + css += "#qr {\n border-color: " + theme["Buttons Border"] + ";\n background: " + backgroundC + ";\n box-shadow: " + (_conf['Quote Shadows'] ? "5px 5px 5px " + theme['Shadow Color'] : "") + ";\n}\n"; + } + return css; + } + }; + + /* + Style.color adapted from 4chan Style Script + */ + + + ThemeTools = { + init: function(key) { + var colorInput, div, fileInput, header, input, item, layout, themecontent, _i, _j, _len, _len1, _ref; + + Conf['editMode'] = "theme"; + if (Themes[key]) { + editTheme = JSON.parse(JSON.stringify(Themes[key])); + if (($.get("userThemes", {}))[key]) { + editTheme["Theme"] = key; + } else { + editTheme["Theme"] = key += " [custom]"; + } + } else { + editTheme = JSON.parse(JSON.stringify(Themes['Yotsuba B'])); + editTheme["Theme"] = "Untitled"; + editTheme["Author"] = "Author"; + editTheme["Author Tripcode"] = "Unknown"; + } + layout = ["Background Image", "Background Attachment", "Background Position", "Background Repeat", "Background Color", "Thread Wrapper Background", "Thread Wrapper Border", "Dialog Background", "Dialog Border", "Reply Background", "Reply Border", "Highlighted Reply Background", "Highlighted Reply Border", "Backlinked Reply Outline", "Input Background", "Input Border", "Hovered Input Background", "Hovered Input Border", "Focused Input Background", "Focused Input Border", "Checkbox Background", "Checkbox Border", "Checkbox Checked Background", "Buttons Background", "Buttons Border", "Navigation Background", "Navigation Border", "Links", "Hovered Links", "Quotelinks", "Backlinks", "Navigation Links", "Hovered Navigation Links", "Names", "Tripcodes", "Emails", "Subjects", "Text", "Inputs", "Post Numbers", "Greentext", "Sage", "Board Title", "Timestamps", "Warnings", "Shadow Color"]; + ThemeTools.dialog = $.el("div", { + id: "themeConf", + className: "reply dialog", + innerHTML: "

" + }); + header = $.el("div", { + innerHTML: " by" + }); + _ref = $$("input", header); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + input = _ref[_i]; + $.on(input, 'blur', function() { + return editTheme[this.name] = this.value; + }); + } + $.add($("#themebar", ThemeTools.dialog), header); + themecontent = $("#themecontent", ThemeTools.dialog); + for (_j = 0, _len1 = layout.length; _j < _len1; _j++) { + item = layout[_j]; + if (!editTheme[item]) { + editTheme[item] = ''; + } + div = $.el("div", { + className: "themevar", + innerHTML: "
" + item + "
" + }); + input = $('input', div); + input.value = editTheme[item]; + switch (item) { + case "Background Image": + input.className = 'field'; + fileInput = $.el('input', { + type: 'file', + accept: "image/*", + title: "BG Image", + hidden: "hidden" + }); + $.on(input, 'click', function(evt) { + if (evt.shiftKey) { + return this.nextSibling.click(); + } + }); + $.on(fileInput, 'change', function(evt) { + return ThemeTools.uploadImage(evt, this); + }); + $.after(input, fileInput); + break; + case "Background Attachment": + case "Background Position": + case "Background Repeat": + input.className = 'field'; + break; + default: + input.className = "colorfield"; + colorInput = $.el('input', { + className: 'color', + value: "#" + (Style.colorToHex(input.value)) + }); + JSColor.bind(colorInput); + $.after(input, colorInput); + } + $.on(input, 'blur', function() { + var depth, i, toggle1, toggle2, _k, _ref1; + + depth = 0; + if (!(this.value.length > 1000)) { + for (i = _k = 0, _ref1 = this.value.length - 1; 0 <= _ref1 ? _k <= _ref1 : _k >= _ref1; i = 0 <= _ref1 ? ++_k : --_k) { + switch (this.value[i]) { + case '(': + depth++; + break; + case ')': + depth--; + break; + case '"': + toggle1 = !toggle1; + break; + case "'": + toggle2 = !toggle2; + } + } + } + if (depth !== 0 || toggle1 || toggle2) { + return alert("Syntax error on " + this.name + "."); + } + if (this.className === "colorfield") { + this.nextSibling.value = "#" + (Style.colorToHex(this.value)); + this.nextSibling.color.importColor(); + } + return editTheme[this.name] = this.value; + }); + Style.addStyle(editTheme); + $.add(themecontent, div); + } + $.add(themecontent, div); + if (!editTheme["Custom CSS"]) { + editTheme["Custom CSS"] = ""; + } + div = $.el("div", { + className: "themevar", + innerHTML: "
Custom CSS
" + }); + $.on($('textarea', div), 'blur', function() { + editTheme["Custom CSS"] = this.value; + return Style.themeCSS.textContent = Style.theme(editTheme); + }); + $.add(themecontent, div); + $.on($('#save > a', ThemeTools.dialog), 'click', function() { + return ThemeTools.save(editTheme); + }); + $.on($('#close > a', ThemeTools.dialog), 'click', ThemeTools.close); + $.add(d.body, ThemeTools.dialog); + return Style.themeCSS.textContent = Style.theme(editTheme); + }, + uploadImage: function(evt, el) { + var file, reader; + + file = evt.target.files[0]; + reader = new FileReader(); + reader.onload = function(evt) { + var val; + + val = 'url("' + evt.target.result + '")'; + el.previousSibling.value = val; + editTheme["Background Image"] = val; + return Style.themeCSS.textContent = Style.theme(editTheme); + }; + return reader.readAsDataURL(file); + }, + importtheme: function(origin, evt) { + var file, reader; + + file = evt.target.files[0]; + reader = new FileReader(); + reader.onload = function(e) { + var bgColor, bgRPA, blinkColor, brderColor, err, imported, inputColor, inputbColor, jlinkColor, linkColor, linkHColor, mainColor, name, nameColor, quoteColor, sageColor, textColor, timeColor, titleColor, tripColor, userThemes; + + try { + imported = JSON.parse(e.target.result); + } catch (_error) { + err = _error; + alert(err); + return; + } + if (!((origin !== 'appchan' && imported.mainColor) || (origin === 'appchan' && imported["Author Tripcode"]))) { + alert("Theme file is invalid."); + return; + } + name = imported.name || imported["Theme"]; + delete imported.name; + if (Themes[name] && !Themes[name]["Deleted"]) { + if (confirm("A theme with this name already exists. Would you like to over-write?")) { + delete Themes[name]; + } else { + return; + } + } + if (origin === "oneechan" || origin === "SS") { + bgColor = new Style.color(imported.bgColor); + mainColor = new Style.color(imported.mainColor); + brderColor = new Style.color(imported.brderColor); + inputColor = new Style.color(imported.inputColor); + inputbColor = new Style.color(imported.inputbColor); + blinkColor = new Style.color(imported.blinkColor); + jlinkColor = new Style.color(imported.jlinkColor); + linkColor = new Style.color(imported.linkColor); + linkHColor = new Style.color(imported.linkHColor); + nameColor = new Style.color(imported.nameColor); + quoteColor = new Style.color(imported.quoteColor); + sageColor = new Style.color(imported.sageColor); + textColor = new Style.color(imported.textColor); + titleColor = new Style.color(imported.titleColor); + tripColor = new Style.color(imported.tripColor); + timeColor = new Style.color(imported.timeColor || imported.textColor); + if (imported.bgRPA) { + bgRPA = imported.bgRPA.split(' '); + } else { + bgRPA = ['no-repeat', 'bottom', 'left', 'fixed']; + } + if (origin === "oneechan") { + Themes[name] = { + 'Author': "Anonymous", + 'Author Tripcode': "!POMF.9waa", + 'Background Image': 'url("' + (imported.bgImg || '') + '")', + 'Background Attachment': bgRPA[3] || '', + 'Background Position': ((bgRPA[1] + " ") || '') + (bgRPA[2] || ''), + 'Background Repeat': bgRPA[0] || '', + 'Background Color': 'rgb(' + bgColor.rgb + ')', + 'Dialog Background': 'rgba(' + mainColor.rgb + ',.98)', + 'Dialog Border': 'rgb(' + brderColor.rgb + ')', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(' + mainColor.rgb + ',' + imported.replyOp + ')', + 'Reply Border': 'rgb(' + brderColor.rgb + ')', + 'Highlighted Reply Background': 'rgba(' + mainColor.shiftRGB(4, true) + ',' + imported.replyOp + ')', + 'Highlighted Reply Border': 'rgb(' + linkColor.rgb + ')', + 'Backlinked Reply Outline': 'rgb(' + linkColor.rgb + ')', + 'Checkbox Background': 'rgba(' + inputColor.rgb + ',' + imported.replyOp + ')', + 'Checkbox Border': 'rgb(' + inputbColor.rgb + ')', + 'Checkbox Checked Background': 'rgb(' + inputColor.rgb + ')', + 'Input Background': 'rgba(' + inputColor.rgb + ',' + imported.replyOp + ')', + 'Input Border': 'rgb(' + inputbColor.rgb + ')', + 'Hovered Input Background': 'rgba(' + inputColor.hover + ',' + imported.replyOp + ')', + 'Hovered Input Border': 'rgb(' + inputbColor.rgb + ')', + 'Focused Input Background': 'rgba(' + inputColor.hover + ',' + imported.replyOp + ')', + 'Focused Input Border': 'rgb(' + inputbColor.rgb + ')', + 'Buttons Background': 'rgba(' + inputColor.rgb + ',' + imported.replyOp + ')', + 'Buttons Border': 'rgb(' + inputbColor.rgb + ')', + 'Navigation Background': 'rgba(' + bgColor.rgb + ',0.8)', + 'Navigation Border': 'rgb(' + mainColor.rgb + ')', + 'Quotelinks': 'rgb(' + linkColor.rgb + ')', + 'Links': 'rgb(' + linkColor.rgb + ')', + 'Hovered Links': 'rgb(' + linkHColor.rgb + ')', + 'Navigation Links': 'rgb(' + textColor.rgb + ')', + 'Hovered Navigation Links': 'rgb(' + linkHColor.rgb + ')', + 'Subjects': 'rgb(' + titleColor.rgb + ')', + 'Names': 'rgb(' + nameColor.rgb + ')', + 'Sage': 'rgb(' + sageColor.rgb + ')', + 'Tripcodes': 'rgb(' + tripColor.rgb + ')', + 'Emails': 'rgb(' + linkColor.rgb + ')', + 'Post Numbers': 'rgb(' + linkColor.rgb + ')', + 'Text': 'rgb(' + textColor.rgb + ')', + 'Backlinks': 'rgb(' + linkColor.rgb + ')', + 'Greentext': 'rgb(' + quoteColor.rgb + ')', + 'Board Title': 'rgb(' + textColor.rgb + ')', + 'Timestamps': 'rgb(' + timeColor.rgb + ')', + 'Inputs': 'rgb(' + textColor.rgb + ')', + 'Warnings': 'rgb(' + sageColor.rgb + ')', + 'Shadow Color': 'rgba(0,0,0,0.1)', + 'Custom CSS': ".rice {\n box-shadow:rgba(" + mainColor.shiftRGB(32) + ",.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + (imported.customCSS || '') + }; + } else if (origin === "SS") { + Themes[name] = { + 'Author': "Anonymous", + 'Author Tripcode': "!.pC/AHOKAg", + 'Background Image': 'url("' + (imported.bgImg || '') + '")', + 'Background Attachment': bgRPA[3] || '', + 'Background Position': ((bgRPA[1] + " ") || '') + (bgRPA[2] || ''), + 'Background Repeat': bgRPA[0] || '', + 'Background Color': 'rgb(' + bgColor.rgb + ')', + 'Dialog Background': 'rgba(' + mainColor.rgb + ',.98)', + 'Dialog Border': 'rgb(' + brderColor.rgb + ')', + 'Thread Wrapper Background': 'rgba(' + mainColor.rgb + ',.5)', + 'Thread Wrapper Border': 'rgba(' + brderColor.rgb + ',.9)', + 'Reply Background': 'rgba(' + mainColor.rgb + ',.9)', + 'Reply Border': 'rgb(' + brderColor.rgb + ')', + 'Highlighted Reply Background': 'rgba(' + mainColor.shiftRGB(4, true) + ',.9)', + 'Highlighted Reply Border': 'rgb(' + linkColor.rgb + ')', + 'Backlinked Reply Outline': 'rgb(' + linkColor.rgb + ')', + 'Checkbox Background': 'rgba(' + inputColor.rgb + ',.9)', + 'Checkbox Border': 'rgb(' + inputbColor.rgb + ')', + 'Checkbox Checked Background': 'rgb(' + inputColor.rgb + ')', + 'Input Background': 'rgba(' + inputColor.rgb + ',.9)', + 'Input Border': 'rgb(' + inputbColor.rgb + ')', + 'Hovered Input Background': 'rgba(' + inputColor.hover + ',.9)', + 'Hovered Input Border': 'rgb(' + inputbColor.rgb + ')', + 'Focused Input Background': 'rgba(' + inputColor.hover + ',.9)', + 'Focused Input Border': 'rgb(' + inputbColor.rgb + ')', + 'Buttons Background': 'rgba(' + inputColor.rgb + ',.9)', + 'Buttons Border': 'rgb(' + inputbColor.rgb + ')', + 'Navigation Background': 'rgba(' + bgColor.rgb + ',0.8)', + 'Navigation Border': 'rgb(' + mainColor.rgb + ')', + 'Quotelinks': 'rgb(' + linkColor.rgb + ')', + 'Links': 'rgb(' + linkColor.rgb + ')', + 'Hovered Links': 'rgb(' + linkHColor.rgb + ')', + 'Navigation Links': 'rgb(' + textColor.rgb + ')', + 'Hovered Navigation Links': 'rgb(' + linkHColor.rgb + ')', + 'Subjects': 'rgb(' + titleColor.rgb + ')', + 'Names': 'rgb(' + nameColor.rgb + ')', + 'Sage': 'rgb(' + sageColor.rgb + ')', + 'Tripcodes': 'rgb(' + tripColor.rgb + ')', + 'Emails': 'rgb(' + linkColor.rgb + ')', + 'Post Numbers': 'rgb(' + linkColor.rgb + ')', + 'Text': 'rgb(' + textColor.rgb + ')', + 'Backlinks': 'rgb(' + linkColor.rgb + ')', + 'Greentext': 'rgb(' + quoteColor.rgb + ')', + 'Board Title': 'rgb(' + textColor.rgb + ')', + 'Timestamps': 'rgb(' + timeColor.rgb + ')', + 'Inputs': 'rgb(' + textColor.rgb + ')', + 'Warnings': 'rgb(' + sageColor.rgb + ')', + 'Shadow Color': 'rgba(0,0,0,0.1)', + 'Custom CSS': ".board {\n padding: 1px 2px;\n}\n.rice {\n box-shadow:rgba(" + mainColor.shiftRGB(32) + ",.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + (imported.customCSS || '') + }; + } + } else if (origin === 'appchan') { + Themes[name] = imported; + } + userThemes = $.get("userThemes", {}); + userThemes[name] = Themes[name]; + $.set('userThemes', userThemes); + alert("Theme \"" + name + "\" imported!"); + $.rm($("#themes", d.body)); + return Options.themeTab(); + }; + return reader.readAsText(file); + }, + save: function(theme) { + var name, userThemes; + + name = theme["Theme"]; + if (Themes[name] && !Themes[name]["Deleted"]) { + if (confirm("A theme with this name already exists. Would you like to over-write?")) { + delete Themes[name]; + } else { + return; + } + } + Themes[name] = JSON.parse(JSON.stringify(theme)); + delete Themes[name]["Theme"]; + userThemes = $.get("userThemes", {}); + userThemes[name] = Themes[name]; + $.set('userThemes', userThemes); + $.set("theme", Conf['theme'] = name); + return alert("Theme \"" + name + "\" saved."); + }, + close: function() { + Conf['editMode'] = false; + $.rm($("#themeConf", d.body)); + Style.addStyle(); + return Options.dialog("theme"); + } + }; + + Themes = { + 'AppChan': { + 'Author': 'Zixaphir', + 'Author Tripcode': '!..NoTrip..', + 'Background Color': 'rgba(44,44,44,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Dialog Background': 'rgba(44,44,44,1)', + 'Dialog Border': 'rgba(44,44,44,1)', + 'Reply Background': 'rgba(51,51,51,1)', + 'Reply Border': 'rgba(51,51,51,1)', + 'Highlighted Reply Background': 'rgba(57,57,57,1)', + 'Highlighted Reply Border': 'rgba(57,57,57,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Input Background': 'rgba(51,51,51,1)', + 'Input Border': 'rgba(51,51,51,1)', + 'Checkbox Background': 'rgba(68,68,68,1)', + 'Checkbox Border': 'rgba(68,68,68,1)', + 'Checkbox Checked Background': 'rgba(17,17,17,1)', + 'Buttons Background': 'rgba(48,48,48,1)', + 'Buttons Border': 'rgba(48,48,48,1)', + 'Focused Input Background': 'rgba(63,63,63,1)', + 'Focused Input Border': 'rgba(63,63,63,1)', + 'Hovered Input Background': 'rgba(57,57,57,1)', + 'Hovered Input Border': 'rgba(57,57,57,1)', + 'Navigation Background': 'rgba(44,44,44,0.9)', + 'Navigation Border': 'rgba(44,44,44,0.9)', + 'Quotelinks': 'rgb(79,95,143)', + 'Backlinks': 'rgb(79,95,143)', + 'Links': 'rgb(102,136,170)', + 'Hovered Links': 'rgb(78,110,142)', + 'Navigation Links': 'rgb(170,170,170)', + 'Hovered Navigation Links': 'rgb(78,110,142)', + 'Names': 'rgb(170,170,170)', + 'Tripcodes': 'rgb(170,170,170)', + 'Emails': 'rgb(102,136,170)', + 'Subjects': 'rgb(144,144,144)', + 'Text': 'rgb(170,170,170)', + 'Inputs': 'rgb(170,170,170)', + 'Post Numbers': 'rgb(102,136,170)', + 'Greentext': 'rgb(120,153,34)', + 'Sage': 'rgb(150,150,150)', + 'Board Title': 'rgb(170,170,170)', + 'Timestamps': 'rgb(170,170,170)', + 'Warnings': 'rgb(102,136,170)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': '' + }, + 'BakaBT': { + 'Author': 'seaweed', + 'Author Tripcode': '!POMF.9waa', + 'Background Image': 'url("http://i.imgur.com/rTkxi.jpg")', + 'Background Attachment': 'fixed', + 'Background Position': '20px 20px', + 'Background Repeat': 'repeat', + 'Background Color': 'rgba(238,238,238,1)', + 'Thread Wrapper Background': 'rgba(255,255,255,1)', + 'Thread Wrapper Border': 'rgba(204,204,204,1)', + 'Dialog Background': 'rgba(238,221,255,1)', + 'Dialog Border': 'rgba(238,221,255,1)', + 'Reply Background': 'rgba(238,221,255,1)', + 'Reply Border': 'rgba(209,162,255,1)', + 'Highlighted Reply Background': 'rgba(238,221,255,1)', + 'Highlighted Reply Border': 'rgba(209,162,255,1)', + 'Backlinked Reply Outline': 'rgba(204,101,99,1)', + 'Input Background': 'rgba(255,255,255,1)', + 'Input Border': 'rgba(204,204,204,1)', + 'Checkbox Background': 'rgba(255,255,238,1)', + 'Checkbox Border': 'rgba(204,204,204,1)', + 'Checkbox Checked Background': 'rgba(188,192,212,1)', + 'Buttons Background': 'rgba(255,255,255,1)', + 'Buttons Border': 'rgba(204,204,204,1)', + 'Focused Input Background': 'rgba(255,255,255,1)', + 'Focused Input Border': 'rgba(209,162,255,1)', + 'Hovered Input Background': 'rgba(238,221,255,1)', + 'Hovered Input Border': 'rgba(204,204,204,1)', + 'Navigation Background': 'rgba(255,255,255,0.8)', + 'Navigation Border': 'rgba(255,255,255,0.8)', + 'Quotelinks': 'rgb(146,92,141)', + 'Backlinks': 'rgb(146,92,141)', + 'Links': 'rgb(133,76,158)', + 'Hovered Links': 'rgb(198,23,230)', + 'Navigation Links': 'rgb(17,17,17)', + 'Hovered Navigation Links': 'rgb(198,23,230)', + 'Names': 'rgb(133,76,158)', + 'Tripcodes': 'rgb(146,92,141)', + 'Emails': 'rgb(133,76,158)', + 'Subjects': 'rgb(17,17,17)', + 'Text': 'rgb(0,0,0)', + 'Inputs': 'rgb(0,0,0)', + 'Post Numbers': 'rgb(146,92,141)', + 'Greentext': 'rgb(129,153,65)', + 'Sage': 'rgb(146,92,141)', + 'Board Title': 'rgb(133,76,158)', + 'Timestamps': 'rgb(0,0,0)', + 'Warnings': 'rgb(133,76,158)', + 'Shadow Color': 'rgba(0,0,0,.05)', + 'Custom CSS': ".board {\n box-shadow: 0px 10px 10px 2px rgba(128,128,128,0.5);\n border-radius: 3px;\n}\n.thread {\n padding:10px;\n}\n#options.reply.dialog,\n#options .dialog {\n background-color:#FFF;\n color:#000;\n border:2px solid #CCC;\n}\n#options ul {\n border-bottom:1px solid #DBD8D2;\n}\n#options ul:last-of-type{\n border:none;\n}\n#qp div.post{\n background-color:rgba(255,255,255,0.9);\n border:1px solid #D1A2FF;\n color:#000;\n}" + }, + 'Blackberry Jam': { + 'Author': 'seaweed', + 'Author Tripcode': '!POMF.9waa', + 'Dialog Background': 'rgba(27,27,27,1)', + 'Dialog Border': 'rgba(27,27,27,1)', + 'Background Color': 'rgba(45,45,45,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(27,27,27,1)', + 'Reply Border': 'rgba(38,38,38,1)', + 'Highlighted Reply Background': 'rgba(17,17,17,1)', + 'Highlighted Reply Border': 'rgba(17,17,17,1)', + 'Backlinked Reply Outline': 'rgba(103,204,232,1)', + 'Checkbox Background': 'rgba(51,51,51,1)', + 'Checkbox Border': 'rgba(51,51,51,1)', + 'Input Background': 'rgba(27,27,27,1)', + 'Input Border': 'rgba(27,27,27,1)', + 'Focused Input Background': 'rgba(27,27,27,1)', + 'Focused Input Border': 'rgba(27,27,27,1)', + 'Hovered Input Background': 'rgba(17,17,17,1)', + 'Hovered Input Border': 'rgba(17,17,17,1)', + 'Checkbox Checked Background': 'rgba(17,17,17,1)', + 'Buttons Background': 'rgba(27,27,27,1)', + 'Buttons Border': 'rgba(27,27,27,1)', + 'Navigation Background': 'rgba(45,45,45,0.9)', + 'Navigation Border': 'rgba(45,45,45,0.9)', + 'Links': 'rgb(218,105,224)', + 'Hovered Links': 'rgb(255,0,255)', + 'Navigation Links': 'rgb(241,241,241)', + 'Hovered Navigation Links': 'rgb(255,0,255)', + 'Subjects': 'rgb(241,241,241)', + 'Names': 'rgb(103,204,232)', + 'Sage': 'rgb(103,204,232)', + 'Tripcodes': 'rgb(103,204,232)', + 'Emails': 'rgb(218,105,224)', + 'Post Numbers': 'rgb(218,105,224)', + 'Text': 'rgb(241,241,241)', + 'Quotelinks': 'rgb(223,153,247)', + 'Backlinks': 'rgb(223,153,247)', + 'Greentext': 'rgb(108,204,102)', + 'Board Title': 'rgb(103,204,232)', + 'Timestamps': 'rgb(218,105,224)', + 'Inputs': 'rgb(218,105,224)', + 'Warnings': 'rgb(103,204,232)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': ".reply.post {\n box-shadow: inset 0px 1px 2px 1px #111;\n}\n#qr {\n box-shadow: none;\n}\n#qr textarea,\n#qr input[name=\"name\"],\n#qr input[name=\"email\"],\n#qr input[name=\"sub\"],\n#qr input[title=\"Verification\"] {\n box-shadow: inset 0px 1px 2px 0px #111;\n}\n#qp .post {\n background-color: rgba(29,29,33,1);\n border: 1px solid rgba(95,137,172,0.4);\n}" + }, + 'Midnight Caek': { + 'Author': 'Zixaphir', + 'Author Tripcode': '!M.........', + 'Background Color': 'rgba(16,16,16,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Dialog Background': 'rgba(28,28,28,1)', + 'Dialog Border': 'rgba(28,28,28,1)', + 'Reply Background': 'rgba(28,28,28,1)', + 'Reply Border': 'rgba(28,28,28,1)', + 'Highlighted Reply Background': 'rgba(24,24,24,1)', + 'Highlighted Reply Border': 'rgba(24,24,24,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Input Background': 'rgba(28,28,28,1)', + 'Input Border': 'rgba(28,28,28,1)', + 'Hovered Input Background': 'rgba(24,24,24,1)', + 'Hovered Input Border': 'rgba(24,24,24,1)', + 'Focused Input Background': 'rgba(16,16,16,1)', + 'Focused Input Border': 'rgba(28,28,28,1)', + 'Checkbox Background': 'rgba(0,0,0,1)', + 'Checkbox Border': 'rgba(60,60,60,1)', + 'Checkbox Checked Background': 'rgba(60,60,60,1)', + 'Buttons Background': 'rgba(24,24,24,1)', + 'Buttons Border': 'rgba(24,24,24,1)', + 'Navigation Background': 'rgba(16,16,16,0.9)', + 'Navigation Border': 'rgba(16,16,16,0.9)', + 'Quotelinks': 'rgb(71,71,91)', + 'Backlinks': 'rgb(66,66,71)', + 'Links': 'rgb(87,87,123)', + 'Hovered Links': 'rgb(71,71,91)', + 'Navigation Links': 'rgb(144,144,144)', + 'Hovered Navigation Links': 'rgb(71,71,91)', + 'Names': 'rgb(124,45,45)', + 'Tripcodes': 'rgb(62,113,87)', + 'Emails': 'rgb(68,68,68)', + 'Subjects': 'rgb(170,170,170)', + 'Text': 'rgb(144,144,144)', + 'Inputs': 'rgb(144,144,144)', + 'Post Numbers': 'rgb(144,144,144)', + 'Greentext': 'rgb(113,121,62)', + 'Sage': 'rgb(68,68,68)', + 'Board Title': 'rgb(144,144,144)', + 'Timestamps': 'rgb(144,144,144)', + 'Warnings': 'rgb(87,87,123)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': '' + }, + 'Minimalistic Mayhem': { + 'Author': 'Mayhem', + 'Author Tripcode': '!MayhemYDG.', + 'Background Image': 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAACdJREFUCNdNxzEBADAMwzCnOMwfWYDs2JNPCgCoH9m0zQa4jXob4AGJFwxchPNwQAAAAABJRU5ErkJggg==")', + 'Background Color': 'rgba(25,25,25,1)', + 'Dialog Background': 'rgba(34,34,34,1)', + 'Dialog Border': 'rgba(41,41,41,1)', + 'Thread Wrapper Background': 'rgba(34,34,34,1)', + 'Thread Wrapper Border': 'rgba(0,0,0,1)', + 'Reply Background': 'rgba(51,51,51,1)', + 'Reply Border': 'rgba(17,17,17,1)', + 'Highlighted Reply Background': 'rgba(37,38,42,1)', + 'Highlighted Reply Border': 'rgba(85,85,85,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(57,57,57,1)', + 'Checkbox Border': 'rgba(25,25,25,1)', + 'Input Background': 'rgba(34,34,34,1)', + 'Input Border': 'rgba(21,21,21,1)', + 'Focused Input Background': 'rgba(32,32,32,1)', + 'Focused Input Border': 'rgba(102,102,102,1)', + 'Hovered Input Background': 'rgba(24,24,24,1)', + 'Hovered Input Border': 'rgba(21,21,21,1)', + 'Checkbox Checked Background': 'rgba(57,57,57,1)', + 'Buttons Background': 'rgba(32,32,32,1)', + 'Buttons Border': 'rgba(16,16,16,1)', + 'Navigation Background': 'rgba(26,26,26,0.9)', + 'Navigation Border': 'rgba(26,26,26,0.9)', + 'Links': 'rgb(85,156,122)', + 'Hovered Links': 'rgb(199,222,26)', + 'Navigation Links': 'rgb(144,144,144)', + 'Hovered Navigation Links': 'rgb(198,23,230)', + 'Subjects': 'rgb(72,98,115)', + 'Names': 'rgb(46,136,166)', + 'Sage': 'rgb(124,45,45)', + 'Tripcodes': 'rgb(140,93,42)', + 'Emails': 'rgb(174,43,41)', + 'Post Numbers': 'rgb(137,115,153)', + 'Text': 'rgb(221,221,221)', + 'Quotelinks': 'rgb(139,164,70)', + 'Backlinks': 'rgb(139,164,70)', + 'Greentext': 'rgb(139,164,70)', + 'Board Title': 'rgb(187,187,187)', + 'Timestamps': 'rgb(221,221,221)', + 'Inputs': 'rgb(187,187,187)', + 'Warnings': 'rgb(87,87,123)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': ".nameBlock > .useremail > postertrip {\n color: rgb(137,115,153);\n}\na.backlink:hover {\n color: rgb(198,23,230);\n}\n.reply:target,\n.reply.highlight:target {\n background:rgb(37,38,42);\n}\n[alt=\"sticky\"] + a {\n color: rgb(242,141,0);\n}\n[alt=\"closed\"] + a {\n color: rgb(178,171,130);\n}\ninput:checked .rice {\n border-color:rgb(21,21,21);\n}\ninput[type=\"submit\"],\ninput[type=\"button\"],\nbutton {\n background: linear-gradient(#393939, #292929);\n border: 1px solid #191919;\n color: #AAA;\n text-shadow: 0 1px 1px #191919;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\nbackground-color: #393939;\n border: 1px solid #191919;\n}\ninput[type=\"checkbox\"]:checked,\ninput[type=\"radio\"]:checked {\n background: linear-gradient(#595959, #393939);\n border: 1px solid #151515;\n}\n.thread {\n padding: 7px;\n}\n.subject:hover,\ndiv.post:hover .subject {\n color: #3F8DBF !important;\n}\n.postertrip:hover,\ndiv.post:hover .postertrip {\n color:#CC7212 !important;\n}\n.name:hover,\ndiv.post:hover .name {\n color: #0AAEE7 !important;\n}\n.name,\n.subject,\n.postertrip {\n -webkit-transition:color .3s ease-in-out;\n -moz-transition:color .3s ease-in-out;\n -o-transition:color .3s ease-in-out;\n}" + }, + 'ObsidianChan': { + 'Author': 'seaweed', + 'Author Tripcode': '!POMF.9waa', + 'Background Image': 'url("http://i.imgur.com/sbi8u.png")', + 'Background Attachment': 'fixed', + 'Dialog Background': 'rgba(0,0,0,0.7)', + 'Dialog Border': 'rgba(0,0,0,0.7)', + 'Background Color': 'rgba(0,0,0,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0.3)', + 'Thread Wrapper Border': 'rgba(51,51,51,1)', + 'Reply Background': 'rgba(0,0,0,0.6)', + 'Reply Border': 'rgba(0,0,0,0.6)', + 'Highlighted Reply Background': 'rgba(0,0,0,0.4)', + 'Highlighted Reply Border': 'rgba(0,0,0,0.4)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(68,68,68,1)', + 'Checkbox Border': 'rgba(68,68,68,1)', + 'Input Background': 'rgba(0,0,0,0.6)', + 'Input Border': 'rgba(0,0,0,0.6)', + 'Hovered Input Background': 'rgba(0,0,0,0.4)', + 'Hovered Input Border': 'rgba(0,0,0,0.4)', + 'Focused Input Background': 'rgba(0,0,0,0.4)', + 'Focused Input Border': 'rgba(0,0,0,0.4)', + 'Checkbox Checked Background': 'rgba(255,0,127,1)', + 'Buttons Background': 'rgba(0,0,0,0.4)', + 'Buttons Border': 'rgba(0,0,0,0.4)', + 'Navigation Background': 'rgba(0,0,0,0.7)', + 'Navigation Border': 'rgba(0,0,0,0.7)', + 'Links': 'rgb(0,255,255)', + 'Hovered Links': 'rgb(0,255,255)', + 'Navigation Links': 'rgb(253,254,255)', + 'Hovered Navigation Links': 'rgb(253,254,255)', + 'Subjects': 'rgb(144,144,144)', + 'Names': 'rgb(253,254,255)', + 'Sage': 'rgb(253,254,255)', + 'Tripcodes': 'rgb(255,82,203)', + 'Emails': 'rgb(0,255,255)', + 'Post Numbers': 'rgb(0,255,255)', + 'Text': 'rgb(253,254,255)', + 'Quotelinks': 'rgb(0,255,255)', + 'Backlinks': 'rgb(0,255,255)', + 'Greentext': 'rgb(67,204,103)', + 'Board Title': 'rgb(253,254,255)', + 'Timestamps': 'rgb(253,254,255)', + 'Inputs': 'rgb(253,254,255)', + 'Warnings': 'rgb(0,255,255)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': "#qp div.post{\n background-color:rgba(0,0,0,0.8);\n border: 1px solid #333;\n}\n#qr {\n background-color: rgba(0,0,0,0.7);\n border: 1px solid #333;\n}" + }, + 'PaisleyChan': { + 'Author': 'Ubuntufriend', + 'Author Tripcode': '!TRip.C0d3', + 'Background Image': 'url(http://i.imgur.com/DRaZf.jpg)', + 'Background Attachment': 'fixed', + 'Background Repeat': 'repeat', + 'Background Color': 'rgba(19,19,19,1)', + 'Dialog Background': 'rgba(16,16,16,1)', + 'Dialog Border': 'rgba(16,16,16,1)', + 'Thread Wrapper Background': 'rgba(52,56,56,0.3)', + 'Thread Wrapper Border': 'rgba(52,56,56,0.3)', + 'Reply Background': 'rgba(52,56,56,1)', + 'Reply Border': 'rgba(0,0,0,0)', + 'Highlighted Reply Background': 'rgba(0,0,0,0)', + 'Highlighted Reply Border': 'rgba(0,0,0,0)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(34,34,34,1)', + 'Checkbox Border': 'rgba(60,60,60,1)', + 'Input Background': 'rgba(28,28,28,1)', + 'Input Border': 'rgba(28,28,28,1)', + 'Hovered Input Background': 'rgba(24,24,24,1)', + 'Hovered Input Border': 'rgba(24,24,24,1)', + 'Focused Input Background': 'rgba(32,32,32,1)', + 'Focused Input Border': 'rgba(32,32,32,1)', + 'Checkbox Checked Background': 'rgba(34,34,34,1)', + 'Buttons Background': 'rgba(32,32,32,1)', + 'Buttons Border': 'rgba(32,32,32,1)', + 'Navigation Background': 'rgba(16,16,16,0.9)', + 'Navigation Border': 'rgba(16,16,16,0.9)', + 'Links': 'rgb(187,187,187)', + 'Hovered Links': 'rgb(0,223,252)', + 'Navigation Links': 'rgb(153,153,153)', + 'Hovered Navigation Links': 'rgb(0,223,252)', + 'Subjects': 'rgb(170,170,170)', + 'Names': 'rgb(128,172,206)', + 'Sage': 'rgb(153,153,153)', + 'Tripcodes': 'rgb(128,172,206)', + 'Emails': 'rgb(187,187,187)', + 'Post Numbers': 'rgb(153,153,153)', + 'Text': 'rgb(153,153,153)', + 'Quotelinks': 'rgb(212,212,212)', + 'Backlinks': 'rgb(212,212,212)', + 'Greentext': 'rgb(152,185,98)', + 'Board Title': 'rgb(153,153,153)', + 'Timestamps': 'rgb(153,153,153)', + 'Inputs': 'rgb(153,153,153)', + 'Warnings': 'rgb(187,187,187)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': "#options {\n background-color: rgba(16,16,16,1) !important;\n}\n#delform blockquote {\n border-radius:3px;\n color:#bbb;\n background:#343838;\n padding:8px;\n box-shadow:0px 0px 20px rgba(25,25,25,0.6);\n border:1px solid #343838;\n border-bottom:2px solid #444848;\n border-radius:0px 6px 6px 6px;\n padding-top:15px;\n}\n.name {\n font-weight:800;\n}\n.nameBlock > .useremail > .name:hover,\n.nameBlock> .useremail> .postertrip:hover {\n color:#00dffc;\n}\na.forwardlink {\n color:#608cae;\n font-weight:800;\n}\ndiv.reply,\n.reply.highlight {\n padding:0;\n}\n#qp div.post {\n border:1px solid rgba(128,172,206,0.5) !important;\n background-color: rgba(24,24,24,0.9) !important;\n}\n.name,\n.postertrip {\n text-shadow:0px 0px 6px rgba(20,20,20,0.9);\n font-weight:bold;\n background:#343838;\n border:1px solid #343838;\n border-radius:5px 5px 0px 0px;\n padding:4px 6px;\n padding-top:2px;\n}\n.board,\n.board blockquote {\n margin:0 10px 15px 0 !important;\n padding:0px;\n}\na {\n -moz-transition:all 0.5s ease;\n -webkit-transition:all 0.5s ease;\n -o-transition:all 0.5s ease;\n}\na.pointer{\n font-weight:bold;\n font-weight:normal;\n color:#777;\n padding-right:5px;\n}\n.thread .opContainer,\n.thread .replyContainer {\n opacity:0.45;\n transition:all 0.5s ease;\n}\n.thread .opContainer:hover,\n.thread .replyContainer:hover {\n opacity:1;\n}\n.reply.post,\n.reply.highlight {\n background:transparent;\n border:0px;\n padding:0px;\n padding-bottom:0px;\n border-radius:6px;\n}\n#delform blockquote {\n padding:5px;\n background:#343838;\n margin-top:0px;\n min-height:20px;\n padding-top:10px;\n clear:none;\n}\n #delform .file + blockquote{\n margin-top:-16px !important;\n padding-left:150px !important;\n}\n.file{\n margin-top: 2px;\n}\na.backlink{\nborder:1px solid #343838;\nborder-radius:5px 5px 0px 0px;\nbackground:#343838;\npadding:2px 4px 2px;\n text-decoration:none;\n}\na.forwardlink{\n color:#608CAE;\n text-shadow:0 0 6px rgba(96,140,174,0.8);\n}\n.subject{\n font-weight: bold;\n letter-spacing: 3px;\n background: transparent;\n}\n.reply.post {\n background-color: rgba(0,0,0,0) !important;\n border: none !important;\n}\n#qp div.post .name,\n#qp div.post a.backlink,\n#qp div.post blockquote {\n background:none !important;\n border:none !important;\n box-shadow:none !important;\n border-radius:0px !important;\n}" + }, + 'Photon': { + 'Author': 'seaweed', + 'Author Tripcode': '!POMF.9waa', + 'Background Color': 'rgba(238,238,238,1)', + 'Dialog Background': 'rgba(238,238,238,1)', + 'Dialog Border': 'rgba(204,204,204,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(221,221,221,1)', + 'Reply Border': 'rgba(204,204,204,1)', + 'Highlighted Reply Background': 'rgba(204,204,204,1)', + 'Highlighted Reply Border': 'rgba(204,204,204,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(255,255,238)', + 'Checkbox Border': 'rgba(255,255,238)', + 'Checkbox Checked Background': 'rgba(188,192,212)', + 'Input Background': 'rgba(255,255,255,1)', + 'Input Border': 'rgba(204,204,204,1)', + 'Hovered Input Background': 'rgba(204,204,204,1)', + 'Hovered Input Border': 'rgba(204,204,204,1)', + 'Focused Input Background': 'rgba(255,255,255,1)', + 'Focused Input Border': 'rgba(0,74,153,1)', + 'Buttons Background': 'rgba(255,255,238,1)', + 'Buttons Border': 'rgba(204,204,204,1)', + 'Navigation Background': 'rgba(238,238,238,0.9)', + 'Navigation Border': 'rgba(238,238,238,0.9)', + 'Links': 'rgb(255,102,0)', + 'Hovered Links': 'rgb(255,51,0)', + 'Navigation Links': 'rgb(17,17,17)', + 'Hovered Navigation Links': 'rgb(255,51,0)', + 'Subjects': 'rgb(17,17,17)', + 'Names': 'rgb(0,74,153)', + 'Sage': 'rgb(51,51,51)', + 'Tripcodes': 'rgb(255,51,0)', + 'Emails': 'rgb(255,102,0)', + 'Post Numbers': 'rgb(51,51,51)', + 'Text': 'rgb(51,51,51)', + 'Quotelinks': 'rgb(17,17,17)', + 'Backlinks': 'rgb(17,17,17)', + 'Greentext': 'rgb(120,153,34)', + 'Board Title': 'rgb(0,74,153)', + 'Timestamps': 'rgb(51,51,51)', + 'Inputs': 'rgb(0,0,0)', + 'Warnings': 'rgb(51,51,51)', + 'Shadow Color': 'rgba(0,0,0,.05)', + 'Custom CSS': ".fileText{\n color: rgb(102,102,102);\n}\n.boardTitle {\n color: #004a99 !important;\n text-shadow: 1px 1px 1px #222 !important;\n}\n.boardSubtitle,\n.boardBanner .boardSubtitle > a {\n text-shadow: none !important;\n}" + }, + 'RedUX': { + 'Author': 'Zixaphir', + 'Author Tripcode': '!VGsTHECURE', + 'Background Image': 'linear-gradient(rgba(210,210,210,0.7), rgba(240,240,240,0.4) 400px, rgba(240,240,240,0.3)), url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAACEAQMAAABrihHkAAAABlBMVEX///8AAABVwtN+AAAAAnRSTlMASuCaZbYAAAA+SURBVHhe7c2xCQAgDAXRKywsHcFRdDNxchtBkhHk4Lp88ui7hhaztBCkyYZ7fFHzI/Jk/GRpaWlpaWlpaR3scHNQSY3kigAAAABJRU5ErkJggg==")', + 'Background Attachment': 'fixed, scroll', + 'Background Position': 'top, center', + 'Background Repeat': 'no-repeat, repeat', + 'Background Color': 'rgba(238,242,255,1)', + 'Thread Wrapper Background': 'rgb(230,230,230)', + 'Thread Wrapper Border': 'rgba(204,204,204,1)', + 'Dialog Background': 'linear-gradient(rgb(222,222,222), rgb(240,240,240) 200px, rgb(240,240,240))', + 'Dialog Border': 'rgb(220,210,210)', + 'Reply Background': 'rgba(230,230,230,1)', + 'Reply Border': 'rgba(204,204,204,1)', + 'Highlighted Reply Background': 'rgba(219,219,219,1)', + 'Highlighted Reply Border': 'rgba(219,219,219,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Input Background': 'linear-gradient(rgb(222,222,222), rgb(240,240,240)), rgb(240,240,240)', + 'Input Border': 'rgb(220,210,210)', + 'Hovered Input Background': 'linear-gradient(rgba(214,186,208,0.7), rgb(240,240,240)), rgb(240,240,240)', + 'Hovered Input Border': 'rgba(214,186,208,1)', + 'Focused Input Background': 'rgb(240,240,240)', + 'Focused Input Border': 'rgb(220,210,210)', + 'Checkbox Background': 'rgba(238,242,255,1)', + 'Checkbox Checked Background': 'rgba(255,255,255,1)', + 'Checkbox Border': 'rgba(180,180,180,1)', + 'Buttons Background': 'linear-gradient(rgb(222,222,222), rgb(240,240,240)), rgb(240,240,240)', + 'Buttons Border': 'rgb(220,210,210)', + 'Navigation Background': 'rgba(230,230,230,0.8)', + 'Navigation Border': 'rgba(204,204,204,1)', + 'Quotelinks': 'rgb(153,51,51)', + 'Backlinks': 'rgb(153,51,51)', + 'Links': 'rgb(87,87,123)', + 'Hovered Links': 'rgb(221,0,0)', + 'Navigation Links': 'rgb(0,0,0)', + 'Hovered Navigation Links': 'rgb(87,87,123)', + 'Names': 'rgb(119,51,51)', + 'Tripcodes': 'rgb(119,51,51)', + 'Emails': 'rgb(87,87,123)', + 'Subjects': 'rgb(15,12,93)', + 'Text': 'rgb(0,0,0)', + 'Inputs': 'rgb(0,0,0)', + 'Post Numbers': 'rgb(0,0,0)', + 'Greentext': 'rgb(34,133,34)', + 'Sage': 'rgb(87,87,123)', + 'Board Title': 'rgb(119,51,51)', + 'Timestamps': 'rgb(0,0,0)', + 'Warnings': 'rgb(87,87,123)', + 'Shadow Color': 'rgba(0,0,0,.07)', + 'Custom CSS': ".thread .reply {\n background-color: transparent;\n border-color: #ccc transparent transparent transparent;\n border-style: solid;\n border-radius: 0 !important;\n margin-bottom: 0;\n}\n.thread .op {\n padding: 0 3px;\n}\n#themes {\n text-shadow: none;\n}\n#qp {\n text-shadow: 1px 0 0 rgb(0,0,0),\n 1px 1px 0 rgb(0,0,0),\n 0 1px 0 rgb(0,0,0),\n 1px 1px 2px rgb(0,0,0);\n}\n#qp .op.post,\n#qp .reply.post {\n border: 1px rgba(0,0,0,0.7) solid;\n background: linear-gradient(to right, rgba(0,0,0,0.7), rgba(0,0,0,0.5)), transparent;\n}\n#qp div.post,\n#qp .pln,\n#qp .postNum a {\n color: #fcd;\n}\n#qp .dateTime {\n color: #fcd !important;\n}\n#qp .subject,\n#qp .nameBlock > .useremail > .name,\n#qp .nameBlock > .useremail > .postertrip,\n#qp .name,\n#qp .postertrip,\n#qp .trip {\n color: #ffaac0 !important;\n}\n#qp a {\n color: #aaaac8;\n}\n.boardBanner a,\n#qp a.backlink,\n#qp span.quote > a.quotelink {\n color: rgb(255,255,255);\n}\n#qp span.quote {\n color: rgb(130,163,100);\n}\n.board {\n box-shadow: 0 20px 40px 10px rgba(0,0,0,0.1);\n border-radius: 4px;\n}\n:not(#themes) .rice {\n box-shadow:rgba(170, 170, 170,0.3) 0 1px;\n}\n#qp .prettyprint {\n background-color: rgba(0,0,0,0.3);\n border: 1px solid rgba(0,0,0,0.5);\n}\n#qp span.tag {\n color: #96562c;\n}\n#qp span.pun {\n color: #5b6f2a;\n}\n#qp span.com {\n color: #a34443;\n}\n#qp span.str,\n#qp span.atv {\n color: #8ba446;\n}\n#qp span.kwd {\n color: #987d3e;\n}\n#qp span.typ,\n#qp span.atn {\n color: #897399;\n}\n#qp span.lit {\n color: #558773;\n}" + }, + 'Solarized': { + 'Author': 'ubuntufriend', + 'Author Tripcode': '!TRip.C0d', + 'Background Color': 'rgba(7,54,66,1)', + 'Dialog Background': 'rgba(0,43,54,1)', + 'Dialog Border': 'rgba(0,43,54,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(0,43,54,1)', + 'Reply Border': 'rgba(0,43,54,1)', + 'Highlighted Reply Background': 'rgba(7,54,66,1)', + 'Highlighted Reply Border': 'rgba(7,54,66,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(88,110,117,1)', + 'Checkbox Border': 'rgba(88,110,117,1)', + 'Checkbox Checked Background': 'rgba(17,17,17,1)', + 'Input Background': 'rgba(0,43,54,1)', + 'Input Border': 'rgba(0,43,54,1)', + 'Hovered Input Background': 'rgba(7,54,66,1)', + 'Hovered Input Border': 'rgba(7,54,66,1)', + 'Focused Input Background': 'rgba(7,54,66,1)', + 'Focused Input Border': 'rgba(7,54,66,1)', + 'Buttons Background': 'rgba(0,43,54,1)', + 'Buttons Border': 'rgba(0,43,54,1)', + 'Navigation Background': 'rgba(7,54,66,1)', + 'Navigation Border': 'rgba(7,54,66,1)', + 'Links': 'rgb(108,113,196)', + 'Hovered Links': 'rgb(211,54,130)', + 'Navigation Links': 'rgb(147,161,161)', + 'Hovered Navigation Links': 'rgb(211,54,130)', + 'Subjects': 'rgb(203,75,22)', + 'Names': 'rgb(88,110,117)', + 'Sage': 'rgb(108,113,196)', + 'Tripcodes': 'rgb(42,161,152)', + 'Emails': 'rgb(108,113,196)', + 'Post Numbers': 'rgb(147,161,161)', + 'Text': 'rgb(147,161,161)', + 'Quotelinks': 'rgb(79,95,143)', + 'Backlinks': 'rgb(79,95,143)', + 'Greentext': 'rgb(133,153,0)', + 'Board Title': 'rgb(147,161,161)', + 'Timestamps': 'rgb(147,161,161)', + 'Inputs': 'rgb(147,161,161)', + 'Warnings': 'rgb(108,113,196)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': "#qp div.post {\n background-color:rgba(7,54,66,0.9);\n border:1px solid rgba(79,95,143,0.9);\n}" + }, + 'Yotsuba': { + 'Author': 'moot', + 'Author Tripcode': '!Ep8pui8Vw2', + 'Background Image': 'linear-gradient(rgb(254,214,175), rgb(255,255,238) 200px, rgb(255,255,238))', + 'Background Color': 'rgba(255,255,238,1)', + 'Dialog Background': 'rgba(240,224,214,1)', + 'Dialog Border': 'rgba(217,191,183,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(240,224,214,1)', + 'Reply Border': 'rgba(217,191,183,1)', + 'Highlighted Reply Background': 'rgba(240,192,176,1)', + 'Highlighted Reply Border': 'rgba(217,191,183,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(255,255,238,1)', + 'Checkbox Border': 'rgba(217,191,183,1)', + 'Checkbox Checked Background': 'rgba(255,255,238,1)', + 'Input Background': 'rgba(240,224,214,1)', + 'Input Border': 'rgba(217,191,183,1)', + 'Hovered Input Background': 'rgba(240,224,214,1)', + 'Hovered Input Border': 'rgba(217,191,183,1)', + 'Focused Input Background': 'rgba(255,255,255,1)', + 'Focused Input Border': 'rgba(128,0,0,1)', + 'Buttons Background': 'rgba(240,192,176,1)', + 'Buttons Border': 'rgba(217,191,183,1)', + 'Navigation Background': 'rgba(240,192,176,0.7)', + 'Navigation Border': 'rgba(217,191,183,1)', + 'Links': 'rgb(186,0,0)', + 'Hovered Links': 'rgb(221,0,0)', + 'Navigation Links': 'rgb(128,0,0)', + 'Hovered Navigation Links': 'rgb(221,0,0)', + 'Subjects': 'rgb(204,17,5)', + 'Names': 'rgb(17,119,67)', + 'Sage': 'rgb(204,17,17)', + 'Tripcodes': 'rgb(34,136,84)', + 'Emails': 'rgb(186,0,0)', + 'Post Numbers': 'rgb(128,0,0)', + 'Text': 'rgb(128,0,0)', + 'Quotelinks': 'rgb(221,0,0)', + 'Backlinks': 'rgb(220,0,0)', + 'Greentext': 'rgb(120,153,34)', + 'Board Title': 'rgb(204,17,5)', + 'Timestamps': 'rgb(186,0,0)', + 'Inputs': 'rgb(0,0,0)', + 'Warnings': 'rgb(128,0,0)', + 'Shadow Color': 'rgba(0,0,0,.05)', + 'Custom CSS': "#qp div.post {\n background-color:rgba(240,192,176,1);\n box-shadow:5px 5px 5px rgba(128,128,128,0.5);\n}\n.reply.post {\n border-color: transparent rgba(240,224,214,1) rgba(240,224,214,1) transparent;\n}" + }, + 'Yotsuba B': { + 'Author': 'moot', + 'Author Tripcode': '!Ep8pui8Vw2', + 'Background Image': 'linear-gradient(rgb(209,213,238), rgb(238,242,255) 200px, rgb(238,242,255))', + 'Background Color': 'rgba(238,242,255,1)', + 'Dialog Background': 'rgba(214,218,240,1)', + 'Dialog Border': 'rgba(183,197,217,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(214,218,240,1)', + 'Reply Border': 'rgba(183,197,217,1)', + 'Highlighted Reply Background': 'rgba(214,186,208,1)', + 'Highlighted Reply Border': 'rgba(183,197,217,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(238,242,255,1)', + 'Checkbox Border': 'rgba(183,197,217,1)', + 'Checkbox Checked Background': 'rgba(188,192,212,1)', + 'Input Background': 'rgba(238,242,255,1)', + 'Input Border': 'rgba(183,197,217,1)', + 'Hovered Input Background': 'rgba(214,186,208,1)', + 'Hovered Input Border': 'rgba(183,197,217,1)', + 'Focused Input Background': 'rgba(214,218,240,1)', + 'Focused Input Border': 'rgba(153,136,238,1)', + 'Buttons Background': 'rgba(214,218,240,1)', + 'Buttons Border': 'rgba(183,197,217,1)', + 'Navigation Background': 'rgba(211,215,238,0.7)', + 'Navigation Border': 'rgba(183,197,217,1)', + 'Links': 'rgb(52,52,92)', + 'Hovered Links': 'rgb(221,0,0)', + 'Navigation Links': 'rgb(0,0,0)', + 'Hovered Navigation Links': 'rgb(221,0,0)', + 'Subjects': 'rgb(15,12,93)', + 'Names': 'rgb(17,119,67)', + 'Sage': 'rgb(153,0,0)', + 'Tripcodes': 'rgb(34,136,84)', + 'Emails': 'rgb(87,87,123)', + 'Post Numbers': 'rgb(0,0,0)', + 'Text': 'rgb(0,0,0)', + 'Quotelinks': 'rgb(221,0,0)', + 'Backlinks': 'rgb(52,52,92)', + 'Greentext': 'rgb(120,153,34)', + 'Board Title': 'rgb(175,10,15)', + 'Timestamps': 'rgb(0,0,0)', + 'Inputs': 'rgb(0,0,0)', + 'Warnings': 'rgb(87,87,123)', + 'Shadow Color': 'rgba(0,0,0,.05)', + 'Custom CSS': "#qp div.post {\n background-color:rgba(214,186,208,1);\n box-shadow:5px 5px 5px rgba(128,128,128,0.5);\n}\n.reply.post {\n border-color: transparent rgba(183,197,217,1) rgba(183,197,217,1) transparent;\n}" + }, + 'Zenburned': { + 'Author': 'lazy', + 'Author Tripcode': '!HONKYn7h1.', + 'Background Color': 'rgba(63,63,63,1)', + 'Dialog Background': 'rgba(87,87,87,1)', + 'Dialog Border': 'rgba(87,87,87,1)', + 'Thread Wrapper Background': 'rgba(0,0,0,0)', + 'Thread Wrapper Border': 'rgba(0,0,0,0)', + 'Reply Background': 'rgba(87,87,87,1)', + 'Reply Border': 'rgba(87,87,87,1)', + 'Highlighted Reply Background': 'rgba(38,38,38,1)', + 'Highlighted Reply Border': 'rgba(38,38,38,1)', + 'Backlinked Reply Outline': 'rgba(98,124,141,1)', + 'Checkbox Background': 'rgba(63,63,63,1)', + 'Checkbox Border': 'rgba(136,136,136,1)', + 'Checkbox Checked Background': 'rgba(17,17,17,1)', + 'Input Background': 'rgba(87,87,87,1)', + 'Input Border': 'rgba(136,136,136,1)', + 'Hovered Input Background': 'rgba(38,38,38,1)', + 'Hovered Input Border': 'rgba(38,38,38,1)', + 'Focused Input Background': 'rgba(38,38,38,1)', + 'Focused Input Border': 'rgba(153,136,238,1)', + 'Buttons Background': 'rgba(49,60,54,1)', + 'Buttons Border': 'rgba(136,136,136,1)', + 'Navigation Background': 'rgba(63,63,63,0.9)', + 'Navigation Border': 'rgba(63,63,63,0.9)', + 'Links': 'rgb(239,220,188)', + 'Hovered Links': 'rgb(248,248,147)', + 'Navigation Links': 'rgb(220,220,204)', + 'Hovered Navigation Links': 'rgb(248,248,147)', + 'Subjects': 'rgb(170,170,170)', + 'Names': 'rgb(192,190,209)', + 'Sage': 'rgb(220,220,204)', + 'Tripcodes': 'rgb(140,208,211)', + 'Emails': 'rgb(239,220,188)', + 'Post Numbers': 'rgb(220,220,204)', + 'Text': 'rgb(220,220,204)', + 'Quotelinks': 'rgb(220,163,163)', + 'Backlinks': 'rgb(220,163,163)', + 'Greentext': 'rgb(127,159,127)', + 'Board Title': 'rgb(220,220,204)', + 'Timestamps': 'rgb(220,220,204)', + 'Inputs': 'rgb(220,220,204)', + 'Warnings': 'rgb(239,220,188)', + 'Shadow Color': 'rgba(0,0,0,.1)', + 'Custom CSS': '' + }, + "ピンク": { + "Author": "DrooidKun", + "Author Tripcode": "!/Apk/MRkGM", + "Background Color": "rgb(255,255,255)", + "Dialog Background": "rgba(242,242,242,.98)", + "Dialog Border": "rgb(240,240,240)", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Reply Background": "rgba(242,242,242,1.0)", + "Reply Border": "rgb(240,240,240)", + "Highlighted Reply Background": "rgba(238,238,238,1.0)", + "Highlighted Reply Border": "rgb(191,122,180)", + "Backlinked Reply Outline": "rgb(191,122,180)", + "Checkbox Background": "rgba(240,240,240,1.0)", + "Checkbox Border": "rgb(222,222,222)", + "Checkbox Checked Background": "rgb(240,240,240)", + "Input Background": "rgba(240,240,240,1.0)", + "Input Border": "rgb(222,222,222)", + "Hovered Input Background": "rgba(224,224,224,1.0)", + "Hovered Input Border": "rgb(222,222,222)", + "Focused Input Background": "rgba(224,224,224,1.0)", + "Focused Input Border": "rgb(222,222,222)", + "Buttons Background": "rgba(240,240,240,1.0)", + "Buttons Border": "rgb(222,222,222)", + "Navigation Background": "rgba(255,255,255,0.8)", + "Navigation Border": "rgb(242,242,242)", + "Quotelinks": "rgb(191,122,180)", + "Links": "rgb(191,122,180)", + "Hovered Links": "rgb(198,105,201)", + "Navigation Links": "rgb(77,77,76)", + "Hovered Navigation Links": "rgb(198,105,201)", + "Subjects": "rgb(77,77,77)", + "Names": "rgb(204,94,193)", + "Sage": "rgb(200,40,41)", + "Tripcodes": "rgb(198,105,201)", + "Emails": "rgb(191,122,180)", + "Post Numbers": "rgb(191,122,180)", + "Text": "rgb(77,77,76)", + "Backlinks": "rgb(191,122,180)", + "Greentext": "rgb(113,140,0)", + "Board Title": "rgb(77,77,76)", + "Timestamps": "rgb(77,77,76)", + "Inputs": "rgb(77,77,76)", + "Warnings": "rgb(200,40,41)", + "Shadow Color": "rgba(0,0,0,0.05)", + "Custom CSS": ".rice {\n box-shadow:rgba(255,255,255,.3) 0 1px;\n}\nnput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}\n.boardTitle {\n color: #cc5ec1 !important;\n text-shadow: 1px 1px 1px #772E28 !important;\n}\n.boardSubtitle,\n.boardBanner .boardSubtitle > a {\n text-shadow: none !important;\n}" + }, + "Yotsuba Purple": { + "Author": "seaweed", + "Author Tripcode": "!POMF.9waa", + "Background Image": "linear-gradient(rgba(238,221,255,1.0), rgba(248,243,254,1) 200px, rgba(248,243,254,1))", + "Background Color": "rgb(248,243,254)", + "Dialog Background": "rgba(238,221,255,.98)", + "Dialog Border": "rgb(202,183,217)", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Reply Background": "rgba(238,221,255,1.0)", + "Reply Border": "rgb(202,183,217)", + "Highlighted Reply Background": "rgba(234,217,251,1.0)", + "Highlighted Reply Border": "rgb(150,37,148)", + "Backlinked Reply Outline": "rgb(150,37,148)", + "Checkbox Background": "rgba(255,255,255,1.0)", + "Checkbox Border": "rgb(202,183,217)", + "Checkbox Checked Background": "rgb(255,255,255)", + "Input Background": "rgba(255,255,255,1.0)", + "Input Border": "rgb(202,183,217)", + "Hovered Input Background": "rgba(239,239,239,1.0)", + "Hovered Input Border": "rgb(202,183,217)", + "Focused Input Background": "rgba(239,239,239,1.0)", + "Focused Input Border": "rgb(202,183,217)", + "Buttons Background": "rgba(255,255,255,1.0)", + "Buttons Border": "rgb(202,183,217)", + "Navigation Background": "rgba(229, 219, 240,.9)", + "Navigation Border": "rgb(238,221,255)", + "Quotelinks": "rgb(150,37,148)", + "Links": "rgb(150,37,148)", + "Hovered Links": "rgb(178,44,170)", + "Navigation Links": "rgb(0,0,0)", + "Hovered Navigation Links": "rgb(178,44,170)", + "Subjects": "rgb(15,12,93)", + "Names": "rgb(89,17,119)", + "Sage": "rgb(153,0,0)", + "Tripcodes": "rgb(178,44,170)", + "Emails": "rgb(150,37,148)", + "Post Numbers": "rgb(150,37,148)", + "Text": "rgb(0,0,0)", + "Backlinks": "rgb(150,37,148)", + "Greentext": "rgb(120,153,34)", + "Board Title": "rgb(0,0,0)", + "Timestamps": "rgb(0,0,0)", + "Inputs": "rgb(0,0,0)", + "Warnings": "rgb(153,0,0)", + "Shadow Color": "rgba(0,0,0,.05)", + "Custom CSS": ".rice {\n box-shadow:rgba(255,253,255,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}\n.boardTitle {\n color: #591177 !important;\n text-shadow: 1px 1px 1px #222 !important;\n}\n.boardSubtitle,\n.boardBanner .boardSubtitle > a {\n text-shadow: none !important;\n}\n.postNum a {\n color: #000000 !important;\n}\n.reply.post {\n border-color: transparent rgb(202,183,217) rgb(202,183,217) transparent;\n}" + }, + "Vimyanized Dark": { + "Author": "seaweed", + "Author Tripcode": "!POMF.9waa", + "Background Color": "rgb(9,13,15)", + "Dialog Background": "rgba(13,17,20,.98)", + "Dialog Border": "rgb(11,19,22)", + "Thread Wrapper Background": "rgba(13,17,20,.5)", + "Thread Wrapper Border": "rgba(11,19,22,.9)", + "Reply Background": "rgba(13,17,20,.9)", + "Reply Border": "rgb(11,19,22)", + "Highlighted Reply Background": "rgba(9,13,16,.9)", + "Highlighted Reply Border": "rgb(83,189,177)", + "Backlinked Reply Outline": "rgb(83,189,177)", + "Checkbox Background": "rgba(9,13,15,.9)", + "Checkbox Border": "rgb(11,19,22)", + "Checkbox Checked Background": "rgb(9,13,15)", + "Input Background": "rgba(9,13,15,.9)", + "Input Border": "rgb(11,19,22)", + "Hovered Input Background": "rgba(0,0,0,.9)", + "Hovered Input Border": "rgb(11,19,22)", + "Focused Input Background": "rgba(0,0,0,.9)", + "Focused Input Border": "rgb(11,19,22)", + "Buttons Background": "rgba(9,13,15,.9)", + "Buttons Border": "rgb(11,19,22)", + "Navigation Background": "rgba(9,13,15,0.8)", + "Navigation Border": "rgb(13,17,20)", + "Quotelinks": "rgb(83,189,177)", + "Links": "rgb(83,189,177)", + "Hovered Links": "rgb(48,144,181)", + "Navigation Links": "rgb(248,248,248)", + "Hovered Navigation Links": "rgb(48,144,181)", + "Subjects": "rgb(184,140,209)", + "Names": "rgb(214,62,52)", + "Sage": "rgb(79,79,79)", + "Tripcodes": "rgb(212,182,60)", + "Emails": "rgb(83,189,177)", + "Post Numbers": "rgb(83,189,177)", + "Text": "rgb(248,248,248)", + "Backlinks": "rgb(83,189,177)", + "Greentext": "rgb(150,200,59)", + "Board Title": "rgb(248,248,248)", + "Timestamps": "rgb(221,221,221)", + "Inputs": "rgb(248,248,248)", + "Warnings": "rgb(79,79,79)", + "Shadow Color": "rgba(0,0,0,.1)", + "Custom CSS": ".thread {\n padding: 1px;\n}\n.rice {\n box-shadow:rgba(45,49,52,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + }, + "Tomorrow Night": { + "Author": "Chris Kempson", + "Author Tripcode": "!.pC/AHOKAg", + "Background Color": "rgb(29,31,33)", + "Dialog Background": "rgba(40,42,46,.98)", + "Dialog Border": "rgb(55,59,65)", + "Thread Wrapper Background": "rgba(40,42,46,.5)", + "Thread Wrapper Border": "rgba(55,59,65,.9)", + "Reply Background": "rgba(40,42,46,.9)", + "Reply Border": "rgb(55,59,65)", + "Highlighted Reply Background": "rgba(36,38,42,.9)", + "Highlighted Reply Border": "rgb(129,162,190)", + "Backlinked Reply Outline": "rgb(129,162,190)", + "Checkbox Background": "rgba(40,42,46,.9)", + "Checkbox Border": "rgb(29,31,33)", + "Checkbox Checked Background": "rgb(40,42,46)", + "Input Background": "rgba(40,42,46,.9)", + "Input Border": "rgb(29,31,33)", + "Hovered Input Background": "rgba(24,26,30,.9)", + "Hovered Input Border": "rgb(29,31,33)", + "Focused Input Background": "rgba(24,26,30,.9)", + "Focused Input Border": "rgb(29,31,33)", + "Buttons Background": "rgba(40,42,46,.9)", + "Buttons Border": "rgb(29,31,33)", + "Navigation Background": "rgba(29,31,33,0.8)", + "Navigation Border": "rgb(40,42,46)", + "Quotelinks": "rgb(129,162,190)", + "Links": "rgb(129,162,190)", + "Hovered Links": "rgb(204,102,102)", + "Navigation Links": "rgb(197,200,198)", + "Hovered Navigation Links": "rgb(204,102,102)", + "Subjects": "rgb(178,148,187)", + "Names": "rgb(129,162,190)", + "Sage": "rgb(204,102,102)", + "Tripcodes": "rgb(138,190,183)", + "Emails": "rgb(129,162,190)", + "Post Numbers": "rgb(129,162,190)", + "Text": "rgb(197,200,198)", + "Backlinks": "rgb(129,162,190)", + "Greentext": "rgb(181,189,104)", + "Board Title": "rgb(197,200,198)", + "Timestamps": "rgb(197,200,198)", + "Inputs": "rgb(197,200,198)", + "Warnings": "rgb(204,102,102)", + "Shadow Color": "rgba(0,0,0,.1)", + "Custom CSS": ".thread {\n padding: 1px;\n}\n.rice {\n box-shadow:rgba(72,74,78,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + }, + "Solarized Light": { + "Author": "seaweed", + "Author Tripcode": "!POMF.9waa", + "Background Color": "rgb(240,240,240)", + "Dialog Background": "rgba(253,246,227,.98)", + "Dialog Border": "rgb(230,223,206)", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Reply Background": "rgba(253,246,227,1.0)", + "Reply Border": "rgb(230,223,206)", + "Highlighted Reply Background": "rgba(249,242,223,1.0)", + "Highlighted Reply Border": "rgb(108,113,196)", + "Backlinked Reply Outline": "rgb(108,113,196)", + "Checkbox Background": "rgba(255,255,255,1.0)", + "Checkbox Border": "rgb(204,204,204)", + "Checkbox Checked Background": "rgb(255,255,255)", + "Input Background": "rgba(255,255,255,1.0)", + "Input Border": "rgb(204,204,204)", + "Hovered Input Background": "rgba(239,239,239,1.0)", + "Hovered Input Border": "rgb(204,204,204)", + "Focused Input Background": "rgba(239,239,239,1.0)", + "Focused Input Border": "rgb(204,204,204)", + "Buttons Background": "rgba(255,255,255,1.0)", + "Buttons Border": "rgb(204,204,204)", + "Navigation Background": "rgba(240,240,240,0.8)", + "Navigation Border": "rgb(253,246,227)", + "Quotelinks": "rgb(108,113,196)", + "Links": "rgb(108,113,196)", + "Hovered Links": "rgb(211,54,130)", + "Navigation Links": "rgb(101,123,131)", + "Hovered Navigation Links": "rgb(211,54,130)", + "Subjects": "rgb(181,137,0)", + "Names": "rgb(101,123,131)", + "Sage": "rgb(153,0,0)", + "Tripcodes": "rgb(42,161,152)", + "Emails": "rgb(108,113,196)", + "Post Numbers": "rgb(108,113,196)", + "Text": "rgb(101,123,131)", + "Backlinks": "rgb(108,113,196)", + "Greentext": "rgb(133,153,0)", + "Board Title": "rgb(101,123,131)", + "Timestamps": "rgb(101,123,131)", + "Inputs": "rgb(101,123,131)", + "Warnings": "rgb(153,0,0)", + "Shadow Color": "rgba(0,0,0,.05)", + "Custom CSS": ".rice {\n box-shadow:rgba(255,255,255,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}\n.boardTitle {\n color: #b58900 !important;\n text-shadow: 1px 1px 1px #999 !important;\n}\n.boardSubtitle,\n.boardBanner .boardSubtitle > a {\n text-shadow: none !important;\n}\n.postNum a {\n color: #657b83 !important;\n}" + }, + "Muted": { + "Author": "seaweed", + "Author Tripcode": "!POMF.9waa", + "Background Color": "rgb(255,255,255)", + "Dialog Background": "rgba(245,242,233,.98)", + "Dialog Border": "rgb(204,204,204)", + "Thread Wrapper Background": "rgba(245,242,233,.5)", + "Thread Wrapper Border": "rgba(204,204,204,.9)", + "Reply Background": "rgba(245,242,233,.9)", + "Reply Border": "rgb(204,204,204)", + "Highlighted Reply Background": "rgba(241,238,229,.9)", + "Highlighted Reply Border": "rgb(188,49,42)", + "Backlinked Reply Outline": "rgb(188,49,42)", + "Checkbox Background": "rgba(255,255,255,.9)", + "Checkbox Border": "rgb(204,204,204)", + "Checkbox Checked Background": "rgb(255,255,255)", + "Input Background": "rgba(255,255,255,.9)", + "Input Border": "rgb(204,204,204)", + "Hovered Input Background": "rgba(239,239,239,.9)", + "Hovered Input Border": "rgb(204,204,204)", + "Focused Input Background": "rgba(239,239,239,.9)", + "Focused Input Border": "rgb(204,204,204)", + "Buttons Background": "rgba(255,255,255,.9)", + "Buttons Border": "rgb(204,204,204)", + "Navigation Background": "rgba(255,255,255,0.8)", + "Navigation Border": "rgb(245,242,233)", + "Quotelinks": "rgb(188,49,42)", + "Links": "rgb(188,49,42)", + "Hovered Links": "rgb(142,34,32)", + "Navigation Links": "rgb(57,55,53)", + "Hovered Navigation Links": "rgb(142,34,32)", + "Subjects": "rgb(17,17,17)", + "Names": "rgb(44,100,160)", + "Sage": "rgb(153,0,0)", + "Tripcodes": "rgb(204,101,99)", + "Emails": "rgb(188,49,42)", + "Post Numbers": "rgb(188,49,42)", + "Text": "rgb(57,55,53)", + "Backlinks": "rgb(188,49,42)", + "Greentext": "rgb(120,153,34)", + "Board Title": "rgb(57,55,53)", + "Timestamps": "rgb(51,51,51)", + "Inputs": "rgb(57,55,53)", + "Warnings": "rgb(153,0,0)", + "Shadow Color": "rgba(0,0,0,.05)", + "Custom CSS": ".thread {\n padding: 1px;\n}\n.rice {\n box-shadow:rgba(255,255,255,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}\n.boardTitle{\ncolor:#bc312a!important;\n text-shadow:1px 1px 1px #772e28 !important;\n}\n.boardSubtitle,\n.boardBanner .boardSubtitle > a {\n text-shadow:none!important;\n}\n.postNum a {\n color:#111111!important;\n}\ndiv.reply a.quotelink{\n color:#bc312a!important;\n}" + }, + "Monokai": { + "Author": "seaweed", + "Author Tripcode": "!POMF.9waa", + "Background Color": "rgb(32,33,28)", + "Dialog Background": "rgba(39,40,34,.98)", + "Dialog Border": "rgb(45,46,39)", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Reply Background": "rgba(39,40,34,1.0)", + "Reply Border": "rgb(45,46,39)", + "Highlighted Reply Background": "rgba(35,36,30,1.0)", + "Highlighted Reply Border": "rgb(226,219,116)", + "Backlinked Reply Outline": "rgb(226,219,116)", + "Checkbox Background": "rgba(32,33,28,1.0)", + "Checkbox Border": "rgb(23,23,19)", + "Checkbox Checked Background": "rgb(32,33,28)", + "Input Background": "rgba(32,33,28,1.0)", + "Input Border": "rgb(23,23,19)", + "Hovered Input Background": "rgba(16,17,12,1.0)", + "Hovered Input Border": "rgb(23,23,19)", + "Focused Input Background": "rgba(16,17,12,1.0)", + "Focused Input Border": "rgb(23,23,19)", + "Buttons Background": "rgba(32,33,28,1.0)", + "Buttons Border": "rgb(23,23,19)", + "Navigation Background": "rgba(32,33,28,0.8)", + "Navigation Border": "rgb(39,40,34)", + "Quotelinks": "rgb(226,219,116)", + "Links": "rgb(226,219,116)", + "Hovered Links": "rgb(174,129,255)", + "Navigation Links": "rgb(248,248,242)", + "Hovered Navigation Links": "rgb(174,129,255)", + "Subjects": "rgb(174,129,255)", + "Names": "rgb(90,192,204)", + "Sage": "rgb(79,79,79)", + "Tripcodes": "rgb(250,130,32)", + "Emails": "rgb(226,219,116)", + "Post Numbers": "rgb(226,219,116)", + "Text": "rgb(248,248,242)", + "Backlinks": "rgb(226,219,116)", + "Greentext": "rgb(162,204,40)", + "Board Title": "rgb(248,248,242)", + "Timestamps": "rgb(248,248,242)", + "Inputs": "rgb(248,248,242)", + "Warnings": "rgb(79,79,79)", + "Shadow Color": "rgba(0,0,0,.12)", + "Custom CSS": ".rice {\n box-shadow:rgba(71,72,66,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + }, + "Dark Flat": { + "Author": "Ahoka", + "Author Tripcode": "!.pC/AHOKAg", + "Background Image": "url(\"data:image/gif;base64,R0lGODlhAwADAIAAAB0dHRkZGSH5BADoAwAALAAAAAADAAMAAAIDDG5YADs=\")", + "Background Attachment": "fixed", + "Background Position": "top left", + "Background Repeat": "repeat", + "Background Color": "rgb(32,32,32)", + "Dialog Background": "rgba(35,36,37,.98)", + "Dialog Border": "rgb(41,42,43)", + "Thread Wrapper Background": "rgba(35,36,37,.5)", + "Thread Wrapper Border": "rgba(41,42,43,.9)", + "Reply Background": "rgba(35,36,37,.9)", + "Reply Border": "rgba(35,36,37,.9)", + "Highlighted Reply Background": "rgba(31,32,33,.9)", + "Highlighted Reply Border": "rgb(172,155,176)", + "Backlinked Reply Outline": "rgb(172,155,176)", + "Checkbox Background": "rgba(24,25,26,.9)", + "Checkbox Border": "rgb(18,19,20)", + "Checkbox Checked Background": "rgb(24,25,26)", + "Input Background": "rgba(24,25,26,.9)", + "Input Border": "rgb(18,19,20)", + "Hovered Input Background": "rgba(8,9,10,.9)", + "Hovered Input Border": "rgb(18,19,20)", + "Focused Input Background": "rgba(8,9,10,.9)", + "Focused Input Border": "rgb(18,19,20)", + "Buttons Background": "rgba(24,25,26,.9)", + "Buttons Border": "rgb(18,19,20)", + "Navigation Background": "rgba(32,32,32,0.8)", + "Navigation Border": "rgb(35,36,37)", + "Quotelinks": "rgb(172,155,176)", + "Links": "rgb(172,155,176)", + "Hovered Links": "rgb(111,153,180)", + "Navigation Links": "rgb(221,221,221)", + "Hovered Navigation Links": "rgb(111,153,180)", + "Subjects": "rgb(147,144,201)", + "Names": "rgb(168,198,217)", + "Sage": "rgb(201,144,144)", + "Tripcodes": "rgb(212,192,149)", + "Emails": "rgb(172,155,176)", + "Post Numbers": "rgb(172,155,176)", + "Text": "rgb(221,221,221)", + "Backlinks": "rgb(172,155,176)", + "Greentext": "rgb(179,196,94)", + "Board Title": "rgb(221,221,221)", + "Timestamps": "rgb(221,221,221)", + "Inputs": "rgb(221,221,221)", + "Warnings": "rgb(201,144,144)", + "Shadow Color": "rgba(0,0,0,.1)", + "Custom CSS": ".thread {\n padding: 1px;\n}\n.rice {\n box-shadow:rgba(67,68,69,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + }, + "Blackboard": { + "Author": "seaweed", + "Author Tripcode": "!POMF.9waa", + "Background Color": "rgb(10,13,28)", + "Dialog Background": "rgba(12,16,33,.98)", + "Dialog Border": "rgb(14,18,40)", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Reply Background": "rgba(12,16,33,1.0)", + "Reply Border": "rgb(14,18,40)", + "Highlighted Reply Background": "rgba(8,12,29,1.0)", + "Highlighted Reply Border": "rgb(251,222,45)", + "Backlinked Reply Outline": "rgb(251,222,45)", + "Checkbox Background": "rgba(12,16,33,1.0)", + "Checkbox Border": "rgb(8,11,22)", + "Checkbox Checked Background": "rgb(12,16,33)", + "Input Background": "rgba(12,16,33,1.0)", + "Input Border": "rgb(8,11,22)", + "Hovered Input Background": "rgba(0,0,17,1.0)", + "Hovered Input Border": "rgb(8,11,22)", + "Focused Input Background": "rgba(0,0,17,1.0)", + "Focused Input Border": "rgb(8,11,22)", + "Buttons Background": "rgba(12,16,33,1.0)", + "Buttons Border": "rgb(8,11,22)", + "Navigation Background": "rgba(10,13,28,0.8)", + "Navigation Border": "rgb(12,16,33)", + "Quotelinks": "rgb(251,222,45)", + "Links": "rgb(251,222,45)", + "Hovered Links": "rgb(75,101,204)", + "Navigation Links": "rgb(248,248,248)", + "Hovered Navigation Links": "rgb(75,101,204)", + "Subjects": "rgb(255,100,0)", + "Names": "rgb(141,166,206)", + "Sage": "rgb(79,79,79)", + "Tripcodes": "rgb(255,100,0)", + "Emails": "rgb(251,222,45)", + "Post Numbers": "rgb(251,222,45)", + "Text": "rgb(248,248,248)", + "Backlinks": "rgb(251,222,45)", + "Greentext": "rgb(154,207,8)", + "Board Title": "rgb(248,248,248)", + "Timestamps": "rgb(221,221,221)", + "Inputs": "rgb(248,248,248)", + "Warnings": "rgb(79,79,79)", + "Shadow Color": "rgba(0,0,0,.1)", + "Custom CSS": ".rice {\n box-shadow:rgba(44,48,65,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}\n.postInfo {\n box-shadow: 0px 2px 3px #0A0A0A;\n}\n#qp .postInfo,\n.inline .postInfo {\n box-shadow: none;\n}" + }, + "4chan Rewired": { + "Author": "", + "Author Tripcode": "!K.WeEabo0o", + "Background Color": "rgb(244,244,244)", + "Dialog Background": "rgba(239,239,239,.98)", + "Dialog Border": "rgb(212,212,212)", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Reply Background": "linear-gradient(rgba(244,244,244,0.9), rgba(239,239,239,0.9)), rgba(239,239,239,1)", + "Reply Border": "rgb(212,212,212)", + "Highlighted Reply Background": "linear-gradient(rgba(250,250,250,.9), rgba(230,230,230,0.9))", + "Highlighted Reply Border": "rgb(191,127,63)", + "Backlinked Reply Outline": "rgba(191,127,63,0.5)", + "Checkbox Background": "rgba(228,228,228,.9)", + "Checkbox Border": "rgb(204,204,204)", + "Checkbox Checked Background": "rgb(228,228,228)", + "Input Background": "rgba(244,244,244,0.9)", + "Input Border": "rgb(204,204,204)", + "Hovered Input Background": "rgba(212,212,212,.9)", + "Hovered Input Border": "rgb(204,204,204)", + "Focused Input Background": "rgba(212,212,212,.9)", + "Focused Input Border": "rgb(204,204,204)", + "Buttons Background": "rgba(244,244,244,0.9)", + "Buttons Border": "rgb(204,204,204)", + "Navigation Background": "rgba(244,244,244,0.8)", + "Navigation Border": "rgb(239,239,239)", + "Quotelinks": "rgb(191,127,63)", + "Links": "rgb(191,127,63)", + "Hovered Links": "rgb(191,127,63)", + "Navigation Links": "rgba(0,0,0,.7)", + "Hovered Navigation Links": "rgb(211,54,130)", + "Subjects": "rgba(0,0,0,.7)", + "Names": "rgba(0,0,0,.7)", + "Sage": "rgb(204,102,102)", + "Tripcodes": "rgb(191,127,63)", + "Emails": "rgb(191,127,63)", + "Post Numbers": "rgb(191,127,63)", + "Text": "rgba(0,0,0,.7)", + "Backlinks": "rgb(191,127,63)", + "Greentext": "rgb(107,122,30)", + "Board Title": "rgba(0,0,0,.7)", + "Timestamps": "rgba(0,0,0,.7)", + "Inputs": "rgba(0,0,0,.7)", + "Warnings": "rgb(204,102,102)", + "Shadow Color": "rgba(0,0,0,.07)", + "Custom CSS": ".rice {\n box-shadow:rgba(255,255,255,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\n.reply.post,\n.op.post {\n background-color: transparent !important;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\na {\n -moz-transition: text-shadow .2s;\n -o-transition: text-shadow .2s;\n -webkit-transition: text-shadow .2s;\n}\na:hover {\n text-shadow: 0 0 3px rgba(232,118,0,.7);\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:\n background .2s,\n box-shadow .2s;\n}\n.subject:not(:empty)::after {\n content: \" by\";\n font-weight: normal;\n}" + }, + "4chan Dark Upgrade": { + "Author": "Ahoka", + "Author Tripcode": "!.pC/AHOKAg", + "Background Image": "url(\"http://i.minus.com/iNkJoDJkLU0co.png\")", + "Background Attachment": "fixed", + "Background Position": "top left", + "Background Repeat": "repeat", + "Background Color": "rgb(36,36,36)", + "Dialog Background": "rgba(51,51,51,.98)", + "Dialog Border": "rgb(58,58,58)", + "Thread Wrapper Background": "rgba(51,51,51,.5)", + "Thread Wrapper Border": "rgba(58,58,58,.9)", + "Reply Background": "rgba(51,51,51,.9)", + "Reply Border": "rgb(58,58,58)", + "Highlighted Reply Background": "rgba(47,47,47,.9)", + "Highlighted Reply Border": "rgb(221,221,221)", + "Backlinked Reply Outline": "rgb(221,221,221)", + "Checkbox Background": "rgba(47,47,47,.9)", + "Checkbox Border": "rgb(15,15,15)", + "Checkbox Checked Background": "rgb(47,47,47)", + "Input Background": "rgba(47,47,47,.9)", + "Input Border": "rgb(15,15,15)", + "Hovered Input Background": "rgba(31,31,31,.9)", + "Hovered Input Border": "rgb(15,15,15)", + "Focused Input Background": "rgba(31,31,31,.9)", + "Focused Input Border": "rgb(15,15,15)", + "Buttons Background": "rgba(47,47,47,.9)", + "Buttons Border": "rgb(15,15,15)", + "Navigation Background": "rgba(36,36,36,0.8)", + "Navigation Border": "rgb(51,51,51)", + "Quotelinks": "rgb(221,221,221)", + "Links": "rgb(221,221,221)", + "Hovered Links": "rgb(238,238,238)", + "Navigation Links": "rgb(255,255,255)", + "Hovered Navigation Links": "rgb(238,238,238)", + "Subjects": "rgb(153,153,153)", + "Names": "rgb(255,255,255)", + "Sage": "rgb(177,115,133)", + "Tripcodes": "rgb(167,220,231)", + "Emails": "rgb(221,221,221)", + "Post Numbers": "rgb(221,221,221)", + "Text": "rgb(255,255,255)", + "Backlinks": "rgb(221,221,221)", + "Greentext": "rgb(99,153,91)", + "Board Title": "rgb(255,255,255)", + "Timestamps": "rgb(170,170,170)", + "Inputs": "rgb(255,255,255)", + "Warnings": "rgb(177,115,133)", + "Shadow Color": "rgba(0,0,0,0.2)", + "Custom CSS": "html {\n}\n.thread {\n padding: 3px 4px;\n}\n.rice {\n box-shadow:rgba(83,83,83,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}\n#delform {\n background: rgba(22,22,22,.8) !important;\n border: 0 !important;\n padding: 1px !important;\n box-shadow: rgba(0,0,0,.8) 0 0 10px;\n}\ndiv.reply.post {\n background-image: -moz-repeating-linear-gradient(45deg, #303030, #292929, #303030, #303030 3px) !important;\n background-image: -o-repeating-linear-gradient(45deg, #303030, #292929, #303030, #303030 3px) !important;\n background-image: -webkit-repeating-linear-gradient(45deg, #303030, #292929, #303030, #303030 3px) !important;\n border-bottom:#1f1f1f!important;\n}\n.thread:not(.stub) {\n background: 0 !important\n}\na:not([href='javascript:;']){\n text-shadow: #0f0f0f 0 1px;\n}" + }, + "安心院なじみ ": { + "Author": "Ahoka", + "Author Tripcode": "!.pC/AHOKAg", + "Background Image": "url(\"http://i.imgur.com/RewHm.png\")", + "Background Attachment": "fixed", + "Background Position": "bottom right", + "Background Repeat": "no-repeat", + "Background Color": "rgb(255,255,255)", + "Dialog Background": "rgba(239,239,239,.98)", + "Dialog Border": "rgb(214,214,214)", + "Thread Wrapper Background": "rgba(239,239,239,.4)", + "Thread Wrapper Border": "rgba(214,214,214,.9)", + "Reply Background": "rgba(239,239,239,.9)", + "Reply Border": "rgb(214,214,214)", + "Highlighted Reply Background": "rgba(235,235,235,.9)", + "Highlighted Reply Border": "rgb(191,128,64)", + "Backlinked Reply Outline": "rgb(191,128,64)", + "Checkbox Background": "rgba(204,204,204,.9)", + "Checkbox Border": "rgb(187,187,187)", + "Checkbox Checked Background": "rgb(204,204,204)", + "Input Background": "rgba(204,204,204,.9)", + "Input Border": "rgb(187,187,187)", + "Hovered Input Background": "rgba(188,188,188,.9)", + "Hovered Input Border": "rgb(187,187,187)", + "Focused Input Background": "rgba(188,188,188,.9)", + "Focused Input Border": "rgb(187,187,187)", + "Buttons Background": "rgba(204,204,204,.9)", + "Buttons Border": "rgb(187,187,187)", + "Navigation Background": "rgba(255,255,255,0.8)", + "Navigation Border": "rgb(239,239,239)", + "Quotelinks": "rgb(191,128,64)", + "Links": "rgb(191,128,64)", + "Hovered Links": "rgb(191,128,64)", + "Navigation Links": "rgb(77,77,76)", + "Hovered Navigation Links": "rgb(191,128,64)", + "Subjects": "rgb(77,77,77)", + "Names": "rgb(43,128,194)", + "Sage": "rgb(200,40,41)", + "Tripcodes": "rgb(62,153,159)", + "Emails": "rgb(191,128,64)", + "Post Numbers": "rgb(191,128,64)", + "Text": "rgb(77,77,76)", + "Backlinks": "rgb(191,128,64)", + "Greentext": "rgb(113,140,0)", + "Board Title": "rgb(77,77,76)", + "Timestamps": "rgb(77,77,76)", + "Inputs": "rgb(77,77,76)", + "Warnings": "rgb(200,40,41)", + "Shadow Color": "rgba(0,0,0,.05)", + "Custom CSS": ".thread {\n padding: 1px;\n}\n.rice {\n box-shadow:rgba(255,255,255,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow: inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow: inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition: background .2s,box-shadow .2s;\n}" + }, + "violaceous": { + "Author": "Anonymous", + "Author Tripcode": "!MaSoOdDwDw", + "Background Color": "rgb(18,19,20)", + "Dialog Background": "rgba(27,27,27,.98)", + "Dialog Border": "rgb(41,42,43)", + "Thread Wrapper Background": "rgba(27,27,27,.5)", + "Thread Wrapper Border": "rgba(41,42,43,.9)", + "Reply Background": "rgba(27,27,27,.9)", + "Reply Border": "rgba(27,27,27,.9)", + "Highlighted Reply Background": "rgba(31,31,31,.9)", + "Highlighted Reply Border": "rgb(42,127,160)", + "Backlinked Reply Outline": "rgb(42,127,160)", + "Checkbox Background": "rgba(24,25,26,.9)", + "Checkbox Border": "rgb(18,19,20)", + "Checkbox Checked Background": "rgb(24,25,26)", + "Input Background": "rgba(24,25,26,.9)", + "Input Border": "rgb(18,19,20)", + "Hovered Input Background": "rgba(40,41,42,.9)", + "Hovered Input Border": "rgb(18,19,20)", + "Focused Input Background": "rgba(40,41,42,.9)", + "Focused Input Border": "rgb(18,19,20)", + "Buttons Background": "rgba(24,25,26,.9)", + "Buttons Border": "rgb(18,19,20)", + "Navigation Background": "rgba(18,19,20,0.8)", + "Navigation Border": "rgb(27,27,27)", + "Quotelinks": "rgb(42,127,160)", + "Links": "rgb(42,127,160)", + "Hovered Links": "rgb(48,144,181)", + "Navigation Links": "rgb(221,221,221)", + "Hovered Navigation Links": "rgb(48,144,181)", + "Subjects": "rgb(6,152,154)", + "Names": "rgb(164,151,176)", + "Sage": "rgb(79,79,79)", + "Tripcodes": "rgb(189,43,131)", + "Emails": "rgb(42,127,160)", + "Post Numbers": "rgb(42,127,160)", + "Text": "rgb(221,221,221)", + "Backlinks": "rgb(42,127,160)", + "Greentext": "rgb(0,171,63)", + "Board Title": "rgb(221,221,221)", + "Timestamps": "rgb(221,221,221)", + "Inputs": "rgb(221,221,221)", + "Warnings": "rgb(79,79,79)", + "Shadow Color": "rgba(0,0,0,.1)", + "Custom CSS": ".thread {\n padding: 1px;\n}\n.rice {\n box-shadow:rgba(59,59,59,.3) 0 1px;\n}\ninput[type=password]:hover,\ninput[type=text]:not([disabled]):hover,\ninput#fs_search:hover,\ninput.field:hover,\n.webkit select:hover,\ntextarea:hover,\n#options input:not([type=checkbox]):hover {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\ninput[type=password]:focus,\ninput[type=text]:focus,\ninput#fs_search:focus,\ninput.field:focus,\n.webkit select:focus,\ntextarea:focus,\n#options input:focus {\n box-shadow:inset rgba(0,0,0,.2) 0 1px 2px;\n}\nbutton,\ninput,\ntextarea,\n.rice {\n transition:background .2s,box-shadow .2s;\n}" + }, + "Mesa": { + "Author": "Tristan", + "Author Tripcode": "!..NoTrip..", + "Background Color": "#3c212a", + "Thread Wrapper Background": "rgba(0,0,0,0)", + "Thread Wrapper Border": "rgba(0,0,0,0)", + "Dialog Background": "#3c212a", + "Dialog Border": "#171717", + "Reply Background": "#3c212a", + "Reply Border": "#171717", + "Highlighted Reply Background": "#3c212a", + "Highlighted Reply Border": "#bfa977", + "Backlinked Reply Outline": "#bfa977", + "Input Background": "#3c212a", + "Input Border": "#171717", + "Checkbox Background": "#3c212a", + "Checkbox Border": "#171717", + "Checkbox Checked Background": "rgba(17,17,17,1)", + "Buttons Background": "#3c212a", + "Buttons Border": "#171717", + "Focused Input Background": "#3c212a", + "Focused Input Border": "#171717", + "Hovered Input Background": "#3c212a", + "Hovered Input Border": "#171717", + "Navigation Background": "#3c212a", + "Navigation Border": "#171717", + "Quotelinks": "#bfa977", + "Backlinks": "#bfa977", + "Links": "#bfa977", + "Hovered Links": "#aa4775", + "Navigation Links": "#bfa977", + "Hovered Navigation Links": "#aa4775", + "Names": "#bfa977", + "Tripcodes": "#aa6d89", + "Emails": "#9c8aaa", + "Subjects": "#bfa977", + "Text": "#BFA977", + "Inputs": "#bfa977", + "Post Numbers": "#bfa977", + "Greentext": "#99848b", + "Sage": "rgb(150,150,150)", + "Board Title": "#aa9d8d", + "Timestamps": "#aa9d8d", + "Warnings": "#aa8575", + "Shadow Color": "rgba(0,0,0,.1)", + "Custom CSS": "", + "Background Image": "", + "Background Attachment": "", + "Background Position": "", + "Background Repeat": "" + } + }; + + Get = { + post: function(board, threadID, postID, root, cb, cb2) { + var post, url; + + if (board === g.BOARD && (post = $.id("pc" + postID))) { + post = Get.cleanPost(post.cloneNode(true)); + if (cb2) { + cb2(Main.preParse(post)); + } + $.add(root, post); + return; + } + root.innerHTML = "
Loading post No." + postID + "...
"; + if (threadID) { + return $.cache("//api.4chan.org/" + board + "/res/" + threadID + ".json", function() { + return Get.parsePost(this, board, threadID, postID, root, cb); + }); + } else if (url = Redirect.post(board, postID)) { + return $.cache(url, function() { + return Get.parseArchivedPost(this, board, postID, root, cb); + }); + } + }, + parsePost: function(req, board, threadID, postID, root, cb) { + var post, postNode, posts, spoilerRange, status, url, _i, _len; + + status = req.status; + if (status !== 200) { + if (url = Redirect.post(board, postID)) { + $.cache(url, function() { + return Get.parseArchivedPost(this, board, postID, root, cb); + }); + } else { + $.addClass(root, 'warning'); + root.innerHTML = status === 404 ? "
Thread No." + threadID + " 404'd.
" : "
Error " + req.status + ": " + req.statusText + ".
"; + } + return; + } + posts = JSON.parse(req.response).posts; + if (spoilerRange = posts[0].custom_spoiler) { + Build.spoilerRange[board] = spoilerRange; + } + postID = +postID; + for (_i = 0, _len = posts.length; _i < _len; _i++) { + post = posts[_i]; + if (post.no === postID) { + break; + } + if (post.no > postID) { + if (url = Redirect.post(board, postID)) { + $.cache(url, function() { + return Get.parseArchivedPost(this, board, postID, root, cb); + }); + } else { + $.addClass(root, 'warning'); + root.textContent = "Post No." + postID + " was not found."; + } + return; + } + } + post = Main.preParse(postNode = Get.cleanPost(Build.postFromObject(post, board))); + if (cb) { + cb(post, root); + } + return $.replace(root.firstChild, postNode); + }, + parseArchivedPost: function(req, board, postID, root, cb) { + var bq, comment, data, o, post, postNode, _ref; + + 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'); + o = { + postID: postID, + threadID: data.thread_num, + board: board, + 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.replace(/"/g, '"')) : '', + 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/" + board + "/thumb/" + data.media.preview_orig), + theight: data.media.preview_h, + twidth: data.media.preview_w, + isSpoiler: data.media.spoiler === '1' + }; + } + post = Main.preParse(postNode = Get.cleanPost(Build.post(o, true))); + if (cb) { + cb(post, root); + } + return $.replace(root.firstChild, postNode); + }, + cleanPost: function(root) { + var child, el, els, inline, inlined, now, post, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2; + + post = $('.post', root); + _ref = __slice.call(root.childNodes); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + if (child !== post) { + $.rm(child); + } + } + _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'); + } + now = Date.now(); + els = $$('[id]', root); + els.push(root); + for (_l = 0, _len3 = els.length; _l < _len3; _l++) { + el = els[_l]; + el.id = "" + now + "_" + el.id; + } + $.rmClass(root, 'forwarded'); + $.rmClass(root, 'qphl'); + $.rmClass(post, 'highlight'); + $.rmClass(post, 'qphl'); + root.hidden = post.hidden = false; + return root; + }, + title: function(thread) { + var el, op, span; + + op = $('.op', thread); + el = $('.postInfo .subject', op); + if (!el.textContent) { + el = $('blockquote', op); + if (!el.textContent) { + el = $('.nameBlock', op); + } + } + span = $.el('span', { + innerHTML: el.innerHTML.replace(/
/g, ' ') + }); + return "/" + g.BOARD + "/ - " + (span.textContent.trim()); + } + }; + + Build = { + spoilerRange: {}, + shortFilename: function(filename, isOP) { + var threshold; + + threshold = isOP ? 40 : 30; + if (filename.length - 4 > threshold) { + return "" + filename.slice(0, threshold - 5) + "(...)." + filename.slice(-3); + } else { + return filename; + } + }, + postFromObject: function(data, board) { + var o; + + o = { + postID: data.no, + threadID: data.resto || data.no, + board: board, + 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: "//images.4chan.org/" + board + "/src/" + data.tim + data.ext, + height: data.h, + width: data.w, + MD5: data.md5, + size: data.fsize, + turl: "//thumbs.4chan.org/" + board + "/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, board, 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, board = o.board, 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'; + 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 = '//static.4chan.org/image/spoiler'; + if (spoilerRange = Build.spoilerRange[board]) { + fileThumb += ("-" + board) + Math.floor(1 + spoilerRange * Math.random()); + } + fileThumb += '.png'; + file.twidth = file.theight = 100; + } + } + imgSrc = ("") + ("" + 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 = "/" + board + "/res/" + href; + } + return container; + } + }; + + Main = { + init: function() { + var key, mascot, name, now, path, pathname, settings, temp, theme, val, _conf, _ref, _ref1; + + Main.flatten(null, Config); + for (key in Conf) { + val = Conf[key]; + Conf[key] = $.get(key, val); + } + Conf['Hidden Categories'] = $.get("Hidden Categories", ["Questionable"]); + path = location.pathname; + pathname = path.slice(1).split('/'); + g.BOARD = pathname[0], temp = pathname[1]; + switch (temp) { + case 'res': + g.REPLY = true; + g.THREAD_ID = pathname[2]; + break; + case 'catalog': + g.CATALOG = true; + } + if (['b', 'd', 'e', 'gif', 'h', 'hc', 'hm', 'hr', 'pol', 'r', 'r9k', 'rs', 's', 's4s', 'soc', 't', 'u', 'y'].contains(g.BOARD)) { + g.TYPE = 'nsfw'; + } + _conf = Conf; + if (_conf["NSFW/SFW Mascots"]) { + g.MASCOTSTRING = "Enabled Mascots " + g.TYPE; + } else { + g.MASCOTSTRING = "Enabled Mascots"; + } + userNavigation = $.get("userNavigation", Navigation); + _ref = $.get("userThemes", {}); + for (name in _ref) { + theme = _ref[name]; + Themes[name] = theme; + } + _ref1 = $.get("userMascots", {}); + for (name in _ref1) { + mascot = _ref1[name]; + Mascots[name] = mascot; + } + Conf["Enabled Mascots"] = $.get("Enabled Mascots", []); + Conf["Enabled Mascots sfw"] = $.get("Enabled Mascots sfw", []); + Conf["Enabled Mascots nsfw"] = $.get("Enabled Mascots nsfw", []); + Conf["Deleted Mascots"] = $.get("Deleted Mascots", []); + if (_conf["Interval per board"]) { + Conf["Interval_" + g.BOARD] = $.get("Interval_" + g.BOARD, Conf["Interval"]); + Conf["BGInterval_" + g.BOARD] = $.get("BGInterval_" + g.BOARD, Conf["BGInteval"]); + } + if (_conf["NSFW/SFW Themes"]) { + Conf["theme"] = $.get("theme_" + g.TYPE, Conf["theme"]); + } + switch (location.hostname) { + case 'sys.4chan.org': + if (/report/.test(location.search)) { + $.ready(function() { + var field, form; + + form = $('form'); + field = $.id('recaptcha_response_field'); + $.on(field, 'keydown', function(e) { + if (e.keyCode === 8 && !e.target.value) { + return $.globalEval('Recaptcha.reload()'); + } + }); + return $.on(form, 'submit', function(e) { + var response; + + e.preventDefault(); + response = field.value.trim(); + if (!/\s/.test(response)) { + field.value = "" + response + " " + response; + } + return form.submit(); + }); + }); + } + return; + case 'images.4chan.org': + $.ready(function() { + var url; + + if (/^4chan - 404/.test(d.title) && _conf['404 Redirect']) { + path = location.pathname.split('/'); + url = Redirect.image(path[1], path[3]); + if (url) { + return location.href = url; + } + } + }); + return; + } + Main.prune(); + Style.init(); + now = Date.now(); + if (_conf['Check for Updates'] && $.get('lastUpdate', 0) < now - 18 * $.HOUR) { + $.ready(function() { + Main.message() + $.set('lastUpdate', now); + }); + } + settings = JSON.parse(localStorage.getItem('4chan-settings')) || {}; + settings.disableAll = true; + localStorage.setItem('4chan-settings', JSON.stringify(settings)); + if (g.CATALOG) { + return $.ready(Main.catalog); + } else { + return Main.features(); + } + }, + catalog: function() { + var a, nav, _conf, _i, _len, _ref; + + _conf = Conf; + MascotTools.init(); + if (_conf['Custom Navigation']) { + CustomNavigation.init(); + } + if (_conf['Catalog Links']) { + CatalogLinks.init(); + } + if (_conf['Thread Hiding']) { + ThreadHiding.init(); + } + _ref = ['boardNavDesktop', 'boardNavDesktopFoot']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + nav = _ref[_i]; + if (a = $("a[href*='/" + g.BOARD + "/']", $.id(nav))) { + $.addClass(a, 'current'); + } + } + }, + features: function() { + var _conf; + + _conf = Conf; + if (_conf['Filter']) { + Filter.init(); + } + if (_conf['Reply Hiding']) { + ReplyHiding.init(); + } + if (_conf['Reply Hiding'] || _conf['Reply Hiding Link'] || _conf['Filter']) { + StrikethroughQuotes.init(); + QuotePreview.callbacks.push(ReplyHiding.unhide); + QuoteInline.callbacks.push(ReplyHiding.unhide); + } + if (_conf['Anonymize']) { + Anonymize.init(); + } + if (_conf['Time Formatting']) { + Time.init(); + } + if (_conf['File Info Formatting']) { + FileInfo.init(); + } + if (_conf['Sauce']) { + Sauce.init(); + } + if (_conf['Reveal Spoilers']) { + RevealSpoilers.init(); + } + if (_conf['Image Auto-Gif']) { + AutoGif.init(); + } + if (_conf['Png Thumbnail Fix']) { + PngFix.init(); + } + if (_conf['Image Hover']) { + ImageHover.init(); + } + if (_conf['Menu']) { + Menu.init(); + if (_conf['Report Link']) { + ReportLink.init(); + } + if (_conf['Delete Link']) { + DeleteLink.init(); + } + if (_conf['Filter']) { + Filter.menuInit(); + } + if (_conf['Archive Link']) { + ArchiveLink.init(); + } + if (_conf['Download Link']) { + DownloadLink.init(); + } + if (_conf['Embed Link']) { + EmbedLink.init(); + } + if (_conf['Thread Hiding Link']) { + ThreadHideLink.init(); + } + if (_conf['Reply Hiding Link']) { + ReplyHideLink.init(); + } + } + if (_conf['Linkify']) { + Linkify.init(); + } + if (_conf['Resurrect Quotes']) { + Quotify.init(); + } + if (_conf['Quote Inline']) { + QuoteInline.init(); + } + if (_conf['Quote Preview']) { + QuotePreview.init(); + } + if (_conf['Quote Backlinks']) { + QuoteBacklink.init(); + } + if (_conf['Mark Owned Posts']) { + MarkOwn.init(); + } + if (_conf['Indicate OP quote']) { + QuoteOP.init(); + } + if (_conf['Indicate Cross-thread Quotes']) { + QuoteCT.init(); + } + if (_conf['Color user IDs']) { + IDColor.init(); + } + if (_conf['Replace GIF'] || _conf['Replace PNG'] || _conf['Replace JPG']) { + ImageReplace.init(); + } + return $.ready(Main.featuresReady); + }, + featuresReady: function() { + var a, board, nav, node, nodes, now, ready, _conf, _i, _j, _len, _len1, _ref, _ref1; + + _conf = Conf; + if (/^4chan - 404/.test(d.title)) { + if (_conf['404 Redirect'] && /^\d+$/.test(g.THREAD_ID)) { + location.href = Redirect.to({ + board: g.BOARD, + threadID: g.THREAD_ID, + postID: location.hash + }); + } + return; + } + if (!$.id('navtopright')) { + return; + } + $.addClass(d.body, $.engine); + $.addClass(d.body, 'fourchan_x'); + if (_conf['Custom Navigation']) { + CustomNavigation.init(); + } + _ref = ['boardNavDesktop', 'boardNavDesktopFoot']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + nav = _ref[_i]; + if (a = $("a[href*='/" + g.BOARD + "/']", $.id(nav))) { + $.addClass(a, 'current'); + } + } + now = Date.now(); + Favicon.init(); + Options.init(); + QR.init(); + MascotTools.init(); + if (_conf['Image Expansion']) { + ImageExpand.init(); + } + if (_conf['Catalog Links']) { + CatalogLinks.init(); + } + if (_conf['Thread Watcher']) { + Watcher.init(); + } + if (_conf['Keybinds']) { + Keybinds.init(); + } + if (_conf['Fappe Tyme']) { + FappeTyme.init(); + } + if (g.REPLY) { + if (_conf['Prefetch']) { + Prefetch.init(); + } + if (_conf['Thread Updater']) { + Updater.init(); + } + if (_conf['Thread Stats']) { + ThreadStats.init(); + } + if (_conf['Reply Navigation']) { + Nav.init(); + } + if (_conf['Post in Title']) { + TitlePost.init(); + } + if (_conf['Unread Count'] || _conf['Unread Favicon']) { + Unread.init(); + } + } else { + if (_conf['Thread Hiding']) { + ThreadHiding.init(); + } + if (_conf['Thread Expansion']) { + ExpandThread.init(); + } + if (_conf['Comment Expansion']) { + ExpandComment.init(); + } + if (_conf['Index Navigation']) { + Nav.init(); + } + } + board = $('.board'); + nodes = []; + ready = function() { + if (d.readyState === "complete") { + return true; + } + return false; + }; + _ref1 = $$('.postContainer', board); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + node = _ref1[_j]; + Main.node(Main.preParse(node), ready); + } + Main.hasCodeTags = !!$('script[src^="//static.4chan.org/js/prettify/prettify"]'); + if (MutationObserver) { + Main.observer = new MutationObserver(Main.observe); + Main.observer.observe(board, { + childList: true, + subtree: true + }); + $.ready(function() { + return Main.observer.disconnect(); + }); + } else { + $.on(board, 'DOMNodeInserted', Main.listener); + $.ready(function() { + return $.off(board, 'DOMNodeInserted', Main.listener); + }); + } + }, + prune: function() { + var cutoff, hiddenThreads, id, now, ownedPosts, timestamp, titles, _ref; + + now = Date.now(); + g.hiddenReplies = $.get("hiddenReplies/" + g.BOARD + "/", {}); + if ($.get('lastChecked', 0) < now - 1 * $.DAY) { + $.set('lastChecked', now); + cutoff = now - 7 * $.DAY; + hiddenThreads = $.get("hiddenThreads/" + g.BOARD + "/", {}); + ownedPosts = $.get('ownedPosts', {}); + titles = $.get('CachedTitles', {}); + for (id in hiddenThreads) { + timestamp = hiddenThreads[id]; + if (timestamp < cutoff) { + delete hiddenThreads[id]; + } + } + _ref = g.hiddenReplies; + for (id in _ref) { + timestamp = _ref[id]; + if (timestamp < cutoff) { + delete g.hiddenReplies[id]; + } + } + for (id in ownedPosts) { + timestamp = ownedPosts[id]; + if (timestamp < cutoff) { + delete ownedPosts[id]; + } + } + for (id in titles) { + if (titles[id][1] < cutoff) { + delete titles[id]; + } + } + $.set("hiddenThreads/" + g.BOARD + "/", hiddenThreads); + $.set("hiddenReplies/" + g.BOARD + "/", g.hiddenReplies); + $.set('CachedTitles', titles); + return $.set('ownedPosts', ownedPosts); + } + }, + 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]; + Main.flatten(key, val); + } + } else { + Conf[parent] = obj; + } + }, + message: function(e) { + var xupdate; + + xupdate = $.el('div', { + id: 'xupdater', + className: 'reply', + innerHTML: "An updated version of Appchan X (v2.0.0) is available. dismiss" + }); + $.on($('#dismiss_xupdate', xupdate), 'click', function() { + return $.rm(xupdate); + }); + return $.prepend($.id('delform'), xupdate); + }, + preParse: function(node) { + var el, img, imgParent, parent, parentClass, post; + + parentClass = (parent = node.parentElement) ? parent.className : ""; + el = $('.post', node); + post = { + root: node, + el: el, + "class": el.className, + ID: el.id.match(/\d+$/)[0], + threadID: g.THREAD_ID || (parent ? $.x('ancestor::div[parent::div[@class="board"]]', node).id.match(/\d+$/)[0] : void 0), + isArchived: parentClass.contains('archivedPost'), + isInlined: /\binline\b/.test(parentClass), + isCrosspost: parentClass.contains('crosspost'), + blockquote: el.lastElementChild, + quotes: el.getElementsByClassName('quotelink'), + backlinks: el.getElementsByClassName('backlink'), + fileInfo: false, + img: false + }; + if (img = $('img[data-md5]', el)) { + imgParent = img.parentNode; + post.img = img; + post.fileInfo = imgParent.previousElementSibling; + post.hasPdf = /\.pdf$/.test(imgParent.href); + } + Main.prettify(post.blockquote); + return post; + }, + node: function(node, notify) { + var callback, err, _i, _len, _ref; + + _ref = Main.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + try { + callback(node); + } catch (_error) { + err = _error; + if (notify) { + alert("AppChan X has experienced an error. You can help by sending this snippet to:\nhttps://github.com/zixaphir/appchan-x/issues\n\n" + Main.version + "\n" + window.location + "\n" + navigator.userAgent + "\n\n" + err + "\n" + err.stack); + } + } + } + }, + observe: function(mutations) { + var addedNode, mutation, nodes, _i, _len, _results; + + nodes = []; + _results = []; + for (_i = 0, _len = mutations.length; _i < _len; _i++) { + mutation = mutations[_i]; + _results.push((function() { + var _j, _len1, _ref, _results1; + + _ref = mutation.addedNodes; + _results1 = []; + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + addedNode = _ref[_j]; + if (/\bpostContainer\b/.test(addedNode.className)) { + _results1.push(Main.node(Main.preParse(addedNode))); + } + } + return _results1; + })()); + } + return _results; + }, + listener: function(e) { + var target; + + target = e.target; + if (/\bpostContainer\b/.test(target.className)) { + return Main.node(Main.preParse(target)); + } + }, + prettify: function(bq) { + var code; + + if (!Main.hasCodeTags) { + return; + } + switch (g.BOARD) { + case 'g': + code = function() { + var pre, _i, _len, _ref; + + _ref = document.getElementById('_id_').getElementsByClassName('prettyprint'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + pre = _ref[_i]; + pre.innerHTML = prettyPrintOne(pre.innerHTML.replace(/\s/g, ' ')); + } + }; + break; + case 'sci': + code = function() { + jsMath.Process(document.getElementById('_id_')); + }; + break; + default: + return; + } + return $.globalEval(("" + code).replace('_id_', bq.id)); + }, + namespace: 'appchan_x.', + version: '1.2.7', + callbacks: [] + }; + + Main.init(); + +}).call(this); \ No newline at end of file diff --git a/builds/appchan-x.zip b/builds/appchan-x.zip new file mode 100644 index 0000000000000000000000000000000000000000..68cfc4e31c2fae965c01c7059dc71422108dc44b GIT binary patch literal 164348 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