diff --git a/README.md b/README.md
index 980fc6b2..4a771895 100644
--- a/README.md
+++ b/README.md
@@ -6,133 +6,15 @@
[paypal-badge]: https://img.shields.io/badge/Paypal-Donate!-%2300457C.svg?logo=paypal&style=flat-square
[paypal-link]: https://paypal.me/ZackRauen
-BandagedBD (Bandaged BetterDiscord) is a fork of the original [BetterDiscord](https://github.com/Jiiks/BetterDiscordApp) by Jiiks. This has a number of improvements over the original which is currently undergoing a full rewrite. In the interim, the current version has been unmaintained hence this fork existing. I will continue to maintain this fork until BDv2 comes out. I am helping to develop BDv2 as well so as release gets closer this fork will become less and less active.
+This branch is for the ongoing rewrite of BandagedBD. You can view what I believe to be left in the TODO.md file.
-# Installation
+# Testing
-### Windows
-Grab the `exe` file from the latest release on the [releases page](https://github.com/rauenzi/BetterDiscordApp/releases).
+The following steps tell you how you can currently test the state of the rewrite as of September 26th 2019.
-### macOS/OS X
-Grab the `zip` file from the latest release on the [releases page](https://github.com/rauenzi/BetterDiscordApp/releases).
-
-### Linux
-See this link: https://gist.github.com/ObserverOfTime/d7e60eb9aa7fe837545c8cb77cf31172
-
-# FAQ
-
-### What is this?
-
-This is a client modification for Discord. You can read more about it in the [original repo](https://github.com/Jiiks/BetterDiscordApp).
-
-### Where can I get plugins and themes?
-
-In our suport servers we have channels with lists of official plugins and themes. Please note we do not have an official listing on a website and are **not affiliated with any of those websites**.
-
-### Support Servers?
-
-Yup we have two of them [this one](https://discord.gg/0Tmfo5ZbORCRqbAd) and [this one](https://discord.gg/2HScm8j)
-
-
-
-
-# Supporters
-
-These people have all subscribed to the `True Supporter` tier on Patreon to support BandagedBD.
-
-
-
-
-
-
-Kraken
-
-
-
-
-
-# Bandagers
-
-These people have all subscribed to the `Bandager` tier on Patreon to support BandagedBD.
-
-
-
'),this.faContainerInner=this.faContainer.querySelector(".emote-menu-inner"),this.observer=new MutationObserver(e=>{for(const t of e)this.observe(t)}),this.enableHideEmojis=this.enableHideEmojis.bind(this),this.disableHideEmojis=this.disableHideEmojis.bind(this),this.updateTwitchEmotes=this.updateTwitchEmotes.bind(this)}async enabled(){this.log("Starting to observe"),this.observer.observe(document.getElementById("app-mount"),{childList:!0,subtree:!0}),this.hideEmojiCancel=this.registerSetting(this.hideEmojisID,this.enableHideEmojis,this.disableHideEmojis),this.hideEmojis&&this.enableHideEmojis(),Ye.emotesLoaded&&this.updateTwitchEmotes(),this.updateFavorites(),g.on("emotes-loaded",this.updateTwitchEmotes)}disabled(){g.off("emotes-loaded",this.updateTwitchEmotes),this.observer.disconnect(),this.disableHideEmojis(),this.hideEmojiCancel&&this.hideEmojiCancel()}enableHideEmojis(){const e=document.querySelector(".emojiPicker-3m1S-j");e&&e.classList.add("bd-qme-hidden")}disableHideEmojis(){const e=document.querySelector(".emojiPicker-3m1S-j");e&&e.classList.remove("bd-qme-hidden")}insertEmote(e){const t=c.getTextArea();c.insertText(t[0]," "==t.val().slice(-1)?t.val()+e:t.val()+" "+e)}favContext(e){e.stopPropagation();const t=e.target.closest(".emote-container").children[0],s=$('
Remove
');s.css({top:e.pageY-$("#bd-qem-favourite-container").offset().top,left:e.pageX-$("#bd-qem-favourite-container").offset().left}),$(t).parent().append(s),s.on("click",e=>{e.preventDefault(),e.stopPropagation(),$(t).remove(),Ye.removeFavorite($(t).attr("title")),this.updateFavorites(),$(document).off("mousedown.emotemenu")}),$(document).on("mousedown.emotemenu",function(e){"removemenu"!=e.target.id&&($("#removemenu").remove(),$(document).off("mousedown.emotemenu"))})}switchMenu(e){let t="string"==typeof e?e:e.target.id;"bd-qem-emojis"==t&&this.hideEmojis&&(t="bd-qem-favourite");const s=$("#bd-qem-twitch"),n=$("#bd-qem-favourite"),i=$("#bd-qem-emojis");switch(s.removeClass("active"),n.removeClass("active"),i.removeClass("active"),$(".emojiPicker-3m1S-j").hide(),$("#bd-qem-favourite-container").hide(),$("#bd-qem-twitch-container").hide(),t){case"bd-qem-twitch":s.addClass("active"),$("#bd-qem-twitch-container").show();break;case"bd-qem-favourite":n.addClass("active"),$("#bd-qem-favourite-container").show();break;case"bd-qem-emojis":i.addClass("active"),$(".emojiPicker-3m1S-j").show(),$(".emojiPicker-3m1S-j input").focus()}t&&(this.lastTab=t)}observe(e){if(!(e.addedNodes.length&&e.addedNodes[0]instanceof Element))return;const t=e.addedNodes[0];if(!t.classList.contains("popout-3sVMXz")||t.classList.contains("popoutLeft-30WmrD")||!t.getElementsByClassName("emojiPicker-3m1S-j").length)return;const s=$(t);this.hideEmojis?s.addClass("bd-qme-hidden"):s.removeClass("bd-qme-hidden"),s.prepend(this.qmeHeader),s.append(this.teContainer),s.append(this.faContainer),this.switchMenu(this.lastTab)}updateTwitchEmotes(){for(;this.teContainerInner.firstChild;)this.teContainerInner.firstChild.remove();for(const e in Ye.getCategory("TwitchGlobal")){if(!Ye.getCategory("TwitchGlobal").hasOwnProperty(e))continue;const t=Ye.getUrl("TwitchGlobal",e),s=xt(e,t,{onClick:this.insertEmote.bind(this,e)});this.teContainerInner.append(s)}}updateFavorites(){for(;this.faContainerInner.firstChild;)this.faContainerInner.firstChild.remove();for(const e in Ye.favorites){const t=Ye.favorites[e],s=xt(e,t,{onClick:this.insertEmote.bind(this,e),onContextMenu:this.favContext.bind(this)});this.faContainerInner.append(s)}Ye.saveFavorites()}},Mt=new class extends _e{get name(){return"EmoteAutocapitalize"}get collection(){return"emotes"}get category(){return"general"}get id(){return"autoCaps"}enabled(){$("body").off(".bdac"),$("body").on("keyup.bdac change.bdac paste.bdac",$(".channelTextArea-1LDbYG textarea:first"),()=>{const e=$(".channelTextArea-1LDbYG textarea:first").val();if(null==e)return;const t=e.split(" ").pop();if(t.length>3){if("danSgame"==t)return;const s=this.capitalize(t.toLowerCase());null!=s&&c.insertText(c.getTextArea()[0],e.replace(t,s))}})}disabled(){$("body").off(".bdac")}capitalize(e){const t=Ye.getCategory("TwitchGlobal");for(const s in t)if(t.hasOwnProperty(s)&&e==(s+"").toLowerCase())return s}};const At=s(1),Dt=s(2);var Nt=new class extends _e{get name(){return"WindowPrefs"}get category(){return"window"}get id(){return"transparency"}get WindowConfigFile(){if(this._windowConfigFile)return this._windowConfigFile;const e=s(0).remote.app,t=e.getAppPath(),n=e.getPath("userData"),i=Dt.resolve(n,e.getVersion(),"modules","discord_desktop_core","injector","config.json"),o=Dt.resolve(t,"..","app","config.json"),r=At.existsSync(o)?o:At.existsSync(i)?i:null;return this._windowConfigFile=r||null}enabled(){this.setWindowPreference("transparent",!0),this.setWindowPreference("backgroundColor",null)}disabled(){this.setWindowPreference("transparent",!1),this.setWindowPreference("backgroundColor","#2f3136")}getAllWindowPreferences(){return this.WindowConfigFile?require(this.WindowConfigFile):{}}getWindowPreference(e){if(this.WindowConfigFile)return this.getAllWindowPreferences()[e]}setWindowPreference(e,t){if(!this.WindowConfigFile)return;const n=this.getAllWindowPreferences();n[e]=t,delete s.c[this.WindowConfigFile],At.writeFileSync(this.WindowConfigFile,JSON.stringify(n,null,4))}};class Ft extends O.Component{render(){return O.createElement("svg",{className:"bd-logo "+this.props.className,height:"100%",width:this.props.size||"16px",viewBox:"0 0 2000 2000",style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}},O.createElement("metadata",null),O.createElement("defs",null,O.createElement("filter",{id:"shadow1"},O.createElement("feDropShadow",{dx:"20",dy:"0",stdDeviation:"20",floodColor:"rgba(0,0,0,0.35)"})),O.createElement("filter",{id:"shadow2"},O.createElement("feDropShadow",{dx:"15",dy:"0",stdDeviation:"20",floodColor:"rgba(255,255,255,0.15)"})),O.createElement("filter",{id:"shadow3"},O.createElement("feDropShadow",{dx:"10",dy:"0",stdDeviation:"20",floodColor:"rgba(0,0,0,0.35)"}))),O.createElement("g",null,O.createElement("path",{style:{filter:"url(#shadow3)"},fill:"#171717",opacity:"1",d:"M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z"}),O.createElement("path",{style:{filter:"url(#shadow2)"},fill:"#3E82E5",opacity:"1",d:"M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z"}),O.createElement("path",{style:{filter:"url(#shadow1)"},fill:"#FFFFFF",opacity:"1",d:"M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z"})))}}var Tt=new class{initialize(){c.suppressErrors(this.patchSocial.bind(this),"BD Social Patch")(),c.suppressErrors(this.patchGuildPills.bind(this),"BD Guild Pills Patch")(),c.suppressErrors(this.patchGuildListItems.bind(this),"BD Guild List Items Patch")(),c.suppressErrors(this.patchGuildSeparator.bind(this),"BD Guild Separator Patch")()}patchSocial(){if(this.socialPatch)return;const e=u.getByDisplayName("TabBar"),t=u.getByDisplayName("Anchor");e&&t&&(this.socialPatch=F.after("ThemeHelper",e.prototype,"render",(e,s,n)=>{const i=n.props.children;if(!i||!i.length)return;if("Separator"!==i[i.length-2].type.displayName)return;if(!i[i.length-1].type.toString().includes("socialLinks"))return;const o=i[i.length-1].type;i[i.length-1].type=function(){const e=o(...arguments);return e.props.children.push(p.React.createElement(t,{className:"bd-social-link",href:"https://github.com/rauenzi/BetterDiscordApp",rel:"author",title:"BandagedBD",target:"_blank"},p.React.createElement(Ft,{size:"16px",className:"bd-social-logo"}))),e}}))}patchGuildListItems(){if(this.guildListItemsPatch)return;const e=p.GuildClasses.listItem.split(" ")[0],t=p.GuildClasses.blobContainer.split(" ")[0],s=c.getReactInstance(document.querySelector(`.${e} .${t}`).parentElement).return.type;s&&(this.guildListItemsPatch=F.after("ThemeHelper",s.prototype,"render",(e,t,s)=>{const n=e.props;return s.props.className+=" bd-guild",n.unread&&(s.props.className+=" bd-unread"),n.selected&&(s.props.className+=" bd-selected"),n.audio&&(s.props.className+=" bd-audio"),n.video&&(s.props.className+=" bd-video"),n.badge&&(s.props.className+=" bd-badge"),n.animatable&&(s.props.className+=" bd-animatable"),s}))}patchGuildPills(){if(this.guildPillPatch)return;const e=u.getModule(e=>e.default&&!e.default.displayName&&e.default.toString&&e.default.toString().includes("translate3d"));e&&(this.guildPillPatch=F.after("ThemeHelper",e,"default",(e,t,s)=>{const n=t[0];return n.unread&&(s.props.className+=" bd-unread"),n.selected&&(s.props.className+=" bd-selected"),n.hovered&&(s.props.className+=" bd-hovered"),s}))}patchGuildSeparator(){if(this.guildSeparatorPatch)return;const e=u.getByDisplayName("Guilds"),t=u.getByProps("renderListItem");if(!t||!e)return;const s=function(){const e=t.Separator(...arguments);return e.props.className+=" bd-guild-separator",e};this.guildSeparatorPatch=F.after("ThemeHelper",e.prototype,"render",(e,t,n)=>{const i=c.findInReactTree(n,e=>e.type&&!e.type.displayName&&"function"==typeof e.type&&c.isEmpty(e.props));i&&(i.type=s)})}};const Bt=p.GuildClasses;function Lt(){}Lt.prototype.setConfig=function(e){Object.assign(i,e)},Lt.prototype.init=async function(){if(i.version Please download the latest version from GitHub");v.initialize(),await P.initialize(),d.log("Startup","Initializing Settings"),A.initialize(),x.initialize(),await this.waitForGuilds(),z.initialize(),Tt.initialize();for(const e in n)n[e].initialize();d.log("Startup","Loading Plugins");const e=Oe.initialize();d.log("Startup","Loading Themes");const t=Ie.initialize();d.log("Startup","Removing Loading Icon"),document.getElementsByClassName("bd-loaderv2")[0].remove(),d.log("Startup","Collecting Startup Errors"),te.showAddonErrors({plugins:e,themes:t})},Lt.prototype.waitForGuilds=function(){return new Promise(e=>{const t=function(){"complete"!=document.readyState&&setTimeout(t,100);const s=Bt.wrapper.split(" ")[0],n=Bt.listItem.split(" ")[0],o=Bt.blobContainer.split(" ")[0];if(document.querySelectorAll(`.${s} .${n} .${o}`).length>0)return e(i.deferLoaded=!0);setTimeout(t,100)};t()})};var jt=new Lt;const $t={get React(){return p.React},get ReactDOM(){return p.ReactDOM},get WindowConfigFile(){if(this._windowConfigFile)return this._windowConfigFile;const e=s(0).remote.app,t=s(2),n=e.getAppPath(),i=e.getPath("userData"),o=t.resolve(i,e.getVersion(),"modules","discord_desktop_core","injector","config.json"),r=t.resolve(n,"..","app","config.json"),a=s(1),l=a.existsSync(r)?r:a.existsSync(o)?o:null;return this._windowConfigFile=l||null},getAllWindowPreferences:function(){return this.WindowConfigFile?require(this.WindowConfigFile):{}},getWindowPreference:function(e){if(this.WindowConfigFile)return this.getAllWindowPreferences()[e]},setWindowPreference:function(e,t){if(!this.WindowConfigFile)return;const n=s(1),i=this.getAllWindowPreferences();i[e]=t,delete s.c[this.WindowConfigFile],n.writeFileSync(this.WindowConfigFile,JSON.stringify(i,null,4))},injectCSS:function(e,t){x.injectStyle(e,t)},clearCSS:function(e){x.removeStyle(e)},linkJS:function(e,t){return x.injectScript(e,t)},unlinkJS:function(e){x.removeScript(e)},alert:function(e,t){te.alert(e,t)},showConfirmationModal:function(e,t,s={}){return te.showConfirmationModal(e,t,s)},showToast:function(e,t={}){_.show(e,t)},findModule:function(e){return u.getModule(e)},findAllModules:function(e){return u.getModule(e,!1)},findModuleByProps:function(...e){return u.getByProps(...e)},findModuleByPrototypes:function(...e){return u.getByPrototypes(...e)},findModuleByDisplayName:function(e){return u.getByDisplayName(e)},getInternalInstance:function(e){if(e instanceof window.jQuery||e instanceof Element)return e instanceof jQuery&&(e=e[0]),c.getReactInstance(e)},loadData:function(e,t){return v.getPluginData(e,t)}};$t.getData=$t.loadData,$t.saveData=function(e,t,s){return v.setPluginData(e,t,s)},$t.setData=$t.saveData,$t.deleteData=function(e,t){return v.deletePluginData(e,t)},$t.monkeyPatch=function(e,t,s){return c.monkeyPatch(e,t,s)},$t.onRemoved=function(e,t){return c.onRemoved(e,t)},$t.suppressErrors=function(e,t){return c.suppressErrors(e,t)},$t.testJSON=function(e){return c.testJSON(e)},$t.getBDData=function(e){return v.getBDData(e)},$t.setBDData=function(e,t){return v.setBDData(e,t)};var zt=$t;s.d(t,"default",function(){return Rt});const Ot=document.createElement("div");Ot.className="bd-loaderv2",Ot.title="BandagedBD is loading...",document.body.appendChild(Ot),window.BdApi=zt,window.pluginModule=Oe,window.themeModule=Ie,window.bdEmotes=Ye.Emotes,window.bemotes=Ye.blacklist,window.settingsModule=A,window.DataStore=v,window.DomManager=x,window.utils=c,window.Components=z,window.BDEvents=g,window.bdConfig=i,window.Strings=M;class Rt{constructor(e){jt.setConfig(e)}init(){jt.init()}}!function(){const e=s(4),t=e._load;e._load=function(e){return"betterdiscord"!==e&&!e.startsWith("betterdiscord/")||"api"!=e.substr("betterdiscord/".length)?t.apply(this,arguments):zt}}()}]).default;
\ No newline at end of file
+var Core=function(e){var t={};function s(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,s),i.l=!0,i.exports}return s.m=e,s.c=t,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)s.d(n,i,function(t){return e[t]}.bind(null,i));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=6)}([function(e,t){e.exports=require("electron")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("request")},function(e,t){e.exports=require("module")},function(e,t){e.exports=require("events")},function(e,t,s){"use strict";s.r(t);var n={};s.r(n),s.d(n,"EmoteModule",function(){return Ye}),s.d(n,"CustomCSS",function(){return it}),s.d(n,"VoiceMode",function(){return ot}),s.d(n,"ClassNormalizer",function(){return at}),s.d(n,"DeveloperMode",function(){return lt}),s.d(n,"PublicServers",function(){return yt}),s.d(n,"DarkMode",function(){return vt}),s.d(n,"MinimalMode",function(){return wt}),s.d(n,"TwentyFourHour",function(){return Ct}),s.d(n,"ColoredText",function(){return Et}),s.d(n,"VoiceDisconnect",function(){return Pt}),s.d(n,"EmoteMenu",function(){return kt}),s.d(n,"EmoteAutocaps",function(){return Mt}),s.d(n,"WindowPrefs",function(){return Nt});var i={local:!1,localServer:"//localhost:8080",minified:!0,version:"0.3.0",branch:"master",repo:"rauenzi",minSupportedVersion:"0.3.0",bbdVersion:"1.0.0"},o=[{type:"category",id:"general",name:"General",collapsible:!0,settings:[{type:"switch",id:"download",value:!0},{type:"switch",id:"emoteMenu",value:!0},{type:"switch",id:"hideEmojiMenu",value:!1,enableWith:"emoteMenu"},{type:"switch",id:"autoCaps",value:!1},{type:"switch",id:"showNames",value:!0},{type:"switch",id:"modifiers",value:!0},{type:"switch",id:"animateOnHover",value:!1}]},{type:"category",id:"categories",name:"Categories",collapsible:!0,settings:[{type:"switch",id:"twitchglobal",value:!0},{type:"switch",id:"twitchsubscriber",value:!1},{type:"switch",id:"frankerfacez",value:!0},{type:"switch",id:"bttv",value:!0}]}],r=[{type:"category",id:"general",collapsible:!0,settings:[{type:"switch",id:"emotes",value:!0},{type:"switch",id:"publicServers",value:!0},{type:"switch",id:"voiceDisconnect",value:!1},{type:"switch",id:"twentyFourHour",value:!1},{type:"switch",id:"classNormalizer",value:!0},{type:"switch",id:"showToasts",value:!0}]},{type:"category",id:"appearance",collapsible:!0,settings:[{type:"switch",id:"voiceMode",value:!1},{type:"switch",id:"minimalMode",value:!1},{type:"switch",id:"hideChannels",value:!1,enableWith:"minimalMode"},{type:"switch",id:"darkMode",value:!0},{type:"switch",id:"coloredText",value:!1}]},{type:"category",id:"addons",collapsible:!0,shown:!1,settings:[{type:"switch",id:"addonErrors",value:!0},{type:"switch",id:"autoScroll",value:!0},{type:"switch",id:"autoReload",value:!0},{type:"dropdown",id:"editAction",value:"detached",options:[{value:"detached"},{value:"system"}]}]},{type:"category",id:"customcss",collapsible:!0,shown:!1,settings:[{type:"switch",id:"customcss",value:!0},{type:"switch",id:"liveUpdate",value:!1},{type:"dropdown",id:"openAction",value:"settings",options:[{value:"settings"},{value:"detached"},{value:"system"}]}]},{type:"category",id:"developer",collapsible:!0,shown:!1,settings:[{type:"switch",id:"developerMode",value:!1},{type:"switch",id:"copySelector",value:!1,enableWith:"developerMode"}]},{type:"category",id:"window",collapsible:!0,shown:!1,settings:[{type:"switch",id:"transparency",value:!1},{type:"switch",id:"frame",value:!1,hidden:!0}]}],a={Panels:{plugins:"Plugins",themes:"Themes",customcss:"Custom CSS"},Collections:{settings:{name:"Settings",general:{name:"General",emotes:{name:"Emote System",note:"Enables BD's emote system"},publicServers:{name:"Public Servers",note:"Display public servers button"},voiceDisconnect:{name:"Voice Disconnect",note:"Disconnect from voice server when closing Discord"},twentyFourHour:{name:"24-Hour Timestamps",note:"Hides channels when in minimal mode"},classNormalizer:{name:"Normalize Classes",note:"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)"},showToasts:{name:"Show Toasts",note:"Shows a small notification for important information"}},appearance:{name:"Appearance",voiceMode:{name:"Voice Mode",note:"Hides everything that isn't voice chat"},minimalMode:{name:"Minimal Mode",note:"Hide elements and reduce the size of elements"},hideChannels:{name:"Hide Channels",note:"Hides channels when in minimal mode"},darkMode:{name:"Dark Mode",note:"Make certain elements dark by default"},coloredText:{name:"Colored Text",note:"Make text colour the same as role color"}},addons:{name:"Addon Manager",addonErrors:{name:"Show Addon Errors",note:"Shows a modal with plugin/theme errors"},autoScroll:{name:"Scroll To Settings",note:"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)"},autoReload:{name:"Automatic Loading",note:"Automatically loads, reloads, and unloads plugins and themes"},editAction:{name:"Edit Action",note:"Where plugins & themes appear when editing",options:{detached:"Detached Window",system:"System Editor"}}},customcss:{name:"Custom CSS",customcss:{name:"Custom CSS",note:"Enables the Custom CSS tab"},liveUpdate:{name:"Live Update",note:"Updates the css as you type"},startDetached:{name:"Start Detached",note:"Clicking the Custom CSS tab opens the editor in a separate window"},nativeOpen:{name:"Open in Native Editor",note:"Clicking the Custom CSS tab opens your custom css in your native editor"},openAction:{name:"Editor Location",note:"Where Custom CSS should open by default",options:{settings:"Settings Menu",detached:"Detached Window",system:"System Editor"}}},developer:{name:"Developer Settings",developerMode:{name:"Developer Mode",note:"Allows activating debugger when pressing F8"},copySelector:{name:"Copy Selector",note:'Adds a "Copy Selector" option to context menus when developer mode is active'}},window:{name:"Window Preferences",transparency:{name:"Enable Transparency",note:"Enables the main window to be see-through (requires restart)"},frame:{name:"Window Frame",note:"Adds the native os window frame to the main window"}}},emotes:{name:"Emotes",general:{name:"General",download:{name:"Download Emotes",note:"Download emotes whenever they are out of date"},emoteMenu:{name:"Emote Menu",note:"Show Twitch/Favourite emotes in emote menu"},hideEmojiMenu:{name:"Hide Emoji Menu",note:"Hides Discord's emoji menu when using emote menu"},autoCaps:{name:"Emote Autocapitalization",note:"Autocapitalize emote commands"},showNames:{name:"Show Names",note:"Show emote names on hover"},modifiers:{name:"Show Emote Modifiers",note:"Enable emote mods (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"},animateOnHover:{name:"Animate On Hover",note:"Only animate the emote modifiers on hover"}},categories:{name:"Categories",twitchglobal:{name:"Twitch Globals",note:"Show Twitch global emotes"},twitchsubscriber:{name:"Twitch Subscribers",note:"Show Twitch subscriber emotes"},frankerfacez:{name:"FrankerFaceZ",note:"Show emotes from FFZ"},bttv:{name:"BetterTTV",note:"Show emotes from BTTV"}}}},Addons:{title:"{{name}} v{{version}} by {{author}}",openFolder:"Open {{type}} Folder",reload:"Reload",addonSettings:"Settings",website:"Website",source:"Source",server:"Support Server",donate:"Donate",name:"Name",author:"Author",version:"Version",added:"Date Added",modified:"Date Modified",search:"Search {{type}}",editAddon:"Edit",deleteAddon:"Delete",confirmDelete:"Are you sure you want to delete {{name}}?",confirmationText:"You have unsaved changes to {{name}}. Closing this window will lose all those changes."},Emotes:{loading:"Loading emotes in the background do not reload.",loaded:"All emotes successfully loaded.",clearEmotes:"Clear Emote Data",favoriteAction:"Favorite!"},CustomCSS:{confirmationText:"You have unsaved changes to your Custom CSS. Closing this window will lose all those changes.",update:"Update",save:"Save",openNative:"Open in System Editor",openDetached:"Detach Window",settings:"Editor Settings",editorTitle:"Custom CSS Editor"},PublicServers:{button:"public",join:"Join",joining:"Joining",joined:"Joined",loading:"Loading",loadMore:"Load More",notConnected:"Not connected to DiscordServers.com!",search:"Search",connect:"Connect",reconnect:"Reconnect",categories:"Categories",connection:"Connected as: {{username}}#{{discriminator}}",results:"Showing {{start}}-{{end}} of {{total}} results in {{category}}",query:"for {{query}}"},Modals:{confirmAction:"Are You Sure?",okay:"Okay",cancel:"Cancel",close:"Close",name:"Name",message:"Message",error:"Error",addonErrors:"Addon Errors"},Sorting:{sortBy:"Sort By",order:"Order",ascending:"Ascending",descending:"Descending"}};const l={err:"error",error:"error",dbg:"debug",debug:"debug",log:"log",warn:"warn",info:"info"};class d{static stacktrace(e,t,s){console.error(`%c[${e}]%c ${t}\n\n%c`,"color: #3a71c1; font-weight: 700;","color: red; font-weight: 700;","color: red;",s)}static err(e,...t){d._log(e,t,"error")}static warn(e,...t){d._log(e,t,"warn")}static info(e,...t){d._log(e,t,"info")}static debug(e,...t){d._log(e,t,"debug")}static log(e,...t){d._log(e,t)}static _log(e,t,s="log"){s=d.parseType(s),Array.isArray(t)||(t=[t]),console[s](`%c[BandagedBD]%c [${e}]%c`,"color: #3E82E5; font-weight: 700;","color: #3a71c1;","",...t)}static parseType(e){return l.hasOwnProperty(e)?l[e]:"log"}}class c{static repoUrl(e){return`https://cdn.staticaly.com/gh/${i.repo}/BetterDiscordApp/${i.hash}/${e}`}static parseHTML(e,t=!1){const s=document.createElement("template");s.innerHTML=e;const n=s.content.cloneNode(!0);return t?n:n.childNodes.length>1?n.childNodes:n.childNodes[0]}static getTextArea(){return $(".channelTextArea-1LDbYG textarea")}static insertText(e,t){e.focus(),e.selectionStart=0,e.selectionEnd=e.value.length,document.execCommand("insertText",!1,t)}static escape(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}static testJSON(e){try{return JSON.parse(e)}catch(e){return!1}}static suppressErrors(e,t){return(...s)=>{try{return e(...s)}catch(e){d.stacktrace("SuppressedError","Error occurred in "+t,e)}}}static onRemoved(e,t){const s=new MutationObserver(n=>{for(let i=0;i-1,l=r.some(t=>t.contains(e));(a||l)&&(s.disconnect(),t())}});s.observe(document.body,{subtree:!0,childList:!0})}static isEmpty(e){if(null==e||null==e||""==e)return!0;if("object"!=typeof e)return!1;if(Array.isArray(e))return 0==e.length;for(const t in e)if(e.hasOwnProperty(t))return!1;return!0}static memoizeObject(e){const t=new Proxy(e,{get:function(e,t){if(e.hasOwnProperty(t)){if(Object.getOwnPropertyDescriptor(e,t).get){const s=e[t];delete e[t],e[t]=s}return e[t]}},set:function(e,t,s){return e.hasOwnProperty(t)?d.error("MemoizedObject","Trying to overwrite existing property"):(e[t]=s,e[t])}});return Object.defineProperty(t,"hasOwnProperty",{value:function(e){return void 0!==this[e]}}),t}static extend(e,...t){for(let s=0;se.startsWith("__reactInternalInstance"))]||null}static getOwnerInstance(e,{include:t,exclude:s=["Popout","Tooltip","Scroller","BackgroundFlash"],filter:n=(e=>e)}={}){if(void 0===e)return;const i=void 0===t,o=i?s:t;function r(e){const t=function(e){const t=e.type;return t&&(t.displayName||t.name)||null}(e);return null!==t&&!!(o.includes(t)^i)}let a=this.getReactInstance(e);for(a=a&&a.return;null!==a;a=a.return){if(null===a)continue;const e=a.stateNode;if(null!==a&&!(e instanceof HTMLElement)&&r(a)&&n(e))return e}return null}}class h{static byProperties(e,t=(e=>e)){return s=>{const n=t(s);return!!n&&e.every(e=>void 0!==n[e])}}static byPrototypeFields(e,t=(e=>e)){return s=>{const n=t(s);return!!n&&(!!n.prototype&&e.every(e=>void 0!==n.prototype[e]))}}static byCode(e,t=(e=>e)){return s=>{const n=t(s);return!!n&&-1!==n.toString([]).search(e)}}static byString(...e){return t=>{const s=t.toString([]);for(const t of e)if(!s.includes(t))return!1;return!0}}static byDisplayName(e){return t=>t&&t.displayName===e}static combine(...e){return t=>e.every(e=>e(t))}}class u{static find(e,t=!0){return this.getModule(e,t)}static findAll(e){return this.getModule(e,!1)}static findByUniqueProperties(e,t=!0){return t?this.getByProps(...e):this.getAllByProps(...e)}static findByDisplayName(e){return this.getByDisplayName(e)}static getModule(e,t=!0){const s=this.getAllModules(),n=[];for(const i in s){if(!s.hasOwnProperty(i))continue;const o=s[i],{exports:r}=o;let a=null;if(r&&(r.__esModule&&r.default&&e(r.default)&&(a=r.default),e(r)&&(a=r),a)){if(t)return a;n.push(a)}}return t||0==n.length?void 0:n}static getModules(e){return this.getModule(e,!1)}static getByDisplayName(e){return this.getModule(h.byDisplayName(e),!0)}static getByRegex(e,t=!0){return this.getModule(h.byCode(e),t)}static getByPrototypes(...e){return this.getModule(h.byPrototypeFields(e),!0)}static getAllByPrototypes(...e){return this.getModule(h.byPrototypeFields(e),!1)}static getByProps(...e){return this.getModule(h.byProperties(e),!0)}static getAllByProps(...e){return this.getModule(h.byProperties(e),!1)}static getByString(...e){return this.getModule(h.byString(...e),!0)}static getAllByString(...e){return this.getModule(h.byString(...e),!1)}static get require(){if(this._require)return this._require;const e="bbd-webpackmodules",t="function"==typeof window.webpackJsonp?window.webpackJsonp([],{[e]:(e,t,s)=>t.default=s},[e]).default:window.webpackJsonp.push([[],{[e]:(e,t,s)=>e.exports=s},[[e]]]);return delete t.m[e],delete t.c[e],this._require=t}static getAllModules(){return this.require.c}}var p=c.memoizeObject({get React(){return u.getByProps("createElement","cloneElement")},get ReactDOM(){return u.getByProps("render","findDOMNode")},get Flux(){return u.getByProps("connectStores")},get Events(){return u.getByPrototypes("setMaxListeners","emit")},get GuildStore(){return u.getByProps("getGuild")},get SortedGuildStore(){return u.getByProps("getSortedGuilds")},get SelectedGuildStore(){return u.getByProps("getLastSelectedGuildId")},get GuildSync(){return u.getByProps("getSyncedGuilds")},get GuildInfo(){return u.getByProps("getAcronym")},get GuildChannelsStore(){return u.getByProps("getChannels","getDefaultChannel")},get GuildMemberStore(){return u.getByProps("getMember")},get MemberCountStore(){return u.getByProps("getMemberCounts")},get GuildEmojiStore(){return u.getByProps("getEmojis")},get GuildActions(){return u.getByProps("markGuildAsRead")},get GuildPermissions(){return u.getByProps("getGuildPermissions")},get ChannelStore(){return u.getByProps("getChannels","getDMFromUserId")},get SelectedChannelStore(){return u.getByProps("getLastSelectedChannelId")},get ChannelActions(){return u.getByProps("selectChannel")},get PrivateChannelActions(){return u.getByProps("openPrivateChannel")},get ChannelSelector(){return u.getByProps("selectGuild","selectChannel")},get UserInfoStore(){return u.getByProps("getToken")},get UserSettingsStore(){return u.getByProps("guildPositions")},get AccountManager(){return u.getByProps("register","login")},get UserSettingsUpdater(){return u.getByProps("updateRemoteSettings")},get OnlineWatcher(){return u.getByProps("isOnline")},get CurrentUserIdle(){return u.getByProps("getIdleTime")},get RelationshipStore(){return u.getByProps("isBlocked","getFriendIDs")},get RelationshipManager(){return u.getByProps("addRelationship")},get MentionStore(){return u.getByProps("getMentions")},get UserStore(){return u.getByProps("getCurrentUser")},get UserStatusStore(){return u.getByProps("getStatus","getState")},get UserTypingStore(){return u.getByProps("isTyping")},get UserActivityStore(){return u.getByProps("getActivity")},get UserNameResolver(){return u.getByProps("getName")},get UserNoteStore(){return u.getByProps("getNote")},get UserNoteActions(){return u.getByProps("updateNote")},get EmojiInfo(){return u.getByProps("isEmojiDisabled")},get EmojiUtils(){return u.getByProps("getGuildEmoji")},get EmojiStore(){return u.getByProps("getByCategory","EMOJI_NAME_RE")},get InviteStore(){return u.getByProps("getInvites")},get InviteResolver(){return u.getByProps("findInvite")},get InviteActions(){return u.getByProps("acceptInvite")},get DiscordConstants(){return u.getByProps("Permissions","ActivityTypes","StatusTypes")},get DiscordPermissions(){return u.getByProps("Permissions","ActivityTypes","StatusTypes").Permissions},get PermissionUtils(){return u.getByProps("getHighestRole")},get ColorConverter(){return u.getByProps("hex2int")},get ColorShader(){return u.getByProps("darken")},get TinyColor(){return u.getByPrototypes("toRgb")},get ClassResolver(){return u.getByProps("getClass")},get ButtonData(){return u.getByProps("ButtonSizes")},get IconNames(){return u.getByProps("IconNames")},get NavigationUtils(){return u.getByProps("transitionTo","replaceWith","getHistory")},get MessageStore(){return u.getByProps("getMessages")},get MessageActions(){return u.getByProps("jumpToMessage","_sendMessage")},get MessageQueue(){return u.getByProps("enqueue")},get MessageParser(){return u.getByProps("createMessage","parse","unparse")},get hljs(){return u.getByProps("highlight","highlightBlock")},get SimpleMarkdown(){return u.getByProps("parseBlock","parseInline","defaultOutput")},get ExperimentStore(){return u.getByProps("getExperimentOverrides")},get ExperimentsManager(){return u.getByProps("isDeveloper")},get CurrentExperiment(){return u.getByProps("getExperimentId")},get ImageResolver(){return u.getByProps("getUserAvatarURL","getGuildIconURL")},get ImageUtils(){return u.getByProps("getSizedImageSrc")},get AvatarDefaults(){return u.getByProps("getUserAvatarURL","DEFAULT_AVATARS")},get WindowInfo(){return u.getByProps("isFocused","windowSize")},get TagInfo(){return u.getByProps("VALID_TAG_NAMES")},get DOMInfo(){return u.getByProps("canUseDOM")},get LocaleManager(){return u.getByProps("setLocale")},get Moment(){return u.getByProps("parseZone")},get LocationManager(){return u.getByProps("createLocation")},get Timestamps(){return u.getByProps("fromTimestamp")},get TimeFormatter(){return u.getByProps("dateFormat")},get Strings(){return u.getByProps("Messages").Messages},get StringFormats(){return u.getByProps("a","z")},get StringUtils(){return u.getByProps("toASCII")},get URLParser(){return u.getByProps("Url","parse")},get ExtraURLs(){return u.getByProps("getArticleURL")},get DNDActions(){return u.getByProps("beginDrag")},get DNDSources(){return u.getByProps("addTarget")},get DNDObjects(){return u.getByProps("DragSource")},get MediaDeviceInfo(){return u.getByProps("Codecs","SUPPORTED_BROWSERS")},get MediaInfo(){return u.getByProps("getOutputVolume")},get MediaEngineInfo(){return u.getByProps("MediaEngineFeatures")},get VoiceInfo(){return u.getByProps("EchoCancellation")},get VideoStream(){return u.getByProps("getVideoStream")},get SoundModule(){return u.getByProps("playSound")},get ElectronModule(){return u.getByProps("setBadge")},get Dispatcher(){return u.getByProps("dirtyDispatch")},get PathUtils(){return u.getByProps("hasBasename")},get NotificationModule(){return u.getByProps("showNotification")},get RouterModule(){return u.getByProps("Router")},get APIModule(){return u.getByProps("getAPIBaseURL")},get AnalyticEvents(){return u.getByProps("AnalyticEventConfigs")},get KeyGenerator(){return u.getByRegex(/"binary"/)},get Buffers(){return u.getByProps("Buffer","kMaxLength")},get DeviceStore(){return u.getByProps("getDevices")},get SoftwareInfo(){return u.getByProps("os")},get CurrentContext(){return u.getByProps("setTagsContext")},get GuildClasses(){const e=u.getByProps("wrapper","unreadMentionsBar"),t=u.getByProps("guildsError","selected"),s=u.getByProps("blobContainer");return Object.assign({},e,t,s)}});const m=s(5);var g=new class extends m{constructor(){super(),this.setMaxListeners(20)}dispatch(e,...t){this.emit(e,...t)}};const f=s(1),b=s(2),y=DiscordNative.globals.releaseChannel;var v=new class{constructor(){this.data={misc:{}},this.pluginData={},this.cacheData={}}initialize(){f.existsSync(this.baseFolder)||f.mkdirSync(this.baseFolder),f.existsSync(this.dataFolder)||f.mkdirSync(this.dataFolder),f.existsSync(this.localeFolder)||f.mkdirSync(this.localeFolder),f.existsSync(this.emoteFolder)||f.mkdirSync(this.emoteFolder),f.existsSync(this.cacheFile)||f.writeFileSync(this.cacheFile,JSON.stringify({})),f.existsSync(this.customCSS)||f.writeFileSync(this.customCSS,"");const e=f.readdirSync(this.dataFolder).filter(e=>!f.statSync(b.resolve(this.dataFolder,e)).isDirectory()&&e.endsWith(".json"));for(const t of e)this.data[t.split(".")[0]]=require(b.resolve(this.dataFolder,t));this.cacheData=c.testJSON(f.readFileSync(this.cacheFile).toString())||{}}get customCSS(){return this._customCSS||(this._customCSS=b.resolve(this.dataFolder,"custom.css"))}get baseFolder(){return this._baseFolder||(this._baseFolder=b.resolve(i.dataPath,"data"))}get dataFolder(){return this._dataFolder||(this._dataFolder=b.resolve(this.baseFolder,`${y}`))}get localeFolder(){return this._localeFolder||(this._localeFolder=b.resolve(this.baseFolder,"locales"))}get emoteFolder(){return this._emoteFolder||(this._emoteFolder=b.resolve(this.baseFolder,"emotes"))}get cacheFile(){return this._cacheFile||(this._cacheFile=b.resolve(this.baseFolder,".cache"))}getPluginFile(e){return b.resolve(i.dataPath,"plugins",e+".config.json")}_getFile(e){return"settings"==e||"plugins"==e||"themes"==e?b.resolve(this.dataFolder,`${e}.json`):b.resolve(this.dataFolder,"misc.json")}getBDData(e){return this.data.misc[e]||""}setBDData(e,t){this.data.misc[e]=t,f.writeFileSync(b.resolve(this.dataFolder,"misc.json"),JSON.stringify(this.data.misc,null,4))}getLocale(e){const t=b.resolve(this.localeFolder,`${e}.json`);return f.existsSync(t)?c.testJSON(f.readFileSync(t).toString()):null}saveLocale(e,t){f.writeFileSync(b.resolve(this.localeFolder,`${e}.json`),JSON.stringify(t,null,4))}getCacheHash(e,t){return this.cacheData[e]&&f.existsSync(b.resolve(this.baseFolder,e,`${t}.json`))&&this.cacheData[e][t]||""}setCacheHash(e,t,s){this.cacheData[e]||(this.cacheData[e]={}),this.cacheData[e][t]=s,f.writeFileSync(this.cacheFile,JSON.stringify(this.cacheData))}invalidateCache(e,t){this.cacheData[e]&&(delete this.cacheData[e][t],f.writeFileSync(this.cacheFile,JSON.stringify(this.cacheData)))}emotesExist(e){return f.existsSync(b.resolve(this.emoteFolder,`${e}.json`))}getEmoteData(e){const t=b.resolve(this.emoteFolder,`${e}.json`);return f.existsSync(t)?c.testJSON(f.readFileSync(t).toString()):null}saveEmoteData(e,t){f.writeFileSync(b.resolve(this.emoteFolder,`${e}.json`),JSON.stringify(t))}getData(e){return this.data[e]||""}setData(e,t){this.data[e]=t,f.writeFileSync(b.resolve(this.dataFolder,`${e}.json`),JSON.stringify(t,null,4))}loadCustomCSS(){return f.readFileSync(this.customCSS).toString()}saveCustomCSS(e){return f.writeFileSync(this.customCSS,e)}getPluginData(e,t){return void 0!==this.pluginData[e]?this.pluginData[e][t]||void 0:f.existsSync(this.getPluginFile(e))?(this.pluginData[e]=JSON.parse(f.readFileSync(this.getPluginFile(e))),this.pluginData[e][t]||void 0):void 0}setPluginData(e,t,s){void 0!==s&&(void 0===this.pluginData[e]&&(this.pluginData[e]={}),this.pluginData[e][t]=s,f.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4)))}deletePluginData(e,t){void 0===this.pluginData[e]&&(this.pluginData[e]={}),delete this.pluginData[e][t],f.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4))}};const w=s(3),{Dispatcher:C,DiscordConstants:S,UserSettingsStore:E}=p;var P=new class{get discordLocale(){return E.locale.split("-")[0]}get defaultLocale(){return"en"}constructor(){this.locale="",this.strings={}}async initialize(){await this.setLocale(this.discordLocale),C.subscribe(S.ActionTypes.USER_SETTINGS_UPDATE,({settings:e})=>{const t=e.locale;t&&t!=this.locale&&this.setLocale(t.split("-")[0])})}async setLocale(e){let t;if(e!=this.defaultLocale){if(!(t=await this.getLocaleStrings(e)))return this.setLocale(this.defaultLocale)}else t=a;this.locale=e,c.extend(this.strings,t),g.emit("strings-updated")}async getLocaleStrings(e){const t=v.getCacheHash("locales",e);if(!t)return await this.downloadLocale(e);const s=await this.downloadLocale(e,t);return s||v.getLocale(e)}downloadLocale(e,t=""){return new Promise(s=>{const n={url:c.repoUrl(`data/locales/${e}.json`),timeout:2e3,json:!0};t&&(n.headers={"If-None-Match":t}),w.get(n,(t,n,i)=>{if(t||200!==n.statusCode)return s(null);v.saveLocale(e,i),v.setCacheHash("locales",e,n.headers.etag),s(i)})})}};class x{static get bdHead(){return this.getElement("bd-head")}static get bdBody(){return this.getElement("bd-body")}static get bdScripts(){return this.getElement("bd-scripts")}static get bdStyles(){return this.getElement("bd-styles")}static get bdThemes(){return this.getElement("bd-themes")}static get bdCustomCSS(){return this.getElement("#customcss")}static initialize(){this.createElement("bd-head",{target:document.head}),this.createElement("bd-body",{target:document.body}),this.createElement("bd-scripts",{target:this.bdHead}),this.createElement("bd-styles",{target:this.bdHead}),this.createElement("bd-themes",{target:this.bdHead}),this.createElement("style",{id:"customcss",target:this.bdHead})}static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static getElement(e,t=document){return e instanceof Node?e:t.querySelector(e)}static createElement(e,t={}){const{className:s,id:n,target:i}=t,o=document.createElement(e);return s&&(o.className=s),n&&(o.id=n),i&&this.getElement(i).append(o),o}static removeStyle(e){e=this.escapeID(e);const t=this.getElement(`#${e}`,this.bdStyles);t&&t.remove()}static injectStyle(e,t){e=this.escapeID(e);const s=this.getElement(`#${e}`,this.bdStyles)||this.createElement("style",{id:e});s.textContent=t,this.bdStyles.append(s)}static removeTheme(e){e=this.escapeID(e);const t=this.getElement(`#${e}`,this.bdThemes);t&&t.remove()}static injectTheme(e,t){e=this.escapeID(e);const s=this.getElement(`#${e}`,this.bdThemes)||this.createElement("style",{id:e});s.textContent=t,this.bdThemes.append(s)}static updateCustomCSS(e){this.bdCustomCSS.textContent=e}static removeScript(e){e=this.escapeID(e);const t=this.getElement(`#${e}`,this.bdScripts);t&&t.remove()}static injectScript(e,t){return e=this.escapeID(e),new Promise(s=>{const n=this.getElement(`#${e}`,this.bdScripts)||this.createElement("script",{id:e});n.src=t,n.onload=s,this.bdScripts.append(n)})}}class k extends String{format(e){return c.formatString(this,e)}}var M=new Proxy(P.strings,{get:function(e,t){return e.hasOwnProperty(t)?new Proxy(e[t],{get:function(e,t){return"string"==typeof e[t]?new k(e[t]):e[t]}}):new Proxy({},{get:function(){return`String group "${t}" not found.`}})}}),A=new class{constructor(){this.state={},this.collections=[],this.panels=[],this.updateStrings=this.updateStrings.bind(this)}initialize(){this.registerCollection("settings","Settings",r),g.on("strings-updated",this.updateStrings)}registerCollection(e,t,s,n=null){if(this.collections.find(t=>t.id==e))return d.error("Settings","Already have a collection with id "+e);this.collections.push({type:"collection",id:e,name:t,settings:s,button:n}),this.setupCollection(e),this.loadCollection(e),this.updateStrings()}removeCollection(e){const t=this.collections.findIndex(t=>t.id==e);if(!t<0)return d.error("Settings","No collection with id "+e);this.collections.splice(t,1)}registerPanel(e,t,s){if(this.panels.find(t=>t.id==e))return d.error("Settings","Already have a panel with id "+e);const{element:n,onClick:i,order:o=1}=s,r={id:e,order:o,label:t,section:e};i&&(r.clickListener=i),n&&(r.element=n instanceof p.React.Component?()=>p.React.createElement(n,{}):"function"==typeof n?n:()=>n),this.panels.push(r)}removePanel(e){const t=this.panels.findIndex(t=>t.id==e);if(!t<0)return d.error("Settings","No collection with id "+e);this.panels.splice(t,1)}getPath(e,t="",s=""){return{collection:3==e.length?e[0]:t,category:3==e.length?e[1]:2==e.length?e[0]:s,setting:e[e.length-1]}}setupCollection(e){const t=this.collections.find(t=>t.id==e);if(!t)return;const s=t.settings;this.state[t.id]||(this.state[t.id]={});for(let e=0;e{const e=this.state[o.collection][o.category][o.setting];return s.enableWith?!e:e}})}}}}saveSettings(){for(const e in this.state)this.saveCollection(e)}loadSettings(){for(const e in this.state)this.loadCollection(e)}saveCollection(e){v.setData(e,this.state[e])}loadCollection(e){const t=v.getData(e);if(!t)return this.saveCollection(e);for(const s in this.state[e]){t[s]||Object.assign(t,{[s]:this.state[e][s]});for(const n in this.state[e][s]){if(null==t[s][n])continue;const i=this.getSetting(e,s,n);if("switch"==i.type&&(this.state[e][s][n]=t[s][n]),"dropdown"==i.type){i.options.some(e=>e.value==t[s][n])&&(this.state[e][s][n]=t[s][n])}}}this.saveCollection(e)}onSettingChange(e,t,s,n){this.state[e][t][s]=n,g.dispatch("setting-updated",e,t,s,n),this.saveCollection(e)}getSetting(e,t,s){return 2==arguments.length?this.collections[0].find(e=>e.id==arguments[0]).settings.find(e=>e.id==arguments[1]):this.collections.find(t=>t.id==e).settings.find(e=>e.id==t).settings.find(e=>e.id==s)}get(e,t,s){return 2==arguments.length&&(s=t,t=e,e="settings"),!(!this.state[e]||!this.state[e][t])&&this.state[e][t][s]}set(e,t,s,n){return 3==arguments.length&&(n=s,s=t,t=e,e="settings"),this.onSettingChange(e,t,s,n)}on(e,t,s,n){const i=(i,o,r,a)=>{i===e&&o===t&&r===s&&n(a)};return g.on("setting-updated",i),()=>{g.off("setting-updated",i)}}updateStrings(){for(let e=0;e"before"===e.type))try{t.callback(this,arguments)}catch(s){d.err("Patcher",`Could not fire before callback of ${e.functionName} for ${t.caller}`,s)}const s=e.children.filter(e=>"instead"===e.type);if(s.length)for(const n of s)try{const s=n.callback(this,arguments,e.originalFunction.bind(this));void 0!==s&&(t=s)}catch(t){d.err("Patcher",`Could not fire instead callback of ${e.functionName} for ${n.caller}`,t)}else t=e.originalFunction.apply(this,arguments);for(const s of e.children.filter(e=>"after"===e.type))try{const n=s.callback(this,arguments,t);void 0!==n&&(t=n)}catch(t){d.err("Patcher",`Could not fire after callback of ${e.functionName} for ${s.caller}`,t)}return t}}static rePatch(e){e.proxyFunction=e.module[e.functionName]=this.makeOverride(e)}static makePatch(e,t,s){const n={name:s,module:e,functionName:t,originalFunction:e[t],proxyFunction:null,revert:()=>{n.module[n.functionName]=n.originalFunction,n.proxyFunction=null,n.children=[]},counter:0,children:[]};return n.proxyFunction=e[t]=this.makeOverride(n),this.patches.push(n),n}static before(e,t,s,n,i={}){return this.pushChildPatch(e,t,s,n,Object.assign(i,{type:"before"}))}static after(e,t,s,n,i={}){return this.pushChildPatch(e,t,s,n,Object.assign(i,{type:"after"}))}static instead(e,t,s,n,i={}){return this.pushChildPatch(e,t,s,n,Object.assign(i,{type:"instead"}))}static pushChildPatch(e,t,s,n,i={}){const{type:o="after",forcePatch:r=!0}=i,a=this.resolveModule(t);if(!a)return null;if(!a[s]&&r&&(a[s]=function(){}),!(a[s]instanceof Function))return null;"string"==typeof t&&(i.displayName=t);const l=`${i.displayName||a.displayName||a.name||a.constructor.displayName||a.constructor.name}.${s}`,d=this.patches.find(e=>e.module==a&&e.functionName==s)||this.makePatch(a,s,l);d.proxyFunction||this.rePatch(d);const c={caller:e,type:o,id:d.counter,callback:n,unpatch:()=>{if(d.children.splice(d.children.findIndex(e=>e.id===c.id&&e.type===o),1),d.children.length<=0){const e=this.patches.findIndex(e=>e.module==a&&e.functionName==s);this.patches[e].revert(),this.patches.splice(e,1)}}};return d.children.push(c),d.counter++,c.unpatch}}const T=p.React,B={},L=new Set,j=new Set;var z=new class{get named(){return B}get unknown(){return L}get listeners(){return j}constructor(){F.after("ReactComponents",T,"createElement",(e,t,s)=>{this.walkRenderTree(s)}),F.instead("ReactComponents",T.Component.prototype,"componentWillMount",e=>{this.addComponent(e.constructor)}),F.instead("ReactComponents",T.Component.prototype,"UNSAFE_componentWillMount",e=>{this.addComponent(e.constructor)}),F.instead("ReactComponents",T.PureComponent.prototype,"componentWillMount",e=>{this.addComponent(e.constructor)}),F.instead("ReactComponents",T.PureComponent.prototype,"UNSAFE_componentWillMount",e=>{this.addComponent(e.constructor)})}initialize(){this.walkReactTree(document.querySelector("#app-mount")._reactRootContainer._internalRoot.current)}get(e,t){return new Promise(s=>{if(B[e])return s(B[e]);if(j.add({name:e,filter:t,resolve:s}),t)for(const s of L)t(s)&&(s.displayName=e,L.delete(s),this.addNamedComponent(s))})}addNamedComponent(e){const t=e.displayName;if(!B[t]){B[t]=e;for(const s of j)s.name===t&&(s.resolve(e),j.delete(s))}}addUnknownComponent(e){if(!L.has(e)){for(const t of j)t.filter&&t.filter(e)&&(e.displayName=t.name,this.addNamedComponent(e));e.displayName||L.add(e)}}addComponent(e){return e.displayName?this.addNamedComponent(e):this.addUnknownComponent(e)}walkRenderTree(e){if(e){if("function"==typeof e.type&&this.addComponent(e.type),Array.isArray(e))for(const t of e)this.walkRenderTree(t);e.props&&e.props.children&&this.walkRenderTree(e.props.children)}}walkReactTree(e){e&&("function"==typeof e.type&&this.addComponent(e.type),e.child&&this.walkReactTree(e.child),e.sibling&&this.walkReactTree(e.sibling))}};const O=p.React,R=(p.ReactDOM,u.getByProps("sidebar","hasNotice").sidebar.split(" ")[0]),I=u.getByProps("membersWrap").membersWrap.split(" ")[0];class _{static get shouldShowToasts(){return A.get("settings","general","showToasts")}static async success(e,t={}){return this.show(e,Object.assign(t,{type:"success"}))}static async info(e,t={}){return this.show(e,Object.assign(t,{type:"info"}))}static async warning(e,t={}){return this.show(e,Object.assign(t,{type:"warning"}))}static async error(e,t={}){return this.show(e,Object.assign(t,{type:"error"}))}static async default(e,t={}){return this.show(e,Object.assign(t,{type:""}))}static show(e,t={}){const{type:s="",icon:n=!0,timeout:i=3e3,forceShow:o=!1}=t;if(!this.shouldShowToasts&&!o)return;this.ensureContainer();const r=document.createElement("div");r.classList.add("bd-toast"),s&&r.classList.add("toast-"+s),s&&n&&r.classList.add("icon"),r.innerText=e,document.querySelector(".bd-toasts").appendChild(r),setTimeout(()=>{r.classList.add("closing"),setTimeout(()=>{r.remove(),document.querySelectorAll(".bd-toasts .bd-toast").length||document.querySelector(".bd-toasts").remove()},300)},i)}static ensureContainer(){if(document.querySelector(".bd-toasts"))return;const e=document.querySelector(`.${R} + div`),t=e.querySelector(`.${I}`),s=e?e.querySelector("form"):null,n=e?e.getBoundingClientRect().left:310,i=t?t.getBoundingClientRect().left:0,o=i?i-e.getBoundingClientRect().left:e.offsetWidth,r=s?s.offsetHeight:80,a=document.createElement("div");a.classList.add("bd-toasts"),a.style.setProperty("left",n+"px"),a.style.setProperty("width",o+"px"),a.style.setProperty("bottom",r+"px"),document.querySelector("#app-mount").appendChild(a)}}class q extends O.Component{constructor(e){super(e),this.onClick=this.onClick.bind(this),this.state={checked:this.props.checked||!1}}render(){return O.createElement("div",{className:"checkbox-item"},O.createElement("div",{className:"checkbox-label label-JWQiNe da-label"},this.props.text),O.createElement("div",{className:"checkbox-wrapper checkbox-3kaeSU da-checkbox checkbox-3EVISJ da-checkbox",onClick:this.onClick},O.createElement("div",{className:"checkbox-inner checkboxInner-3yjcPe da-checkboxInner"},O.createElement("input",{className:"checkbox checkboxElement-1qV33p da-checkboxElement",checked:this.state.checked,type:"checkbox"}),O.createElement("span",null)),O.createElement("span",null)))}onClick(){this.props.onChange(!this.state.checked),this.setState({checked:!this.state.checked})}}function H(){return(H=Object.assign||function(e){for(var t=1;t{for(const s of e){if(!(s.addedNodes.length&&s.addedNodes[0]instanceof Element))continue;const e=s.addedNodes[0];e.parentElement===document.body&&e.querySelector("#ace_settingsmenu")&&(e.id="ace_settingsmenu_container",t.disconnect())}});t.observe(document.body,{childList:!0})};const t=this.props.theme==V.defaultProps.theme?this.props.theme.split("-")[1]:this.props.theme;this.editor.setTheme(`ace/theme/${t}`),this.editor.session.setMode(`ace/mode/${this.props.language}`),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(this.props.fontSize),this.editor.on("change",this.onChange)}componentWillUnmount(){this.editor.destroy()}get value(){return this.editor.session.getValue()}set value(e){this.editor.setValue(e)}onChange(){this.props.onChange&&this.props.onChange(this.value)}showSettings(){return this.editor.keyBinding.$defaultHandler.commands.showSettingsMenu.exec(this.editor)}resize(){return this.editor.resize()}buildControl(e){return"checkbox"==e.type?this.makeCheckbox(e):this.makeButton(e)}makeCheckbox(e){return O.createElement(q,{text:e.label,onChange:e.onChange,checked:e.checked})}makeButton(e){return O.createElement(U,{color:"black",position:"top",text:e.tooltip},t=>O.createElement("button",H({},t,{className:"btn btn-primary",onClick:t=>{e.onClick(t,this.value)}}),e.label))}render(){this.editor&&this.editor.resize&&this.editor.resize();const e=this.props.controls.filter(e=>"right"!=e.side).map(this.buildControl.bind(this)),t=this.props.controls.filter(e=>"right"==e.side).map(this.buildControl.bind(this));return O.createElement("div",{id:"bd-editor-panel",className:this.props.theme},O.createElement("div",{id:"bd-editor-controls"},O.createElement("div",{className:"controls-section controls-left"},e),O.createElement("div",{className:"controls-section controls-right"},t)),O.createElement("div",{className:"editor-wrapper"},O.createElement("div",{id:this.props.id,className:"editor "+this.props.theme},this.props.value)))}}class J extends O.Component{render(){const e=this.props.size||"24px";return O.createElement("svg",{viewBox:"0 0 24 24",style:{width:e,height:e}},O.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),O.createElement("path",{d:"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm2 16H5V5h11.17L19 7.83V19zm-7-7c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zM6 6h9v4H6z"}))}}class Z extends O.Component{render(){const e=this.props.size||"24px";return O.createElement("svg",{viewBox:"0 0 24 24",fill:"#FFFFFF",style:{width:e,height:e},onClick:this.props.onClick},O.createElement("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"}),O.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}))}}class Y extends O.Component{render(){const e=this.props.size||"20px";return O.createElement("svg",{viewBox:"0 0 20 20",style:{width:e,height:e}},O.createElement("path",{fill:"none",d:"M0 0h20v20H0V0z"}),O.createElement("path",{d:"M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z"}))}}class K extends O.Component{constructor(e){super(e),this.hasUnsavedChanges=!1,this.onChange=this.onChange.bind(this),this.save=this.save.bind(this),this.openNative=this.openNative.bind(this),this.update=this.update.bind(this),this.controls=[{label:O.createElement(J,{size:"18px"}),tooltip:M.CustomCSS.save,onClick:this.save},{label:O.createElement(Z,{size:"18px"}),tooltip:M.CustomCSS.openNative,onClick:this.openNative},{label:O.createElement(Y,{size:"18px"}),tooltip:M.CustomCSS.settings,onClick:"showSettings"}]}update(){this.forceUpdate()}updateEditor(e){this.editor&&(this.editor.value=e)}get value(){return this.editor.session.getValue()}set value(e){this.editor.setValue(e)}showSettings(){return this.editor.keyBinding.$defaultHandler.commands.showSettingsMenu.exec(this.editor)}resize(){return this.editor.resize()}setEditorRef(e){this.editor=e,this.props.editorRef&&void 0!==this.props.editorRef.current?this.props.editorRef.current=e:this.props.editorRef&&(this.props.editorRef=e)}render(){return O.createElement(V,{ref:this.setEditorRef.bind(this),language:this.props.language,id:this.props.id||"bd-addon-editor",controls:this.controls,value:this.props.content,onChange:this.onChange})}onChange(){this.hasUnsavedChanges=!0}save(e,t){this.hasUnsavedChanges=!1,this.props.save&&this.props.save(t)}openNative(){this.props.openNative&&this.props.openNative()}}class X{static get width(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)}static get height(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)}}class Q extends O.Component{render(){return O.createElement("svg",{viewBox:"0 0 12 12",style:{width:"18px",height:"18px"}},O.createElement("g",{className:"background",fill:"none",fillRule:"evenodd"},O.createElement("path",{d:"M0 0h12v12H0"}),O.createElement("path",{className:"fill",fill:"#dcddde",d:"M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"})))}}class ee extends O.Component{render(){const e=this.props.size||"24px";return O.createElement("svg",{className:this.props.className||"",fill:"#FFFFFF",viewBox:"0 0 24 24",style:{width:e,height:e},onClick:this.props.onClick},O.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),O.createElement("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"}))}}class te{static get shouldShowAddonErrors(){return A.get("settings","addons","addonErrors")}static get ModalStack(){return u.getByProps("push","update","pop","popWithKey")}static get AlertModal(){return u.getByPrototypes("handleCancel","handleSubmit","handleMinorConfirm")}static get TextElement(){return u.getByProps("Sizes","Weights")}static get ConfirmationModal(){return u.getModule(e=>e.defaultProps&&e.key&&"confirm-modal"==e.key())}static default(e,t){const s=u.getByProps("backdrop")||{backdrop:"backdrop-1wrmKb"},n=u.getModule(e=>e.modal&&e.inner&&!e.sizeMedium)||{modal:"modal-36zFtW",inner:"inner-2VEzy9"},i=u.getByProps("sizeMedium")||{modal:"backdrop-1wrmKb",sizeMedium:"sizeMedium-ctncE5",content:"content-2KoCOZ",header:"header-2nhbou",footer:"footer-30ewN8",close:"close-hhyjWJ",inner:"inner-2Z5QZX"},o=c.parseHTML(`
'),this.faContainerInner=this.faContainer.querySelector(".emote-menu-inner"),this.observer=new MutationObserver(e=>{for(const t of e)this.observe(t)}),this.enableHideEmojis=this.enableHideEmojis.bind(this),this.disableHideEmojis=this.disableHideEmojis.bind(this),this.updateTwitchEmotes=this.updateTwitchEmotes.bind(this)}async enabled(){this.log("Starting to observe"),this.observer.observe(document.getElementById("app-mount"),{childList:!0,subtree:!0}),this.hideEmojiCancel=this.registerSetting(this.hideEmojisID,this.enableHideEmojis,this.disableHideEmojis),this.hideEmojis&&this.enableHideEmojis(),Ye.emotesLoaded&&this.updateTwitchEmotes(),this.updateFavorites(),g.on("emotes-loaded",this.updateTwitchEmotes)}disabled(){g.off("emotes-loaded",this.updateTwitchEmotes),this.observer.disconnect(),this.disableHideEmojis(),this.hideEmojiCancel&&this.hideEmojiCancel()}enableHideEmojis(){const e=document.querySelector(".emojiPicker-3m1S-j");e&&e.classList.add("bd-qme-hidden")}disableHideEmojis(){const e=document.querySelector(".emojiPicker-3m1S-j");e&&e.classList.remove("bd-qme-hidden")}insertEmote(e){const t=c.getTextArea();c.insertText(t[0]," "==t.val().slice(-1)?t.val()+e:t.val()+" "+e)}favContext(e){e.stopPropagation();const t=e.target.closest(".emote-container").children[0],s=$('