This commit is contained in:
Jiiks 2018-01-10 17:58:57 +02:00
parent e9e3627339
commit ea8ac32a1c
177 changed files with 0 additions and 25495 deletions

Binary file not shown.

View File

@ -1,2 +0,0 @@
#BetterDiscord
BetterDiscord enhances Discord with several features

Binary file not shown.

View File

@ -1,3 +0,0 @@
.guilds {
background:red !important;
}

View File

@ -1,199 +0,0 @@
var emotesTwitch = null, emotesTwitchSub = null, emotesFfz = null, emotesBttv = null, emotesBttv2 = null;
var twitchEmoteUrlStart = "https://static-cdn.jtvnw.net/emoticons/v1/";
var twitchEmoteUrlEnd = "/1.0";
var ffzEmoteUrlStart = "https://cdn.frankerfacez.com/emoticon/";
var ffzEmoteUrlEnd = "/1";
var bttvEmoteUrlStart = "https://cdn.betterttv.net/emote/";
var bttvEmoteUrlEnd = "/1x";
var _emoteModule;
function EmoteModule() {
}
EmoteModule.prototype.init = function() {
_emoteModule.loadEmoteData();
};
EmoteModule.prototype.obsCallback = function(mutation) {
var self = this;
for(var i = 0 ; i < mutation.addedNodes.length ; ++i) {
var next = mutation.addedNodes.item(i);
if (next) {
var nodes = self.getNodes(next);
for(var node in nodes) {
if (nodes.hasOwnProperty(node)) {
self.injectEmote(nodes[node]);
}
}
}
}
};
EmoteModule.prototype.getNodes = function(node) {
var next;
var nodes = [];
var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false);
while((next = treeWalker.nextNode()) != null) {
nodes.push(next);
}
return nodes;
};
EmoteModule.prototype.injectEmote = function(node) {
if (!node.parentElement) {
return;
}
var parent = node.parentElement;
if (parent.tagName != "SPAN") {
return;
}
if(!$(parent.parentElement).hasClass("markup") && !$(parent.parentElement).hasClass("message-content")) { return; }
var parentInnerHTML = parent.innerHTML;
var words = parentInnerHTML.split(/\s+/g);
if (!words) {
return;
}
words.some(function(word) {
if (word.length < 4) {
return;
}
if(emotesTwitch != null) {
if (emotesTwitch.emotes.hasOwnProperty(word)) {
var len = Math.round(word.length / 4);
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + twitchEmoteUrlStart + emotesTwitch.emotes[word].image_id + twitchEmoteUrlEnd + '" />');
return;
}
}
if(emotesTwitchSub != null) {
if (emotesTwitchSub.hasOwnProperty(word)) {
var len = Math.round(word.length / 4);
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + twitchEmoteUrlStart + emotesTwitchSub[word] + twitchEmoteUrlEnd + '" />');
return;
}
}
if(emotesFfz != null) {
if(emotesFfz.hasOwnProperty(word)) {
var len = Math.round(word.length / 4);
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + ffzEmoteUrlStart + emotesFfz[word] + ffzEmoteUrlEnd + '" />');
return;
}
}
if(emotesBttv != null) {
if(emotesBttv.hasOwnProperty(word)) {
var len = Math.round(word.length / 4);
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + bttvEmoteUrlStart + emotesBttv[word] + bttvEmoteUrlEnd + '" />');
return;
}
}
if(emotesBttv2 != null) {
if(emotesBttv2.hasOwnProperty(word)) {
var len = Math.round(word.length / 4);
parentInnerHTML = parentInnerHTML.replace(word, '<img class="emote" alt="' + word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3) + '" src="' + bttvEmoteUrlStart + emotesBttv2[word] + bttvEmoteUrlEnd + '" />');
return;
}
}
});
parent.innerHTML = parentInnerHTML.replace(new RegExp("\uFDD9", "g"), "");
};
EmoteModule.prototype.loadEmoteData = function(type) {
if(_hash == null) {
_utils.getHash(this.loadEmoteData);
return;
}
switch(type) {
default:
_emoteModule.loadEmoteData("twitch");
break;
case "twitch":
_utils.log("Loading twitch global emotes");
$.getJSON('https://twitchemotes.com/api_cache/v2/global.json', function(data) {
_utils.log("Loaded twitch global emotes");
emotesTwitch = data;
_emoteModule.loadEmoteData("twitch-sub");
});
break;
case "twitch-sub":
emotesTwitchSub = {};
_utils.log("Loading twitch subscriber emotes");
$.getJSON('https://twitchemotes.com/api_cache/v2/subscriber.json', function(data) {
$.each(data.channels, function(key, val){
$.each(val.emotes, function(key, val) {
emotesTwitchSub[val.code] = val.image_id;
});
});
_emoteModule.loadEmoteData("ffz");
});
break;
case "ffz":
emotesFfz = {};
_utils.log("Loading FFZ emotes");
$.getJSON('https://cdn.rawgit.com/Jiiks/BetterDiscordApp/'+_hash+'/data/emotedata_ffz.json', function(data) {
emotesFfz = data;
_emoteModule.loadEmoteData("bttv");
});
break;
case "bttv":
emotesBttv = {};
_utils.log("Loading Basic BTTV emotes");
$.getJSON('https://api.betterttv.net/2/emotes', function(data) {
$.each(data.emotes, function(key, val) {
emotesBttv[val.code] = val.id;
});
_emoteModule.loadEmoteData("bttv2");
});
break;
case "bttv2":
emotesBttv2 = {};
_utils.log("Loading BTTV emotes");
$.getJSON('https://cdn.rawgit.com/Jiiks/BetterDiscordApp/'+_hash+'/data/emotedata_bttv.json', function(data) {
emotesBttv2 = data;
});
break;
}
};
var _utils;
var _hash = null;
function Utils() {}
Utils.prototype.getHash = function(callback) {
_utils.log("Getting HASH");
$.getJSON("https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master", function(data){
_hash = data.sha;
_utils.log("HASH = " + _hash);
callback();
});
};
Utils.prototype.log = function(message) {
console.log("[BetterDiscord] - " + message);
};
(function() {
_utils = new Utils();
_emoteModule = new EmoteModule();
_emoteModule.init();
var mainObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
_emoteModule.obsCallback(mutation);
});
});
mainObserver.observe(document, { childList: true, subtree: true });
})();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,14 +0,0 @@
"use sctrict"
var pageMod = require('sdk/page-mod');
var data = require("sdk/self").data;
function BdPageMod(options, callbacks) {
pageMod.PageMod({
include: '*.discordapp.com',
contentScriptFile: [data.url('../data/js/jquery-2.1.4.min.js'), data.url('../data/js/main.js')],
contentStyleFile: []
});
}
exports.BdPageMod = BdPageMod;

View File

@ -1,9 +0,0 @@
"use strict"
var _bdPagemod = require('./BdPageMod.js');
function BetterDiscord(args) {
_bdPagemod = new _bdPagemod.BdPageMod();
}
exports.BetterDiscord = BetterDiscord;

View File

@ -1,9 +0,0 @@
"use strict";
var _betterDiscord = require("./BetterDiscord.js");
function main(options, callbacks) {
_betterDiscord = new _betterDiscord.BetterDiscord();
}
exports.main = main;

View File

@ -1,18 +0,0 @@
{
"title": "BetterDiscord",
"name": "betterdiscord",
"version": "0.0.3",
"description": "BetterDiscord enhances Discord with several features",
"main": "lib/main",
"author": "JiCode",
"engines": {
"firefox": ">=40.*"
},
"license": "MIT",
"keywords": [
"jetpack"
],
"installs_allowed_from": [
"https://betterdiscord.net"
]
}

View File

@ -1,19 +0,0 @@
var main = require("../");
exports["test main"] = function(assert) {
assert.pass("Unit test running!");
};
exports["test main async"] = function(assert, done) {
assert.pass("async Unit test running!");
done();
};
exports["test dummy"] = function(assert, done) {
main.dummy("foo", function(text) {
assert.ok((text === "foo"), "Is the text actually 'foo'");
done();
});
};
require("sdk/test").run(exports);

View File

@ -1,46 +0,0 @@
module.exports = function(grunt) {
grunt.initConfig({
sass: {
dist: {
options: {
style: 'expanded'
},
files: {
'dev/css/main.css': 'dev/css/main.sass'
}
}
},
concat: {
js: {
src: 'dev/js/*.js',
dest: 'js/main.js'
},
css: {
src: 'dev/css/*.css',
dest: 'css/main.css'
}
},
uglify: {
options: {
screwIE8: true
},
js: {
files: {
'js/main.min.js': ['js/main.js']
}
}
},
cssmin: {
css: {
src: 'css/main.css',
dest: 'css/main.min.css'
}
}
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-css');
grunt.registerTask('default', ['sass', 'concat', 'uglify', 'cssmin']);
};

View File

@ -1,3 +0,0 @@
dist/
pack.bat
run.bat

View File

@ -1,20 +0,0 @@
{
"name": "betterdiscordinstaller",
"description": "Better Discord installer.",
"version": "0.1.1",
"homepage": "https://github.com/Jiiks/BetterDiscordApp",
"license": "MIT",
"main": "index.js",
"dependencies": {
"fs-extra": "^0.30.0",
"readline": "^1.3.0",
"open": "^0.0.5",
"request": "^2.72.0",
"path": "^0.12.7",
"walk": "^2.3.9",
"unzip": "^0.1.11"
},
"devDependencies": {
"electron-prebuilt": "~1.2.8"
}
}

View File

@ -1,71 +0,0 @@
'use strict';
const
fs = require('fs'),
path = require('path'),
walk = require('walk'),
p = require('path');
fs.mkdirPSync = function(dirPath) {
try {
fs.mkdirSync(dirPath);
} catch(err) {
if(err.errno === -4058 || err.errno === -2) {
fs.mkdirPSync(path.dirname(dirPath));
fs.mkdirPSync(dirPath);
} else if(err.errno === -4075) {
return "EXIST";
} else {
return "NOT OK";
}
}
return "OK";
}
class Asar {
constructor(filePath) {
this.path = filePath;
this.files = [];
}
extract(statusCb, progressCb, cb) {
this.walker = walk.walk(this.path, { followLinks: false });
statusCb("Creating Directories");
this.walker.on('file', (root, stat, next) => {
this.files.push(`${root}/${stat.name}`);
try {
fs.statSync(root.replace("app.asar", "app"));
} catch(err) {
fs.mkdirPSync(root.replace("app.asar", "app"));
}
next();
});
this.walker.on('end', () => {
var self = this;
statusCb("Copying files");
var p = 1;
var filecount = this.files.length;
function copy(files, index) {
if(index >= filecount) {
statusCb("Finished extracting app package");
cb(null);
return;
}
setTimeout(() => { self.copyfile(files, index, copy) }, 1);
progressCb(index, filecount);
}
copy(this.files, 0);
});
}
copyfile(files, index, cb) {
fs.writeFileSync(files[index].replace("app.asar", "app"), fs.readFileSync(files[index]));
cb(files, index+1);
}
}
module.exports = Asar;

View File

@ -1,650 +0,0 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src:local('Open Sans'), local('OpenSans'), url('../font/OpenSans-Regular.ttf') format('TrueType');
}
/* latin-ext */
@font-face {
font-family: 'Inconsolata';
font-style: normal;
font-weight: 400;
src: local('Inconsolata'), url('../font/Inconsolata.woff2') format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Inconsolata';
font-style: normal;
font-weight: 400;
src: local('Inconsolata'), url('../font/Inconsolata.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
html, body {
margin:0;
padding:0;
background: rgba(34, 35, 42, 1);
overflow: hidden;
}
html, body {
width:800px;
height:400px;
}
* {
font-family: "Open Sans";
color:#E8E8E8;
outline:none;
user-select: none;
-webkit-user-select: none;
cursor: default;
}
a {
cursor: pointer;
color: dodgerblue;
}
#titleBar {
display:flex;
-webkit-app-region: drag;
pointer-events: none;
width:100%;
height:40px;
background:rgba(34, 35, 42, 0.6);
border-bottom:1px solid #000;
box-shadow:0 1px 0 0 #303030;
background: rgba(23, 23, 23, 0.6);
border:none;
box-shadow: none;
}
#titleBar h3 {
color:#FFF;
}
.icon {
display:inline-block;
width:40px;
height:40px;
padding:5px;
}
.icon-image {
background:blue;
height:30px;
width:30px;
}
.title {
display:inline-block;
height:40px;
line-height:40px;
color:#FFF;
}
.main-container {
display:flex;
width:100%;
height:calc(100% - 40px);
}
.sidebar {
width:200px;
height:358px;
border-right:1px solid #000;
box-shadow:1px 0 0 0 #303030;
background:rgba(44, 45, 56, 0.6);
z-index:90001;
margin-top: 1px;
border:none;
margin:0;
box-shadow: none;
margin-left:1px;
}
.sidebar-inner {
width:100%;
height:100%;
padding:5px;
}
.main {
flex-grow:1;
padding:5px;
transform:translateX(0);
}
.panel-container {
position:absolute;
left:10px;
transition: all 0.5s ease-in-out;
}
.panel {
display:inline-block;
width:580px;
position:absolute;
transition: all 0.5s ease-in-out;
opacity: 0;
}
.main-container.panel-0 #uninstall {
display: inline-block;
}
.main-container.panel-0 #back {
display: none;
}
.main-container.panel-0 #next {
display: inline-block;
}
.main-container.panel-0 #cancel {
display: inline-block;
}
.main-container.panel-1 #uninstall {
display: none;
}
.main-container.panel-1 #back {
display: inline-block;
}
.main-container.panel-1 #next {
display: inline-block;
}
.main-container.panel-1 #cancel {
display: inline-block;
}
.main-container.panel-2 #uninstall {
display: none;
}
.main-container.panel-2 #back {
display: inline-block;
}
.main-container.panel-2 #next {
display: inline-block;
}
.main-container.panel-2 #cancel {
display: inline-block;
}
.main-container.panel-3 #uninstall {
display: none;
}
.main-container.panel-3 #back {
display: none;
}
.main-container.panel-3 #next {
display: none;
}
.main-container.panel-3 #cancel {
display: inline-block;
}
.main-container.panel-0 #li-0:before {
background:dodgerblue;
}
.main-container.panel-0 #li-1:before {
background:gray;
}
.main-container.panel-0 #li-2:before {
background:gray;
}
.main-container.panel-0 #li-3:before {
background:gray;
}
.main-container.panel-1 #li-0:before {
background:#00D443;
}
.main-container.panel-1 #li-1:before {
background:dodgerblue;
}
.main-container.panel-1 #li-2:before {
background:gray;
}
.main-container.panel-1 #li-3:before {
background:gray;
}
.main-container.panel-2 #li-0:before,
.main-container.panel-advanced #li-0:before {
background:#00D443;
}
.main-container.panel-2 #li-1:before,
.main-container.panel-advanced #li-1:before {
background:#00D443;
}
.main-container.panel-2 #li-2:before,
.main-container.panel-advanced #li-2:before {
background:dodgerblue;
}
.main-container.panel-2 #li-3:before,
.main-container.panel-advanced #li-3:before {
background:gray;
}
.main-container.panel-2 #panel-advanced {
pointer-events: none;
}
.main-container.panel-3 #li-0:before {
background:#00D443;
}
.main-container.panel-3 #li-1:before {
background:#00D443;
}
.main-container.panel-3 #li-2:before {
background:#00D443;
}
.main-container.panel-3 #li-3:before {
background:dodgerblue;
}
.main-container.panel-0 .panel-container {
left: 10px;
}
.main-container.panel-1 .panel-container {
left: -590px;
}
.main-container.panel-2 .panel-container,
.main-container.panel-advanced .panel-container {
left: -1180px;
}
.main-container.panel-3 .panel-container {
left: -1770px;
}
.main-container.panel-0 .panel-container #panel-0 {
opacity: 1;
}
.main-container.panel-0 .panel-container #panel-1 {
opacity: 0;
}
.main-container.panel-0 .panel-container #panel-2 {
opacity: 0;
}
.main-container.panel-0 .panel-container #panel-3 {
opacity: 0;
}
.main-container.panel-1 .panel-container #panel-0 {
opacity: 0;
}
.main-container.panel-1 .panel-container #panel-1 {
opacity: 1;
}
.main-container.panel-1 .panel-container #panel-2 {
opacity: 0;
}
.main-container.panel-1 .panel-container #panel-3 {
opacity: 0;
}
.main-container.panel-2 .panel-container #panel-0 {
opacity: 0;
}
.main-container.panel-2 .panel-container #panel-1 {
opacity: 0;
}
.main-container.panel-2 .panel-container #panel-2 {
opacity: 1;
}
.main-container.panel-2 .panel-container #panel-3 {
opacity: 0;
}
.main-container.panel-3 .panel-container #panel-0 {
opacity: 0;
}
.main-container.panel-3 .panel-container #panel-1 {
opacity: 0;
}
.main-container.panel-3 .panel-container #panel-2 {
opacity: 0;
}
.main-container.panel-3 .panel-container #panel-3 {
opacity: 1;
}
.main-container.panel-advanced .controls button {
display: none;
}
.main-container.panel-advanced #panel-advanced {
pointer-events: initial;
}
.main-container.panel-advanced .panel-container #panel-0 {
opacity: 0;
}
.main-container.panel-advanced .panel-container #panel-1 {
opacity: 0;
}
.main-container.panel-advanced .panel-container #panel-2 {
opacity: 0;
}
.main-container.panel-advanced .panel-container #panel-3 {
opacity: 0;
}
.main-container.panel-advanced .panel-container #panel-advanced {
opacity: 1;
}
.main-container .panel-container #panel-advanced textarea {
background: rgba(33, 34, 41, 0.98);
width: 570px;
height: 140px;
resize: none;
border: 1px solid #000;
outline: 1px solid #303030;
}
.main-container .panel-container #panel-advanced button {
float: right;
margin-right: 10px;
margin-top: 5px;
}
.visible {
opacity: 1;
}
#panel-1 {
left:600px;
}
#panel-2 {
left:1200px;
}
#panel-advanced {
left:1200px;
}
#panel-3 {
left:1775px;
}
#licensetext {
width: 100%;
overflow-y: scroll;
white-space: pre-line;
height:280px;
}
#licenseform {
float:right;
margin-top:5px;
margin-right:10px;
}
input[type='radio'] {
cursor:pointer;
}
label {
cursor:pointer;
}
label, input[type='radio']{
font-size: 16px;
display: inline-block;
margin: 0;
margin-left: 3px;
line-height: 25px;
height: 28px;
vertical-align: top;
}
ul {
margin:0;
padding:0;
list-style:none;
}
li {
list-style:none;
color:gray;
}
li.active {
color:#FFF;
}
li.visited {
color:#EBEBEB;
}
.sidebar-inner li:before {
content: "";
display:inline-block;
background:gray;
border-radius: 50%;
width: 10px;
height: 10px;
margin-right:3px;
}
.sidebar-inner li.active:before {
background:dodgerblue;
}
.sidebar-inner li.visited:before {
background:#00D443;
}
.controls {
position:absolute;
bottom:5px;
right:5px;
}
button {
color:gray;
width:60px;
background:#1b1c23;
border-style:solid;
border-color:#000;
border-width:0 1px 1px 0;
padding:5px;
box-shadow:1px 1px 0 0 #303030 inset;
cursor:pointer;
border: none;
box-shadow: none;
}
button:hover {
color:#FFF;
background:#24262f;
}
button:disabled {
background:#292929;
border-color:#191919;
color:gray;
cursor: not-allowed;
}
button:active {
background: #232b2e;
}
button#advanced-settings {
width: 100px;
display: block;
}
::-webkit-scrollbar-thumb {
background:#282828 !important;
}
::-webkit-scrollbar, ::-webkit-scrollbar-track-piece {
background:#383838 !important;
}
input.path {
width: 450px;
height: 23px;
background: rgb(27, 28, 35) none repeat scroll 0% 0%;
border: 1px solid rgb(17, 17, 17);
box-shadow: -1px -1px 0px 0px rgb(50, 49, 49) inset;
border-width: 1px 0px 0px 1px;
border-style: solid;
border-color: #111;
}
.modal {
position: absolute;
background: rgba(29, 29, 29, 0.71);
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 900000;
}
.modal-container {
background: #212229;
width: 600px;
height: 200px;
position: relative;
margin: auto;
top: 100px;
box-shadow: 0px 0px 5px 5px rgba(0, 0, 0, 0.39);
}
.modal-header {
height: 30px;
line-height: 30px;
background: #212229;
padding-left: 10px;
border-bottom: 1px solid #000;
box-shadow: 0 1px 0 0 #303030;
}
.modal-body {
padding:30px;
}
.modal-footer {
position: absolute;
bottom: 0;
left:0;
right: 0;
height: 35px;
padding-top:10px;
background:#212229;
box-shadow: 0 1px 0 0 #303030 inset;
border-top: 1px solid #000;
}
.modal-footer button {
margin-right:5px;
float: right;
}
.splash {
width:300px !important;
height:100px !important;
}
.splash .wrapper {
top:20px;
width:40px;
margin:auto;
position:relative;
}
.splash .wrapper .spinner {
width:30px;
height:30px;
border-radius:30px;
border-width:5px;
border-color:#121212 #404040 #404040 #404040;
border-style:solid;
animation: spin 0.7s linear infinite;
}
.splash .spinnertext {
position: absolute;
bottom: 0;
width: 100%;
display: block;
text-align: center;
bottom: 10px;
color: rgb(171, 171, 171);
-webkit-animation: spinnertext-opacity 2s linear 0s infinite;
}
@-webkit-keyframes spin {
100% {
transform: rotate(360deg);
}
}
@-webkit-keyframes spinnertext-opacity {
0% {opacity: 0}
20% {opacity: 0}
50% {opacity: 1}
100%{opacity: 0}
}
#log {
padding: 10px;
height:294px;
resize: none;
width: 570px;
background: rgba(42, 44, 55, 0.6);
border: none;
-webkit-user-select: text;
word-wrap: break-word;
white-space: pre-line;
overflow: auto;
}
progress {
position: absolute;
bottom: -36px;
left:0;
width:525px;
height: 27px;
-webkit-appearance:none;
}
progress::-webkit-progress-bar {
background:rgba(42, 44, 55, 0.6);
}
progress[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(left, rgba(73,155,234,1) 0%, rgba(32,124,229,1) 100%);
}
.border {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
border:1px solid #55BBF7;
pointer-events: none;
}
.warning {
color: red;
font-weight: 700;
}

