Compare commits
25 Commits
Author | SHA1 | Date |
---|---|---|
hxvy0 | 53c8dc45f2 | |
hxvy0 | 18f0098e3e | |
hxvy0 | 949fd7d537 | |
hxvy0 | fee1c67189 | |
hxvy0 | 80c074eb7b | |
hxvy0 | e22525730d | |
hxvy0 | f35fa26860 | |
hxvy0 | 171779ea59 | |
hxvy0 | bcd9010f7b | |
hxvy0 | a25815a97e | |
hxvy0 | fa78022017 | |
hxvy0 | 99b56613fd | |
hxvy0 | e7b41c9a91 | |
hxvy0 | 5e03be65df | |
hxvy0 | 1b5ded672c | |
hxvy0 | 2e279d3bb9 | |
hxvy0 | bb8363fc75 | |
hxvy0 | effd93b42b | |
hxvy0 | 7efa2c44c5 | |
hxvy0 | bab5bcce5d | |
hxvy0 | 0b05c02d43 | |
hxvy0 | c348fcf7f7 | |
hxvy0 | d5aef4e7d1 | |
hxvy0 | 5979b17a7b | |
hxvy0 | 954e00c4a9 |
95445
LICENSES.chromium.html
95445
LICENSES.chromium.html
File diff suppressed because it is too large
Load Diff
22
README.md
22
README.md
|
@ -1,5 +1,23 @@
|
|||
# Boocord
|
||||
A discord client respects your privacy.
|
||||
Download in: https://github.com/Boocord/discord-client/releases/
|
||||
# What is boocord?
|
||||
Boocord is a discord client built with nativefier.
|
||||
|
||||
## Is it safe?
|
||||
Trusted by antiviruses & sandboxes.
|
||||
![image](https://user-images.githubusercontent.com/85783692/223534002-f8ef79f6-9391-4b43-9ada-9e18f3b749f0.png)
|
||||
|
||||
### Wanna build yourself?
|
||||
|
||||
First you need install nativefier.
|
||||
|
||||
`npm install nativefier`
|
||||
|
||||
For Build Boocord:
|
||||
|
||||
`nativefier --name 'Boocord' 'discord.com/app' --disable-gpu --tray -u "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 uacq"`
|
||||
|
||||
For Build Boocord PTB:
|
||||
|
||||
`nativefier --name 'Boocord PTB' 'ptb.discord.com/app' --disable-gpu --tray -u "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 uacq"`
|
||||
|
||||
Build done!
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ffmpeg.dll
BIN
ffmpeg.dll
Binary file not shown.
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
BIN
icudtl.dat
BIN
icudtl.dat
Binary file not shown.
BIN
libEGL.dll
BIN
libEGL.dll
Binary file not shown.
BIN
libGLESv2.dll
BIN
libGLESv2.dll
Binary file not shown.
BIN
locales/af.pak
BIN
locales/af.pak
Binary file not shown.
BIN
locales/am.pak
BIN
locales/am.pak
Binary file not shown.
BIN
locales/ar.pak
BIN
locales/ar.pak
Binary file not shown.
BIN
locales/bg.pak
BIN
locales/bg.pak
Binary file not shown.
BIN
locales/bn.pak
BIN
locales/bn.pak
Binary file not shown.
BIN
locales/ca.pak
BIN
locales/ca.pak
Binary file not shown.
BIN
locales/cs.pak
BIN
locales/cs.pak
Binary file not shown.
BIN
locales/da.pak
BIN
locales/da.pak
Binary file not shown.
BIN
locales/de.pak
BIN
locales/de.pak
Binary file not shown.
BIN
locales/el.pak
BIN
locales/el.pak
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
locales/es.pak
BIN
locales/es.pak
Binary file not shown.
BIN
locales/et.pak
BIN
locales/et.pak
Binary file not shown.
BIN
locales/fa.pak
BIN
locales/fa.pak
Binary file not shown.
BIN
locales/fi.pak
BIN
locales/fi.pak
Binary file not shown.
BIN
locales/fil.pak
BIN
locales/fil.pak
Binary file not shown.
BIN
locales/fr.pak
BIN
locales/fr.pak
Binary file not shown.
BIN
locales/gu.pak
BIN
locales/gu.pak
Binary file not shown.
BIN
locales/he.pak
BIN
locales/he.pak
Binary file not shown.
BIN
locales/hi.pak
BIN
locales/hi.pak
Binary file not shown.
BIN
locales/hr.pak
BIN
locales/hr.pak
Binary file not shown.
BIN
locales/hu.pak
BIN
locales/hu.pak
Binary file not shown.
BIN
locales/id.pak
BIN
locales/id.pak
Binary file not shown.
BIN
locales/it.pak
BIN
locales/it.pak
Binary file not shown.
BIN
locales/ja.pak
BIN
locales/ja.pak
Binary file not shown.
BIN
locales/kn.pak
BIN
locales/kn.pak
Binary file not shown.
BIN
locales/ko.pak
BIN
locales/ko.pak
Binary file not shown.
BIN
locales/lt.pak
BIN
locales/lt.pak
Binary file not shown.
BIN
locales/lv.pak
BIN
locales/lv.pak
Binary file not shown.
BIN
locales/ml.pak
BIN
locales/ml.pak
Binary file not shown.
BIN
locales/mr.pak
BIN
locales/mr.pak
Binary file not shown.
BIN
locales/ms.pak
BIN
locales/ms.pak
Binary file not shown.
BIN
locales/nb.pak
BIN
locales/nb.pak
Binary file not shown.
BIN
locales/nl.pak
BIN
locales/nl.pak
Binary file not shown.
BIN
locales/pl.pak
BIN
locales/pl.pak
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
locales/ro.pak
BIN
locales/ro.pak
Binary file not shown.
BIN
locales/ru.pak
BIN
locales/ru.pak
Binary file not shown.
BIN
locales/sk.pak
BIN
locales/sk.pak
Binary file not shown.
BIN
locales/sl.pak
BIN
locales/sl.pak
Binary file not shown.
BIN
locales/sr.pak
BIN
locales/sr.pak
Binary file not shown.
BIN
locales/sv.pak
BIN
locales/sv.pak
Binary file not shown.
BIN
locales/sw.pak
BIN
locales/sw.pak
Binary file not shown.
BIN
locales/ta.pak
BIN
locales/ta.pak
Binary file not shown.
BIN
locales/te.pak
BIN
locales/te.pak
Binary file not shown.
BIN
locales/th.pak
BIN
locales/th.pak
Binary file not shown.
BIN
locales/tr.pak
BIN
locales/tr.pak
Binary file not shown.
BIN
locales/uk.pak
BIN
locales/uk.pak
Binary file not shown.
BIN
locales/ur.pak
BIN
locales/ur.pak
Binary file not shown.
BIN
locales/vi.pak
BIN
locales/vi.pak
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
resources.pak
BIN
resources.pak
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,108 +0,0 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.INJECT_DIR = void 0;
|
||||
/**
|
||||
* Preload file that will be executed in the renderer process.
|
||||
* Note: This needs to be attached **prior to imports**, as imports
|
||||
* would delay the attachment till after the event has been raised.
|
||||
*/
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
injectScripts(); // eslint-disable-line @typescript-eslint/no-use-before-define
|
||||
});
|
||||
const fs = __importStar(require("fs"));
|
||||
const path = __importStar(require("path"));
|
||||
const electron_1 = require("electron");
|
||||
// Do *NOT* add 3rd-party imports here in preload (except for webpack `externals` like electron).
|
||||
// They will work during development, but break in the prod build :-/ .
|
||||
// Electron doc isn't explicit about that, so maybe *we*'re doing something wrong.
|
||||
// At any rate, that's what we have now. If you want an import here, go ahead, but
|
||||
// verify that apps built with a non-devbuild nativefier (installed from tarball) work.
|
||||
// Recipe to monkey around this, assuming you git-cloned nativefier in /opt/nativefier/ :
|
||||
// cd /opt/nativefier/ && rm -f nativefier-43.1.0.tgz && npm run build && npm pack && mkdir -p ~/n4310/ && cd ~/n4310/ \
|
||||
// && rm -rf ./* && npm i /opt/nativefier/nativefier-43.1.0.tgz && ./node_modules/.bin/nativefier 'google.com'
|
||||
// See https://github.com/nativefier/nativefier/issues/1175
|
||||
// and https://www.electronjs.org/docs/api/browser-window#new-browserwindowoptions / preload
|
||||
const log = console; // since we can't have `loglevel` here in preload
|
||||
exports.INJECT_DIR = path.join(__dirname, '..', 'inject');
|
||||
/**
|
||||
* Patches window.Notification to:
|
||||
* - set a callback on a new Notification
|
||||
* - set a callback for clicks on notifications
|
||||
* @param createCallback
|
||||
* @param clickCallback
|
||||
*/
|
||||
function setNotificationCallback(createCallback, clickCallback) {
|
||||
const OldNotify = window.Notification;
|
||||
const newNotify = function (title, opt) {
|
||||
createCallback(title, opt);
|
||||
const instance = new OldNotify(title, opt);
|
||||
instance.addEventListener('click', clickCallback);
|
||||
return instance;
|
||||
};
|
||||
newNotify.requestPermission = OldNotify.requestPermission.bind(OldNotify);
|
||||
Object.defineProperty(newNotify, 'permission', {
|
||||
get: () => OldNotify.permission,
|
||||
});
|
||||
// @ts-expect-error TypeScript says its not compatible, but it works?
|
||||
window.Notification = newNotify;
|
||||
}
|
||||
function injectScripts() {
|
||||
const needToInject = fs.existsSync(exports.INJECT_DIR);
|
||||
if (!needToInject) {
|
||||
return;
|
||||
}
|
||||
// Dynamically require scripts
|
||||
try {
|
||||
const jsFiles = fs
|
||||
.readdirSync(exports.INJECT_DIR, { withFileTypes: true })
|
||||
.filter((injectFile) => injectFile.isFile() && injectFile.name.endsWith('.js'))
|
||||
.map((jsFileStat) => path.join('..', 'inject', jsFileStat.name));
|
||||
for (const jsFile of jsFiles) {
|
||||
log.debug('Injecting JS file', jsFile);
|
||||
require(jsFile);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
log.error('Error encoutered injecting JS files', err);
|
||||
}
|
||||
}
|
||||
function notifyNotificationCreate(title, opt) {
|
||||
electron_1.ipcRenderer.send('notification', title, opt);
|
||||
}
|
||||
function notifyNotificationClick() {
|
||||
electron_1.ipcRenderer.send('notification-click');
|
||||
}
|
||||
// @ts-expect-error TypeScript thinks these are incompatible but they aren't
|
||||
setNotificationCallback(notifyNotificationCreate, notifyNotificationClick);
|
||||
electron_1.ipcRenderer.on('params', (event, message) => {
|
||||
log.debug('ipcRenderer.params', { event, message });
|
||||
const appArgs = JSON.parse(message);
|
||||
log.info('nativefier.json', appArgs);
|
||||
});
|
||||
electron_1.ipcRenderer.on('debug', (event, message) => {
|
||||
log.debug('ipcRenderer.debug', { event, message });
|
||||
});
|
||||
//# sourceMappingURL=preload.js.map
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../src/preload.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjD,aAAa,EAAE,CAAC,CAAC,8DAA8D;AACjF,CAAC,CAAC,CAAC;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B,uCAAuC;AAGvC,iGAAiG;AACjG,uEAAuE;AACvE,kFAAkF;AAClF,kFAAkF;AAClF,uFAAuF;AACvF,yFAAyF;AACzF,wHAAwH;AACxH,iHAAiH;AACjH,2DAA2D;AAC3D,4FAA4F;AAE5F,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,iDAAiD;AAEzD,QAAA,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAE/D;;;;;;GAMG;AACH,SAAS,uBAAuB,CAC9B,cAGC,EACD,aAAqE;IAErE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;IACtC,MAAM,SAAS,GAAG,UAChB,KAAa,EACb,GAAwB;QAExB,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3C,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IACF,SAAS,CAAC,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1E,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE;QAC7C,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU;KAChC,CAAC,CAAC;IAEH,qEAAqE;IACrE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;AAClC,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO;KACR;IACD,8BAA8B;IAC9B,IAAI;QACF,MAAM,OAAO,GAAG,EAAE;aACf,WAAW,CAAC,kBAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAChD,MAAM,CACL,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CACvE;aACA,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,CAAC;SACjB;KACF;IAAC,OAAO,GAAY,EAAE;QACrB,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;KACvD;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAAa,EACb,GAAwB;IAExB,sBAAW,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AACD,SAAS,uBAAuB;IAC9B,sBAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AACzC,CAAC;AAED,4EAA4E;AAC5E,uBAAuB,CAAC,wBAAwB,EAAE,uBAAuB,CAAC,CAAC;AAE3E,sBAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAClD,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,sBAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IACjD,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
|
|
@ -1,57 +0,0 @@
|
|||
label, input {
|
||||
display: block;
|
||||
}
|
||||
|
||||
* {
|
||||
font-family: Verdana, sans-serif;
|
||||
}
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
-webkit-app-region: drag;
|
||||
}
|
||||
.login-form {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.login-form > div {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.login-form > div > label {
|
||||
margin-bottom: 25px;
|
||||
letter-spacing: 5px;
|
||||
font-weight: 100;
|
||||
text-transform: uppercase;
|
||||
font-size: 18px;
|
||||
text-align: center;
|
||||
color: rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
.login-form > div > input {
|
||||
height: 30px;
|
||||
width: 225px;
|
||||
font-size: 16px;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
.login-form > div > button {
|
||||
border: 0;
|
||||
font-size: 15px;
|
||||
font-weight: 100;
|
||||
text-transform: uppercase;
|
||||
height: 35px;
|
||||
width: 225px;
|
||||
background-color: #2196F3;
|
||||
color: white;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #0D47A1;
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Login</title>
|
||||
<link rel="stylesheet" type="text/css" href="login.css">
|
||||
</head>
|
||||
<body>
|
||||
<form class="login-form" id="login-form">
|
||||
<div>
|
||||
<label for="username-input">Username</label>
|
||||
<input type="text" id="username-input" autofocus/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="password-input">Password</label>
|
||||
<input type="password" id="password-input"/>
|
||||
</div>
|
||||
<div>
|
||||
<button id="submit-form-button" type="submit">Login</button>
|
||||
</div>
|
||||
</form>
|
||||
<script src="login.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,10 +0,0 @@
|
|||
const { ipcRenderer } = require('electron');
|
||||
|
||||
document.getElementById('login-form').addEventListener('submit', (event) => {
|
||||
event.preventDefault();
|
||||
const usernameInput = document.getElementById('username-input');
|
||||
const username = usernameInput.nodeValue || usernameInput.value;
|
||||
const passwordInput = document.getElementById('password-input');
|
||||
const password = passwordInput.nodeValue || passwordInput.value;
|
||||
ipcRenderer.send('login-message', [username, password]);
|
||||
});
|
|
@ -1 +0,0 @@
|
|||
{"accessibilityPrompt":true,"alwaysOnTop":false,"arch":"x64","asar":false,"blockExternalUrls":false,"bounce":false,"buildDate":1675157978907,"clearCache":false,"counter":false,"darwinDarkModeSupport":false,"disableContextMenu":false,"disableDevTools":false,"disableGpu":false,"disableOldBuildWarning":false,"electronVersionUsed":"19.1.4","enableEs3Apis":false,"fastQuit":false,"fullScreen":false,"height":800,"hideWindowFrame":false,"ignoreCertificate":false,"ignoreGpuBlacklist":false,"insecure":false,"isUpgrade":false,"maximize":false,"name":"Boocord","nativefierVersion":"50.0.1","portable":false,"quiet":false,"showMenuBar":false,"singleInstance":false,"strictInternalUrls":false,"targetUrl":"https://discord.com/app","tray":"false","userAgentHonest":false,"width":1280,"widevine":false,"win32metadata":{"ProductName":"Boocord","InternalName":"Boocord","FileDescription":"Boocord"},"zoom":1,"oldBuildWarningText":""}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,25 +0,0 @@
|
|||
{
|
||||
"name": "boocord-nativefier-18566a",
|
||||
"version": "1.0.0",
|
||||
"description": "Placeholder for the nativefier cli to override with a target url",
|
||||
"main": "lib/main.js",
|
||||
"author": "Jia Hao",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"desktop",
|
||||
"electron",
|
||||
"placeholder"
|
||||
],
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"electron-context-menu": "^3.1.1",
|
||||
"electron-dl": "^3.2.1",
|
||||
"electron-squirrel-startup": "^1.0.0",
|
||||
"electron-window-state": "^5.0.3",
|
||||
"loglevel": "^1.7.1",
|
||||
"source-map-support": "^0.5.19"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^19.1.4"
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
{"file_format_version": "1.0.0", "ICD": {"library_path": ".\\vk_swiftshader.dll", "api_version": "1.0.5"}}
|
BIN
vulkan-1.dll
BIN
vulkan-1.dll
Binary file not shown.
Loading…
Reference in New Issue