mirror of
https://github.com/6dylan6/jdpro.git
synced 2026-04-04 17:59:09 +00:00
1
This commit is contained in:
parent
cec5b3bb2c
commit
dd12b116ad
422
jd_dwapp.js
422
jd_dwapp.js
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
积分换话费
|
积分换话费
|
||||||
入口:首页-生活·缴费-积分换话费
|
入口:首页-生活·缴费-积分换话费
|
||||||
update:20220530
|
update:2023/6/10
|
||||||
20 7,19 * * * jd_dwapp.js
|
33 3,18 * * * jd_dwapp.js
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const $ = new Env('积分换话费');
|
const $ = new Env('积分换话费');
|
||||||
@ -13,248 +13,270 @@ CryptoJS = $.isNode() ? require('crypto-js') : CryptoJS;
|
|||||||
//IOS等用户直接用NobyDa的jd cookie
|
//IOS等用户直接用NobyDa的jd cookie
|
||||||
let cookiesArr = [], cookie = '';
|
let cookiesArr = [], cookie = '';
|
||||||
if ($.isNode()) {
|
if ($.isNode()) {
|
||||||
Object.keys(jdCookieNode).forEach((item) => { cookiesArr.push(jdCookieNode[item]) })
|
Object.keys(jdCookieNode).forEach((item) => { cookiesArr.push(jdCookieNode[item]) })
|
||||||
if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { };
|
if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { };
|
||||||
} else {
|
} else {
|
||||||
cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item);
|
cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item);
|
||||||
}
|
}
|
||||||
!(async () => {
|
!(async () => {
|
||||||
if (!cookiesArr[0]) {
|
if (!cookiesArr[0]) {
|
||||||
$.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', { "open-url": "https://bean.m.jd.com/bean/signIndex.action" });
|
$.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', { "open-url": "https://bean.m.jd.com/bean/signIndex.action" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (let i = 0; i < cookiesArr.length; i++) {
|
for (let i = 0; i < cookiesArr.length; i++) {
|
||||||
if (cookiesArr[i]) {
|
if (cookiesArr[i]) {
|
||||||
cookie = cookiesArr[i];
|
cookie = cookiesArr[i];
|
||||||
$.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1])
|
$.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1])
|
||||||
$.index = i + 1;
|
$.index = i + 1;
|
||||||
$.isLogin = true;
|
$.isLogin = true;
|
||||||
$.nickName = '';
|
$.nickName = '';
|
||||||
message = '';
|
message = '';
|
||||||
await TotalBean();
|
await TotalBean();
|
||||||
console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`);
|
console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`);
|
||||||
if (!$.isLogin) {
|
if (!$.isLogin) {
|
||||||
$.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { "open-url": "https://bean.m.jd.com/bean/signIndex.action" });
|
$.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { "open-url": "https://bean.m.jd.com/bean/signIndex.action" });
|
||||||
if ($.isNode()) {
|
if ($.isNode()) {
|
||||||
await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
|
await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
$.UUID = getUUID('xxxxxxxxxxxxxxxx');
|
$.UUID = getUUID('xxxxxxxxxxxxxxxx');
|
||||||
await main()
|
await main()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})().catch((e) => { $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') }).finally(() => { $.done(); })
|
})().catch((e) => { $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') }).finally(() => { $.done(); })
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
$.log("去签到")
|
$.log("去签到")
|
||||||
await usersign()
|
await usersign()
|
||||||
await tasklist();
|
await tasklist();
|
||||||
if ($.tasklist) {
|
if ($.tasklist) {
|
||||||
for (let i = 0; i < $.tasklist.length; i++) {
|
for (let i of $.tasklist) {
|
||||||
console.log(`去领取${$.tasklist[i].taskDesc}任务`)
|
if (i.viewStatus == 0) {
|
||||||
await taskrecord($.tasklist[i].id)
|
console.log(`去做 ${i.taskDesc}`);
|
||||||
await $.wait(3000);
|
await taskrecord(i.id);
|
||||||
console.log(`去领取积分`)
|
await $.wait(3000);
|
||||||
await taskreceive($.tasklist[i].id)
|
console.log(`去领积分`);
|
||||||
|
await taskreceive(i.id)
|
||||||
|
} else if (i.viewStatus == 2) {
|
||||||
|
console.log(`去领积分`);
|
||||||
|
await taskreceive(i.id);
|
||||||
|
} else if (i.viewStatus == 1) {
|
||||||
|
$.log(`${i.name} 已完成浏览`);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
async function taskrecord(id) {
|
async function taskrecord(id) {
|
||||||
enc = await sign(id + "1")
|
enc = await sign(id + "1")
|
||||||
let body = { "id": id, "agentNum": "m", "taskType": 1, "followChannelStatus": "", ...enc }
|
let body = { "id": id, "agentNum": "m", "taskType": 1, "followChannelStatus": "", ...enc }
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
$.post(taskPostUrl("task/dwRecord", body), (err, resp, data) => {
|
$.post(taskPostUrl("task/dwRecord", body), (err, resp, data) => {
|
||||||
try {
|
try {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(`${err}`)
|
console.log(`${err}`)
|
||||||
console.log(`${$.name} API请求失败,请检查网路重试`)
|
console.log(`${$.name} API请求失败,请检查网路重试`)
|
||||||
} else {
|
} else {
|
||||||
data = JSON.parse(data)
|
data = JSON.parse(data)
|
||||||
if (data) {
|
if (data) {
|
||||||
if (data.code === 200) {
|
if (data.code === 200) {
|
||||||
if (data.data.dwUserTask) {
|
if (data.data.dwUserTask) {
|
||||||
$.log(" 领取任务成功")
|
$.log("----领取任务成功")
|
||||||
} else {
|
} else {
|
||||||
$.log(" 此任务已经领取过了")
|
$.log("----此任务已经领取过了")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log(JSON.stringify(data))
|
console.log(JSON.stringify(data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
$.logErr(e, resp)
|
||||||
|
} finally {
|
||||||
|
resolve(data);
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
$.logErr(e, resp)
|
|
||||||
} finally {
|
|
||||||
resolve(data);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function taskreceive(id) {
|
async function taskreceive(id) {
|
||||||
enc = await sign(id)
|
enc = await sign(id)
|
||||||
let body = { "id": id, ...enc }
|
let body = { "id": id, ...enc }
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
$.post(taskPostUrl("task/dwReceive", body), (err, resp, data) => {
|
$.post(taskPostUrl("task/dwReceive", body), (err, resp, data) => {
|
||||||
try {
|
try {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(`${err}`)
|
console.log(`${err}`)
|
||||||
console.log(`${$.name} API请求失败,请检查网路重试`)
|
console.log(`${$.name} API请求失败,请检查网路重试`)
|
||||||
} else {
|
} else {
|
||||||
data = JSON.parse(data)
|
data = JSON.parse(data)
|
||||||
if (data) {
|
if (data) {
|
||||||
if (data.code === 200 && data.data.success) {
|
if (data.code === 200 && data.data.success) {
|
||||||
console.log(` 领取任务积分:获得${data.data.giveScoreNum}`)
|
console.log(`----领取成功:获得${data.data.giveScoreNum}积分`);
|
||||||
} else if (data.code === 200 && !data.data.success) {
|
} else if (data.code === 200 && !data.data.success) {
|
||||||
console.log(" 积分已经领取完了")
|
console.log("----积分已经领取完了");
|
||||||
} else {
|
} else {
|
||||||
console.log(JSON.stringify(data))
|
console.log(JSON.stringify(data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
$.logErr(e, resp)
|
||||||
|
} finally {
|
||||||
|
resolve(data);
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
$.logErr(e, resp)
|
|
||||||
} finally {
|
|
||||||
resolve(data);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function usersign() {
|
async function usersign() {
|
||||||
body = await sign()
|
body = await sign()
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
$.post(taskPostUrl("dwSign", body), (err, resp, data) => {
|
$.post(taskPostUrl("dwSign", body), (err, resp, data) => {
|
||||||
try {
|
try {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(`${err}`)
|
console.log(`${err}`)
|
||||||
console.log(`${$.name} API请求失败,请检查网路重试`)
|
console.log(`${$.name} API请求失败,请检查网路重试`)
|
||||||
} else {
|
} else {
|
||||||
data = JSON.parse(data)
|
data = JSON.parse(data);
|
||||||
if (data) {
|
JSON.stringify(data);
|
||||||
if (data.code === 200) {
|
if (data) {
|
||||||
console.log(`签到成功:获得积分${data.data.signInfo.signNum}\n`)
|
if (data.code === 200) {
|
||||||
} else {
|
console.log(`签到成功:获得积分${data.data.signInfo.signNum}`);
|
||||||
console.log("似乎签到完成了\n")
|
$.log(`总积分:${data.data.totalNum}\n`);
|
||||||
|
} else {
|
||||||
|
console.log("似乎签到完成了\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
$.logErr(e, resp)
|
||||||
|
} finally {
|
||||||
|
resolve(data);
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
$.logErr(e, resp)
|
|
||||||
} finally {
|
|
||||||
resolve(data);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function tasklist() {
|
async function tasklist() {
|
||||||
body = await sign()
|
body = await sign();
|
||||||
return new Promise(resolve => {
|
body.channelSource = 'txzs';
|
||||||
$.post(taskPostUrl("task/dwList", body), (err, resp, data) => {
|
let opt = {
|
||||||
try {
|
url: `https://api.m.jd.com/user/color/task/dwList`,
|
||||||
if (err) {
|
body: `appid=txsm-m&client=h5&functionId=dwapp_task_dwList&body=${encodeURIComponent(JSON.stringify(body))}`,
|
||||||
console.log(`${err}`)
|
headers: {
|
||||||
console.log(`${$.name} API请求失败,请检查网路重试`)
|
"Origin": "https://txsm-m.jd.com",
|
||||||
} else {
|
"Accept": "*/*",
|
||||||
data = JSON.parse(data)
|
"User-Agent": `jdapp;iPhone;10.1.0;13.5;${$.UUID};network/wifi;model/iPhone11,6;addressid/4596882376;appBuild/167774;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`,
|
||||||
if (data) {
|
"Referer": "https://txsm-m.jd.com/",
|
||||||
$.tasklist = data.data
|
"Cookie": cookie,
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
}
|
||||||
$.logErr(e, resp)
|
|
||||||
} finally {
|
return new Promise(resolve => {
|
||||||
resolve(data);
|
$.post(opt, (err, resp, data) => {
|
||||||
}
|
try {
|
||||||
|
if (err) {
|
||||||
|
console.log(`${err}`)
|
||||||
|
console.log(`${$.name} API请求失败,请检查网路重试`)
|
||||||
|
} else {
|
||||||
|
data = JSON.parse(data)
|
||||||
|
if (data) {
|
||||||
|
$.tasklist = data.data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
$.logErr(e, resp)
|
||||||
|
} finally {
|
||||||
|
resolve(data);
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function taskPostUrl(function_id, body) {
|
function taskPostUrl(function_id, body) {
|
||||||
return {
|
return {
|
||||||
url: `https://dwapp.jd.com/user/${function_id}`,
|
url: `https://dwapp.jd.com/user/${function_id}`,
|
||||||
body: JSON.stringify(body),
|
body: JSON.stringify(body),
|
||||||
headers: {
|
headers: {
|
||||||
"Host": "dwapp.jd.com",
|
"Host": "dwapp.jd.com",
|
||||||
"Origin": "https://prodev.m.jd.com",
|
"Origin": "https://prodev.m.jd.com",
|
||||||
"Connection": "keep-alive",
|
"Connection": "keep-alive",
|
||||||
"Accept": "*/*",
|
"Accept": "*/*",
|
||||||
"User-Agent": `jdapp;iPhone;10.1.0;13.5;${$.UUID};network/wifi;model/iPhone11,6;addressid/4596882376;appBuild/167774;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`,
|
"User-Agent": `jdapp;iPhone;10.1.0;13.5;${$.UUID};network/wifi;model/iPhone11,6;addressid/4596882376;appBuild/167774;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`,
|
||||||
"Accept-Language": "zh-cn",
|
"Accept-Language": "zh-cn",
|
||||||
"Referer": "https://prodev.m.jd.com/mall/active/eEcYM32eezJB7YX4SBihziJCiGV/index.html",
|
"Referer": "https://prodev.m.jd.com/mall/active/eEcYM32eezJB7YX4SBihziJCiGV/index.html",
|
||||||
"Accept-Encoding": "gzip, deflate, br",
|
"Accept-Encoding": "gzip, deflate, br",
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
"Cookie": cookie,
|
"Cookie": cookie,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TotalBean() {
|
function TotalBean() {
|
||||||
return new Promise(async resolve => {
|
return new Promise(async resolve => {
|
||||||
const options = {
|
const options = {
|
||||||
"url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
|
"url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
|
||||||
"headers": {
|
"headers": {
|
||||||
"Accept": "application/json,text/plain, */*",
|
"Accept": "application/json,text/plain, */*",
|
||||||
"Content-Type": "application/x-www-form-urlencoded",
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
"Accept-Encoding": "gzip, deflate, br",
|
"Accept-Encoding": "gzip, deflate, br",
|
||||||
"Accept-Language": "zh-cn",
|
"Accept-Language": "zh-cn",
|
||||||
"Connection": "keep-alive",
|
"Connection": "keep-alive",
|
||||||
"Cookie": cookie,
|
"Cookie": cookie,
|
||||||
"Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
|
"Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
|
||||||
"User-Agent": $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1")
|
"User-Agent": $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1")
|
||||||
}
|
|
||||||
}
|
|
||||||
$.post(options, (err, resp, data) => {
|
|
||||||
try {
|
|
||||||
if (err) {
|
|
||||||
console.log(`${JSON.stringify(err)}`)
|
|
||||||
console.log(`${$.name} API请求失败,请检查网路重试`)
|
|
||||||
} else {
|
|
||||||
if (data) {
|
|
||||||
data = JSON.parse(data);
|
|
||||||
if (data['retcode'] === 13) {
|
|
||||||
$.isLogin = false; //cookie过期
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
if (data['retcode'] === 0) {
|
|
||||||
$.nickName = (data['base'] && data['base'].nickname) || $.UserName;
|
|
||||||
} else {
|
|
||||||
$.nickName = $.UserName
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.log(`京东服务器返回空数据`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
$.post(options, (err, resp, data) => {
|
||||||
$.logErr(e, resp)
|
try {
|
||||||
} finally {
|
if (err) {
|
||||||
resolve();
|
console.log(`${JSON.stringify(err)}`)
|
||||||
}
|
console.log(`${$.name} API请求失败,请检查网路重试`)
|
||||||
|
} else {
|
||||||
|
if (data) {
|
||||||
|
data = JSON.parse(data);
|
||||||
|
if (data['retcode'] === 13) {
|
||||||
|
$.isLogin = false; //cookie过期
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (data['retcode'] === 0) {
|
||||||
|
$.nickName = (data['base'] && data['base'].nickname) || $.UserName;
|
||||||
|
} else {
|
||||||
|
$.nickName = $.UserName
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log(`京东服务器返回空数据`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
$.logErr(e, resp)
|
||||||
|
} finally {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUUID(format = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', UpperCase = 0) {
|
function getUUID(format = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', UpperCase = 0) {
|
||||||
return format.replace(/[xy]/g, function (c) {
|
return format.replace(/[xy]/g, function (c) {
|
||||||
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
||||||
if (UpperCase) {
|
if (UpperCase) {
|
||||||
uuid = v.toString(36).toUpperCase();
|
uuid = v.toString(36).toUpperCase();
|
||||||
} else {
|
} else {
|
||||||
uuid = v.toString(36)
|
uuid = v.toString(36)
|
||||||
}
|
}
|
||||||
return uuid;
|
return uuid;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sign(en) {
|
async function sign(en) {
|
||||||
time = new Date().getTime();
|
time = new Date().getTime();
|
||||||
let encStr = en || '';
|
let encStr = en || '';
|
||||||
const encTail = `${time}e9c398ffcb2d4824b4d0a703e38yffdd`;
|
const encTail = `${time}e9c398ffcb2d4824b4d0a703e38yffdd`;
|
||||||
encStr = CryptoJS.MD5(encStr + encTail).toString()
|
encStr = CryptoJS.MD5(encStr + encTail).toString()
|
||||||
return { "t": time, "encStr": encStr }
|
return { "t": time, "encStr": encStr }
|
||||||
}
|
}
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user