View File

@ -1,36 +0,0 @@
<html>
<head>
<head>
<link rel="stylesheet" href="css/main.css">
<script type="text/javascript" src="js/jquery-2.0.0.min.js"></script>
</head>
</head>
<body>
<div class="border"></div>
<div id="titleBar">
<div class="icon">
<div class="icon-image"></div>
</div>
<div class="title">
Error!
</div>
</div>
<div>
<div id="log" style="width:680px"></div>
</div>
<div>
<button style="position: absolute;right: 10px;bottom: 6px;">OK</button>
</div>
</body>
<script>
const ipcRenderer = require('electron').ipcRenderer;
$(function() {
ipcRenderer.send('async', '{ "arg": "geterror" }');
});
ipcRenderer.on('async-reply', (event, arg) => {
console.log(event);
console.log(arg);
$("#log").text(arg);
});
</script>
</html>

View File

@ -1,153 +0,0 @@
<html>
<head>
<link rel="stylesheet" href="css/main.css">
</head>
<body>
<div class="border"></div>
<div id="titleBar">
<div class="icon">
<div class="icon-image"></div>
</div>
<div class="title">
BetterDiscord Installer - v0.1.1
</div>
</div>
<div class="main-container panel-0">
<div class="sidebar">
<div class="sidebar-inner">
<ul>
<li id="li-0" class="navli">Introduction</li>
<li id="li-1" class="navli">License</li>
<li id="li-2" class="navli">Destination</li>
<li id="li-3" class="navli">Installation</li>
</ul>
</div>
</div>
<div class="main">
<div class="panel-container">
<div class="panel" id="panel-0">
<h2>Welcome to the BetterDiscord setup</h2>
<p style="white-space:pre-line">
The setup will install BetterDiscord on your computer.
Click "Next" to continue or "Cancel" to exit the setup.
BetterDiscord is not in any way affiliated with Discord
For support join the <a href="https://betterdiscord.net/discord" target="_blank">official BetterDiscord support channel</a> in Discord
</p>
<p>
<strong class="warning" style="font-size:12px">
Do not contact Discord support about BetterDiscord issues!
<br>
If Discord breaks, ask in the BetterDiscord support channel!
</strong>
</p>
<input name="cd" id="cd" type="checkbox">
<label style="margin:0; line-height: 18px;" for="cd">I will not contact Discord support about BetterDiscord issues</label>
</div>
<div class="panel" id="panel-1">
<div id="licensetext">
The MIT License (MIT)
Copyright (c) 2015-2016 Jiiks | Jiiks.net
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.
</div>
<form action="" id="licenseform">
<input type="radio" name="licensegroup" value="Accept" id="accept" disabled="true"><label for="accept">Accept</label>
<input type="radio" name="licensegroup" value="Decline" id="decline" checked="true"><label for="decline">Decline</label>
</form>
</div>
<div class="panel" id="panel-2">
<p style="font-size: 12px;">Setup will install BetterDiscord to the following location:</p>
<input class="path" id="libpath" type="text" style="height:26px;" disabled="true" />
<button id="libpathbtn" style="height:26px;">Browse</button>
<p style="font-size:12px">
*If you wish to install somewhere else then click "Browse" and select your path
</p>
<label for="discordPath" style="display:block; margin-top: 10px; font-size: 12px;">Discord Path:</label>
<input class="path" id="discordPath" type="text" style="height:26px;" disabled="true" />
<button id="path" style="height:26px;">Browse</button>
<p style="font-size:12px">
*If the path is not pointing to the latest version of Discord then click "Browse" and select it
<br>
*If you want to install to ptb/canary then click "Browse" and select it
<br>
*Installer will kill Discord process
</p>
<div class="checkboxGroup">
<input type="checkbox" name="demotes" id="demotes">
<label for="demotes" style="margin:0; line-height: 18px;">Disable emotes completely</label>
</div>
<div class="checkboxGroup">
<input type="checkbox" name="restart" id="restart" checked="true">
<label for="restart" style="margin:0; line-height: 18px;">Restart Discord after installation</label>
</div>
<button id="advanced-settings">Advanced</button>
</div>
<div class="panel" id="panel-advanced">
<span>Advanced settings</span> - <span class="warning">For advanced users only!</span>
<ul>
<li><input type="checkbox" name="aaot" id="aaot"><label for="aaot">Discord window always on top</label></li>
<li><input type="checkbox" name="aframeless" id="aframeless" checked><label for="aframeless">Frameless Discord window</label></li>
<li><input type="checkbox" name="atransparent" id="atransparent"><label for="atransparent">Transparent Discord window</label></li>
<li><input type="checkbox" name="athickframe" id="athickframe"><label for="athickframe">Thick Frame</label></li>
<li><input type="checkbox" name="aprefs" id="aprefs"><label for="aprefs">Use custom Web Preferences:</label></li>
</ul>
<textarea name="" id="" cols="30" rows="10"></textarea>
<button id="advanced-close">Save</button>
</div>
<div class="panel" id="panel-3">
<div name="log" id="log"></div>
<progress id="logpbar" value="0" max="100"></progress>
</div>
</div>
<div class="controls">
<button id="uninstall">Uninstall</button>
<button id="back">Back</button>
<button id="next" >Next</button>
<button id="cancel">Cancel</button>
</div>
</div>
</div>
<div class="modal" id="quit" style="display: none;">
<div class="modal-container">
<div class="modal-header">
<span>Exit Setup?</span>
</div>
<div class="modal-body">
Setup is not complete. If you exit now, BetterDiscord will not be installed.
<br>
Exit Setup?
</div>
<div class="modal-footer">
<button id="modal-exit">
Yes
</button>
<button id="modal-cancel">
No
</button>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="js/jquery-2.0.0.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript">
$(window).blur(function(){
$(".border").css("border-color", "#F76455");
});
$(window).focus(function(){
$(".border").css("border-color", "#55BBF7");
});
</script>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,202 +0,0 @@
'use strict';
const ipcRenderer = require('electron').ipcRenderer;
var config = {
urls: {
package: "https://github.com/Jiiks/BetterDiscordApp/archive/stable16.zip",
finish: "https://betterdiscord.net/installed"
},
discord: {
lastKnownVersion: "0.0.291"
},
import: "BetterDiscordApp-stable16",
cache: [
"emotes_bttv.json",
"emotes_bttv_2.json",
"emotes_ffz.json",
"emotes_twitch_global.json",
"emotes_twitch_subscriber.json",
"user.json"
]
};
(function() {
//Pass latest config to core application
ipcSendAsync("config", config);
//Get Discord installation path
ipcSendAsync("get", "discordpath" );
//Get BetterDiscord installation path
ipcSendAsync("get", "libpath");
})();
//Listeners
(function() {
$("#cd").on("change", () => {
$("#next").prop("disabled", !$("#cd").prop("checked"));
});
var currentPanel = 0;
function switchPanel() {
var container = $(".panel-container");
var main = $(".main-container");
main.removeClass();
main.addClass(`main-container panel-${currentPanel}`)
switch(currentPanel) {
case 0:
$("#next").text("Next");
//$("#next").prop("disabled", !$("#cd").prop("checked"));
break;
case 1:
$("#next").text("Next");
//$("#next").prop("disabled", !$("#accept").prop("checked"));
break;
case 2:
$("#next").text("Install");
$("#cancel").text("Cancel");
break;
case 3:
$("#cancel").text("Abort");
ipcSendAsync("install");
break;
}
}
$("#next").on("click", function() {
currentPanel++;
switchPanel();
});
$("#back").on("click", function() {
currentPanel--;
switchPanel();
});
$("#cancel").on("click", function() {
$("#quit").show();
});
$("#uninstall").on("click", function() {
});
$("#accept").on("change", function() {
// $("#next").prop("disabled", !$(this).prop("checked"));
});
$("#decline").on("change", function() {
// $("#next").prop("disabled", $(this).prop("checked"));
});
$("#licensetext").on("scroll", function() {
var e = $(this);
if(e.height() + e.scrollTop() >= e[0].scrollHeight) {
$("#accept").prop("disabled", false);
} else {
$("#accept").prop("disabled", true);
$("#decline").prop("checked", true)
// $("#next").prop("disabled", true);
}
});
$(".modal").on("click", function(e) {
if(e.target.className !== "modal") return;
$(this).hide();
});
$("#modal-cancel").on("click", function() {
$(".modal").hide();
});
$("#modal-exit").on("click", function() {
ipcRenderer.send("async", {arg: "quit", data: []});
});
$("#path").on("click", () => {
ipcRenderer.send("async", { arg: "browsedialog", data: "discordpath" });
});
$("#libpathbtn").on("click", () => {
ipcRenderer.send("async", { arg: "browsedialog", data: "libpath" });
});
$("#advanced-settings").on("click", function() {
currentPanel = "advanced";
switchPanel();
});
$("#advanced-close").on("click", function() {
var main = $(".main-container");
currentPanel = 2;
switchPanel();
});
})();
ipcRenderer.on("async-reply", (event, arg) => {
var data = arg.data;
arg = arg.arg;
switch(arg) {
case "discordpath":
$("#discordPath").val(data);
break;
case "libpath":
$("#libpath").val(data);
break;
}
});
/*ipcRenderer.on('async-reply', (event, arg) => {
switch(arg.arg) {
case "exists":
switch(arg.file) {
case "install":
if(arg.exists) {
appendLog("Located app package");
appendLog("Downloading latest BetterDiscord package");
ipcRenderer.send('async', '{"arg": "download", "package": "https://github.com/Jiiks/BetterDiscordApp/archive/stable16.zip" }');
} else {
appendLog("Unable to locate app.asar. Check your install path.");
}
}
break;
case "discordpath":
$("#discordPath").val(arg.path);
break;
case "locate-app.asar":
appendLog(arg.data);
break;
}
});*/
function ipcSendAsync(arg, data) {
ipcRenderer.send("async", { arg: arg, data: data });
}
function install() {
appendLog("Initiating installation");
appendLog("Locating Discord package");
ipcRenderer.send('async', { "arg": "install" });
}
function appendLog(text) {
var log = $("#log");
log.append(text+"\n");
var sh = log[0].scrollHeight - 40;
if(log.height() + log.scrollTop() >= sh) {
log.scrollTop(sh);
}
}
function updatePbar(cur, max) {
var pbar = $("#logpbar");
pbar.val(cur);
pbar.prop("max", max);
}

View File

@ -1,15 +0,0 @@
'use strict';
const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.on('async-reply', (event, arg) => {
switch(arg) {
case "update":
$(".spinnertext").text("Downloading Update");
break;
}
});
$(function() {
ipcRenderer.send('async', '{ "arg": "update" }');
});

View File

@ -1,16 +0,0 @@
<html>
<head>
<head>
<link rel="stylesheet" href="css/main.css">
<script type="text/javascript" src="js/jquery-2.0.0.min.js"></script>
<script type="text/javascript" src="js/splash.js"></script>
</head>
</head>
<body class="splash">
<div class="border"></div>
<div class="wrapper">
<div class="spinner"></div>
</div>
<span class="spinnertext">Checking for updates...</span>
</body>
</html>

View File

@ -1,8 +0,0 @@
{
"windows": {
"version": "0.1.0"
},
"osx": {
"version": "0.1.1"
}
}

View File

@ -1,45 +0,0 @@
'use strict';
var devMode = false;
const
electron = require('electron'),
app = electron.app,
BrowserWindow = electron.BrowserWindow,
ipcMain = electron.ipcMain,
utils = require('./utils'),
_utils = new utils();
var
mainWindow,
windowOptions = {
width: 300,
height: 100,
fullscreenable: false,
maximizable: false,
frame: false,
resizable: devMode ? true : false,
alwaysOnTop: devMode ? true : false,
transparent: false
};
class Index {
constructor() {
app.on("ready", () => this.appReady());
}
appReady() {
mainWindow = new BrowserWindow(windowOptions);
this.loadInstaller();
}
loadInstaller() {
this.installer = require('./installer_index');
this.installerInstance = new this.installer(app, mainWindow, ipcMain, _utils);
}
}
module.exports = new Index();

View File

@ -1,269 +0,0 @@
'use strict';
//Imports
const
path = require('path'),
dialog = require('electron').dialog,
fs = require("fs"),
fse = require("fs-extra"),
request = require('request'),
unzip = require('unzip'),
readline = require('readline'),
asar = require('./asar');
const platform = (process.platform !== "win32" && process.platform !== "darwin") ? "linux" : process.platform;
var
config = {
urls: {
package: "https://github.com/Jiiks/BetterDiscordApp/archive/stable16.zip",
finish: "https://betterdiscord.net/installed"
},
discord: {
lastKnownVersion: "0.0.292"
},
import: "BetterDiscordApp-stable16",
cache: [
"emotes_bttv.json",
"emotes_bttv_2.json",
"emotes_ffz.json",
"emotes_twitch_global.json",
"emotes_twitch_subscriber.json",
"user.json"
],
paths: {
installPath: "",
libPath: ""
}
};
class Installer {
constructor(app, mainWindow, ipc, utils) {
this.app = app;
this.utils = utils;
this.initConfig();
mainWindow.setSize(800, 400);
mainWindow.center();
mainWindow.loadURL(`file://${__dirname}/data/index.html`);
this.webContents = mainWindow.webContents;
ipc.on('async', (event, arg) => this.receiveAsync(event, arg));
}
initConfig() {
config.paths.installPath = path.normalize(this.utils.installPath(config.discord.lastKnownVersion));
config.paths.libPath = path.normalize(this.utils.libPath());
}
install() {
this.utils.log("Config: " + JSON.stringify(config));
this.appendLog("Initializing");
this.locateAppPackage();
}
locateAppPackage() {
var p = path.normalize(`${config.paths.installPath}/resources`);
var pkg = fs.readdirSync(p).filter(file => {
if(file === "app.asar") {
return true;
}
});
if(pkg.length <= 0) {
//App package not found
this.appendLog("Unable to locate app package, check the logs for errors");
return;
}
this.appendLog("Located app package");
this.downloadBd();
//this.extractAppPackage();
}
downloadBd() {
var self = this;
this.appendLog("Downloading BetterDiscord");
var error = false;
var size = 0;
var downloaded = 0;
var req = request({
method: 'GET',
uri: config.urls.package
});
req.pipe(unzip.Extract({ path: path.normalize(config.paths.libPath) }));
req.on('data', chunk => {
downloaded += chunk.length;
this.updatePb(downloaded, size);
});
req.on('response', data => {
size = data.headers['content-length'];
});
req.on('error', err => {
error = true;
self.utils.log(err);
self.appendLog("Failed to download BetterDiscord package, check the logs for errors");
});
req.on('end', () => {
console.log("got here?");
if(error) {
self.appendLog("Failed to download BetterDiscord package, check the logs for errors");
} else {
self.extractAppPackage();
}
});
}
extractAppPackage() {
var self = this;
try {
if(fs.existsSync(`${config.paths.installPath}/resources/app`)) {
self.appendLog("Deleting old app directory");
setTimeout(() => {
fse.removeSync(`${config.paths.installPath}/resources/app`);
extract();
}, 500);
} else {
extract();
}
} catch(err) {
self.appendLog("Could not delete old app directory, check the logs for errors");
return;
}
function extract() {
try {
self.appendLog("Extracting app package");
var a = new asar(`${config.paths.installPath}/resources/app.asar`);
a.extract(msg => {
self.appendLog(msg);
}, (curIndex, total) => {
self.updatePb(curIndex, total);
}, err => {
if(err === null) {
self.inject();
} else {
self.log(err);
self.appendLog("Failed to extract app package, check the logs for errors");
self.clean();
}
});
}catch(err) {
console.log(err);
}
}
}
inject() {
var self = this;
this.updatePb(0, 5);
this.appendLog("Injecting loader");
var lines = [];
var lr = readline.createInterface({
input: fs.createReadStream(`${config.paths.installPath}/resources/app/index.js`)
});
lr.on('line', line => {
lines.push(line);
if(line.indexOf("'use strict';") > -1) {
lines.push(path.normalize(`var _betterDiscord = require('${config.paths.libPath}/${config.import}');`).replace(/\\/g,"/"));
lines.push("var _betterDiscord2;");
}
if(line.indexOf("mainWindow = new BrowserWindow(mainWindowOptions);") > -1) {
lines.push(` _betterDiscord2 = new _betterDiscord.BetterDiscord(mainWindow, false);`);
}
});
lr.on('close', () => {
fs.writeFileSync(`${config.paths.installPath}/resources/app/index.js`, lines.join('\n'));
self.appendLog("Finished installing BetterDiscord");
self.updatePb(5, 5);
});
}
clean() {
this.appendLog("Cleaning installation");
try {
if(fs.existsSync(`${config.paths.installPath}/resources/app`)) {
self.appendLog("Deleting app directory");
setTimeout(() => {
fse.removeSync(`${config.paths.installPath}/resources/app`);
}, 500);
}
} catch(err) {
self.appendLog("Could not delete old app directory, check the logs for errors");
}
}
appendLog(msg) {
this.utils.log(msg);
this.webContents.executeJavaScript(`appendLog("${msg}");`);
}
updatePb(cur, max) {
this.webContents.executeJavaScript(`updatePbar(${cur}, ${max});`);
}
getData(e) {
switch(e) {
case "discordpath":
return config.paths.installPath;
case "libpath":
return config.paths.libPath;
}
}
receiveAsync(event, arg) {
var data = arg.data || '';
arg = arg.arg;
switch(arg) {
case "get":
this.replyAsync(event, data, this.getData(data));
break;
case "browsedialog":
var path = dialog.showOpenDialog({ properties: ['openDirectory'] });
switch(data) {
case "discordpath":
path = path === undefined ? config.paths.installPath : path[0];
config.paths.installPath = path;
break;
case "libpath":
path = path === undefined ? config.paths.libPath : path[0];
config.paths.libPath = path;
break;
}
this.replyAsync(event, data, path);
break;
case "install":
this.install();
break;
case "quit":
this.app.quit();
break;
}
}
replyAsync(event, arg, data) {
event.sender.send('async-reply', { "arg": arg, "data": data });
}
}
module.exports = Installer;

View File

@ -1,10 +0,0 @@
{
"name": "Install",
"description": "Better Discord enhances Discord.",
"version": "0.1.1",
"homepage": "https://github.com/Jiiks/BetterDiscordApp",
"license": "MIT",
"devDependencies": {
"electron-prebuilt": "^1.0.0"
}
}

View File

@ -1,75 +0,0 @@
'use strict';
class Updater {
constructor(utils) {
this.utils = utils;
}
update() {
var self = this;
var promises = [
new Promise((resolve, reject) => {
downloadResource("/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/index.html", (error, data)
if(error) {
error(data, true);
reject();
return;
}
self.utils.log("Succesfully loaded index.html");
resolve();
});
}),
new Promise((resolve, reject) => {
downloadResource("/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/js/main.js", (error, data)
if(error) {
error(data, true);
reject();
return;
}
self.utils.log("Succesfully loaded main.js");
resolve();
});
}),
new Promise((resolve, reject) => {
downloadResource("/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/css/main.css", (error, dat
if(error) {
error(data, true);
reject();
return;
}
self.utils.log("Succesfully loaded main.css");
resolve();
});
})
];
return Promise.all(promises);
}
checkForUpdates(okCb, errorCb) {
_utils.downloadResource("/Jiiks/BetterDiscordApp/master/Installers/Electron/src/data/vi.json", (error, data) => {
if(error) {
errorCb(data);
return;
}
try {
data = JSON.parse(data);
}catch(err) {
errorCb(err);
return;
}
switch(platform) {
case "win32":
okCb(data.windows.version > vi.windows.version);
break;
case "darwin":
okCb(data.osx.version > vi.osx.version);
break;
}
});
}
}
module.exports = Updater;

View File

@ -1,98 +0,0 @@
'use strict';
const
https = require('https'),
fs = require('fs'),
eol = require('os').EOL,
platform = (process.platform !== "win32" && process.platform !== "darwin") ? "linux" : process.platform;
class Utils {
constructor() {
this.logs = "";
}
log(message) {
var d = new Date();
var ds = ("00" + (d.getDate() + 1)).slice(-2) + "/" +
("00" + d.getMonth()).slice(-2) + "/" +
d.getFullYear() + " " +
("00" + d.getHours()).slice(-2) + ":" +
("00" + d.getMinutes()).slice(-2) + ":" +
("00" + d.getSeconds()).slice(-2);
console.log(`[${ds}] ${message}`);
this.logs += `[${ds}] ${message}${eol}`;
this.saveLogs();
}
printLogs() {
console.log(this.logs);
}
saveLogs() {
fs.writeFileSync("logs.log", this.logs);
}
downloadResource(resource, callback, host) {
https.get({
host: host || "raw.githubusercontent.com",
path: resource,
headers: { 'user-agent': 'Mozilla/5.0' }
},
(response) => {
var data = "";
response.on("data", (chunk) => {
data += chunk;
});
response.on("end", () => {
callback(false, data);
});
response.on("error", (e) => {
callback(true, e);
});
}).on('error', (e) => {
callback(true, e);
});
}
installPath(lastKnownVersion) {
return {
"win32": () => {
var hver = lastKnownVersion;
var path = `${process.env.LOCALAPPDATA}/Discord/app-${lastKnownVersion}\\`;
fs.readdirSync(`${process.env.LOCALAPPDATA}/Discord/`).filter(function(file) {
var tpath = `${process.env.LOCALAPPDATA}/Discord/${file}`;
if(!fs.statSync(tpath).isDirectory()) return;
if(!file.startsWith("app-")) return;
var ver = file.replace("app-", "");
if(ver < hver) return;
hver = ver;
path = tpath;
});
return path;
},
"darwin": () => "/Applications/Discord.app/Contents",
"linux": () => "/usr/share/discord"
}[platform]();
}
libPath() {
return {
"win32": () => {
return `${process.env.APPDATA}/BetterDiscord/lib`;
},
"darwin": () => {
return `${process.env.HOME}/.local/share/BetterDiscord`;
},
"linux": () => {
// FIXME: for a non-root user, a path like OSX's makes more sense
return "/usr/local/share/BetterDiscord";
}
}[platform]();
}
}
module.exports = Utils;

View File

@ -1,3 +0,0 @@
{
"init": "init"
}

View File

@ -1,261 +0,0 @@
/*
* BetterDiscordApp Installer v0.3.2
*/
var dver = "0.0.284";
var asar = require('asar');
var wrench = require('wrench');
var fs = require('fs');
var readline = require('readline');
var util = require('util');
var _importSplice;
var _functionSplice;
var _functionCallSplice;
var _discordPath;
var _appFolder = "/app";
var _appArchive = "/app.asar";
var _packageJson = _appFolder + "/package.json";
var _index = _appFolder + "/index.js";
var _force = false;
// Get Arguments
process.argv.forEach(function (val, index, array) {
if (val == "--force") {
_force = true;
}
if (val == "-d" || val == "--directory") {
_discordPath = array[(index+1)]
}
});
function install() {
if (typeof _discordPath == 'undefined') {
var _os = process.platform;
if (_os == "win32") {
_importSplice = 89;
_functionCallSplice = 497;
_functionSplice = 601;
_discordPath = process.env.LOCALAPPDATA + "/Discord/app-"+dver+"/resources";
} else if (_os == "darwin") {
_importSplice = 67;
_functionCallSplice = 446;
_functionSplice = 547;
_discordPath = "/Applications/Discord.app/Contents/Resources" // Defaults to Applications directory
} else if (_os == "linux") {
_discordPath = "/opt/DiscordCanary/resources";
_index = "/app/index.js";
}
}
console.log("Looking for discord resources at: " + _discordPath);
fs.exists(_discordPath, function(exists) {
if(exists) {
console.log("Discord resources found at: " + _discordPath + "\nLooking for app folder");
if(fs.existsSync(_discordPath + _appFolder)) {
console.log("Deleting " + _discordPath + _appFolder + " folder.");
wrench.rmdirSyncRecursive(_discordPath + _appFolder);
console.log("Deleted " + _discordPath + _appFolder + " folder.");
}
if(fs.existsSync(_discordPath + "/node_modules/BetterDiscord")) {
console.log("Deleting " + _discordPath + "/node_modules/BetterDiscord" + " folder.");
wrench.rmdirSyncRecursive(_discordPath + "/node_modules/BetterDiscord");
console.log("Deleted " + _discordPath + "/node_modules/BetterDiscord" + " folder.");
}
console.log("Looking for app archive");
if(fs.existsSync(_discordPath + _appArchive)) {
console.log("App archive found at: " + _discordPath + _appArchive);
} else {
console.log("Failed to locate app archive at: " + _discordPath + _appArchive);
process.exit();
}
console.log("Extracting app archive");
asar.extractAll(_discordPath + _appArchive, _discordPath + _appFolder);
console.log("Copying BetterDiscord");
if(_os == "linux") {
fs.mkdirSync(_discordPath + _appFolder + "/node_modules/BetterDiscord");
}
else {
fs.mkdirSync(_discordPath + "/node_modules/BetterDiscord");
}
wrench.copyDirSyncRecursive(__dirname + "/BetterDiscord/", _discordPath + _appFolder + "/node_modules/BetterDiscord/", {forceDelete: true});
if(!fs.existsSync("splice")) {
console.log("Missing splice file");
process.exit();
}
var splice = fs.readFileSync("splice");
fs.exists(_discordPath + _appFolder, function(exists) {
if(exists) {
console.log("Extracted to: " + _discordPath + _appFolder);
console.log("Injecting index.js");
var data = fs.readFileSync(_discordPath + _index).toString().split("\n");
if(_os == "linux") {
data = data.join("\n");
data = data.replace('var _GPUSettings2 = _interopRequireDefault(_GPUSettings);','var _GPUSettings2 = _interopRequireDefault(_GPUSettings);\n\nvar _betterDiscord = require(\'BetterDiscord\');\n');
data = data.replace('mainWindow.setMenuBarVisibility(false);','mainWindow.setMenuBarVisibility(false);\n' + splice + '\n');
data = data.split("\n");
} else {
data.splice(_importSplice, 0, 'var _betterDiscord = require(\'betterdiscord\');\n');
data.splice(_functionCallSplice, 0, splice);
}
fs.writeFile(_discordPath + _index, data.join("\n"), function(err) {
if(err) return console.log(err);
console.log("Injected index.js");
console.log("Deleting old cache files");
var counter = 0;
var _prefsPath = '/Library/Preferences/BetterDiscord/';
var emotes_twitch_global = 'emotes_twitch_global.json';
fs.exists(process.env.HOME + _prefsPath + emotes_twitch_global, (exists) => {
if (exists) {
console.log("Deleting " + emotes_twitch_global);
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_twitch_global, (err) => {
if(err) throw err;
});
console.log("Deleted " + emotes_twitch_global);
}
counter++;
finished();
});
var emotes_twitch_subscriber = 'emotes_twitch_subscriber.json';
fs.exists(process.env.HOME + _prefsPath + emotes_twitch_subscriber, (exists) => {
if (exists) {
console.log("Deleting " + emotes_twitch_subscriber);
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_twitch_subscriber, (err) => {
if(err) throw err;
});
console.log("Deleted " + emotes_twitch_subscriber);
}
counter++;
finished();
});
var emotes_bttv = 'emotes_bttv.json';
fs.exists(process.env.HOME + _prefsPath + emotes_bttv, (exists) => {
if (exists) {
console.log("Deleting " + emotes_bttv);
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_bttv, (err) => {
if(err) throw err;
});
console.log("Deleted " + emotes_bttv);
}
counter++;
finished();
});
var emotes_bttv_2 = "emotes_bttv_2.json";
fs.exists(process.env.HOME + _prefsPath + emotes_bttv_2, (exists) => {
if (exists) {
console.log("Deleting " + emotes_bttv_2);
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_bttv_2, (err) => {
if(err) throw err;
});
console.log("Deleted " + emotes_bttv_2);
}
counter++;
finished();
});
var emotes_ffz = "emotes_ffz.json";
fs.exists(process.env.HOME + _prefsPath + emotes_ffz, (exists) => {
if (exists) {
console.log("Deleting " + emotes_ffz);
fs.unlinkSync(process.env.HOME + _prefsPath + emotes_ffz, (err) => {
if(err) throw err;
});
console.log("Deleted " + emotes_ffz);
}
counter++;
finished();
});
var user_pref = "user.json";
fs.exists(process.env.HOME + _prefsPath + user_pref, (exists) => {
if (exists) {
console.log("Deleting " + user_pref);
fs.unlinkSync(process.env.HOME + _prefsPath + user_pref, (err) => {
if(err) throw err;
});
console.log("Deleted " + user_pref);
}
counter++;
finished();
});
function finished() {
if(counter => 6) {
console.log("Looks like we're done here");
process.exit();
}
}
});
} else {
console.log("Something went wrong. Please try again.");
process.exit();
}
});
} else {
console.log("Discord resources not found at: " + _discordPath);
process.exit();
}
});
}
function init() {
console.log("BetterDiscord Simple Installer v0.3 for Discord "+dver+" by Jiiks.");
console.log("If Discord has updated then download the latest installer.");
var rl = readline.createInterface({ input: process.stdin, output: process.stdout });
if (_force == false) {
rl.question("The following directories will be deleted if they exists: discorpath/app, discordpath/node_modules/BetterDiscord, is this ok? Y/N", function(answer) {
var alc = answer.toLowerCase();
switch(alc) {
case "y":
case "yes":
install();
break;
case "n":
case "no":
process.exit();
break;
}
});
} else {
install();
}
}
init();

View File

@ -1,11 +0,0 @@
@echo off
where node.exe >nul 2>nul
if %errorlevel%==1 (
echo "Node.exe not found, opening your browser..."
start "" "https://nodejs.org/dist/latest/win-x86/node.exe"
pause
) else (
taskkill /f /im "Discord.exe" >nul 2>nul
cmd /k node.exe index.js
)
exit

View File

@ -1,7 +0,0 @@
#!/bin/bash
# As there is no Linux support, this script assumes OS X as the host system.
command -v node > /dev/null || (echo 'Node not found, please download it!' && open 'https://nodejs.org/en/' && sleep 5 && exit)
node index.js
exit

View File

@ -1,63 +0,0 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

View File

@ -1,156 +0,0 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
!packages/*/build/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#LightSwitch generated files
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
# =========================
# Windows detritus
# =========================
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac desktop service store files
.DS_Store

View File

@ -1,22 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterDiscordWI", "BetterDiscordWI\BetterDiscordWI.csproj", "{469F7547-7664-4DE8-A568-E89525981539}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{469F7547-7664-4DE8-A568-E89525981539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{469F7547-7664-4DE8-A568-E89525981539}.Debug|Any CPU.Build.0 = Debug|Any CPU
{469F7547-7664-4DE8-A568-E89525981539}.Release|Any CPU.ActiveCfg = Release|Any CPU
{469F7547-7664-4DE8-A568-E89525981539}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
</startup>
</configuration>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="BetterDiscord Installer"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

View File

@ -1,158 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{469F7547-7664-4DE8-A568-E89525981539}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BetterDiscordWI</RootNamespace>
<AssemblyName>BetterDiscordWI</AssemblyName>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Resources\BetterDiscord-icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup />
<PropertyGroup>
<ApplicationManifest>App.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="asardotnet">
<HintPath>..\..\..\..\WindowsInstaller\asardotnet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="components\CTextBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="FormMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormMain.Designer.cs">
<DependentUpon>FormMain.cs</DependentUpon>
</Compile>
<Compile Include="panels\IPanel.cs" />
<Compile Include="panels\Panel0.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\Panel0.Designer.cs">
<DependentUpon>Panel0.cs</DependentUpon>
</Compile>
<Compile Include="panels\Panel1.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\Panel1.Designer.cs">
<DependentUpon>Panel1.cs</DependentUpon>
</Compile>
<Compile Include="panels\Panel2.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\Panel2.Designer.cs">
<DependentUpon>Panel2.cs</DependentUpon>
</Compile>
<Compile Include="panels\Panel3.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\Panel3.Designer.cs">
<DependentUpon>Panel3.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utils.cs" />
<EmbeddedResource Include="FormMain.resx">
<DependentUpon>FormMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="panels\Panel0.resx">
<DependentUpon>Panel0.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="panels\Panel1.resx">
<DependentUpon>Panel1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="panels\Panel2.resx">
<DependentUpon>Panel2.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="App.manifest" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bd_logo2.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bd_logo_64x64.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bd_logo_64x64_nobg.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\bd_logo_large_nobg.png" />
</ItemGroup>
<ItemGroup>
<Content Include="BetterDiscord-icon.ico" />
<Content Include="Resources\BetterDiscord-icon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -1,137 +0,0 @@
namespace BetterDiscordWI
{
partial class FormMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
this.btnCancel = new System.Windows.Forms.Button();
this.panelContainer = new System.Windows.Forms.Panel();
this.btnNext = new System.Windows.Forms.Button();
this.btnBack = new System.Windows.Forms.Button();
this.lblPanelTitle = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(438, 328);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 0;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// panelContainer
//
this.panelContainer.BackColor = System.Drawing.SystemColors.Control;
this.panelContainer.Location = new System.Drawing.Point(0, 52);
this.panelContainer.Name = "panelContainer";
this.panelContainer.Size = new System.Drawing.Size(524, 258);
this.panelContainer.TabIndex = 0;
//
// btnNext
//
this.btnNext.Enabled = false;
this.btnNext.Location = new System.Drawing.Point(357, 328);
this.btnNext.Name = "btnNext";
this.btnNext.Size = new System.Drawing.Size(75, 23);
this.btnNext.TabIndex = 4;
this.btnNext.Text = "Next >";
this.btnNext.UseVisualStyleBackColor = true;
//
// btnBack
//
this.btnBack.Enabled = false;
this.btnBack.Location = new System.Drawing.Point(276, 328);
this.btnBack.Name = "btnBack";
this.btnBack.Size = new System.Drawing.Size(75, 23);
this.btnBack.TabIndex = 5;
this.btnBack.Text = "< Back";
this.btnBack.UseVisualStyleBackColor = true;
//
// lblPanelTitle
//
this.lblPanelTitle.AutoSize = true;
this.lblPanelTitle.BackColor = System.Drawing.SystemColors.Window;
this.lblPanelTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblPanelTitle.Location = new System.Drawing.Point(61, 16);
this.lblPanelTitle.Name = "lblPanelTitle";
this.lblPanelTitle.Size = new System.Drawing.Size(103, 16);
this.lblPanelTitle.TabIndex = 6;
this.lblPanelTitle.Text = "BetterDiscord";
//
// panel1
//
this.panel1.BackColor = System.Drawing.SystemColors.Window;
this.panel1.BackgroundImage = global::BetterDiscordWI.Properties.Resources.bd_logo_large_nobg;
this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(64, 46);
this.panel1.TabIndex = 0;
//
// FormMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(524, 361);
this.Controls.Add(this.panel1);
this.Controls.Add(this.lblPanelTitle);
this.Controls.Add(this.btnBack);
this.Controls.Add(this.panelContainer);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.btnNext);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormMain";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Setup - BetterDiscord ";
this.TransparencyKey = System.Drawing.Color.LimeGreen;
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panelContainer;
public System.Windows.Forms.Button btnNext;
public System.Windows.Forms.Button btnBack;
public System.Windows.Forms.Label lblPanelTitle;
private System.Windows.Forms.Panel panel1;
public System.Windows.Forms.Button btnCancel;
}
}

View File

@ -1,71 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Xml;
using BetterDiscordWI.panels;
namespace BetterDiscordWI {
public partial class FormMain : Form {
private readonly IPanel[] _panels = { new Panel0(), new Panel1(), new Panel2() };
private int _index;
public string DiscordPath;
public bool RestartDiscord = false;
public string Sha;
public bool Finished = false;
public XmlNodeList ResourceList;
public FormMain() {
InitializeComponent();
Sha = Utils.GetHash();
if (Sha.Length < 1) {
MessageBox.Show(@"Failed to get sha", @"Error", MessageBoxButtons.OK);
Environment.Exit(0);
}
foreach (IPanel ipanel in _panels) {
panelContainer.Controls.Add((UserControl)ipanel);
((UserControl)ipanel).Dock = DockStyle.Fill;
((UserControl)ipanel).Hide();
}
((UserControl)_panels[_index]).Show();
_panels[_index].SetVisible();
btnCancel.Click += (sender, args) => Close();
btnNext.Click += (sender, args) => _panels[_index].BtnNext();
btnBack.Click += (sender, args) => _panels[_index].BtnPrev();
}
public void SwitchPanel(int index) {
((UserControl)_panels[_index]).Hide();
_index = index;
((UserControl)_panels[_index]).Show();
_panels[_index].SetVisible();
}
protected override void OnFormClosing(FormClosingEventArgs e) {
if (Finished) return;
DialogResult dr = MessageBox.Show(@"Setup is not complete. If you exit now, BetterDiscord will not be installed. Exit Setup?", @"Exit Setup?", MessageBoxButtons.YesNo);
if (dr == DialogResult.No) {
e.Cancel = true;
}
}
readonly Pen _borderPen = new Pen(Color.FromArgb(160, 160, 160));
protected override void OnPaint(PaintEventArgs e) {
Graphics g = e.Graphics;
g.FillRectangle(SystemBrushes.Window, new Rectangle(0, 0, Width, 50));
g.DrawLine(_borderPen, 0, 50, Width, 50);
g.DrawLine(SystemPens.Window, 0, 51, Width, 51);
g.DrawLine(_borderPen, 0, 310, Width, 310);
g.DrawLine(SystemPens.Window, 0, 311, Width, 311);
base.OnPaint(e);
}
}
}

View File

@ -1,659 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA
IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD5AAAA+wAA
APsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD5AAAA+wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAA
APsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APsAAAD7AAAA/wEBCf8NClr/FBCI/wMCGP8AAAD/AAAA/wAAAP8AAAD/AwIW/xQQif8NClv/AQEK/wAA
AP8AAAD7AAAA+wQDH/8cFr7/HhjN/xkTqf8QDW7/EQ1z/xURkf8VEZH/EQ10/xANbf8YE6j/HhjN/xwW
v/8EAyH/AAAA+wAAAPsPDGn/HhjL/x0Xxv8aFbT/HxnV/x4Y0P8eGMz/HhjM/x4Y0P8fGdT/GhW1/x0X
xf8eGMv/EAxs/wAAAPsAAAD7DQpb/x4YzP8eGMz/HRfK/wcFMP8JB0D/HhjP/x4Yz/8JB0P/BgUu/x0X
yf8eGMz/HhjM/w0LXf8AAAD7AAAA+wgGN/8eGM//HhjM/xoVtf8AAAD/AAAC/x0XyP8dF8r/AAAD/wAA
AP8aFbL/HhjM/x4Yz/8IBzv/AAAA+wAAAPsBAQn/HhjP/x4YzP8eGM7/FBCK/xYRlv8eGM3/HhjN/xYR
l/8UEIn/HhjO/x4YzP8eGND/AQEL/wAAAPsAAAD7AAAA/xcSnP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/FxKf/wAAAP8AAAD7AAAA+wAAAP8LCU3/HhjP/x4Yy/8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMv/HhjP/wsJUP8AAAD/AAAA+wAAAPsAAAD/AAAD/xYRlP8XEp3/GhSw/x4Y
0f8fGdX/HxnV/x4Y0f8aFLH/FxKd/xYRlv8AAAT/AAAA/wAAAPsAAAD7AAAA/wAAAP8AAAD/CQc8/wwK
Uf8EAxn/AwMa/wMDGv8EAxj/DApR/wkHPf8AAAD/AAAA/wAAAP8AAAD7AAAA+wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAAAPsAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPsAAAD5AAAA+wAA
APsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD7AAAA+wAAAPsAAAD5AAD//wAA
//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA
AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA9QAAAPkAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APkAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQAG/wYE
J/8IBjj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CAY3/wYE
KP8BAAb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/BgQn/xYR
lf8eGM3/IBnc/yIb5v8OC2L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0L
W/8iG+j/IBnc/x4Yzv8WEpn/BgQq/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/xEN
df8gGt//HhjO/x4Yy/8eGMv/IBna/xwWwf8BAQr/AAAE/wUEI/8JBz//CwlO/wsJTv8JB0D/BQQk/wAA
Bf8BAQj/HBa8/yAa2/8eGMv/HhjL/x4Yzv8hGt//Eg56/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAA
AP8SDn7/IBra/x4Yy/8eGMz/HhjP/x0Xxf8IBzv/CghK/xgTov8dGMv/IBnb/yAa3v8gGdr/IBna/yAa
3v8gGdz/HhjM/xgTpf8LCUz/CAY5/xwWwv8eGM//HhjM/x4Yy/8fGdn/Ew+E/wAAAP8AAAD/AAAA+QAA
APkAAAD/AQAF/x8Z1P8eGMv/HhjM/x4Yzf8bFbj/Dgxk/x4Yzv8gGtv/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/yAZ2v8eGM//Dwxm/xoVtP8eGM3/HhjM/x4Yy/8fGdb/AQEK/wAA
AP8AAAD5AAAA+QAAAP8AAAD/HRjK/x4YzP8eGMz/HhjM/x0XyP8fGdX/HhjL/x4Y0P8gGdz/IBnc/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/yAZ3P8gGdz/HhjQ/x4Yy/8fGdX/HRfI/x4YzP8eGMz/HhjM/x4Y
zf8AAAP/AAAA/wAAAPkAAAD5AAAA/wAAAP8cFsH/HhjM/x4YzP8eGMz/HhjM/x4YzP8fGNP/FhGW/wYF
Kv8HBjX/GxW4/x4Yzv8eGMz/HhjM/x4Yzf8bFrz/CAY3/wYFKf8VEZH/HxnU/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HBfF/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/xkUrf8eGMz/HhjM/x4YzP8eGMz/HhjM/xwW
v/8AAAD/AAAA/wAAAP8DAhX/HxnW/x4YzP8eGMz/HxnX/wMDGf8AAAD/AAAA/wAAAP8bFrr/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8aFLL/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/FBCK/x4Yzv8eGMz/HhjM/x4Y
zP8eGM3/FBCJ/wAAAP8AAAD/AAAA/wAAAP8aFbj/HhjM/x4YzP8cFr3/AAAA/wAAAP8AAAD/AAAA/xIP
gP8eGM//HhjM/x4YzP8eGMz/HhjN/xURkv8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8MCVT/IBnZ/x4Y
zP8eGMz/HhjM/x4YzP8aFbP/AAAA/wAAAP8AAAD/AQEK/x4Y0P8eGMz/HhjM/x8Z0/8CAQ3/AAAA/wAA
AP8AAAD/GRSt/x4YzP8eGMz/HhjM/x4YzP8fGdf/DQpb/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wUE
Jf8gGtz/HhjM/x4YzP8eGMz/HhjM/x8Z1v8RDnb/AgEN/wMCFv8XEp3/HhjR/x4YzP8eGMz/HhjQ/xgT
ov8DAhj/AQEM/xANcf8gGdf/HhjM/x4YzP8eGMz/HhjM/yAa3v8GBSv/AAAA/wAAAP8AAAD5AAAA+QAA
AP8AAAD/AAAC/x0Xyf8eGMv/HhjM/x4YzP8eGMz/HhjL/x8Z1f8fGNL/HxnV/x4Y0P8eGMv/HhjM/x4Y
zP8eGMz/HhjP/x8Z1v8eGNH/HxnV/x4Yy/8eGMz/HhjM/x4YzP8eGMv/HhjM/wAAA/8AAAD/AAAA/wAA
APkAAAD5AAAA/wAAAP8AAAD/FBCJ/x4Yz/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yzv8VEZL/AAAA/wAA
AP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8IBzv/IBre/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IRrd/wkH
Qf8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAf8dF8f/HhjL/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
y/8dGMr/AAAD/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/w8Ma/8fGNT/HxjT/x4Y
y/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
y/8fGNP/HxjT/xENc/8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/AQEM/yAa
2f8WEZT/GRSu/yAa3P8eGNH/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/x4Y
0P8gGtz/GhSw/xURkv8hGt3/AgIQ/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAA
AP8AAAD/BQQk/xwWvf8ZFKb/CghG/xANcP8bFbb/HhjR/yAZ2v8gGt7/IBre/yAa3v8gGt7/IBnb/x4Y
0f8bFrj/EA1y/woIRv8ZE6L/HBfA/wYEJ/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkHQf8aFa7/GRSn/w0LXP8EBBz/BAQg/wcFL/8IBjn/CAY5/wcF
MP8EBCH/BAMb/w0LWv8ZFKX/GxWw/woIRP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAA
APkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQj/CQg6/wcGKP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8HBiX/Cgg8/wICCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAA+QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAAD5AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAPUAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD1AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAA7wAAAPcAAAD3AAAA9wAA
APcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAA
APcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAA
APcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAAD3AAAA9wAAAPcAAADvAAAA+wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD7AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAT/AgIR/wQDG/8EAxr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwMZ/wQDHP8CAhL/AAAF/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AwIY/woIRP8PDGv/FhKY/xoUsf8bFbP/BQQj/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EAx7/GhWx/xoU
s/8WEpn/EAxt/woIRv8EAxr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBCP8LCU//GhSz/x8Z1v8fGdb/HxjU/x8Z1f8hGt//GBOk/wMC
Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIC
Ef8XEpz/IRrh/x8Z1f8fGNT/HxnW/x8Z1/8aFbb/CwlT/wEBC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/CAY4/xkUrf8iG+j/HxjS/x4Yyv8eGMv/HhjL/x4Y
zv8fGNL/IRrk/xEOev8BAAf/AAAB/wEBCf8CAhT/BAMe/wUEJP8FBCf/BQQn/wUEJP8EAx7/AgIU/wEB
Cf8AAAH/AAAG/xENcv8iG+H/HxnS/x4Yzv8eGMv/HhjL/x0Xyv8fGNH/Ihvp/xoUsv8IBzz/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8HBjP/HhjK/yAa3f8eGMz/HhfM/x4Y
zP8dF8r/HxjU/x8Z1v8XEp7/CwhL/wUEJf8HBjT/DApX/xIPfP8XEp7/GhW1/xwWvv8cF8P/HBbD/xwW
vv8bFbb/FxKf/xIOfv8NCln/BwY1/wUEJf8LCEn/FhKa/x8Z1f8fGdX/HRfK/x4XzP8dF8z/HhjM/yAa
3f8eGM7/CAY4/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wUEKf8cFr7/HxnX/x4Y
y/8eGMv/HhjM/x0Yyv8fGdb/HRfM/w0KV/8EAxv/Dgth/xcTpP8eGM7/HxnW/x8Z1f8fGNT/HxnV/x8Z
1P8fGNP/HxjT/x8Z1P8fGdX/HxjV/x8Z1f8fGdb/HhjP/xgTpv8OC2T/BAMc/wwJUv8dF8j/HxnX/x0X
yv8eGMz/HhjL/x4Yy/8fGdb/HBfC/wYFLv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAC/xAM
bP8gGdr/HhjK/x4YzP8eGMz/HhjM/x8Y0/8bFrv/CQc//xIOev8fGNL/IRvm/x8Z1f8eGMv/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x0XzP8eGMz/HhjM/x0XzP8eGMz/HhjL/x8Y1P8hG+b/HxjU/xIO
f/8JBz3/GhW3/x8Y0/8eGMz/HhjM/x0XzP8eGMv/IBnZ/xEOdv8AAAX/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAB/w4LYv8fGdX/HhfM/x4YzP8dF8z/HhfN/x4XzP8XE6D/GhW3/yAa3P8eGNL/HhfL/x4Y
zP8eF83/HhfM/x4YzP8eF8z/HhfM/x4YzP8eF8z/HhfM/x4XzP8dF8z/HhfM/x4XzP8dF8z/HhfN/x4X
zP8dF8v/HxjS/yAa3P8bFbr/FxKe/x0Xyv8eGM3/HhfM/x4XzP8dF8z/HxnU/xAMbP8AAAT/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/w0KWP8fGdX/HhjM/x0YzP8eGMz/HhjM/x4Xy/8eGM7/HxjS/x4Y
zP8eGMv/HhjO/yAa4P8hGuH/IRrj/yAZ2/8dGMv/HhjM/x0Xy/8eGMz/HhjM/x4YzP8eGMz/HhjL/yAZ
2v8hGuL/IRrh/yEa4f8eGM7/HhjL/x4YzP8fGNL/HhjO/x4Yy/8eGMv/HhjM/x4YzP8eGMz/HxnV/w4L
YP8AAAH/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wsJTf8fGdb/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x0Xy/8eGNH/HRfI/xAMb/8IBjf/CQhD/xURkf8fGdb/HRfL/x4Yy/8eGMz/HhjM/x0X
y/8dF8v/HxnW/xURlf8KCEX/BwY2/w8Ma/8dF8X/HhjS/x0Xy/8eGMz/HhjM/x0XzP8eGMz/HhjM/x0X
zP8eGMz/HxnW/wwJU/8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wkHQP8fGNT/HhfM/x4Y
zP8dF8z/HhfM/x4YzP8dF8z/HhfM/x4Y0P8fGdn/CQc+/wAAAv8AAAD/AAAA/wICEP8SDnv/IRrf/x4Y
y/8eF8z/HhfM/x4Xy/8gGt//Ew+D/wICEv8AAAD/AAAA/wAAAP8IBjr/HxnW/x4Y0f8dF8z/HhfM/x4X
zP8dF8z/HhfM/x4XzP8dF8z/HxnV/woIRv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wcF
Mf8dF83/HhjM/x0YzP8eGMz/HhjM/x0YzP8eGMz/HhjM/yAa3f8WEpj/AAAA/wAAAP8AAAD/AAAA/wAA
AP8CAQ//HhjM/x8Y0/8eGMz/HhjM/x4Y0f8eGNH/AgIT/wAAAP8AAAD/AAAA/wAAAP8AAAD/FRGP/yAZ
3f8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjQ/wgGNv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wQDHf8bFrr/HhjO/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x8Z2f8NC17/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/FhKd/yAa3v8eGMz/HhjM/yAZ3P8YE6b/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/DApU/x8Z1/8eGM3/HhjM/x0XzP8eGMz/HhjM/x0XzP8eGM3/HBbA/wUEIv8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wEBCf8XEpv/HxnV/x4YzP8dF8z/HhfM/x4YzP8dF8z/HhfM/yAZ
2/8ODGj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GBOm/yAZ3P8eF8z/HhfM/yAZ2v8aFK7/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/Dgtf/yAZ2f8eGM3/HhfM/x4XzP8dF8z/HhfM/x4XzP8fGdP/GBOk/wIB
Dv8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8RDXb/IRri/x0YzP8eGMz/HhjM/x0Y
zP8eGMz/HhjM/yAZ2/8YE6X/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAhb/HxjW/x4Y0f8eGMz/HhjM/x4Y
0P8gGdr/BAMd/wAAAP8AAAD/AAAA/wAAAP8AAAD/FxKc/yAa3P8eGMv/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8hGt//Eg9//wAAAf8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8JB0H/Ihvn/x4Y
zP8eGMv/HhjL/x4YzP8eGMv/HhjM/x4Yy/8hGuH/EA1v/wMCFf8AAAT/AQAH/wUEJP8YE6X/IBnb/x4Y
y/8eGMz/HhjM/x4Yy/8gGdn/GRSr/wUEKP8BAAj/AAAE/wICFP8PDGf/IRrh/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4Yy/8iG+j/CwlK/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8DAhX/HxnV/x4Y0f8eGMz/HhjM/x4YzP8eGMz/HhjM/x0Xy/8eGM7/HxnV/xcSnP8QDGz/EQ12/xoU
s/8fGdj/HRfK/x0Xy/8eGMz/HRfL/x4YzP8dF8r/HxnX/xoVtv8RDnn/Dwxr/xYRmf8fGdT/HhjO/x4Y
y/8eGMz/HRfL/x4YzP8eGMz/HRfL/x4Yz/8fGdn/BAMc/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAH/GhWz/yAZ2/8eGMv/HhjM/x4YzP8eGMz/HRfM/x4YzP8eGMv/HhjO/x8Z
1P8fGdX/HxnV/x4Y0/8eGMz/HRfL/x4YzP8eGMz/HhjM/x4XzP8eGMz/HhfM/x4Y0v8fGdT/HxnV/x8Y
1P8eGM7/HhjL/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjL/yAZ2f8bFrr/AAAC/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/EAxs/yAZ3P8eGMz/HhjL/x4YzP8eGMv/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/yAa3v8RDXb/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/BwYz/x4Yzf8eGNH/HhjM/x4Y
zP8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HRfL/x4Y
zP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HhjQ/x4Y
z/8IBjn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AwMZ/xkU
rP8fGdX/HhjM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4Y
zP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4X
zP8eGMz/HxnU/xoUsv8EAxz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAB/w4LXf8gGdj/HhjL/x4YzP8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMv/HxnX/w4LZf8AAAL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYFKv8dF8n/HhjN/x4YzP8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0X
y/8eGMz/HhjM/x0Xy/8eGMz/HhjM/x0Xy/8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4Y
zP8eGMz/HRfL/x4YzP8eGMz/HRfL/x4YzP8eGMz/HhjN/wcGMP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAABf8TD4X/IBrg/x4Yzf8fGdf/HRfL/x4Y
y/8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HRfM/x4YzP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4X
zP8eGMz/HhjM/x4XzP8eGMz/HhjM/x4Xy/8eGMr/HxnX/x4Xzv8gGt3/FRCP/wAABv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAxz/IBrg/xwW
vf8VEZP/HRfI/x8Y0/8fGdT/HhjP/x4YzP8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjL/x4YzP8eGM7/HxnU/x8Y0/8dF8r/FRGU/xsWuv8hG+T/BQQj/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/EA1u/x8Z0f8cFrz/Dgtj/xANcf8YFKf/HhjS/yAZ3P8gGtz/HxjT/x4Yz/8eGM3/HhjM/x0X
y/8eGMz/HRfL/x4YzP8eGMz/HhfN/x4Yz/8fGNP/IBrc/yAa3P8eGNL/GRSp/xENdP8OC2H/Gxa5/yAZ
0v8RDnb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AQEJ/woISf8aFbL/IRvX/xURkv8HBjT/CAY3/w8Maf8YE6T/HRjK/x8Z
2f8gGuH/IRvm/yIb6P8hG+f/IRvn/yIb6P8hG+b/IBri/x8Z2v8dGMr/GBOm/w8MbP8IBjj/BwUz/xQQ
jf8hGtX/GxW3/wsJTf8BAQv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CwlQ/xkUqf8hGtv/FhKb/wsJ
TP8GBSr/AwIV/wQDH/8HBjT/CghE/wsJT/8MClb/DApW/wsJT/8KCEX/BwY1/wQDIP8DAhT/BgUp/wsJ
Sf8WEZb/IRrc/xoVrP8MClT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIB
Df8IBjn/Eg9z/xcTk/8XEpX/Dw1X/wEBBf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEB
BP8ODFH/FxKV/xcTlP8SD3T/CAc7/wIBDv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAC/wICEP8FBCD/BQQb/wAAAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAv8EBBn/BQQh/wMCEP8AAAL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA9QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA+wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD7AAAA7wAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAA
APUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAA
APUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAAAPUAAAD1AAAA9QAA
APUAAAD1AAAA9QAAAPUAAADvAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA
AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAOUAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAOUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EAxj/CghA/w4L
Xf8TD4D/Dwxj/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4LXP8TEIP/Dgtf/woI
Qv8EAxv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAMc/xAN
bf8YE6X/HhjP/yIb6P8jHPD/JR35/yce//8OC1//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwK
Uv8mHv//JR37/yMc8f8iG+j/HxnR/xkUqP8RDXH/BQQh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8EAxj/FBCF/yAZ1/8kHff/Ihzr/yAZ2P8eGM7/HhjM/x4Yyf8gGtn/JBzx/wkHOf8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wcGLv8jHOz/IRrd/x4Yyf8eGMz/HhjO/yAZ1/8iG+n/JB33/yAa2/8UEIv/BAMe/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8NClf/IBrZ/yUd+v8gGdn/HhjK/x4Yy/8eGMz/HhjM/x4YzP8eGMr/HhjJ/yYe
//8lHvz/BgUq/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUEIv8kHfL/Jx///x4Yyv8eGMr/HhjM/x4YzP8eGMz/HhjL/x4Y
yv8gGdf/JR35/yEa3v8OC2D/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UEIT/JR36/yEb4f8dGMj/HhjM/x4YzP8eGMz/HhjM/x4Y
y/8eGMn/Ihvp/yMc7/8ZFKr/Dgth/wAAAP8AAAD/AAAA/wMCEv8IBzb/DQtZ/xEOdf8UEIn/FxKY/xgT
oP8YE6D/FxKY/xQQiv8SDnf/DQtb/wgHOP8DAhT/AAAA/wAAAP8AAAD/Dgtc/xkUpv8jHO3/Ihzr/x4Y
yv8eGMv/HhjM/x4YzP8eGMz/HhjM/x0YyP8hGt7/JR78/xURj/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UEIr/Jh7+/x8Z0v8eGMr/HhjM/x4Y
zP8eGMz/HhjM/x0YyP8fGdX/JR35/xoVsP8HBi//AAAA/wAAAP8IBjX/Eg55/xgTov8dGMj/IRvj/yMc
8P8kHPL/Ixzu/yMc6/8iG+j/Ihvo/yMc6/8jHO7/JBzy/yMc8P8iG+T/HhjK/xgTpf8SD3v/CQc6/wAA
AP8AAAD/BgUo/xkUqf8lHfn/IBnX/x0YyP8eGMz/HhjM/x4YzP8eGMz/HhjK/x4Y0P8lHv7/FhKX/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8QDW//Jh7//x4Z
z/8eGMr/HhjM/x4YzP8eGMz/HhjM/x0YyP8hG+H/Ihvr/w4LW/8AAAD/AgEO/xANbv8bFrz/Ihzp/yQd
9P8iG+n/IBra/x8Y0P8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjQ/yAa
2f8iG+j/JB30/yMc6/8cF7//EQ1z/wMCE/8AAAD/DApR/yIb5/8iG+T/HRfH/x4YzP8eGMz/HhjM/x4Y
zP8eGMv/HhjN/yYe//8SD3v/AAAB/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
AP8CAQr/HxnT/yEa4P8eGMr/HhjM/x4YzP8eGMz/HhjM/x4Yy/8hGt7/HhjL/wcFLf8DAxf/FhGS/yIb
5P8kHfX/IRvi/x4Yzv8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yy/8eGM7/IRrg/yQd9f8iG+b/FxKZ/wQDHP8GBST/HRfE/yEa
4P8eGMr/HhjM/x4YzP8eGMz/HhjM/x4Yy/8gGtv/IRrc/wMDFP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
APMAAAD/AAAA/wAAAP8AAAD/AgEK/xwXw/8gGtv/HhjM/x4YzP8eGMz/HhjM/x4YzP8fGNH/HxnT/w8M
Zf8PDWj/Ihvn/yMc8P8fGdL/HhjK/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMr/HxjR/yMc
7/8iHOr/EQ1x/w4MYP8eGM//HxnS/x4YzP8eGMz/HhjM/x4YzP8eGMz/IBrY/x4Yy/8DAxb/AAAA/wAA
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAA/8bFrn/IRrf/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HxjQ/xwWvf8cF8H/Ixzu/x8Z0f8eGMr/HhjM/x4YzP8eGMz/HhjN/x4Yz/8eGM7/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGM7/HhjP/x4Y
zf8eGMz/HhjM/x4YzP8eGMr/HxjP/yMc7v8dF8P/Gxa6/x8Z0P8eGMz/HhjM/x4YzP8eGMz/HhjM/yAa
2/8dF8P/AgEM/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/GhWu/yEb
4/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yy/8fGND/HxnU/x4Yy/8eGMz/HhjM/x4Yy/8eGMn/IRrg/yMc
7/8iG+b/Ihvp/yMc7v8fGdP/HRjI/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjJ/x8Z
0f8jHO3/Ihvp/yIb5v8jHO7/IRvi/x4Yyf8eGMv/HhjM/x4YzP8eGMv/HxnU/x8Z0P8eGMr/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8hGt//Gxa5/wAAA/8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
AP8AAAD/AAAA/xgToP8iG+n/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
y/8eGMr/Ixzt/xwWv/8PDGn/CghA/wsJSf8UEIv/Ihvj/yEa4P8dF8f/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HRfI/yAa3f8iG+b/FRGQ/wsJTP8JCED/Dwxk/xsWuf8jHO7/HhjM/x4Yy/8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IRvl/xkUq/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8VEY3/Ixzu/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
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
zP8eGMz/HhjM/yQc7/8QDWn/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQr/HBe//yIb6f8eGMr/HhjM/x4Y
zP8eGMz/HhjM/x4Yyv8iG+b/HhjH/wICEf8AAAD/AAAA/wAAAP8AAAD/AAAA/w4LXP8jHO3/HxjO/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/yQd9f8RDnH/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBjL/Ihvk/x8Y0P8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yyv8fGdX/Ixzu/xQQhP8GBSn/AgEL/wMCEf8LCEf/HBa+/yMc
7f8dF8j/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HRfH/yMc6/8dF8X/CwlM/wMCFP8CAQv/BQQm/xIO
fP8jHOz/IBnY/x4Yyf8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Yzv8iHOr/CQc9/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEI/x0X
xv8gGtz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjJ/x8Y0P8jHO7/IBnX/x0X
wv8dF8b/Ihvn/yEb5P8dF8j/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8dF8f/IRrh/yIb
6f8dGMj/HBfB/x8Z1f8jHO//HxnS/x4Yyf8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8gGdj/HhjO/wICD/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8WEpT/Ixzw/x4Yy/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjL/x8Z1P8gGtz/IBra/x4Yz/8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4Yy/8eGM7/IBrZ/yAa3P8fGdX/HhjL/x4Yy/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMv/Ixzs/xgToP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DApT/yQc8/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/yQd9v8OC2D/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMCEP8fGdH/IBnY/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x8Z1f8gGtn/BAMa/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/FxKc/yMc7/8eGMv/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
y/8jHOv/GRSm/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwKUv8kHfX/HhjL/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMr/JR33/w4LYP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQf/HhjI/yEa3f8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/IBrY/x8Y0v8CAg//AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMP
gf8lHfj/HhjK/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjK/yQd9f8UEYz/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8GBSn/Ihzp/x8Y0f8eGMz/HhjN/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zv8jHO//CAc1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xcSnP8jHPH/HRfF/yAZ1/8gGt3/HhjL/x4Y
y/8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjL/x4Y
yv8gGtz/IBnZ/x0Xxf8jHO3/GRSp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBjP/JB35/x8Z
0v8WEZT/FxOe/yMc7f8iG+f/HhjO/x4Yyv8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMr/HhjN/yIb5f8jHO//GBOj/xURkf8eGM7/JR79/woIQP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/xcTnf8oIP//HBa+/w8MY/8LCU3/FhKX/yIb5v8kHfP/IBrd/x4Yz/8eGMv/HhjM/x4Y
zP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zP8eGMz/HhjL/x4Yzv8gGtv/JB3y/yIb6f8XEp3/DAlP/w4LX/8bFrf/KCD//xkUqv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQX/FRGM/yYf//8mHv//Eg9+/wUEJf8GBCb/EQ5y/x0X
wv8iG+b/JB3z/yMc7P8hGt7/HxnV/x8Y0P8eGM7/HhjN/x4YzP8eGMz/HhjM/x4YzP8eGMz/HhjM/x4Y
zf8eGM7/HxjQ/x8Z1P8hGt3/Ixzr/yQd8/8iG+f/HRfF/xIOeP8GBSn/BQQj/xEOdv8lHv7/Jx///xYR
lf8CAQr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JCEH/Gxa3/ykh
//8lHfj/EQ51/wIBDf8AAAD/BAMZ/w4LYv8XEpr/HBe//x8Z1f8hG+P/Ihvq/yMc7v8kHPL/JBzy/yMc
8P8jHPD/Ixzy/yQd8v8jHO7/Ihzq/yEb5P8fGdb/HBfA/xcTnf8PDGb/BAMd/wAAAP8BAQr/EA1t/yQc
8v8qIf//HBa+/wsJSP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8MClP/GhW0/ygg//8mHv//FxOh/wcFMf8AAAD/AAAA/wAAAP8EAxz/CAc4/wsJ
S/8NC1n/Dwxl/xANb/8RDnX/EQ51/xANb/8PDGb/DQta/wsJTP8IBzn/BAMf/wAAAP8AAAD/AAAA/wYF
K/8WEZr/Jh7//ykg//8bFrr/DQtY/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IBzb/FBCG/yEc1f8mH/f/IBrX/xcS
mf8ODFb/AAEA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8OC1D/FhKW/yAa1P8mH/f/IhzY/xURi/8JBzr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAQD/BwYj/xAOXf8XE47/GRWL/wUFFf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8EBBD/GBSF/xcTkf8RDmH/CAcm/wEBAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAA
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APMAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADzAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPMAAADzAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAOUAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAAAPMAAADzAAAA8wAA
APMAAADzAAAA8wAAAPMAAADzAAAA8wAAAOUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</value>
</data>
</root>

View File

@ -1,19 +0,0 @@
using System;
using System.Windows.Forms;
namespace BetterDiscordWI
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
}

View File

@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("BetterDiscordWI")]
[assembly: AssemblyDescription("Better Discord Windows Installer")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Jiiks")]
[assembly: AssemblyProduct("BetterDiscordWI")]
[assembly: AssemblyCopyright("Copyright © 2015-2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("17adafc9-c3e6-49c2-b2c9-d6866e7f4f23")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.2.8.0")]
[assembly: AssemblyFileVersion("0.2.8.0")]

View File

@ -1,103 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BetterDiscordWI.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BetterDiscordWI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap bd_logo_64x64 {
get {
object obj = ResourceManager.GetObject("bd_logo_64x64", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap bd_logo_64x64_nobg {
get {
object obj = ResourceManager.GetObject("bd_logo_64x64_nobg", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap bd_logo_large_nobg {
get {
object obj = ResourceManager.GetObject("bd_logo_large_nobg", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap bd_logo2 {
get {
object obj = ResourceManager.GetObject("bd_logo2", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -1,133 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="bd_logo2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bd_logo2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="bd_logo_64x64" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bd_logo_64x64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="bd_logo_64x64_nobg" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bd_logo_64x64_nobg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="bd_logo_large_nobg" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bd_logo_large_nobg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -1,26 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BetterDiscordWI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 MiB

View File

@ -1,46 +0,0 @@
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;
using System.Windows.Forms;
namespace BetterDiscordWI
{
class Utils
{
public void StartDownload(ProgressBar pb, string url, string name)
{
Thread t = new Thread(() =>
{
WebClient webClient = new WebClient {Headers = {["User-Agent"] = "Mozilla/5.0"}};
webClient.DownloadProgressChanged += delegate(object sender, DownloadProgressChangedEventArgs args)
{
double percentage = (double.Parse(args.BytesReceived.ToString()) /double.Parse(args.TotalBytesToReceive.ToString())) * 100;
Debug.Print(percentage.ToString());
pb.Invoke((MethodInvoker) delegate
{
pb.Value = (int)Math.Truncate(percentage);
});
};
webClient.DownloadFile(new Uri(url), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BetterDiscord\\temp\\" + name);
});
t.Start();
}
public static string GetHash()
{
WebClient wc = new WebClient {Headers = {["User-Agent"] = "Mozilla/5.0"}};
string result = wc.DownloadString(@"https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master");
int start = result.IndexOf("{\"sha\":");
int end = result.IndexOf("\",\"");
return result.Substring(start + 8, end - 8);
}
}
}

View File

@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BetterDiscordWI.components
{
class CTextBox : TextBox
{
public bool CAutoSize
{
get { return AutoSize; }
set { AutoSize = value; }
}
}
}

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net451" />
</packages>

View File

@ -1,8 +0,0 @@
namespace BetterDiscordWI.panels {
interface IPanel {
void SetVisible();
FormMain GetParent();
void BtnNext();
void BtnPrev();
}
}

View File

@ -1,100 +0,0 @@
namespace BetterDiscordWI.panels
{
partial class Panel0
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Panel0));
this.label2 = new System.Windows.Forms.Label();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.radioDeclineLicense = new System.Windows.Forms.RadioButton();
this.radioAcceptLicense = new System.Windows.Forms.RadioButton();
this.SuspendLayout();
//
// label2
//
this.label2.Location = new System.Drawing.Point(35, 18);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(455, 31);
this.label2.TabIndex = 5;
this.label2.Text = "Please read the following License Agreement and accept the terms before continuin" +
"g the installation.";
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(38, 54);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.ReadOnly = true;
this.richTextBox1.Size = new System.Drawing.Size(452, 169);
this.richTextBox1.TabIndex = 4;
this.richTextBox1.Text = resources.GetString("richTextBox1.Text");
//
// radioDeclineLicense
//
this.radioDeclineLicense.AutoSize = true;
this.radioDeclineLicense.Checked = true;
this.radioDeclineLicense.Location = new System.Drawing.Point(108, 229);
this.radioDeclineLicense.Name = "radioDeclineLicense";
this.radioDeclineLicense.Size = new System.Drawing.Size(61, 17);
this.radioDeclineLicense.TabIndex = 8;
this.radioDeclineLicense.TabStop = true;
this.radioDeclineLicense.Text = "Decline";
this.radioDeclineLicense.UseVisualStyleBackColor = true;
//
// radioAcceptLicense
//
this.radioAcceptLicense.AutoSize = true;
this.radioAcceptLicense.Location = new System.Drawing.Point(38, 229);
this.radioAcceptLicense.Name = "radioAcceptLicense";
this.radioAcceptLicense.Size = new System.Drawing.Size(59, 17);
this.radioAcceptLicense.TabIndex = 7;
this.radioAcceptLicense.Text = "Accept";
this.radioAcceptLicense.UseVisualStyleBackColor = true;
//
// Panel0
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.radioDeclineLicense);
this.Controls.Add(this.radioAcceptLicense);
this.Controls.Add(this.label2);
this.Controls.Add(this.richTextBox1);
this.Name = "Panel0";
this.Size = new System.Drawing.Size(524, 258);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label2;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.RadioButton radioDeclineLicense;
private System.Windows.Forms.RadioButton radioAcceptLicense;
}
}

View File

@ -1,31 +0,0 @@
using System.Windows.Forms;
namespace BetterDiscordWI.panels {
public partial class Panel0 : UserControl, IPanel {
public Panel0() {
InitializeComponent();
radioAcceptLicense.CheckedChanged += (sender, args) => {
GetParent().btnNext.Enabled = radioAcceptLicense.Checked;
};
}
public void SetVisible() {
GetParent().btnBack.Visible = false;
GetParent().btnNext.Enabled = false;
GetParent().btnNext.Text = @"Next >";
GetParent().lblPanelTitle.Text = @"BetterDiscord License Agreement";
GetParent().btnNext.Enabled = radioAcceptLicense.Checked;
}
public FormMain GetParent() {
return (FormMain)ParentForm;
}
public void BtnNext() {
GetParent().SwitchPanel(1);
}
public void BtnPrev() {}
}
}

View File

@ -1,131 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="richTextBox1.Text" xml:space="preserve">
<value>Copyright (c) 2015 Jiiks
http://jiiks.net
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.</value>
</data>
</root>

View File

@ -1,152 +0,0 @@
namespace BetterDiscordWI.panels
{
partial class Panel1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.btnBrowser = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.cbRestart = new System.Windows.Forms.CheckBox();
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.checkBox2 = new System.Windows.Forms.CheckBox();
this.tbPath = new BetterDiscordWI.components.CTextBox();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(20, 17);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(380, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Setup will install BetterDiscord to the following location. Click Install to cont" +
"inue.";
//
// btnBrowser
//
this.btnBrowser.Location = new System.Drawing.Point(406, 46);
this.btnBrowser.Name = "btnBrowser";
this.btnBrowser.Size = new System.Drawing.Size(75, 26);
this.btnBrowser.TabIndex = 2;
this.btnBrowser.Text = "Browse";
this.btnBrowser.UseVisualStyleBackColor = true;
this.btnBrowser.Click += new System.EventHandler(this.btnBrowser_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(20, 75);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(422, 13);
this.label2.TabIndex = 3;
this.label2.Text = "*If the path is not pointing to the latest version of Discord then click browse a" +
"nd select it.";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(20, 91);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(161, 13);
this.label3.TabIndex = 5;
this.label3.Text = "*Installer will kill Discord process.";
//
// cbRestart
//
this.cbRestart.AutoSize = true;
this.cbRestart.Location = new System.Drawing.Point(23, 117);
this.cbRestart.Name = "cbRestart";
this.cbRestart.Size = new System.Drawing.Size(175, 17);
this.cbRestart.TabIndex = 6;
this.cbRestart.Text = "Restart Discord after installation";
this.cbRestart.UseVisualStyleBackColor = true;
//
// checkBox1
//
this.checkBox1.AutoSize = true;
this.checkBox1.Location = new System.Drawing.Point(23, 140);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(137, 17);
this.checkBox1.TabIndex = 7;
this.checkBox1.Text = "Install to DiscordCanary";
this.checkBox1.UseVisualStyleBackColor = true;
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
// checkBox2
//
this.checkBox2.AutoSize = true;
this.checkBox2.Location = new System.Drawing.Point(23, 163);
this.checkBox2.Name = "checkBox2";
this.checkBox2.Size = new System.Drawing.Size(436, 17);
this.checkBox2.TabIndex = 8;
this.checkBox2.Text = "Install to DiscordPTB (Can break at any time)(Installer will be updated frequentl" +
"y for this)";
this.checkBox2.UseVisualStyleBackColor = true;
this.checkBox2.CheckedChanged += new System.EventHandler(this.checkBox2_CheckedChanged);
//
// tbPath
//
this.tbPath.CAutoSize = false;
this.tbPath.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tbPath.Location = new System.Drawing.Point(23, 46);
this.tbPath.Name = "tbPath";
this.tbPath.Size = new System.Drawing.Size(377, 26);
this.tbPath.TabIndex = 4;
//
// Panel1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.checkBox2);
this.Controls.Add(this.checkBox1);
this.Controls.Add(this.cbRestart);
this.Controls.Add(this.label3);
this.Controls.Add(this.tbPath);
this.Controls.Add(this.label2);
this.Controls.Add(this.btnBrowser);
this.Controls.Add(this.label1);
this.Name = "Panel1";
this.Size = new System.Drawing.Size(524, 258);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button btnBrowser;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.CheckBox cbRestart;
internal components.CTextBox tbPath;
private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.CheckBox checkBox2;
}
}

View File

@ -1,90 +0,0 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace BetterDiscordWI.panels {
public partial class Panel1: UserControl, IPanel {
public Panel1() {
InitializeComponent();
}
public void SetVisible() {
GetParent().btnBack.Visible = true;
GetParent().btnNext.Enabled = true;
GetParent().btnBack.Enabled = true;
GetParent().btnNext.Text = @"Install";
GetParent().lblPanelTitle.Text = @"BetterDiscord Installation";
PickVersion();
}
public FormMain GetParent() {
return (FormMain)ParentForm;
}
public void BtnNext() {
GetParent().DiscordPath = tbPath.Text;
GetParent().RestartDiscord = cbRestart.Checked;
GetParent().SwitchPanel(2);
}
public void BtnPrev() {
GetParent().SwitchPanel(0);
}
private void btnBrowser_Click(object sender, EventArgs e) {
FolderBrowserDialog fbd = new FolderBrowserDialog { SelectedPath = tbPath.Text };
fbd.ShowDialog(GetParent());
tbPath.Text = fbd.SelectedPath;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e) {
PickVersion();
}
private void checkBox2_CheckedChanged(object sender, EventArgs e) {
PickVersion();
}
private void PickVersion() {
string dirPath;
if(checkBox1.Checked) {
dirPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\DiscordCanary";
if(!Directory.Exists(dirPath)) checkBox1.Checked = false;
checkBox2.Checked = false;
} else if(checkBox2.Checked) {
dirPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\DiscordPTB";
if(!Directory.Exists(dirPath)) checkBox2.Checked = false;
checkBox1.Checked = false;
} else {
dirPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\Discord";
}
if (!Directory.Exists(dirPath)) return;
string[] directories = Directory.GetDirectories(dirPath);
string highestVersion = null;
foreach(string s in directories) {
Debug.Print(s);
if(!s.Contains("app-"))
continue;
if(string.IsNullOrEmpty(highestVersion)) {
highestVersion = s;
continue;
}
if(string.CompareOrdinal(s, highestVersion) > 0) {
highestVersion = s;
}
}
tbPath.Text = highestVersion;
}
}
}

View File

@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,67 +0,0 @@
namespace BetterDiscordWI.panels
{
partial class Panel2
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.pbMain = new System.Windows.Forms.ProgressBar();
this.rtLog = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// pbMain
//
this.pbMain.Location = new System.Drawing.Point(3, 267);
this.pbMain.Name = "pbMain";
this.pbMain.Size = new System.Drawing.Size(518, 16);
this.pbMain.TabIndex = 0;
//
// rtLog
//
this.rtLog.Location = new System.Drawing.Point(3, 3);
this.rtLog.Name = "rtLog";
this.rtLog.Size = new System.Drawing.Size(518, 252);
this.rtLog.TabIndex = 1;
this.rtLog.Text = "";
//
// Panel2
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.rtLog);
this.Controls.Add(this.pbMain);
this.Name = "Panel2";
this.Size = new System.Drawing.Size(524, 258);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ProgressBar pbMain;
private System.Windows.Forms.RichTextBox rtLog;
}
}

View File

@ -1,310 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Threading;
using System.Windows.Forms;
using asardotnet;
namespace BetterDiscordWI.panels {
public partial class Panel2: UserControl, IPanel {
private string _dataPath, _tempPath;
private Utils _utils;
public Panel2() {
InitializeComponent();
}
public void SetVisible() {
GetParent().btnBack.Enabled = false;
GetParent().btnNext.Enabled = false;
GetParent().btnBack.Visible = false;
GetParent().btnNext.Visible = false;
GetParent().btnCancel.Enabled = false;
_utils = new Utils();
KillProcessIfInstalling("Discord");
KillProcessIfInstalling("DiscordCanary");
KillProcessIfInstalling("DiscordPTB");
CreateDirectories();
}
private void KillProcessIfInstalling(string app) {
if (!GetParent().DiscordPath.Contains(app + "\\")) return;
AppendLog("Killing " + app);
foreach(var process in Process.GetProcessesByName(app)) {
process.Kill();
}
}
private void CreateDirectories() {
Thread t = new Thread(() => {
_dataPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord";
_tempPath = $"{_dataPath}\\temp";
AppendLog("Deleting old cached files");
try {
if(File.Exists($"{_dataPath}\\emotes_bttv.json")) {
File.Delete($"{_dataPath}\\emotes_bttv.json");
}
if(File.Exists($"{_dataPath}\\emotes_bttv_2.json")) {
File.Delete($"{_dataPath}\\emotes_bttv_2.json");
}
if(File.Exists($"{_dataPath}\\emotes_ffz.json")) {
File.Delete($"{_dataPath}\\emotes_ffz.json");
}
if(File.Exists($"{_dataPath}\\emotes_twitch_global.json")) {
File.Delete($"{_dataPath}\\emotes_twitch_global.json");
}
if(File.Exists($"{_dataPath}\\emotes_twitch_subscriber.json")) {
File.Delete($"{_dataPath}\\emotes_twitch_subscriber.json");
}
if(File.Exists($"{_dataPath}\\user.json")) {
File.Delete($"{_dataPath}\\user.json");
}
} catch(Exception e) { AppendLog("Failed to delete one or more cached files"); }
if(Directory.Exists(_tempPath)) {
AppendLog("Deleting temp path");
Directory.Delete(_tempPath, true);
}
while(Directory.Exists(_tempPath)) {
Debug.Print("Waiting for dirdel");
Thread.Sleep(100);
}
Directory.CreateDirectory(_tempPath);
DownloadResource("BetterDiscord.zip", "https://github.com/Jiiks/BetterDiscordApp/archive/stable16.zip");
while(!File.Exists($"{_tempPath}\\BetterDiscord.zip")) {
Debug.Print("Waiting for download");
Thread.Sleep(100);
}
AppendLog("Extracting BetterDiscord");
ZipArchive zar =
ZipFile.OpenRead($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\BetterDiscord.zip");
zar.ExtractToDirectory($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\");
DeleteDirs();
});
t.Start();
}
private void DeleteDirs() {
int errors = 0;
Thread t = new Thread(() => {
string dir = $"{GetParent().DiscordPath}\\resources\\app";
if(Directory.Exists(dir)) {
try {
AppendLog("Deleting " + dir);
Directory.Delete(dir, true);
} catch {
AppendLog($"Error: Failed to Delete the '{dir}\\resources\\app' Directory.");
errors = 1;
Finalize(errors);
}
}
while(Directory.Exists(dir)) {
Debug.Print("Waiting for direl");
Thread.Sleep(100);
}
if (!Directory.Exists($"{GetParent().DiscordPath}\\resources\\node_modules\\")) {
Debug.Print("node_modules doesn't exist, creating");
AppendLog("node_modules doesn't exist, creating");
Directory.CreateDirectory($"{GetParent().DiscordPath}\\resources\\node_modules\\");
}
dir = $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord";
if(Directory.Exists(dir)) {
AppendLog($"Deleting {dir}");
Directory.Delete(dir, true);
}
while(Directory.Exists(dir)) {
Debug.Print("Waiting for direl");
Thread.Sleep(100);
}
AppendLog("Extracting app.asar");
string appAsarPath = $"{GetParent().DiscordPath}\\resources\\app.asar";
if(File.Exists(appAsarPath)) {
AsarArchive archive = new AsarArchive(appAsarPath);
AsarExtractor extractor = new AsarExtractor();
extractor.ExtractAll(archive, $"{GetParent().DiscordPath}\\resources\\app\\");
} else {
AppendLog("Error: app.asar file couldn't be found in 'resources' folder. Installation cannot Continue.");
errors = 1;
Finalize(errors);
}
if(errors == 0) {
AppendLog("Moving BetterDiscord to resources\\node_modules\\");
Directory.Move($"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\BetterDiscordApp-stable16", $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord");
try {
Splice();
} catch {
AppendLog("Error: Extracting app.asar: Newtonsoft.Json.dll might not be present in the Installer Folder. Installation cannot Continue.");
errors = 1;
Finalize(errors);
}
}
});
t.Start();
}
private void DownloadResource(string resource, string url) {
AppendLog("Downloading Resource: " + resource);
WebClient webClient = new WebClient {Headers = {["User-Agent"] = "Mozilla/5.0"}};
webClient.DownloadFile(new Uri(url), $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\BetterDiscord\\temp\\{resource}");
}
private void Splice() {
string indexloc = null;
if(File.Exists($"{GetParent().DiscordPath}\\resources\\app\\app\\index.js"))
{
//Normal path
indexloc = $"{GetParent().DiscordPath}\\resources\\app\\app\\index.js";
} else if (File.Exists($"{GetParent().DiscordPath}\\resources\\app\\index.js"))
{
//Canary 0.0.138 changed path to app\\index.js
indexloc = $"{GetParent().DiscordPath}\\resources\\app\\index.js";
}
if(indexloc == null)
{
AppendLog($"Error: index.js not found");
Finalize(1);
return;
}
if(!File.Exists(@"splice"))
{
AppendLog($"Error: splice install file not found, this should be included with the installer.");
Finalize(1);
return;
}
Thread t = new Thread(() => {
List<string> lines = new List<string>();
AppendLog("Spicing index");
using(FileStream fs = new FileStream(indexloc, FileMode.Open)) {
using(StreamReader reader = new StreamReader(fs)) {
string line = "";
while((line = reader.ReadLine()) != null) {
//if(GetParent().DiscordPath.Contains("Discord\\")) {
//if(GetParent().DiscordPath.Contains("DiscordCanary\\")) {
//if(GetParent().DiscordPath.Contains("DiscordPTB\\")) {
if(line.Replace(" ", "").Contains("var_fs=")) {
lines.Add(line);
lines.Add("var _betterDiscord = require('betterdiscord');");
lines.Add("var _betterDiscord2;");
} else if(line.Replace(" ", "").Contains("mainWindow=new")) {
lines.Add(line);
lines.Add(File.ReadAllText(@"splice"));
} else {
lines.Add(line);
}
//}
}
}
}
AppendLog("Writing index");
File.WriteAllLines(indexloc, lines.ToArray());
AppendLog("Finished installation, verifying installation...");
int errors = 0;
string curPath = $"{GetParent().DiscordPath}\\resources\\app\\app\\index.js";
string curPath2 = $"{GetParent().DiscordPath}\\resources\\app\\index.js";
if (!File.Exists(curPath) && !File.Exists(curPath2))
{
AppendLog($"ERROR: index.js not found in {curPath} or {curPath2}");
errors++;
}
curPath = $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord";
if(!Directory.Exists(curPath)) {
AppendLog($"ERROR: DIRECTORY: {curPath} DOES NOT EXIST!");
errors++;
}
string basePath = $"{GetParent().DiscordPath}\\resources\\node_modules\\BetterDiscord";
string[] bdFiles = { "\\package.json", "\\betterdiscord.js", "\\lib\\BetterDiscord.js", "\\lib\\config.json", "\\lib\\Utils.js" };
foreach(string s in bdFiles.Where(s => !File.Exists(basePath + s))) {
AppendLog($"ERROR: FILE: {basePath}{s} DOES NOT EXIST");
errors++;
}
Finalize(errors);
});
t.Start();
}
private void Finalize(int errors) {
AppendLog($"Finished installing BetterDiscord with {errors} errors");
Invoke((MethodInvoker)delegate {
GetParent().Finished = true;
GetParent().btnCancel.Text = @"OK";
GetParent().btnCancel.Enabled = true;
});
if(GetParent().RestartDiscord) {
if(GetParent().DiscordPath.Contains("\\Discord\\")) {
Process.Start($"{GetParent().DiscordPath}\\Discord.exe");
}
if(GetParent().DiscordPath.Contains("\\DiscordCanary\\")) {
Process.Start($"{GetParent().DiscordPath}\\DiscordCanary.exe");
}
if(GetParent().DiscordPath.Contains("\\DiscordPTB\\")) {
Process.Start($"{GetParent().DiscordPath}\\DiscordPTB.exe");
}
}
}
public FormMain GetParent() {
return (FormMain)ParentForm;
}
public void BtnNext() { }
public void BtnPrev() { }
private void AppendLog(string message) {
Invoke((MethodInvoker)delegate {
rtLog.AppendText(message + "\n");
rtLog.SelectionStart = rtLog.Text.Length;
rtLog.ScrollToCaret();
});
}
}
}

View File

@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,37 +0,0 @@
namespace BetterDiscordWI.panels
{
partial class Panel3
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
}
#endregion
}
}

View File

@ -1,12 +0,0 @@
using System.Windows.Forms;
namespace BetterDiscordWI.panels
{
public partial class Panel3 : UserControl
{
public Panel3()
{
InitializeComponent();
}
}
}

View File

@ -1,2 +0,0 @@
## To Compile Move the DLL's folder to ``BetterDiscordWI\bin``
## Enjoy Building the Installer.

View File

@ -1,22 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26430.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterDiscordWI", "BetterDiscordWI\BetterDiscordWI.csproj", "{390615F1-CE33-4173-9E8C-4E4F3EB1758D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
</configuration>

View File

@ -1,162 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{390615F1-CE33-4173-9E8C-4E4F3EB1758D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>BetterDiscordWI</RootNamespace>
<AssemblyName>BetterDiscordWI</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>betterdiscord_small_white_blue_icO_icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="asardotnetasync">
<HintPath>..\..\..\..\..\Projects\C#\asardotnetasync\asardotnetasync\bin\Release\asardotnetasync.dll</HintPath>
</Reference>
<Reference Include="Costura, Version=1.6.2.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
<HintPath>..\packages\Costura.Fody.1.6.2\lib\dotnet\Costura.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\..\..\..\libs\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="controls\Button.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="controls\Button.Designer.cs">
<DependentUpon>Button.cs</DependentUpon>
</Compile>
<Compile Include="FormMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormMain.Designer.cs">
<DependentUpon>FormMain.cs</DependentUpon>
</Compile>
<Compile Include="panels\ConfigPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\ConfigPanel.Designer.cs">
<DependentUpon>ConfigPanel.cs</DependentUpon>
</Compile>
<Compile Include="panels\InstallPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\InstallPanel.Designer.cs">
<DependentUpon>InstallPanel.cs</DependentUpon>
</Compile>
<Compile Include="panels\IPanel.cs" />
<Compile Include="panels\LicensePanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="panels\LicensePanel.Designer.cs">
<DependentUpon>LicensePanel.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utils.cs" />
<EmbeddedResource Include="FormMain.resx">
<DependentUpon>FormMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="panels\ConfigPanel.resx">
<DependentUpon>ConfigPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="panels\InstallPanel.resx">
<DependentUpon>InstallPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="panels\LicensePanel.resx">
<DependentUpon>LicensePanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Betterdiscord small black+blue.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Betterdiscord small white+blue.png" />
</ItemGroup>
<ItemGroup>
<None Include="FodyWeavers.xml" />
</ItemGroup>
<ItemGroup>
<Content Include="betterdiscord_small_white_blue_icO_icon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Fody.2.0.0\build\netstandard1.4\Fody.targets" Condition="Exists('..\packages\Fody.2.0.0\build\netstandard1.4\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Fody.2.0.0\build\netstandard1.4\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.2.0.0\build\netstandard1.4\Fody.targets'))" />
<Error Condition="!Exists('..\packages\Costura.Fody.1.6.2\build\dotnet\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.1.6.2\build\dotnet\Costura.Fody.targets'))" />
</Target>
<Import Project="..\packages\Costura.Fody.1.6.2\build\dotnet\Costura.Fody.targets" Condition="Exists('..\packages\Costura.Fody.1.6.2\build\dotnet\Costura.Fody.targets')" />
</Project>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura />
</Weavers>

View File

@ -1,128 +0,0 @@
namespace BetterDiscordWI {
partial class FormMain {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
this.panelDock = new System.Windows.Forms.Panel();
this.lblTitle = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel();
this.btnBack = new BetterDiscordWI.controls.Button();
this.btnNext = new BetterDiscordWI.controls.Button();
this.btnCancel = new BetterDiscordWI.controls.Button();
this.SuspendLayout();
//
// panelDock
//
this.panelDock.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panelDock.Location = new System.Drawing.Point(12, 96);
this.panelDock.Name = "panelDock";
this.panelDock.Size = new System.Drawing.Size(752, 339);
this.panelDock.TabIndex = 0;
//
// lblTitle
//
this.lblTitle.AutoSize = true;
this.lblTitle.BackColor = System.Drawing.SystemColors.Window;
this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold);
this.lblTitle.ForeColor = System.Drawing.Color.Black;
this.lblTitle.Location = new System.Drawing.Point(82, 37);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(147, 16);
this.lblTitle.TabIndex = 5;
this.lblTitle.Text = "BetterDiscord Setup";
//
// panel2
//
this.panel2.BackColor = System.Drawing.SystemColors.Window;
this.panel2.BackgroundImage = global::BetterDiscordWI.Properties.Resources.Betterdiscord_small_black_blue;
this.panel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.panel2.Location = new System.Drawing.Point(12, 12);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(64, 64);
this.panel2.TabIndex = 4;
//
// btnBack
//
this.btnBack.Location = new System.Drawing.Point(527, 466);
this.btnBack.Name = "btnBack";
this.btnBack.Size = new System.Drawing.Size(75, 23);
this.btnBack.TabIndex = 6;
this.btnBack.Text = "< Back";
this.btnBack.UseVisualStyleBackColor = true;
this.btnBack.Click += new System.EventHandler(this.btnBack_Click);
//
// btnNext
//
this.btnNext.Location = new System.Drawing.Point(608, 466);
this.btnNext.Name = "btnNext";
this.btnNext.Size = new System.Drawing.Size(75, 23);
this.btnNext.TabIndex = 7;
this.btnNext.Text = "Next >";
this.btnNext.UseVisualStyleBackColor = true;
this.btnNext.Click += new System.EventHandler(this.btnNext_Click);
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(689, 466);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 8;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// FormMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(776, 501);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.btnNext);
this.Controls.Add(this.btnBack);
this.Controls.Add(this.lblTitle);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panelDock);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "FormMain";
this.Text = "Setup - BetterDiscord";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panelDock;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label lblTitle;
public controls.Button btnNext;
public controls.Button btnCancel;
public controls.Button btnBack;
}
}

View File

@ -1,71 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using BetterDiscordWI.panels;
namespace BetterDiscordWI {
public partial class FormMain : Form {
private readonly IPanel[] _panels = { new LicensePanel(), new ConfigPanel(), new InstallPanel() };
private int _currentPanel;
public string DiscordPath = null;
public bool RestartDiscord = true;
public bool Stable = true, Canary, Ptb;
public FormMain() {
InitializeComponent();
foreach (var panel in _panels) {
panel.SetForm(this);
panel.Control.Dock = DockStyle.Fill;
panelDock.Controls.Add(panel.Control);
}
SwitchPanel(0);
}
public void SetTitle(string title) => lblTitle.Text = title;
public void SwitchPanel(int index) {
_currentPanel = index;
foreach (var panel in _panels) { panel.HidePanel(); }
SetTitle($"BetterDiscord {_panels[index].Title}");
_panels[index].ShowPanel();
}
private readonly Pen _borderPen = new Pen(Color.FromArgb(160, 160, 160));
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
var g = e.Graphics;
g.FillRectangle(SystemBrushes.Window, new Rectangle(0, 0, Width, 85));
g.DrawLine(_borderPen, 0, 85, Width, 85);
g.DrawLine(SystemPens.Window, 0, 86, Width, 86);
g.DrawLine(_borderPen, 0, 445, Width, 445);
g.DrawLine(SystemPens.Window, 0, 446, Width, 446);
}
private void btnNext_Click(object sender, EventArgs e) {
_currentPanel++;
SwitchPanel(_currentPanel);
}
private void btnCancel_Click(object sender, EventArgs e) {
Application.Exit();
}
private void btnBack_Click(object sender, EventArgs e) {
_currentPanel--;
SwitchPanel(_currentPanel);
}
public void Fail() {
btnCancel.ShowEnable();
btnNext.ShowDisable();
btnBack.ShowEnable();
}
}
}

View File

@ -1,541 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAAAAAAABACAA4BwAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAATCwAAEwsAAAAA
AAAAAAAA5YI+geWCPoHlgj6B5YI+geWCPoHlgj6B5YI+fOWCPmHlgDsv99jDE////2D///9r////OP//
/wr///8A////AOWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj765YI+5eWDQJj32sZi////2///
/+3///+p////MP///wDlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5H85pvzy
6nX////7/////////9H///8z5YI+meWCPprlgj6a5YI+muWCPprlgj6Z5YI+rOWCPu3lgj7/5YI+/+WB
PPPtqXtl////2v//////////////qwAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AOWCPgLlgj5y5YI+/uWC
Pv/lgj3/6I5Ref///8D//////////////+4AAAAA5YI+AOWCPgDlgj4J5YI+AuWCPgDlgj4A5YI+X+WC
Pv3lgj7/5YI+/+eMTXT///+7///////////////+5YI+AOWCPgDlgj4t5YI+feWCPj3lgj5u5YI+geWC
Ptvlgj7/5YI+/+WCPvTokVVN////u////////////////+WCPgDlgj425YI+0OWCPrzlgj5/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj218LaOFv///77////////////////lgj5O5YI+1+WCPv/lgj675YI+f+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI9tvC1jhb///++////////////////5YI+7OWCPv/lgj7/5YI+veWC
Pjvlgj5s5YI+gOWCPtvlgj7/5YI+/+WCPvTokVVN////u////////////////+WCPv/lgj7/5YI+/+WC
Pr/lgj4J5YI+AOWCPgDlgj5f5YI+/eWCPv/lgj7/54xNdf///7v///////////////7lgj7/5YI+/+WC
Pv/lgj6/5YI+CeWCPgDlgj4C5YI+c+WCPv7lgj7/5YI9/+iOUXn////A///////////////r5YI+/+WC
Pv/lgj7/5YI+5uWCPp7lgj6a5YI+reWCPu3lgj7/5YI+/+WBPPPtqntl////2///////////////puWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/kfzml/PLrdf////v/////////zv//
/y7lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI++uWCPuTlhECX+NvHYv///9v////s////pv//
/y3///8A5YI+gOWCPoDlgj6A5YI+gOWCPoDlgj6A5YI+e+WCPmDlgDou+NvHFP///2H///9q////N///
/wn///8A////AAADAAAAAQAAAAAAAAAAAAD8AAAA5gAAAMAAAACAAAAAAAAAAAAAAAAGAAAABAAAAAAA
AAAAAAAAAAEAAAADAAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAATCwAAEwsAAAAAAAAAAAAA5YI+P+WC
Pj/lgj4/5YI+P+WCPj/lgj4/5YI+P+WCPj/lgj4/5YI+PeWCPjDlgj4Z5YI+Bfrm2AD///8S////PP//
/zb///8f////CP///wD///8AAAAAAAAAAAAAAAAA5YI+8OWCPvDlgj7w5YI+8OWCPvDlgj7w5YI+8OWC
PvDlgj7w5YI+7+WCPuflgj7T5YI+p+WBPFnxupQe////dP///+D////b////tP///23///8e////AP//
/wAAAAAA5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
PvrlgT235ohIMv///3P////4//////////3////T////Vv///wP///8A5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YE9yOqcZyv///+n////////
////////////7////2D///8A5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+R/OYf///5H////9P///////////////////97///805YI+buWC
Pm/lgj5v5YI+b+WCPm/lgj5v5YI+b+WCPm/lgj5u5YI+euWCPrzlgj775YI+/+WCPv/lgj7/5YI+/+WB
PdLyv50t////0v////////////////////////+ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADlgj4A5YI+AOWCPhLlgj6u5YI+/+WCPv/lgj7/5YI+/+WCPu3okFQ3////s///////////////////
///////dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5YI+AOWCPgDlgj5m5YI+/+WC
Pv/lgj7/5YI+/+WCPvPmiEc9////qP/////////////////////////5AAAAAAAAAAAAAAAA5YI+AOWC
PgHlgj4N5YI+AeWCPgAAAAAA5YI+AOWCPgLlgj6P5YI+/+WCPv/lgj7/5YI+/+WCPuvmiUkw////qP//
////////////////////////AAAAAAAAAADlgj4A5YI+AOWCPkTlgj5/5YI+EOWCPjHlgj4z5YI+POWC
PoPlgj7v5YI+/+WCPv/lgj7/5YI+/+WCPtDokVQX////qf//////////////////////////AAAAAOWC
PgDlgj4B5YI+TuWCPuPlgj6p5YI+POWCPuXlgj7w5YI+9OWCPv7lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pov//f0D////q///////////////////////////5YI+AOWCPgPlgj5f5YI+6OWCPv/lgj6n5YI+P+WC
PvTlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+2eWBPSf///8B////q///////////////////
////////5YI+B+WCPm/lgj7w5YI+/+WCPv/lgj6n5YI+P+WCPvTlgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+2eWBPSf///8B////q///////////////////////////5YI+keWCPvTlgj7/5YI+/+WC
Pv/lgj6n5YI+O+WCPuTlgj7v5YI+8+WCPv7lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPoz++vcD////q///
////////////////////////5YI+/OWCPv/lgj7/5YI+/+WCPv/lgj6q5YI+DuWCPi/lgj4x5YI+OuWC
PoHlgj7v5YI+/+WCPv/lgj7/5YI+/+WCPtDokFQY////qf//////////////////////////5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj6r5YI+A+WCPgAAAAAA5YI+AOWCPgLlgj6O5YI+/+WCPv/lgj7/5YI+/+WC
PuvmiUkx////qP//////////////////////////5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6r5YI+A+WC
PgAAAAAA5YI+AOWCPgDlgj5n5YI+/+WCPv/lgj7/5YI+/+WCPvPmiEc9////qP//////////////////
///////45YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6q5YI+A+WCPgDlgj4A5YI+AOWCPhLlgj6v5YI+/+WC
Pv/lgj7/5YI+/+WCPu3okFQ3////s//////////////////////////Y5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7Q5YI+cuWCPnDlgj5w5YI+fOWCPr3lgj775YI+/+WCPv/lgj7/5YI+/+WBPdHywJ4t////0v//
//////////////////////+R5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+R/OYb///9I////9P///////////////////9n///8u5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YE9x+ud
aCv///+o////////////////////7P///1j///8A5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvrlgTy15olJMf///3T////5//////////3////P////UP//
/wL///8A5YI+7+WCPvDlgj7w5YI+8OWCPvDlgj7w5YI+8OWCPvDlgj7w5YI+7uWCPublgj7S5YI+peWB
PFfxvZof////d////+H////b////sv///2r///8b////AP///wAAAAAA5YI+PuWCPj7lgj4+5YI+PuWC
Pj7lgj4+5YI+PuWCPj7lgj4+5YI+O+WCPi7lgj4Y5YI+BPrn2gD///8T////Pf///zf///8f////CP//
/wD///8AAAAAAAAAAAAAAAAAAAQfAAAABwAAAAEAAAABAAAAAAAAAAAA/8AAAP/gAADxwAAA8AAAAMAA
AACAAAAAAAAAAAAAAAAAAAAAAcAAAAHgAAABwAAAAAAAAAAAAAAAAAEAAAABAAAABwAABB8AKAAAACAA
AABAAAAAAQAgAAAAAAAAEAAAEwsAABMLAAAAAAAAAAAAAOWCPhLlgj4S5YI+EuWCPhLlgj4S5YI+EuWC
PhLlgj4S5YI+EuWCPhLlgj4S5YI+EuWCPhHlgj4N5YI+BOWCPgDlgj4A////AP///wD///8L////FP//
/w////8H////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5YI+y+WCPszlgj7M5YI+zOWC
Pszlgj7M5YI+zOWCPszlgj7M5YI+zOWCPszlgj7M5YI+yuWCPsHlgj6r5YI+h+WCPlTlgj4ewgAAAf//
/yT///+V////x////7X///+V////Zf///y3///8G////AP///wAAAAAAAAAAAAAAAADlgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI++uWC
Ptrlgj6I5H02If///x7///+p/////v/////////+////6P///6f///9A////BP///wAAAAAAAAAAAOWC
Pv7lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7R5H44RP///xT///+u/////////////////////////+3///+C////D///
/wAAAAAA5YI+/uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7g5H02O////yr////d////////////////////////
//z///+W////DP///wDlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj685HszEf///3//////////////
//////////////////r///9y////AOWCPvflgj745YI++OWCPvjlgj745YI++OWCPvjlgj745YI++OWC
Pvjlgj745YI++OWCPvrlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvnkfjdS////L///
/+v//////////////////////////////9z///8t5YI+RuWCPkblgj5G5YI+RuWCPkblgj5G5YI+RuWC
Pkblgj5G5YI+RuWCPkblgj5G5YI+TeWCPn7lgj7b5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WB
PZj//fwP////x////////////////////////////////v///4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AOWCPjnlgj7e5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+wOqaYw3///+n////////////////////////////////////yQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AOWCPpDlgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7Q5Hs0Ef///5b////////////////////////////////////vAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWCPgDlgj4A5YI+gOWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPs3jdy4P////lP//////////////////////////////////
//0AAAAAAAAAAAAAAAAAAAAAAAAAAOWCPgDlgj4D5YI+EeWCPgHlgj4AAAAAAAAAAAAAAAAA5YI+AOWC
PhPlgj6+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+uuBrGwf///+U////////////////////////
/////////////wAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AuWCPl3lgj575YI+AeWCPgvlgj4N5YI+DeWC
PhDlgj4w5YI+n+WCPvzlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6T9dG4AP///5X/////////////
///////////////////////+AAAAAAAAAAAAAAAA5YI+AOWCPgXlgj5q5YI+8eWCPpXlgj4O5YI+pOWC
Psnlgj7G5YI+zeWCPunlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI++eWCPlLsom8A////lf//
//////////////////////////////////4AAAAAAAAAAOWCPgDlgj4J5YI+e+WCPvPlgj7/5YI+lOWC
PhPlgj7T5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7B5YI+E/LC
oQD///+V/////////////////////////////////////gAAAADlgj4A5YI+D+WCPo3lgj745YI+/+WC
Pv/lgj6U5YI+E+WCPtPlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+7+WC
PknlhEEA//79AP///5X////////////////////////////////////+5YI+AOWCPhblgj6e5YI+/OWC
Pv/lgj7/5YI+/+WCPpTlgj4T5YI+0+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7v5YI+S+WEQQD//f0A////lf////////////////////////////////////7lgj4k5YI+reWC
Pv7lgj7/5YI+/+WCPv/lgj7/5YI+lOWCPhPlgj7T5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7C5YI+E/LBoAD///+V/////////////////////////////////////uWC
Pszlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6U5YI+DuWCPqLlgj7G5YI+xOWCPsvlgj7o5YI+/uWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvnlgj5T7KJvAP///5X/////////////////////////////
///////+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPpXlgj4A5YI+CuWCPgzlgj4M5YI+D+WC
Pi7lgj6e5YI+++WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPpP21LwA////lf//////////////////
//////////////////7lgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+leWCPgDlgj4AAAAAAAAA
AAAAAAAA5YI+AOWCPhLlgj695YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+u+BrGwf///+U////////
/////////////////////////////+WCPv7lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6V5YI+AOWC
PgAAAAAAAAAAAAAAAADlgj4A5YI+AOWCPoDlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7N43cuEP//
/5T////////////////////////////////////85YI+/uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
PpXlgj4A5YI+AAAAAAAAAAAAAAAAAOWCPgDlgj4A5YI+keWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
PtDkfDQR////lv///////////////////////////////////+vlgj7+5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+lOWCPgDlgj4AAAAAAAAAAADlgj4A5YI+AOWCPjrlgj7f5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+wOqaZA3///+n////////////////////////////////////wuWCPv7lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj6z5YI+R+WCPkjlgj5I5YI+SOWCPk/lgj6A5YI+3OWCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgT2X//79D////8j///////////////////////////////z///955YI+/uWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvzlgj745YI++OWCPvjlgj745YI+++WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI++OR9N1H///8w////7P//////////////////////////////1f//
/yblgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj675Hw0EP///4D/////////////////////////////
//j///9n////AOWCPv7lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+3+R9Njr///8r////3f//////////////////
///////6////i////wn///8A5YI+/uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPtDkfjhC////Ff///7D/////////////
////////////6f///3j///8L////AAAAAADlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI++uWCPtnlgj6G5H02IP///x////+r/////v//
///////9////5v///6H///86////A////wAAAAAAAAAAAOWCPsrlgj7K5YI+yuWCPsrlgj7K5YI+yuWC
Psrlgj7K5YI+yuWCPsrlgj7K5YI+yuWCPsjlgj6/5YI+qeWCPoXlgj5S5YI+HbwAAAH///8n////mP//
/8j///+1////lP///2P///8q////Bf///wD///8AAAAAAAAAAAAAAAAA5YI+EeWCPhHlgj4R5YI+EeWC
PhHlgj4R5YI+EeWCPhHlgj4R5YI+EeWCPhHlgj4R5YI+EOWCPgzlgj4E5YI+AOWCPgD///8A////AP//
/wz///8V////EP///wj///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeD/AAAAHwAA
AAcAAAADAAAAAQAAAAEAAAAAAAAAAP/8AAD//gAA//4AAPx8AAD4AAEA8AABAOAAAQDAAAMAgAADAAAA
AQAAAAEAAIABAAD8AAAA/gAAAP4AAAD8AAAAAAAAAAAAAAAAAAEAAAABAAAAAwAAAAcAAAAfAAHg/ygA
AAAwAAAAYAAAAAEAIAAAAAAAACQAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj5V5YI+VeWC
PlXlgj5V5YI+VeWCPlXlgj5V5YI+VeWCPlXlgj5V5YI+VeWCPlXlgj5V5YI+VeWCPlXlgj5V5YI+VeWC
PlXlgj5U5YI+TuWCPkHlgj4t5YI+GeWCPgjlgj4A5YI+AAAAAAD///8A////BP///zX///9V////Uv//
/0r///85////JP///xD///8C////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADlgj785YI+/eWCPv3lgj795YI+/eWCPv3lgj795YI+/eWCPv3lgj795YI+/eWCPv3lgj795YI+/eWC
Pv3lgj795YI+/eWCPv3lgj795YI+++WCPvXlgj7q5YI+1+WCPrflgj6F5YI+R+WCPhPSJwAA////Af//
/yz///+h////9v////v////y////4////8n///+e////Y////yf///8F////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+9uWC
Psrlgj5z5YI+HPjgywD///8L////cf///+3//////////////////////////f///+P///+e////QP//
/wb///8AAAAAAAAAAAAAAAAAAAAAAAAAAADlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj795YI+zeWCPlXkezMF////Av///1/////t////////////////////////
////////////7v///5j///8l////AP///wAAAAAAAAAAAAAAAADlgj7+5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvHlgj595H44Cf///wH///9y////+P//
///////////////////////////////////////R////Rv///wH///8AAAAAAAAAAADlgj7+5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj745YI+fd9n
FAT///8L////p///////////////////////////////////////////////5P///1D///8A////AAAA
AADlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+8OWCPlPzx6gA////Nv///+f/////////////////////////////////////////////
/9////87////AP///wDlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPsflgDsX////Av///5v/////////////////////////////
//////////////////////+9////Ff///wDlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvvlgj5h88SjAP///0v////2////////
///////////////////////////////////////8////bf///wDlgj7H5YI+yOWCPsjlgj7I5YI+yOWC
Psjlgj7I5YI+yOWCPsjlgj7I5YI+yOWCPsjlgj7I5YI+yOWCPsjlgj7I5YI+yOWCPsjlgj7M5YI+4OWC
Pvnlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6u3FUABf//
/xr////W////////////////////////////////////////////////////yf///xnlgj4O5YI+DuWC
Pg7lgj4O5YI+DuWCPg7lgj4O5YI+DuWCPg7lgj4O5YI+DuWCPg7lgj4O5YI+DuWCPg7lgj4O5YI+DuWC
Pg7lgj4R5YI+IeWCPlnlgj7D5YI+/uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7d5YE8H////wP///+u////////////////////////////////////////////////////9f//
/1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA5YI+AOWCPgDlgj4c5YI+s+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7z5YI+Pe6vhAD///+L////////////////////////////////////////
/////////////////5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWCPgDlgj4A5YI+N+WCPunlgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj775YI+VPG9mQD///90////////////////////////
/////////////////////////////////84AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+CuWC
Prvlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7+5YI+X/LAngD///9p////////
/////////////////////////////////////////////////+0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADlgj4A5YI+BOWCPq3lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj795YI+W/LA
ngD///9o//////////////////////////////////////////////////////////sAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADlgj4A5YI+FOWCPs3lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj755YI+TPLCoAD///9o////////////////////////////////////////////////////////
//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+DeWCPhflgj4A5YI+AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWCPgDlgj4A5YI+YuWCPvjlgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7v5YI+NfTJrAD///9o////////////////////////////////////////
//////////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5YI+AOWCPgDlgj4R5YI+keWC
PmHlgj4A5YI+AAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AOWCPgjlgj5W5YI+4eWCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7X5YI+GvjcyQD///9o////////////////////////
//////////////////////////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AOWC
Phjlgj6i5YI+/OWCPmjlgj4A5YI+HeWCPkzlgj5M5YI+TOWCPkzlgj5Q5YI+beWCPq/lgj7x5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6n5YI+BP328AD///9o////////
//////////////////////////////////////////////////4AAAAAAAAAAAAAAAAAAAAAAAAAAOWC
PgDlgj4A5YI+IuWCPrLlgj7+5YI+/+WCPmjlgj4A5YI+YOWCPvnlgj755YI++eWCPvnlgj775YI+/uWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvvlgj5e5YI+AP//
/wD///9o//////////////////////////////////////////////////////////4AAAAAAAAAAAAA
AAAAAAAA5YI+AOWCPgDlgj4t5YI+weWCPv/lgj7/5YI+/+WCPmjlgj4A5YI+YuWCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pszlgj4Z5YI+AP///wD///9o////////////////////////////////////////////////////////
//4AAAAAAAAAAAAAAADlgj4A5YI+AOWCPjvlgj7P5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+YuWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+9uWCPl/lgj4A5YNAAP///wD///9o////////////////////////////////////////
//////////////////4AAAAAAAAAAOWCPgDlgj4B5YI+SeWCPtrlgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pmjlgj4A5YI+YuWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+meWCPgjlgj4A////AP///wD///9o////////////////////////
//////////////////////////////////4AAAAA5YI+AOWCPgLlgj5Z5YI+5OWCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPmjlgj4A5YI+YuWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+m+WCPgnlgj4A////AP///wD///9o////////
//////////////////////////////////////////////////7lgj4A5YI+BeWCPmrlgj7t5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+YuWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+9+WCPmHlgj4A5YNAAP//
/wD///9o//////////////////////////////////////////////////////////7lgj4L5YI+e+WC
PvPlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+YuWCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Ps3lgj4a5YI+AP///wD///9o////////////////////////////////////////////////////////
//7lgj6c5YI+9uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+X+WC
Pvjlgj745YI++OWCPvjlgj765YI+/uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPvvlgj5g5YI+AP///wD///9o////////////////////////////////////////
//////////////////7lgj795YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pmjlgj4A5YI+HOWCPkjlgj5I5YI+SOWCPkjlgj5N5YI+auWCPqzlgj7w5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj6o5YI+Bf318AD///9o////////////////////////
//////////////////////////////////7lgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPmjlgj4A5YI+AAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+AOWCPgflgj5U5YI+4OWC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7X5YI+GvjbyAD///9o////////
//////////////////////////////////////////////////7lgj7+5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWC
PgDlgj4A5YI+YOWCPvjlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7v5YI+NfTJ
rAD///9o//////////////////////////////////////////////////////////7lgj7+5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADlgj4A5YI+FOWCPszlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj755YI+TPLCoAD///9o////////////////////////////////////////////////////////
//7lgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmjlgj4A5YI+AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+BOWCPq3lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj795YI+W/LAngD///9o////////////////////////////////////////
//////////////////nlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pmjlgj4A5YI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj4A5YI+CuWCPrzlgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7+5YI+X/LAngD///9p////////////////////////
/////////////////////////////////+jlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPmjlgj4A5YI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOWCPgDlgj4A5YI+OOWC
Purlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj775YI+VPG9mQD///90////////
/////////////////////////////////////////////////8blgj7+5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPmflgj4A5YI+AAAAAAAAAAAAAAAAAAAAAAAAAAAA5YI+AOWC
PgDlgj4d5YI+teWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7z5YI+Pe6v
gwD///+L/////////////////////////////////////////////////////////5Dlgj7+5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPnHlgj4M5YI+EOWCPhDlgj4Q5YI+EOWC
PhDlgj4S5YI+I+WCPlzlgj7F5YI+/uWCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7c5YE8Hv///wP///+v////////////////////////////////////////////////////8f//
/0vlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPuDlgj7K5YI+yuWC
Psrlgj7K5YI+yuWCPsrlgj7P5YI+4uWCPvrlgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj6t21EABP///xr////X////////////////////////////////////////
////////////vv///xLlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPvvlgj5f88OjAP///0z////3////////////////////////
///////////////////////5////X////wDlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPsblgDsW////Av///53/////////////
//////////////////////////////////////+v////Dv///wDlgj7+5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+7+WCPlHzxqgA////N///
/+j//////////////////////////////////////////////9X///8v////AP///wDlgj7+5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj735YI+et5h
CwP///8M////qf//////////////////////////////////////////////2////0L///8A////AAAA
AADlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
PvDlgj565H43CP///wL///90////+f////////////////////////////////////7////G////Ov//
/wD///8AAAAAAAAAAADlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj785YI+y+WCPlLjeTAE////Av///2L////u////////////////////////////////////6v//
/43///8d////AP///wAAAAAAAAAAAAAAAADlgj7+5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/5YI+9OWCPsflgj5w5YI+GvbVvgD///8M////dP///+7//////////////////////////P//
/9////+X////OP///wT///8AAAAAAAAAAAAAAAAAAAAAAAAAAADlgj775YI+/OWCPvzlgj785YI+/OWC
Pvzlgj785YI+/OWCPvzlgj785YI+/OWCPvzlgj785YI+/OWCPvzlgj785YI+/OWCPvzlgj785YI++uWC
PvTlgj7p5YI+1eWCPrTlgj6B5YI+ROWCPhL///8A////Af///zD///+l////9/////v////y////4///
/8j///+b////X////yT///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlgj5S5YI+U+WC
PlPlgj5T5YI+U+WCPlPlgj5T5YI+U+WCPlPlgj5T5YI+U+WCPlPlgj5T5YI+U+WCPlPlgj5T5YI+U+WC
PlPlgj5S5YI+TOWCPj7lgj4r5YI+F+WCPgflgj4A5YI+AAAAAAD///8A////Bf///zn///9Y////VP//
/0v///86////JP///w////8C////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
</value>
</data>
</root>

View File

@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BetterDiscordWI {
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
}

View File

@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("BetterDiscordWI")]
[assembly: AssemblyDescription("BetterDiscord Windows Installer")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("CSharpForLife")]
[assembly: AssemblyProduct("BetterDiscordWI")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("390615f1-ce33-4173-9e8c-4e4f3eb1758d")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.3.0.0")]
[assembly: AssemblyFileVersion("0.3.0.0")]

View File

@ -1,83 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BetterDiscordWI.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BetterDiscordWI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Betterdiscord_small_black_blue {
get {
object obj = ResourceManager.GetObject("Betterdiscord_small_black_blue", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Betterdiscord_small_white_blue {
get {
object obj = ResourceManager.GetObject("Betterdiscord_small_white_blue", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -1,127 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Betterdiscord_small_black_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Betterdiscord small black+blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Betterdiscord_small_white_blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Betterdiscord small white+blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -1,26 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BetterDiscordWI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@ -1,22 +0,0 @@
using System;
using System.Net;
using System.Threading.Tasks;
namespace BetterDiscordWI {
public static class Utils {
public static WebHeaderCollection Headers = new WebHeaderCollection { ["User-Agent"] = "Mozilla/5.0" };
public static async Task<string> GetHash() {
using (var wc = new WebClient { Headers = Headers }) {
var result = await wc.DownloadStringTaskAsync(@"https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master");
var start = result.IndexOf("{\"sha\":") + 8;
var end = result.IndexOf("\",\"") - 8;
return result.Substring(start, end);
}
}
}
}

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Specifying requestedExecutionLevel element will disable file and registry virtualization.
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on and is
is designed to work with. Uncomment the appropriate elements and Windows will
automatically selected the most compatible environment. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,31 +0,0 @@
namespace BetterDiscordWI.controls {
partial class Button {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -1,36 +0,0 @@
namespace BetterDiscordWI.controls {
public partial class Button : System.Windows.Forms.Button {
public Button() {
InitializeComponent();
}
public Button HideDisable(string newText = null) {
if (newText != null) Text = newText;
Hide();
Enabled = false;
return this;
}
public Button HideEnable(string newText = null) {
if (newText != null) Text = newText;
Hide();
Enabled = true;
return this;
}
public Button ShowDisable(string newText = null) {
if (newText != null) Text = newText;
Show();
Enabled = false;
return this;
}
public Button ShowEnable(string newText = null) {
if (newText != null) Text = newText;
Show();
Enabled = true;
return this;
}
}
}

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Costura.Fody" version="1.6.2" targetFramework="net462" developmentDependency="true" />
<package id="Fody" version="2.0.0" targetFramework="net462" developmentDependency="true" />
</packages>

View File

@ -1,205 +0,0 @@
namespace BetterDiscordWI.panels {
partial class ConfigPanel {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.label1 = new System.Windows.Forms.Label();
this.tbPath = new System.Windows.Forms.TextBox();
this.btnBrowse = new BetterDiscordWI.controls.Button();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.cbRestart = new System.Windows.Forms.CheckBox();
this.cbCanary = new System.Windows.Forms.CheckBox();
this.cbPtb = new System.Windows.Forms.CheckBox();
this.lblCanarywarning = new System.Windows.Forms.Label();
this.lblPtbwarning = new System.Windows.Forms.Label();
this.cbStable = new System.Windows.Forms.CheckBox();
this.lblStablewarning = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 3);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(380, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Setup will install BetterDiscord to the following location. Click Install to cont" +
"inue.";
//
// tbPath
//
this.tbPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbPath.Location = new System.Drawing.Point(6, 31);
this.tbPath.Name = "tbPath";
this.tbPath.ReadOnly = true;
this.tbPath.Size = new System.Drawing.Size(377, 20);
this.tbPath.TabIndex = 1;
//
// btnBrowse
//
this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnBrowse.Location = new System.Drawing.Point(389, 31);
this.btnBrowse.Name = "btnBrowse";
this.btnBrowse.Size = new System.Drawing.Size(75, 23);
this.btnBrowse.TabIndex = 2;
this.btnBrowse.Text = "Browse";
this.btnBrowse.UseVisualStyleBackColor = true;
this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 66);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(422, 13);
this.label2.TabIndex = 3;
this.label2.Text = "*If the path is not pointing to the latest version of Discord then click browse a" +
"nd select it.";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(3, 79);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(161, 13);
this.label3.TabIndex = 4;
this.label3.Text = "*Installer will kill Discord process.";
//
// cbRestart
//
this.cbRestart.AutoSize = true;
this.cbRestart.Location = new System.Drawing.Point(6, 106);
this.cbRestart.Name = "cbRestart";
this.cbRestart.Size = new System.Drawing.Size(175, 17);
this.cbRestart.TabIndex = 5;
this.cbRestart.Text = "Restart Discord after installation";
this.cbRestart.UseVisualStyleBackColor = true;
this.cbRestart.CheckedChanged += new System.EventHandler(this.cbRestart_CheckedChanged);
//
// cbCanary
//
this.cbCanary.AutoSize = true;
this.cbCanary.Location = new System.Drawing.Point(6, 150);
this.cbCanary.Name = "cbCanary";
this.cbCanary.Size = new System.Drawing.Size(137, 17);
this.cbCanary.TabIndex = 6;
this.cbCanary.Text = "Install to DiscordCanary";
this.cbCanary.UseVisualStyleBackColor = true;
this.cbCanary.CheckedChanged += new System.EventHandler(this.cbCanary_CheckedChanged);
//
// cbPtb
//
this.cbPtb.AutoSize = true;
this.cbPtb.Location = new System.Drawing.Point(6, 173);
this.cbPtb.Name = "cbPtb";
this.cbPtb.Size = new System.Drawing.Size(125, 17);
this.cbPtb.TabIndex = 7;
this.cbPtb.Text = "Install to DiscordPTB";
this.cbPtb.UseVisualStyleBackColor = true;
this.cbPtb.CheckedChanged += new System.EventHandler(this.cbPtb_CheckedChanged);
//
// lblCanarywarning
//
this.lblCanarywarning.AutoSize = true;
this.lblCanarywarning.ForeColor = System.Drawing.Color.Red;
this.lblCanarywarning.Location = new System.Drawing.Point(149, 151);
this.lblCanarywarning.Name = "lblCanarywarning";
this.lblCanarywarning.Size = new System.Drawing.Size(97, 13);
this.lblCanarywarning.TabIndex = 8;
this.lblCanarywarning.Text = "(Canary not found!)";
this.lblCanarywarning.Visible = false;
//
// lblPtbwarning
//
this.lblPtbwarning.AutoSize = true;
this.lblPtbwarning.ForeColor = System.Drawing.Color.Red;
this.lblPtbwarning.Location = new System.Drawing.Point(149, 173);
this.lblPtbwarning.Name = "lblPtbwarning";
this.lblPtbwarning.Size = new System.Drawing.Size(85, 13);
this.lblPtbwarning.TabIndex = 9;
this.lblPtbwarning.Text = "(PTB not found!)";
this.lblPtbwarning.Visible = false;
//
// cbStable
//
this.cbStable.AutoSize = true;
this.cbStable.Location = new System.Drawing.Point(6, 127);
this.cbStable.Name = "cbStable";
this.cbStable.Size = new System.Drawing.Size(98, 17);
this.cbStable.TabIndex = 10;
this.cbStable.Text = "Install to Stable";
this.cbStable.UseVisualStyleBackColor = true;
this.cbStable.CheckedChanged += new System.EventHandler(this.cbStable_CheckedChanged);
//
// lblStablewarning
//
this.lblStablewarning.AutoSize = true;
this.lblStablewarning.ForeColor = System.Drawing.Color.Red;
this.lblStablewarning.Location = new System.Drawing.Point(149, 128);
this.lblStablewarning.Name = "lblStablewarning";
this.lblStablewarning.Size = new System.Drawing.Size(97, 13);
this.lblStablewarning.TabIndex = 11;
this.lblStablewarning.Text = "(Canary not found!)";
this.lblStablewarning.Visible = false;
//
// ConfigPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.lblStablewarning);
this.Controls.Add(this.cbStable);
this.Controls.Add(this.lblPtbwarning);
this.Controls.Add(this.lblCanarywarning);
this.Controls.Add(this.cbPtb);
this.Controls.Add(this.cbCanary);
this.Controls.Add(this.cbRestart);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.btnBrowse);
this.Controls.Add(this.tbPath);
this.Controls.Add(this.label1);
this.Name = "ConfigPanel";
this.Size = new System.Drawing.Size(538, 284);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox tbPath;
private controls.Button btnBrowse;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.CheckBox cbRestart;
private System.Windows.Forms.CheckBox cbCanary;
private System.Windows.Forms.CheckBox cbPtb;
private System.Windows.Forms.Label lblCanarywarning;
private System.Windows.Forms.Label lblPtbwarning;
private System.Windows.Forms.CheckBox cbStable;
private System.Windows.Forms.Label lblStablewarning;
}
}

View File

@ -1,128 +0,0 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace BetterDiscordWI.panels {
public partial class ConfigPanel : UserControl, IPanel {
private FormMain _formMain;
private readonly Regex _matcher = new Regex(@"[0-9]+\.[0-9]+\.[0-9]+");
private static string StablePath => $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\Discord";
private static bool StableExists() => Directory.Exists(StablePath);
private static string CanaryPath => $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\DiscordCanary";
private static bool CanaryExists() => Directory.Exists(CanaryPath);
private static string PtbPath => $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\DiscordPTB";
private static bool PtbExists() => Directory.Exists(PtbPath);
public ConfigPanel() {
InitializeComponent();
}
public void ShowPanel() {
_formMain.btnBack.ShowEnable();
_formMain.btnCancel.ShowEnable();
_formMain.btnNext.ShowEnable("Install");
if (!CanaryExists()) {
lblCanarywarning.Show();
cbCanary.Enabled = false;
}
if (!PtbExists()) {
lblPtbwarning.Show();
cbPtb.Enabled = false;
}
if (!StableExists()) {
lblStablewarning.Show();
cbStable.Enabled = false;
}
if (!StableExists() && !CanaryExists() && PtbExists()) {
_formMain.btnNext.ShowDisable();
}
cbRestart.Checked = _formMain.RestartDiscord;
cbCanary.Checked = _formMain.Canary;
cbPtb.Checked = _formMain.Ptb;
cbStable.Checked = _formMain.Stable;
LocateDiscord();
Show();
}
public void HidePanel() {
Hide();
}
public void SetForm(FormMain formMain) => _formMain = formMain;
public string Title => "Installation";
public UserControl Control => this;
private void btnBrowse_Click(object sender, System.EventArgs e) {
var fbd = new FolderBrowserDialog {SelectedPath = tbPath.Text};
fbd.ShowDialog();
tbPath.Text = fbd.SelectedPath;
_formMain.DiscordPath = fbd.SelectedPath;
}
private void LocateDiscord() {
var finalPath = GetLatestVersion(cbPtb.Checked ? PtbPath : cbCanary.Checked ? CanaryPath : StablePath);
if (finalPath == string.Empty) finalPath = "Not found!";
tbPath.Text = finalPath;
_formMain.DiscordPath = finalPath;
_formMain.Stable = cbStable.Checked;
_formMain.Canary = cbCanary.Checked;
_formMain.Ptb = cbPtb.Checked;
}
private string GetLatestVersion(string path) {
var dirs = Directory.GetDirectories(path);
if (dirs.Length <= 0) return string.Empty;
var latest = dirs[0];
foreach (var dir in dirs) {
if (!_matcher.IsMatch(dir)) continue;
if (string.CompareOrdinal(dir, latest) > 0) latest = dir;
}
return latest;
}
private void cbCanary_CheckedChanged(object sender, EventArgs e) {
if (cbCanary.Checked) {
cbPtb.Checked = false;
cbStable.Checked = false;
}
LocateDiscord();
}
private void cbPtb_CheckedChanged(object sender, EventArgs e) {
if (cbPtb.Checked) {
cbCanary.Checked = false;
cbStable.Checked = false;
}
LocateDiscord();
}
private void cbRestart_CheckedChanged(object sender, EventArgs e) {
_formMain.RestartDiscord = cbRestart.Checked;
}
private void cbStable_CheckedChanged(object sender, EventArgs e) {
if (cbStable.Checked) {
cbCanary.Checked = false;
cbPtb.Checked = false;
}
LocateDiscord();
}
}
}

View File

@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,11 +0,0 @@
using System.Windows.Forms;
namespace BetterDiscordWI.panels {
internal interface IPanel {
void ShowPanel();
void HidePanel();
void SetForm(FormMain formMain);
string Title { get; }
UserControl Control { get; }
}
}

View File

@ -1,98 +0,0 @@
namespace BetterDiscordWI.panels {
partial class InstallPanel {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.rtbStatus = new System.Windows.Forms.RichTextBox();
this.pbStatus = new System.Windows.Forms.ProgressBar();
this.cbDetailed = new System.Windows.Forms.CheckBox();
this.rtbDetailed = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// rtbStatus
//
this.rtbStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.rtbStatus.Location = new System.Drawing.Point(3, 3);
this.rtbStatus.Name = "rtbStatus";
this.rtbStatus.Size = new System.Drawing.Size(492, 126);
this.rtbStatus.TabIndex = 0;
this.rtbStatus.Text = "";
//
// pbStatus
//
this.pbStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pbStatus.Location = new System.Drawing.Point(67, 135);
this.pbStatus.Name = "pbStatus";
this.pbStatus.Size = new System.Drawing.Size(428, 23);
this.pbStatus.TabIndex = 1;
//
// cbDetailed
//
this.cbDetailed.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.cbDetailed.AutoSize = true;
this.cbDetailed.Location = new System.Drawing.Point(4, 138);
this.cbDetailed.Name = "cbDetailed";
this.cbDetailed.Size = new System.Drawing.Size(58, 17);
this.cbDetailed.TabIndex = 2;
this.cbDetailed.Text = "Details";
this.cbDetailed.UseVisualStyleBackColor = true;
this.cbDetailed.CheckedChanged += new System.EventHandler(this.cbDetailed_CheckedChanged);
//
// rtbDetailed
//
this.rtbDetailed.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.rtbDetailed.Location = new System.Drawing.Point(3, 3);
this.rtbDetailed.Name = "rtbDetailed";
this.rtbDetailed.Size = new System.Drawing.Size(492, 126);
this.rtbDetailed.TabIndex = 3;
this.rtbDetailed.Text = "";
this.rtbDetailed.Visible = false;
//
// InstallPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.rtbDetailed);
this.Controls.Add(this.cbDetailed);
this.Controls.Add(this.pbStatus);
this.Controls.Add(this.rtbStatus);
this.Name = "InstallPanel";
this.Size = new System.Drawing.Size(501, 166);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.RichTextBox rtbStatus;
private System.Windows.Forms.ProgressBar pbStatus;
private System.Windows.Forms.CheckBox cbDetailed;
private System.Windows.Forms.RichTextBox rtbDetailed;
}
}

View File

@ -1,315 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using asardotnetasync;
namespace BetterDiscordWI.panels {
public partial class InstallPanel : UserControl, IPanel {
private FormMain _formMain;
private readonly SynchronizationContext _synchronizationContext;
private string _asarPath => $"{_formMain.DiscordPath}\\modules\\discord_desktop_core";
public InstallPanel() {
InitializeComponent();
_synchronizationContext = SynchronizationContext.Current;
}
private async Task<int> InstallTask() {
var asarExists = LocateAsar();
if (!asarExists) return 0;
Append("Killing Discord Processes");
var discordPname = _formMain.Canary ? "DiscordCanary" : _formMain.Ptb ? "DiscordPTB" : "Discord";
string discordExePath = null;
foreach (var process in Process.GetProcessesByName(discordPname)) {
Append($"Killing Discord process {process.Id}", true);
discordExePath = process.MainModule.FileName;
process.Kill();
}
if (await AsarExtract() != 1) return 0;
if (await InjectBd() != 1) return 0;
if (await DownloadBd() != 1) return 0;
if (await Verify() != 1) return 0;
if (_formMain.RestartDiscord && discordExePath != null) {
Append("Restarting Discord");
Process.Start(discordExePath);
}
Append("Finished installing BetterDiscord!");
return 1;
}
private async Task<int> AsarExtract() {
Append("Extracting core.asar");
var asarArchive = new AsarArchive($"{_asarPath}\\core.asar");
var asarExtractor = new AsarExtractor();
asarExtractor.FileExtracted += (s, e) => {
_synchronizationContext.Post(o => {
pbStatus.Value = (int)((AsarExtractEvent)o).Progress;
}, e);
Append(e.File.Path, true);
};
asarExtractor.Finished += (s, e) => {
Append($"Finished extracting core.asar");
};
try {
if (!Directory.Exists($"{_asarPath}\\app")) Directory.CreateDirectory($"{_asarPath}\\core");
await asarExtractor.ExtractAll(asarArchive, $"{_asarPath}\\core\\");
}
catch (Exception e) {
Debug.Print(e.Message);
}
return 1;
}
private async Task<int> InjectBd() {
var mainScreenPath = $"{_asarPath}\\core\\app\\mainScreen.js";
var indexPath = $"{_asarPath}\\index.js";
Append($"Injecting BetterDiscord to {_asarPath}\\core");
if (!File.Exists(mainScreenPath)) {
Append($"{mainScreenPath} does not exist! Cannot continue.");
_formMain.Fail();
return 0;
}
Append("Rewriting index.js");
File.WriteAllText(indexPath, "module.exports = require('./core');");
var lines = new List<string>();
foreach (var line in File.ReadAllLines(mainScreenPath)) {
lines.Add(line);
if (line.Contains("mainWindow = new")) {
lines.Add(" _betterDiscord2 = new _betterDiscord.BetterDiscord(mainWindow);");
}
}
lines.Insert(1, "var _betterDiscord = require('BetterDiscord');");
lines.Insert(2, "var _betterDiscord2;");
File.WriteAllLines(mainScreenPath, lines.ToArray());
Append("Finished injecting BetterDiscord");
return 1;
}
private async Task<int> DownloadBd() {
Append("Fetching latest hash");
// var hash = await Utils.GetHash();
// Append($"Latest hash: {hash}");
var repo = "Jiiks";
var branch = "stable16";
var channel = $"https://github.com/{repo}/BetterDiscordApp/archive/{branch}.zip";
var dest = $"{_formMain.DiscordPath}\\modules\\discord_desktop_core\\BetterDiscord.zip";
Append("Downloading BetterDiscord package");
using (var wc = new WebClient {Headers = Utils.Headers}) {
wc.DownloadProgressChanged += (sender, args) => {
_synchronizationContext.Post(e => {
var state = (DownloadProgressChangedEventArgs) e;
pbStatus.Value = state.ProgressPercentage;
}, args);
};
Append($"Using channel: {channel}", true);
Append($"Downloading to: {dest}", true);
await wc.DownloadFileTaskAsync(channel, dest);
}
Append("Finished downloading BetterDiscord package");
await ExtractBd(dest, $"{_formMain.DiscordPath}\\modules\\discord_desktop_core\\node_modules");
return 1;
}
private async Task<int> ExtractBd(string path, string dest) {
if (Directory.Exists($"{dest}\\BetterDiscord")) {
Append("Deleting old BetterDiscord");
Directory.Delete($"{dest}\\BetterDiscord", true);
}
if (Directory.Exists($"{dest}\\BetterDiscordApp-stable16")) {
Append("Deleting old BetterDiscordApp-stable16");
Directory.Delete($"{dest}\\BetterDiscordApp-stable16", true);
}
Append("Extracting BetterDiscord package");
if (!File.Exists(path)) {
Append($"BetterDiscord package does not exist in: {path}. Cannot continue.");
_formMain.Fail();
return 0;
}
var zar = ZipFile.OpenRead(path);
if (!Directory.Exists(dest)) {
Directory.CreateDirectory(dest);
}
zar.ExtractToDirectory(dest);
zar.Dispose();
if (!Directory.Exists($"{dest}\\BetterDiscordApp-stable16")) {
Append($"BetterDiscord package does not exist in: {dest}\\BetterDiscordApp-stable16. Cannot continue.");
_formMain.Fail();
return 0;
}
Append("Renaming package dir", true);
Directory.Move($"{dest}\\BetterDiscordApp-stable16", $"{dest}\\BetterDiscord");
if (File.Exists(path)) {
Append($"Deleting temp file {path}");
File.Delete(path);
}
return 1;
}
private async Task<int> Verify() {
Append("Verifying installation");
var mainScreenPath = $"{_asarPath}\\core\\app\\mainScreen.js";
var indexPath = $"{_asarPath}\\index.js";
Append("Verifying: Discord files");
if (!File.ReadAllText(indexPath).Contains("module.exports = require('./core');")) {
Append($"{indexPath} NOT OK! Verification failed!");
_formMain.Fail();
return 0;
}
var mainScreen = File.ReadAllText(mainScreenPath);
if (!mainScreen.Contains("var _betterDiscord = require('BetterDiscord');") && mainScreen.Contains("var _betterDiscord2;") && mainScreen.Contains("_betterDiscord2 = new _betterDiscord.BetterDiscord(mainWindow);")) {
Append($"{mainScreenPath} NOT OK! Verification failed!");
_formMain.Fail();
return 0;
}
Append($"Verifying BetterDiscord package");
var modulePath = $"{_formMain.DiscordPath}\\modules\\discord_desktop_core\\node_modules";
if (!Directory.Exists(modulePath)) {
Append($"{modulePath} does not exist! Verification failed!");
_formMain.Fail();
return 0;
}
var bdPath = $"{modulePath}\\BetterDiscord";
if (!Directory.Exists(modulePath)) {
Append($"{modulePath} does not exist! Verification failed!");
_formMain.Fail();
return 0;
}
var currentPath = $"{bdPath}\\lib";
if (!Directory.Exists(currentPath)) {
Append($"{currentPath} does not exist! Verification failed!");
_formMain.Fail();
return 0;
}
var bdFiles = new[]{"betterdiscord.js", "package.json", "lib\\BetterDiscord.js", "lib\\config.json", "lib\\Utils.js"};
foreach (var bdFile in bdFiles) {
if (File.Exists($"{bdPath}\\{bdFile}")) continue;
Append($"{bdPath}\\{bdFile} does not exist! Verification failed!");
_formMain.Fail();
return 0;
}
Append("Verification successful");
return 1;
}
public void ShowPanel() {
_formMain.btnBack.HideDisable();
_formMain.btnNext.HideDisable();
_formMain.btnCancel.ShowDisable("Exit");
rtbStatus.Text = "";
Task.Run(InstallTask).ContinueWith(result => {
Debug.WriteLine($"Install task finished with code: {result.Result}");
if (result.Result == 0) _formMain.Fail();
_synchronizationContext.Post(o => {
_formMain.btnCancel.ShowEnable("Exit");
}, result);
});
}
private bool LocateAsar() {
Append($"Searching for Discord core in: {_asarPath}");
if (!File.Exists($"{_asarPath}\\core.asar")) {
Append($"core.asar does not exist in: {_asarPath}!");
Append("Unable to continue installation.");
return false;
}
Append($"Located core.asar in: {_asarPath}");
return true;
}
public void HidePanel() {
}
public void SetForm(FormMain formMain) => _formMain = formMain;
public string Title => "Installing";
public UserControl Control => this;
private void Append(string text, bool detailed = false) {
_synchronizationContext.Post(o => {
if (!detailed) {
rtbStatus.AppendText((string) o);
rtbStatus.AppendText(Environment.NewLine);
}
rtbDetailed.AppendText((string)o);
rtbDetailed.AppendText(Environment.NewLine);
rtbStatus.ScrollToCaret();
rtbDetailed.ScrollToCaret();
}, text);
}
private void cbDetailed_CheckedChanged(object sender, EventArgs e) {
rtbDetailed.Visible = cbDetailed.Checked;
rtbStatus.Visible = !cbDetailed.Checked;
}
}
}

Some files were not shown because too many files have changed in this diff Show More