0% found this document useful (0 votes)
106 views176 pages

Auto Claim for 50+ Crypto Faucets

Uploaded by

bahaeydo
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
106 views176 pages

Auto Claim for 50+ Crypto Faucets

Uploaded by

bahaeydo
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

// ==UserScript==

// @name [satology] Auto Claim Multiple Faucets with Monitor UI


// @description Automatic rolls and claims for 50+ crypto faucets/PTC/miners
([Link] BTC, auto promo code for 16 CryptosFaucet, FaucetPay, StormGain, etc)
// @description Claim free ADA, BNB, BCH, BTC, DASH, DGB, DOGE, ETH, FEY, LINK,
LTC, NEO, SHIB, STEAM, TRX, USDC, USDT, XEM, XRP, ZEC, ETC
// @version 3.0.57
// @author satology
// @namespace [Link]
// @homepage [Link]
// @noframes

// @grant GM_info
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_xmlhttpRequest
// @grant [Link]
// @grant GM_openInTab
// @grant [Link]
// @connect [Link]

// @note IMPORTANT
// @note - To start the script you need to navigate to
[Link]
// @note - Each schedule will open it's own tab to allow multiclaiming

// @icon [Link]
// @require
[Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// @match [Link]
// ==/UserScript==

(function() {
'use strict';
const localeConfig = {
setToEnglish: true, // will set the faucets to English
stringSearches: {
promoCodeAccepted: 'roll',
promoCodeUsed: 'already used',
promoCodeInvalid: ['not found', 'only alphanumeric'],
promoCodeExpired: ['ended']
}
};

const STATUS = {
INITIALIZING: 0,
IDLE: 1,
CLAIMING: 2
};

const K = [Link]({
WebType: {
UNDEFINED: 0,
CRYPTOSFAUCETS: 1,
STORMGAIN: 2,
FREEBITCOIN: 3,
FAUCETPAY: 4,
FREELITECOIN: 5,
FREEETHEREUMIO: 6,
BAGIKERAN: 7,
OKFAUCET: 8,
BIGBTC: 9,
BESTCHANGE: 10,
KINGBIZ: 11,
BFBOX: 13,
FREEDOGEIO: 14,
DUTCHYROLL: 15,
FCRYPTO: 16,
CPU: 17,
CBG: 18,
FPB: 19,
G8: 20,
FREEGRC: 21,
HELI: 22,
VIE: 23,
O24: 24,
YCOIN: 25,
CDIVERSITY: 26,
BSCADS: 27,
CTOP: 28,
AUTOCML: 29,
CCLICKS: 30
},
CF: {
UrlType: {
HOME: 0,
FREE: 1,
CONTACTTWITTER: 2,
PROMOTION: 3,
STATS: 4,
SETTINGS: 5,
FREEROLLS: 6,
LOGIN: 7,
GAMES: 8,
IGNORE: 99
},
PromoStatus: {
NOCODE: 0,
PENDING: 1,
ACCEPTED: 2,
USEDBEFORE: 3,
INVALID: 4,
UNKNOWNERROR: 5,
EXPIRED: 6
},
},
RandomInteractionLevel: {
NONE: 0,
LOW: 1,
MEDIUM: 2,
HIGH: 3
},
Integers: {
HS_26_IN_MILLISECONDS: 93600000, //Using 26 hs instead of 24hs
HS_2_IN_MILLISECONDS: 7200000 //and 2hs gap retry when code is flagged
as USEDBEFORE
},
WalletType: {
FP_USERNAME: 99,
FP_MAIL: 100,
FP_BTC: 101,
FP_BNB: 102,
FP_BCH: 103,
FP_DASH: 104,
FP_DGB: 105,
FP_DOGE: 106,
FP_ETH: 107,
FP_FEY: 108,
FP_LTC: 109,
FP_TRX: 110,
FP_USDT: 111,
FP_ZEC: 112,
FP_SOL: 113,
FP_MATIC: 114,
FP_XRP: 115,
FP_ADA: 116,
EC: 200,
BTC: 1,
LTC: 2
},
ErrorType: {
ERROR: 0,
TIMEOUT: 1,
NEED_TO_LOGIN: 2,
ROLL_ERROR: 3,
CLICK_ROLL_ERROR: 4,
LOGIN_ERROR: 5,
CLAIM_ERROR: 6,
ADDRESS_ERROR: 7,
MIN_WITHDRAW_ERROR: 8,
IP_BAN: 9,
IP_RESTRICTED: 10,
IP_ERROR: 11,
FORCE_CLOSED: 12,
NO_FUNDS: 13,
VERIFY_EMAIL: 14,
NO_ADDRESS: 15,
FAUCET_EMPTY: 16
},
CMC: {
MULT: '-1',
BTC: '1',
LTC: '2',
XRP: '52',
DOGE: '74',
DGB: '109',
DASH: '131',
USDT: '825',
XEM: '873',
ETH: '1027',
STEEM: '1230',
NEO: '1376',
ZEC: '1437',
BCH: '1831',
BNB: '1839',
TRX: '1958',
LINK: '1975',
ADA: '2010',
USDC: '3408',
SOL: '5426',
SHIB: '5994',
FEY: '10361',
BFG: '11038',
CAKE: '7186',
GRC: '833',
MATIC: '3890',
BABY: '10334',
BTT: '16086',
BSW: '10746',
},
LOCATION: {
UNKNOWN: 0,
MANAGER: 1,
SITE: 2
}
});

let persistence, shared, manager, ui, CFPromotions, interactions, CFHistory,


SiteProcessor, eventer;
let uiRenderer;

[Link] = function() {
return !!([Link]||[Link]||
[Link]().length);
};
[Link] = function(selector) {
let e = selector ? [Link](selector) : this;
return e && [Link]() ? e : null;
};
[Link] = [Link];

[Link] = function() {
return new Date(this);
};
[Link] = function() {
const remainingSeconds = [Link](this / 1000);
const hours = [Link](remainingSeconds / 3600).toString().padStart(2,
'0');
const minutes = [Link]((remainingSeconds % 3600) /
60).toString().padStart(2, '0');
const seconds = (remainingSeconds % 60).toString().padStart(2, '0');
return `${hours}:${minutes}:${seconds}`;
};

[Link] = function() {
let output = "";
for (let i = 0; i < [Link]; i++) {
if ([Link](i) <= 127) {
output += [Link](i);
}
}
return output;
};
[Link] = function () {
"use strict";
var str = [Link]();
if ([Link]) {
var t = typeof arguments[0];
var key;
var args = ("string" === t || "number" === t) ?
[Link](arguments)
: arguments[0];

for (key in args) {


str = [Link](new RegExp("\\{" + key + "\\}", "gi"),
args[key]);
}
}

return str;
};

[Link] = function () {
let currentIndex = [Link], temporaryValue, randomIndex;

while (0 !== currentIndex) {


randomIndex = [Link]([Link]() * currentIndex);
currentIndex -= 1;
temporaryValue = this[currentIndex];
this[currentIndex] = this[randomIndex];
this[randomIndex] = temporaryValue;
}

return this;
};

let helpers = {
typer: function(inputElm, value) {
let lastValue = [Link];
[Link] = value;
let event = new Event('input', { bubbles: true });
[Link] = true;
let tracker = inputElm._valueTracker;
if (tracker) {
[Link](lastValue);
}
[Link](event);
},

hasValue: function (val) {


return val !== null && val !== undefined;
},
getTdPrintableTime: function (date = new Date()) {
if (date != null) {
return ('0' + [Link]()).slice(-2) + ':' + ('0' +
[Link]()).slice(-2);
}
return '';
},
getPrintableTime: function (date = new Date()) {
if (date == null) {
return '';
}
return ('0' + [Link]()).slice(-2) + ':' + ('0' +
[Link]()).slice(-2) + ':' + ('0' + [Link]()).slice(-2);
},
getPrintableDateTime: function (date) {
if (date != null) {
return ('0' + [Link]()).slice(-2) + '/' + ('0' +
([Link]() + 1)).slice(-2) + ' ' + ('0' + [Link]()).slice(-2) + ':' +
('0' + [Link]()).slice(-2);
} else {
return '';
}
},
getEnumText: function (enm, value) {
return [Link](enm).find(key => enm[key] === value) || '_ERR';
},
randomMs: function (a, b){
return a + (b - a) * [Link]();
},
addMinutes: function(mins, date = new Date()) {
return [Link]([Link]() + +mins);
},
addSeconds: function(secs, date = new Date()) {
return [Link]([Link]() + +secs);
},
randomHexColor: function() {
const hexChars = '0123456789abcdef';
let color = '';
for (let i = 0; i < 6; i++) {
color += hexChars[[Link]([Link]() * [Link])];
}
return color;
},
randomString: function(length) {
let str = '';
const characters =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
const charactersLength = [Link];

for (let i = 0; i < length; i++) {


str += [Link]([Link]([Link]() *
charactersLength));
}

return str;
},
randomInt: function(min, max) {
min = [Link](min);
max = [Link](max);
return [Link]([Link]() * (max - min + 1)) + min;
},
addMs: function(ms, date = new Date()) {
return [Link]([Link]() + ms);
},
getRandomMs: function(minute, rangeDiffInPercentage) { // Now will be a
random value between minute and minute + rangeDiffPercentage%; Example if minute =
30 and rangeDiffPercentage = 5 => random in the range [30, 31.5]
let msMin = minute * 60 * 1000;
let msMax = msMin + rangeDiffInPercentage/100 * msMin;
return [Link](msMin, msMax);
},
hsToMs: function(hours) {
return hours * 60 * 60 * 1000;
},
minToMs: function(min) {
return min * 60 * 1000;
},
getEmojiForPromoStatus: function(promoStatus) {
switch (promoStatus) {
case [Link]:
return '⚪';
case [Link]:
return '⏳';
case [Link]:
return '✔️';
case [Link]:
return '🕙';
case [Link]:
return '❌';
case [Link]:
return '📅';
case [Link]:
return '❗';
}
},
getHost: function(url, withHttps = false) {
if ([Link]('//')) {
url = [Link]('//')[1];
}
url = [Link]('/')[0];
return withHttps ? ('[Link] + url) : url;
},
cf: {
getUrlType: function(url) {
if ([Link]('/free-rolls')) {
return [Link];
}
if ([Link]('?')[0].endsWith('/free')) {
return [Link];
}
if ([Link]('/promotion/')) {
return [Link];
}
if ([Link]('/contact-twitter')) {
return [Link];
}
if ([Link]('/settings')) {
return [Link];
}
if ([Link]('/stats')) {
return [Link];
}
if ([Link]('/games')) {
return [Link];
}
if ([Link]('/')) {
url = [Link](0, -1);
if (url == [Link](url, true)) {
return [Link];
}
}
if ([Link]('/login')) {
return [Link];
}

return [Link];
}
},
triggerMouseEvent: function (elm, eventType) {
let clickEvent = [Link]('MouseEvents');
[Link] (eventType, true, true);
[Link] (clickEvent);
},
alternativeClick: function (elm) {
[Link] (elm, "mouseover");
[Link] (elm, "mousedown");
[Link] (elm, "mouseup");
[Link] (elm, "click");
},
textQuerySelector: function (selector, text) {
let all = [...[Link](selector)].filter(x =>
[Link]() == [Link]())
if ([Link] == 1) {
return all[0];
}
return undefined;
}
}

class Persistence {
constructor(prefix = 'autoWeb_') {
[Link] = prefix;
}
save(key, value, parseIt = false) {
GM_setValue([Link] + key, parseIt ? [Link](value) :
value);
}
load(key, parseIt = false) {
let value = GM_getValue([Link] + key);
if(value && parseIt) {
value = [Link](value);
}
return value;

}
}

let objectGenerator = {
createShared: function() {
let config = {};
function initializeConfig() {
config = {
'[Link]': false,
'[Link]': 200,
'[Link]': true,
'[Link]': 4,
'[Link]': 65,
'[Link]': 65,
'[Link]': 65,
'[Link]': true,
'[Link]': true,
'[Link]': 60,
'[Link]': 60,
'[Link]': 60,
'[Link]': false,
'[Link]': "00:00",
'[Link]': "01:00",
'[Link]': false,
'[Link]': true,
'[Link]': false,
'[Link]': false,
'[Link]': 1,
'[Link]': 'YOUR@[Link]',
'[Link]': 'YOURPASSWORD',
'[Link]': 8,
'[Link]': 15,
'[Link]': true,
'[Link]': false,
'[Link]': "0",
'[Link]': 4,
'[Link]': 75,
'[Link]': '101',
'[Link]': 0,
'[Link]': '0',
'[Link]': 2,
'[Link]': 'YOUR_USERNAME',
'[Link]': 'YOURPASSWORD',
'[Link]': 2,
'[Link]': 'YOUR_ACCOUNT_NUMBER',
'[Link]': 'YOURPASSWORD',
'[Link]': 'LTC',
'[Link]': 'LTC',
'migrations': [
{version: '00200799', applied: false} // migration to
change pcodes status from error to usable due to ui changes
]
};

let storedData = [Link]('config', true);


if(storedData) {
for (const prop in config) {
if([Link](prop)) {
config[prop] = storedData[prop];
}
}
}

[Link] = GM_info.[Link];
};
function getConfig() {
return config;
};
function updateConfig(items) {
[Link]( function (item) {
config[[Link]] = [Link];
});
[Link]('config', config, true);
};
function migrationApplied(migrationVersion) {
try {
let mig = [Link](x => [Link] ==
migrationVersion);
[Link] = true;
[Link]('config', config, true);
} catch (err) {
[Link]('Error saving migration as applied');
[Link](err);
}
};
function devlog(msg, elapsed = false, reset = false) {
if(!config['[Link]']) {
return;
}

let log;
if(reset) {
log = [`${[Link]()}|Log cleared`];
} else {
log = [Link]('devlog', true);
log = log ?? [];
}

if(msg) {
msg = scheduleUuid ? `[${scheduleUuid}] ${msg}` : msg;
let previous;
try {
previous = log[[Link] - 1].split('|')[1];
} catch {}
if(elapsed && (previous == msg)) {
log[[Link] - 1] = `${[Link]()}|$
{msg}|[Elapsed time: ${elapsed} seconds]`;
} else {
[Link](`${[Link]()}|${msg}`);
}
}

if([Link] > 200) {


[Link](0, [Link] - 200);
}

[Link]('devlog', log, true);


};
function getDevLog() {
let log;
log = [Link]('devlog', true);
if(log) {
return log;
}
};

function getRunningSites() {
let ret = [];
loadFlowControl();
if(!runningSites || runningSites == {}) {
return ret;
}
for (const sch in runningSites) {
if (runningSites[sch].host) {
[Link](runningSites[sch].host);
}
}
return ret;
}

let runningSites = {}
let scheduleUuid = null;
function isOpenedByManager() {
loadFlowControl();
if(!runningSites || runningSites == {}) {
return false;
}
let uuid = null;
for (const sch in runningSites) {
if ( (runningSites[sch].host && runningSites[sch].host ==
[Link]) ||
(runningSites[sch].params &&
runningSites[sch].[Link] &&
[Link](runningSites[sch].[Link]))
) {
uuid = sch;
break;
}
}
if (!uuid) {
return false;
}

if (runningSites[uuid].runStatus == 'COMPLETED') {
return false;
} else {
scheduleUuid = uuid;
return true;
}
};
function loadFlowControl() {
runningSites = [Link]('runningSites', true) || {};
};
function setFlowControl(schedule, id, url, webType, params = null) {
runningSites[schedule] = {
id: id,
changedAt: [Link](),
url: url,
host: [Link],
type: webType,
opened: false,
error: false,
result: {}
};

if(params) {
runningSites[schedule].params = params;
} else {
runningSites[schedule].params = {};
}
saveFlowControl(schedule);
};
function isCompleted(expectedId) {
loadFlowControl();
for(const sch in runningSites) {
if (runningSites[sch].id == expectedId) {
if (runningSites[sch].runStatus == 'COMPLETED') {
return true;
} else {
return false;
}
}
}
return false;
};
function isIncompleted(expectedId) {
loadFlowControl();
for(const sch in runningSites) {
if (runningSites[sch].id == expectedId) {
if (runningSites[sch].runStatus == 'WORKING') {
return true;
} else {
return false;
}
}
}
return false;
};
function hasErrors(expectedId) {
for(const sch in runningSites) {
if (runningSites[sch].id == expectedId &&
runningSites[sch].error) {
return true;
}
}
return false;
};
function getResult(schedule) {
if (schedule) {
return [Link](schedule) ?
runningSites[schedule].result : {};
}
return [Link](scheduleUuid) ?
runningSites[scheduleUuid].result : {};
};
function getCurrent(schedule) {
if (schedule) {
return [Link](schedule) ?
runningSites[schedule] : {};
}
return [Link](scheduleUuid) ?
runningSites[scheduleUuid] : {};
};
function saveAndclose(runDetails, delay = 0) {
markAsVisited(runDetails);
if(delay) {
setTimeout([Link], delay);
} else {
setTimeout([Link], 1000);
}
};
function purgeFlowControlSchedules(validSchedules) {
loadFlowControl();
let deletables = [];
for (var sch in runningSites) {
if (![Link](sch)) {
[Link](sch);
}
}
[Link](x => {
delete runningSites[sch];
});
[Link]('runningSites', runningSites, true);
};
function saveFlowControl(schedule) {
schedule = schedule ? schedule : scheduleUuid;
if (!schedule) {
[Link]('runningSites', runningSites, true);
return;
}
let tempFlow = [Link]('runningSites', true);
tempFlow[schedule] = runningSites[schedule];
[Link]('runningSites', tempFlow, true);
};
function markAsVisited(runDetails, runStatus = 'COMPLETED') {
if (!scheduleUuid) {
return;
}
runningSites[scheduleUuid].opened = true;
runningSites[scheduleUuid].runStatus = runStatus;
runningSites[scheduleUuid].result = runDetails ? runDetails :
runningSites[scheduleUuid].result;

saveFlowControl(scheduleUuid);
};
function addError(errorType, errorMessage, schedule) {
if (schedule) {
runningSites[schedule].error = true;
runningSites[schedule].[Link] = errorType;
runningSites[schedule].[Link] = errorMessage;
} else {
runningSites[scheduleUuid].error = true;
runningSites[scheduleUuid].[Link] = errorType;
runningSites[scheduleUuid].[Link] = errorMessage;
}

saveFlowControl(schedule ? schedule : scheduleUuid);


};
function closeWithError(errorType, errorMessage) {
addError(errorType, errorMessage);
[Link]();
setInterval(() => {
[Link]();
}, 15000);
};
function clearFlowControl(schedule) {
if (schedule && schedule != 'all') {
runningSites[schedule] = {};
saveFlowControl(schedule);
} else if (schedule == 'all') {
runningSites = {};
[Link]('runningSites', {}, true);
}
};
function clearRetries() {
loadFlowControl();
runningSites[scheduleUuid].retrying = false;
saveFlowControl(scheduleUuid);
return false;
};
function isRetrying() {
if(runningSites[scheduleUuid].retrying) {
return true;
}
runningSites[scheduleUuid].retrying = true;
saveFlowControl(scheduleUuid);
return false;
};
function setProp(key, val) {
runningSites[scheduleUuid][key] = val;
saveFlowControl(scheduleUuid);
};
function getProp(key) {
return runningSites[scheduleUuid][key];
};
function getParam(key) {
try {
} catch {}
return runningSites[scheduleUuid].params[key];
};
initializeConfig();
return {
devlog: devlog,
getDevLog: getDevLog,
setFlowControl: setFlowControl,
isCompleted: isCompleted,
isIncompleted: isIncompleted,
isOpenedByManager: isOpenedByManager,
saveFlowControl: saveFlowControl,
getCurrent: getCurrent,
getResult: getResult,
addError: addError,
closeWindow: saveAndclose,
closeWithError: closeWithError,
updateWithoutClosing: markAsVisited,
hasErrors: hasErrors,
clearFlowControl: clearFlowControl,
getConfig: getConfig,
updateConfig: updateConfig,
clearRetries: clearRetries,
isRetrying: isRetrying,
setProp: setProp,
getProp: getProp,
getParam: getParam,
migrationApplied: migrationApplied,
purgeFlowControlSchedules: purgeFlowControlSchedules,
getRunningSites: getRunningSites
};
},
createCFPromotions: function() {
let codes = [];

function PromotionCode(id, code, repeatDaily = false, expiration =


null, isRemoved = false) {
[Link] = id;
[Link] = code;
[Link] = new Date();
[Link] = [];
[Link] = repeatDaily;
[Link] = null;
this['expiration' + 'Date'] = expiration;
[Link] = isRemoved;
};

function getFaucetStatusInPromo(promo, faucetId) {


let faucet = [Link](x => [Link] == faucetId);
if ([Link] && [Link]) {
if(([Link] == [Link] && ([Link]() -
[Link]()) > [Link].HS_26_IN_MILLISECONDS)
|| ([Link] == [Link] &&
([Link]() - [Link]()) > [Link].HS_2_IN_MILLISECONDS)) {
[Link] = [Link];
}
}
return [Link] ?? [Link];
};

function addNew(code, repeatDaily = false, expiration = null) {


let found = [Link](x => [Link] == code);
if (found) {
[Link] = repeatDaily;
found['expiration' + 'Date'] = expiration;
[Link] = false;
} else {
found = new PromotionCode([Link], code, repeatDaily,
expiration);
[Link](found);
}

[Link] = [Link]().map(x => {


return {
id: [Link],
};});
[Link](function (element, idx, arr) {
arr[idx].status = [Link];
arr[idx].execTimeStamp = null;
});

save();
};

function includeNewCodes(newCodes) {
for(let i=0; i<[Link]; i++) {
let item = newCodes[i];
let exists = [Link](x => [Link]() ==
[Link]());
if (!exists) {
addNew([Link], ![Link], item['expiration' +
'Date']);
} else {
}
}
};

function getAll() {
return [Link](x => ![Link]);
};

function updateFaucetForCode(code, faucetId, newStatus) {


let promo = [Link](x => [Link] == code);
let faucet = [Link](x => [Link] == faucetId);
if(faucet) {
[Link] = newStatus;
[Link] = new Date();
[Link] = [Link];
}
save();
};

function hasPromoAvailable(faucetId) {
let resp = [];
[Link](function (promotion, idx, arr) {
let status = getFaucetStatusInPromo(promotion, faucetId);
if (status == [Link] && ![Link])
{
[Link]([Link]);
}
});
if ([Link] > 0) {
return resp;
} else {
return false;
}
};

function save() {
[Link]('CFPromotions', codes, true);
};

function load(data) {
codes = data;
save();
};

function removeAll() {
[Link](x => [Link] = true);
codes = [Link](x => x['expiration' + 'Date'] &&
[Link](x['expiration' + 'Date']) > [Link]());
save();
};

function remove(id, code) {


let idx = [Link](x => [Link] == id && [Link] == code);
if(idx != -1) {
codes[idx].isRemoved = true;
save();
}

return idx;
};

return {
addNew: addNew,
removeAll: removeAll,
remove: remove,
getAll: getAll,
load: load,
updateFaucetForCode: updateFaucetForCode,
hasPromoAvailable: hasPromoAvailable,
includeNewCodes: includeNewCodes
}
},
createInteractions: function(){
let randomInteractionLevel = [Link];
let maxActions = 0;
let performedActions = -1;
let selectableElements;
let actions = {
available: [
function() {
let element =
[Link][[Link](0,
[Link] - 1)];

try {
if ([Link]) {
const range = [Link]();
[Link](element);
[Link]();
} else if ([Link]) {
const selection = [Link]();
const range = [Link]();
[Link](element);
[Link]();
[Link](range);
}
} catch (err) { }

[Link]();
}
]
};

function start(selectableElements) {
performedActions = 0;
switch(randomInteractionLevel) {
case [Link]:
maxActions = 0;
break;
case [Link]:
maxActions = [Link](2, 4);
break;
case [Link]:
maxActions = [Link](5, 8);
break;
case [Link]:
maxActions = [Link](12, 16);
break;
}
[Link] = selectableElements;
performActions();
}

function performActions() {
if(performedActions >= maxActions) {
return;
}
let delay = 0;
for(let i = 0; i < maxActions; i++) {
delay += [Link](350, 1500);
setTimeout([Link][[Link](0,
[Link] - 1)], delay);
}
}

function addPerformed() {
performedActions++;
}
function completed() {
return (performedActions >= maxActions);
}

return {
start: start,
completed: completed,
addPerformed: addPerformed,
selectableElements: selectableElements
};
},
createCFProcessor: function() {
const NavigationProcess = {
ROLLING: 1,
PROCESSING_PROMOTION: 2,
LOGIN: 3
};
let navigationProcess;
let countdown;
let rollButton;
let promotionTag;
let timeWaiting= 0;
let loopingForErrors = false;
let tempRollNumber = null;
let firstRollCompleted = false;

function init() {
let urlType = [Link]([Link]);
[Link]('URL TYPE:', urlType)
switch(urlType) {
case [Link]:
if([Link]) {
[Link]('.locale-changer .p-dropdown-
trigger')?.click();
setTimeout(() => {
[Link]("#pv_id_3_3")?.click();
}, 1000);
}
addJS_Node (null, null, overrideSelectNativeJS_Functions);
interactions = [Link]();
run();
break;

case [Link]:
interactions = [Link]();
runPromotion();
break;
case [Link]:
[Link]('/free');
break;
case [Link]:
case [Link]:
if ([Link]()['[Link]']) {
addJS_Node (null, null,
overrideSelectNativeJS_Functions);
doLogin();
} else {
[Link]([Link].NEED_TO_LOGIN, '');
}
break;

case [Link]:
[Link]([Link].IP_BAN, '');
break;
default:
break;
}
return;
}

function run() {
navigationProcess = [Link];
setInterval(tryClosePopup, [Link](3000, 6000));
setTimeout(findCountdownOrRollButton, [Link](2000,
5000));
};

function doLogin() {
navigationProcess = [Link];

setTimeout(findLoginForm, [Link](2000, 5000));


};

function isFullyLoaded() { //Waits 55 seconds max


if([Link] == 'complete' || timeWaiting == -1) {
timeWaiting = 0;
if (firstRollCompleted) {
roll();
} else {
interact();
}
} else {
timeWaiting = -1;
setTimeout(isFullyLoaded, [Link](15000, 25000));
}
};
function runPromotion() {
navigationProcess = NavigationProcess.PROCESSING_PROMOTION
setTimeout(findPromotionTag, [Link](1000, 3000));
};
function tryClosePopup() {
let popupBtn = [Link]('.p-dialog .p-dialog-header-
close');
if (popupBtn && [Link]()) {
[Link]();
}
};
function isRollResultVisible() {
let rollDiv = [Link]('.result');
if (rollDiv && [Link]() && [Link] != '') {
}
};
let waitRollNumberCount = 0;
function closeToast() {
[Link]('.p-toast-icon-close')?.click();
}
async function waitForRollNumber() {
let newNumber = -1;
try { // intento leer el rolled number
newNumber = [...[Link]('.lucky-number-
wrapper img')].map(x => [Link]('/').slice(-1)[0].split('.').slice(-3)
[0]).join('');
newNumber = parseInt(newNumber)
} catch(err) {
newNumber = null;
}
if (newNumber === null) { // si no logro leerlo, bajo 1 en
tempRollNumber
if (tempRollNumber < 0) {
tempRollNumber -= 1;
} else {
tempRollNumber = -1;
}
if (tempRollNumber < -5) {
processRunDetails();
return;
} else {
await wait(3000);
return waitForRollNumber();
}
}

if (newNumber == tempRollNumber) {
timeWaiting = 0;
if ([Link]()['[Link]']) {
processRunDetails();
return;
} else {
firstRollCompleted = true;
closeToast();
setTimeout(findCountdownOrRollButton,
[Link](1000, 2000));
return;
}
} else {
waitRollNumberCount++;
if (waitRollNumberCount > 15) {
setTimeout(() => { [Link](); }, 5000);
return;
}

tempRollNumber = newNumber;
await wait(3000);
return waitForRollNumber();
}

};
function isLoggedIn() {
return !![Link]('[data-icon="user"]');
}

function findCountdownOrRollButton() {
if (!isLoggedIn()) {
[Link]();
}
if( isCountdownVisible() && !isRollButtonVisible() ) {
timeWaiting = 0;
processRunDetails();
} else if ( !isCountdownVisible() && isRollButtonVisible() ) {
timeWaiting = 0;
setTimeout(isFullyLoaded, [Link](1000, 5000));
} else if ( isCountdownVisible() && isRollButtonVisible() ) {
try {
let minLeft =
[Link]('.minutes .digits').innerText;
if (minLeft < 1) {
timeWaiting = 0;
setTimeout(isFullyLoaded, [Link](1000,
5000));
}
} catch (err) { [Link](`Error on alt logic of CF roll: $
{err}`); }
} else {
if (timeWaiting/1000 > [Link]()['[Link]'] *
60) {
[Link]([Link], '');
return;
}

timeWaiting += 3000;
setTimeout(findCountdownOrRollButton, [Link](2000,
5000));
}
};
function addUrlChangeListener() {
if ([Link] === null) {
[Link]('urlchange', (data) => {
if (navigationProcess == [Link] && !
[Link]('/login')) {
loopingForErrors = false;
init();
}
});
}
};
function findLoginForm() {
if ( [Link]('#email')?.isVisible() &&
[Link]('#password')?.isVisible() ) {
addUrlChangeListener();
let errElement = [Link]('.login-
wrapper .error');
if( errElement && [Link] != '') {
let errorMessage = [Link];
[Link]([Link].LOGIN_ERROR,
errorMessage);
return;
}
if(!loopingForErrors) {
if([Link]()['[Link]'] == 1) {
timeWaiting = 0;
[Link]([Link]('.login-wrapper
input[name="email"],#email'), [Link]()['[Link]']);
[Link]([Link]('.login-wrapper
input[name="password"],#password'), [Link]()['[Link]']);

[Link]('#password')?.closest('div')?.querySelector('button')?.click
();
loopingForErrors = true;
} else {
if([Link]('.login-wrapper
input[name="email"],#email').value != '' && [Link]('.login-wrapper
input[name="password"],#password').value != '') {

[Link]('#password')?.closest('div')?.querySelector('button')?.click
();
loopingForErrors = true;
} else {
if (timeWaiting/1000 > ([Link]()
['[Link]'] / 1.5) * 60) {
[Link]([Link].LOGIN_ERROR,
'No credentials were provided');
return;
}
}
}
}
}

if (timeWaiting/1000 > [Link]()['[Link]'] * 60)


{
[Link]([Link], '');
return;
}

timeWaiting += 3000;
setTimeout(findLoginForm, [Link](2000, 5000));
};
function interact() {
let selectables = [].concat([...[Link]('td')],
[...[Link]('p')], [...[Link]('th')]);

[Link](selectables);
setTimeout(waitInteractions, [Link](2000, 4000));
}
function waitInteractions() {
if([Link]()) {
roll();
} else {
setTimeout(waitInteractions, [Link](2000, 4000));
}
}
function isCountdownVisible() {
countdown = [Link]('.minutes .digits');
return ([Link] > 0 && countdown[0].isVisible());
};
function isRollButtonVisible() {
let rollButtonIcon = [Link]('.p-button [data-
icon="gift"]');
if (!rollButtonIcon) {
return false;
}
rollButton = [Link]('button');
return rollButton && ![Link] &&
[Link]();
};
function roll() {
[Link]({ behavior: "smooth", block: "nearest",
inline: "nearest" });
[Link]();
tempRollNumber = -1;
setTimeout(waitForRollNumber, [Link](4000, 7000));
}
function isPromotionTagVisible() {
let pTag;
try {
pTag = [Link]('.p-message-text.p-message-
text')[0];
} catch(err) {
return false;
}
if (pTag) {
promotionTag = pTag;
return true;
}
return false;
};
function findPromotionTag() {
if( isPromotionTagVisible() ) {
processRunDetails();
} else {
setTimeout(findPromotionTag, [Link](2000, 5000));
}
};
function processRunDetails() {
let result = {};
if(navigationProcess == [Link]) {
[Link] = readClaimed();
[Link] = readBalance();
if([Link] != 0) {
[Link] = readRolledNumber();
}
let minOneHour = [Link] && [Link] !=
0;
[Link] = readCountdown(minOneHour);
[Link] = readBalance();
} else if (navigationProcess ==
NavigationProcess.PROCESSING_PROMOTION) {
result = [Link]() || {};
if (![Link]) {
[Link] = [];
}
let pc = {
promoCode: readPromoCode(),
promoStatus: readPromoStatus()
};

[Link](pc);
[Link](result, 'WORKING');
setTimeout(gotoNextPromoCode, [Link](1000, 2500));
return;
}
[Link](result);
};
function gotoNextPromoCode() {
let codes = [Link]().[Link];
if (!codes) {
[Link]();
return;
}
let pc = readPromoCode();
let pcIdx = [Link](x => x == pc);
if (pcIdx == -1 || pcIdx == [Link] - 1) {
[Link]();
return;
}
[Link] = '/promotion/' + codes[pcIdx + 1];
};
function readCountdown(minOneHour = false) {
let minsElement = [Link]('.minutes .digits');
let mins = "0";
if (minsElement) {
mins = [Link];
}
if (mins) {
let estimated = [Link](+mins + 1);
let oneHour = [Link]() + (60*60*1000);
if (minOneHour && (oneHour > estimated) ) {
return oneHour;
}
return estimated;
} else {
return null;
}
};
function readClaimed() {
let claimed = 0;
try {
claimed = [Link]('.p-toast-message-text .p-
toast-detail').innerHTML;
claimed = [Link]();
claimed = [Link](' ').slice(-2)[0]
} catch(err) { }
return claimed;
};
function readRolledNumber() {
let number = 0;
try {
number = [...[Link]('.lucky-number-wrapper
img')].map(x => [Link]('/').slice(-1)[0].split('.').slice(-3)[0]).join('');
number = parseInt(number);
} catch(err) { }
return number;
};
function readBalance() {
let balance = "";
try {
balance = [Link]('header div div div > span
span')[1].[Link]().split(' ')[0];
} catch(err) { }
return balance;
};
function readPromoStatus() {
let promoStatus = [Link];
try {

if([Link]([Link]) >
0) {
return [Link];
} else
if([Link]([Link]) > 0) {
return [Link];
} else
if([Link]([Link]) >
0) {
return [Link];
} else
if([Link](x =>
[Link](x) > -1) == -1) {
return [Link];
}
} catch ( err ) { }
return promoStatus;
};
function validatePromoString() {

};
function readPromoCode() {
var urlSplit = [Link]('/');
return urlSplit[[Link] - 1];
};
function displayStatusUi() {
let wrapper = [Link]('div');
[Link] = '<div class="withdraw-button bg-2"
style="top:30%; z-index:1500;" href="#">⚙️ <span
id="process-status">Processing</span></div>';
[Link]( 'body' ).prepend( [Link] );
};
return {
init: init
};
},
createCFHistory: function() {
let rollsMeta = [
{ id: 0, range: '0000-9885', count: 0 },
{ id: 1, range: '9886-9985', count: 0 },
{ id: 2, range: '9986-9993', count: 0 },
{ id: 3, range: '9994-9997', count: 0 },
{ id: 4, range: '9998-9999', count: 0 },
{ id: 5, range: '10000', count: 0 }
];

function initOrLoad() {
let storedData = [Link]('CFHistory', true);
if(storedData) {
rollsMeta = storedData;
}
};

function addRoll(number) {
switch(true) {
case (number <= 9885):
rollsMeta[0].count++;
break;
case (number <= 9985):
rollsMeta[1].count++;
break;
case (number <= 9993):
rollsMeta[2].count++;
break;
case (number <= 9997):
rollsMeta[3].count++;
break;
case (number <= 9999):
rollsMeta[4].count++;
break;
case (number == 10000):
rollsMeta[5].count++;
break;
default:
break;
}
save();
};

function getRollsMeta() {
return [Link](x => [Link]);
};

function save() {
[Link]('CFHistory', rollsMeta, true);
};

return {
initOrLoad: initOrLoad,
addRoll: addRoll,
getRollsMeta: getRollsMeta
}
},
};

function overrideSelectNativeJS_Functions () {
[Link] = function alert (message) {
}
}
function addJS_Node (text, s_URL, funcToRun) {
var scriptNode= [Link] ('script');
[Link]= "text/javascript";
if (text)[Link]= text;
if (s_URL)[Link]= s_URL;
if (funcToRun)[Link] = '(' + [Link]() + ')()';
var element = [Link] ('head')[0] || [Link] ||
[Link];
[Link] (scriptNode);
}
function addHtml(data) { // data = { target: '', where: '', content: '' }
[Link]([Link]).insertAdjacentHTML([Link],
[Link]);
}
function addTemplateTag(data) {
let templateTag = [Link]('template');
[Link] = [Link];
[Link] = [Link];
let container = [Link] || [Link];
[Link](templateTag);
}
function useTemplate(data) { // data = { templateId: '', target: '', where: '',
replacements: {} }
let template = [Link](`#${[Link]}`).innerHTML;
let content = [Link]([Link]);
addHtml({
target: [Link],
where: [Link],
content: content
});
}

function isExpectedPtc() {
let runningList = [Link]();
let ptcHosts = ['[Link]'];

for (let i = 0; i < [Link]; i++) {


if ([Link](`//${ptcHosts[i]}`) &&
[Link](ptcHosts[i])) {
waitForCloseSignal(ptcHosts[i]);
return true;
}
}
return false;
}

async function waitForCloseSignal(host) {


await wait(3000);
const signal = GM_getValue(`ptc-close-signal-${host}`) || null;
if (signal) {
[Link]();
}
return waitForCloseSignal(host);
}

function detectWeb() {
if (isExpectedPtc()) {
return;
}
if(![Link]()) {
return;
}
instance = [Link];

let typeFromManager = [Link]().type;

siteTimer = new Timer({ isManager: false, delaySeconds: 20, uuid:


[Link]('schedule'), webType: typeFromManager });
switch( typeFromManager ) {
case [Link]:
SiteProcessor = createSGProcessor();
setTimeout([Link], [Link](10000, 20000));
break;
case [Link]:
SiteProcessor = [Link]();
setTimeout([Link], [Link](1000, 3000));
break;
case [Link]:
SiteProcessor = createFBProcessor();
setTimeout([Link], [Link](2000, 5000));
break;
case [Link]:
SiteProcessor = new FPPtc();
setTimeout(() => { [Link]() }, [Link](2000,
5000));
break;
case [Link]:
SiteProcessor = createBigBtcProcessor();
setTimeout([Link], [Link](2000, 4000));
break;
case [Link]:
SiteProcessor = createBestChangeProcessor();
setTimeout([Link], [Link](4000, 6000));
break;
case [Link]:
SiteProcessor = new BFRoll([Link]([Link],
[Link]().[Link]).toLowerCase());
setTimeout(() => { [Link]() }, [Link](2000,
5000));
break;
case [Link]:
SiteProcessor = new DutchyRoll();
setTimeout(() => { [Link]() }, [Link](2000,
5000));
break;
case [Link]:
SiteProcessor = new FCryptoRoll();
setTimeout(() => { [Link]() }, [Link](2000,
5000));
break;
case [Link]:
SiteProcessor = new FPB([Link]().[Link]);
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new GRCRoll();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new VieRoll();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link].O24:
SiteProcessor = new O24Roll();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new YCoin();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new CDiversity();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new CTop();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new AutoCMl();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
case [Link]:
SiteProcessor = new CClicks();
setTimeout(() => { [Link]() }, [Link](3000,
5000));
break;
default:
break;
}
}

class UiBaseRenderer {
constructor(uiRenderer) { [Link] = uiRenderer; }
}
class UiSitesRenderer extends UiBaseRenderer {
appendEventListeners() {

[Link]('#modal-assign-
schedule').addEventListener('click', [Link](this));
[Link]('siteChangedSchedule', (e) => {
[Link](`Site moved to schedule ${[Link]}`);
[Link]({withUpdate: true}); // should act based on data
only
});

[Link]('#schedule-table-
body').addEventListener('click', [Link](this));

[Link]('.action-edit-all-
sites').addEventListener('click', [Link](this));
[Link]('.action-edit-all-sites-
cancel').addEventListener('click', [Link](this));
[Link]('.action-edit-all-sites-
save').addEventListener('click', [Link](this));

[Link]('.action-add-external-
site').addEventListener('click', [Link](this));
[Link]('#modal-add-site').addEventListener('click',
[Link](this));
[Link]('siteAdded', (e) => {
[Link](`Site ${[Link]} added`);
[Link]({withUpdate: true}); // should act based on data
only
});
[Link]('siteRemoved', (e) => {
[Link](`Site ${[Link]} removed`);
[Link]({withUpdate: true}); // should act based on data
only
});
}

_legacyAddBadges(stats) {
let consecutiveTimeout = [Link];
let otherErrors = [Link];
let html = ' ';

if (consecutiveTimeout) {
html += `<span class="badge badge-pill badge-warning" title="$
{consecutiveTimeout} consecutive timeouts">${consecutiveTimeout}</span>`;
}

if (otherErrors) {
html += `<span class="badge badge-pill badge-warning" title="$
{[Link]}">${[Link]([Link],
[Link])}</span>`;
}
return html;
}

removeDeletedSitesRows(validSiteIds) {
let removableRows = [...[Link]('#schedule-table-body
tr')].filter(r => ![Link]([Link]));
[Link](r => {
[Link]();
});
}

renderSiteRow(site) {

let row = [...[Link]('#schedule-table-body tr')]


.filter(r => [Link] == [Link]);
if ([Link] == 0) {
row = [Link]('tr');
[Link]('#schedule-table-body').appendChild(row);
[Link]('aria-expanded', false);
[Link]('align-middle');
[Link] = [Link];
[Link] = [Link];
} else {
row = row[0];
}

[Link] = `${[Link](site)}`;
[Link] = [Link];
[Link] = [Link] ? [Link]()
: 'null';
[Link] = [Link] ? '1' : '0';
if ([Link]) {
if (typeof [Link] == 'string') {
[Link] = [Link](' ')[0];
} else {
[Link] = [Link](8);
}
} else {
[Link] = '';
}

let tds = '';

tds += '<td class="align-middle edit-status d-none em-only"><label


class="switch"><input type="checkbox" data-original="' + ([Link] ? '1' : '0')
+ '" ' + ([Link] ? 'checked' : ' ') + '><span class="slider
round"></span></label></td>';
tds += '<td class="align-middle" title="' +
[Link]([Link]) + '"><span><i class="fas fa-square pr-
1" style="color: #' + [Link] + ';"></i></span>' +
[Link]([Link]) + '</td>';
if ([Link] && [Link] == -1) {
tds += '<td class="align-middle text-left"><a class="" title="Visit
site" target="_blank" rel="noreferrer" href="' + [Link] + '"><i class="fa fa-
external-link-alt"></i></a></td>';
} else {
tds += '<td class="align-middle text-left"><a class="" title="Visit
site" target="_blank" rel="noreferrer" href="' + (new URL([Link],
'[Link] + '"><i class="fa
fa-external-link-alt"></i></a></td>';
}

tds += '<td class="align-middle em-input text-left" data-


field="displayName">';
if ([Link]) {
tds +='<div class="input-group input-group-sm">';
tds += '<div class="input-group-prepend"><span class="input-group-
text">';
if ([Link] > 0) {
let cmcLower = [Link]([Link],
[Link]).toLowerCase();
tds += '<img loading="lazy" src="/static/c-icons/' + cmcLower +
'.svg" height="20" alt="' + cmcLower + '">';
} else {
tds += '<i class="fa fa-question-circle"></i>';
}
tds += '</span></div>';
}
tds += ' <span class="site-name-container px-1">' + [Link] +
'</span></div></td>';

tds +='<td class="align-middle text-right">' +


[Link]([Link]([Link]) ? 0 : 8) + '</td>';
tds +='<td class="align-middle text-right">' +
[Link]([Link]([Link]) ? 0 : 8) + '</td>';

tds += '<td class="align-middle text-right">' + (+[Link] >


100 ? (+[Link]).toFixed(2) : [Link]) + '</td>';
tds +='<td class="align-middle text-right fiat-conversion
em-hide"></td>';
tds +='<td class="align-middle">' + this._legacyAddBadges([Link]) +
'</td>';
tds +='<td class="align-middle justify-content-center em-hide">';

tds +=
`<div class="btn-group btn-group-sm">
<button type="button" title="Run ASAP" class="btn btn-default
action-run-asap">
<i class="fa fa-bolt"></i>
</button>
<button type="button" title="Schedule parameters..."
class="btn btn-default action-edit-site $
{[Link]([Link]).some( k => [Link]('.override') && [Link][k] ==
true ) ? 'text-warning' : ''}">
<i class="fa fa-clock"></i>
</button>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-default dropdown-toggle
dropdown-icon" data-toggle="dropdown" aria-expanded="false">
</button>
<div class="dropdown-menu dropdown-menu-right text-sm"
style="">
<a class="dropdown-item action-site-edit-parameters"><i
class="fa fa-edit"></i> Site arguments...</a>
<a class="dropdown-item action-site-assign-schedule"><i
class="fa fa-exchange-alt"></i> Move to...</a>`;
if ([Link]) {
tds += `<a class="dropdown-item action-site-remove-external"><i
class="fa fa-trash"></i> Remove site</a>`;
}
tds += `</div></div></div>`;

tds +='</td></tr>';

[Link] = tds;
}

legacyRenderSiteData(site, config) {
[Link]('#faucet-name').innerHTML = [Link];
[Link]('#faucet-name').[Link] = [Link];
let data = [Link] || {};
for (const prop in config) {
let overrideElement = [Link]('[data-site-prop="' +
prop + '.override"]');
if (overrideElement) {
[Link] = (data[prop + '.override'] ?
"1" : "0");
[Link] = data[prop + '.override'];
}

let element = [Link]('[data-site-prop="' + prop +


'"]');
if(element) {
if([Link] == 'select-one' || [Link] == 'text' ||
[Link] == 'password' || [Link] == 'number' || [Link] == 'time') {
[Link] = data[prop] ?? config[prop];
[Link] = data[prop] ?? config[prop];
} else if ([Link] == 'checkbox') {
[Link] = ((data[prop] ?? config[prop]) ?
"1" : "0");
[Link] = data[prop] ?? config[prop];
}
[Link] = true;
}
}

let elWorkInBackgroundOverride = [Link]('[data-site-


prop="[Link]"]');
let elWorkInBackground = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link] = function (e) {
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link];
}

let elTimeoutOverride = [Link]('[data-site-


prop="[Link]"]');
let elTimeout = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link] = function (e) {
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link];
}

let elPostponeOverride = [Link]('[data-site-


prop="[Link]"]');
let elPostpone = [Link]('[data-site-
prop="[Link]"]');
let elPostponeMin = [Link]('[data-site-
prop="[Link]"]');
let elPostponeMax = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link] = ![Link] ||
([Link] > "0");
[Link] = ![Link] ||
([Link] > "0");
[Link] = function (e) {
let mode = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link] || [Link] >
0;
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link] || [Link] >
0;
}
[Link] = function (e) {
[Link]('[data-site-
prop="[Link]"]').disabled = [Link] > 0;
[Link]('[data-site-
prop="[Link]"]').disabled = [Link] > 0;
if ([Link] > 0) {
[Link]('[data-site-
prop="[Link]"]').value = [Link];
[Link]('[data-site-
prop="[Link]"]').value = [Link];
}
}

let elNextRunOverride = [Link]('[data-site-


prop="[Link]"]');
let elNextRun = [Link]('[data-site-
prop="[Link]"]');
let elNextRunMin = [Link]('[data-site-
prop="[Link]"]');
let elNextRunMax = [Link]('[data-site-
prop="[Link]"]');
let elNextRunUseCountdown = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link] = ![Link] || ([Link]
> "0");
[Link] = ![Link] || ([Link]
> "0");
[Link] = ![Link];
[Link] = function (e) {
let mode = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link] || [Link] > 0;
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link] || [Link] > 0;
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link];
}
[Link] = function (e) {
[Link]('[data-site-
prop="[Link]"]').disabled = [Link] > 0;
[Link]('[data-site-
prop="[Link]"]').disabled = [Link] > 0;
if ([Link] > 0) {
[Link]('[data-site-
prop="[Link]"]').value = [Link];
[Link]('[data-site-
prop="[Link]"]').value = [Link];
}
}

let elSleepOverride = [Link]('[data-site-


prop="[Link]"]');
let elSleep = [Link]('[data-site-
prop="[Link]"]');
let elSleepMin = [Link]('[data-site-
prop="[Link]"]');
let elSleepMax = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link] = ![Link] || ![Link];
[Link] = ![Link] || ![Link];
[Link] = function (e) {
let mode = [Link]('[data-site-
prop="[Link]"]');
[Link] = ![Link];
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link] || ![Link];
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link] || ![Link];
}
[Link] = function (e) {
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link];
[Link]('[data-site-
prop="[Link]"]').disabled = ![Link];
}

return;
}

sortSitesTable() {
const tbody = [Link]('#schedule-table-body');

let rows, switching, i, shouldSwitch;


switching = true;
while (switching) {
switching = false;
rows = [Link];

for (i = 0; i < ([Link] - 1); i++) {


shouldSwitch = false;

let aNextRoll, bNextRoll, aHasLoginError, bHasLoginError,


aName, bName;
aNextRoll = rows[i].[Link];
bNextRoll = rows[i + 1].[Link];
if (aNextRoll == 'null' && bNextRoll == 'null') {
aName = rows[i].querySelector('.site-name-
container').innerText;
bName = rows[i + 1].querySelector('.site-name-
container').innerText;
if ([Link]() > [Link]()) {
shouldSwitch = true;
break;
}
} else if (aNextRoll == 'null' || (aNextRoll > bNextRoll)) {
shouldSwitch = true;
break;
}
}
if (shouldSwitch) {
rows[i].[Link](rows[i + 1], rows[i]);
switching = true;
}
}
}

onClickOnSitesTableBody(e) {
let actionElement = [Link];
if ([Link] === 'I') {
actionElement = [Link];
}
const row = [Link]('tr');
if ([Link]('action-edit-site')) {
[Link]();
[Link]('modal-site', [Link]);
} else if ([Link]('action-run-asap')) {
[Link]();
[Link]([Link]);
} else if ([Link]('action-site-assign-
schedule')) {
[Link]('modal-assign-schedule', { site_id:
[Link], schedule_id: [Link] });
} else if ([Link]('action-site-edit-
parameters')) {
[Link]('modal-site-parameters', { site_id:
[Link] });
} else if ([Link]('action-site-remove-
external')) {
[Link]([Link]);
[Link]('TODO: remove site and all the related configuration',
[Link]);
}
}

onClickOnModalAssignSchedule(e) {
const modalAssignScheduleToSite = [Link]('#modal-
assign-schedule');
let actionElement = [Link] === 'I' ? [Link] :
[Link];
if ([Link]('modal-save')) {
let data =
[Link]([Link]('.form-
container'));
if (data.original_schedule_id == [Link]) {
} else {
[Link](data.site_id).changeSchedule([Link]);
}
}
}

onClickOnModalAddSite(e) {
const modal = [Link]('#modal-add-site');
let actionElement = [Link] === 'I' ? [Link] :
[Link];
if ([Link]('modal-save')) {
let formData =
[Link]([Link]('.form-container'));
let data = {};
[Link] = formData.site_name;
[Link] = new URL(formData.site_url);
[Link] = [Link];
[Link] = -1;
[Link] = 'ext_rnd_id_' + [Link](8);
[Link] = [Link];
[Link] = -1;
[Link] = '';
[Link] = true;

[Link]('Savable new site');


[Link](data);
return;
if (data.original_schedule_id == [Link]) {
} else {
[Link](data.site_id).changeSchedule([Link]);
}
}
}

onClickOnEditAllSites(e) {
[Link]("#schedule-table-body [Link]-input .site-name-
container").forEach(function (x) {
let val = [Link];
[Link] = "<input type=\'text\' class=\'form-control form-
control-sm\' data-original=\'" + [Link]() + "\' value=\'" + [Link]() + "\' />";
});
[Link]("#schedule-table-body [Link]-
status").forEach(function (x) {
[Link]("d-none");
});
[Link](".em-only").forEach(x =>
[Link]("d-none"));
[Link](".em-hide").forEach(x => [Link]("d-
none"));
}

onClickOnCancelEditAllSites(e) {
[Link]("#schedule-table-body [Link]-input .site-name-
container input").forEach(function(x) {
[Link] = [Link];
});
[Link](".em-only").forEach(x => [Link]("d-
none"));
[Link](".em-hide").forEach(x =>
[Link]("d-none"));
}

onClickOnSaveEditAllSites(e) {
let updateObject;
var updateData = [Link]("update-data");
if ([Link] != "") {
updateObject = [Link]([Link]);
} else {
updateObject = {
runAsap: { ids: [], changed: false },
editSingle: { changed: false, items: [] },
wallet: { changed: false, items: [] },
config: { changed: false, items: [] },
site: { changed: false, list: [] }
};
}

[Link]("#schedule-table-body tr").forEach(function
(row) {
let textInputCell = [Link](".em-input .site-name-
container");
let textInput = [Link]("input");
let activeSwitch = [Link]("[Link]-status input");
let single = { id: [Link], displayName:
[Link], enabled: [Link] };
[Link] = [Link];
if([Link] != [Link]) {
[Link] = [Link];
}
if([Link] != Boolean([Link]))
{
[Link] = Boolean([Link]);
}
if([Link] != [Link] ||
[Link] != Boolean([Link])) {
[Link](single);
[Link] = true;
}
});
if([Link]) {
[Link]("update-data").innerHTML =
[Link](updateObject);
[Link]("Data will be updated as soon as possible");
}

[Link](".em-only").forEach(x => [Link]("d-


none"));
[Link](".em-hide").forEach(x =>
[Link]("d-none"));
}

onClickOnAddSiteButton(e) {
[Link]();
[Link]('modal-add-site');
}

renderAddExternalSite() {
const modalAssignSchedule = [Link]('modal-add-site');
let selectElm = [Link]('select');
let options = [];
let firstSchedule = '';
[Link]().forEach(sch => {
if (firstSchedule == '') {
firstSchedule = [Link];
}
[Link](`<option value="${[Link]}"><i class="fas fa-square"
style="color: #${[Link]}"></i>${[Link]}</option>`)
});
[Link] = [Link]('');
[Link] = firstSchedule;
return;
}

renderAssignScheduleToSite(values) {
const modalAssignSchedule = [Link]('modal-assign-
schedule');
[Link]('input[name="site_id"]').value =
values.site_id;

[Link]('input[name="original_schedule_id"]').value =
values.schedule_id;
let selectElm = [Link]('select');
let options = [];
[Link]().forEach(sch => {
[Link](`<option value="${[Link]}"><i class="fas fa-square"
style="color: #${[Link]}"></i>${[Link]}</option>`)
});
[Link] = [Link]('');
[Link] = values.schedule_id || "";
return;
}
}
class UiPromosRenderer extends UiBaseRenderer {
appendEventListeners() {
[Link]('#promo-button').addEventListener('click',
[Link](this));
[Link]('#button-try-get-
codes').addEventListener('click', [Link](this));
[Link]('#promo-table-body').addEventListener('click',
[Link](this));
}

onClickSavePromoCode(e) {
var promoText = [Link]("promo-text-input");
var promoCode = [Link]("promo-code-new");
var promoDaily = [Link]("promo-daily");
var promoObject = { action: "ADD", code: [Link](),
repeatDaily: [Link] };
[Link] =[Link](promoObject);
[Link]("Adding promo code: " + [Link] +
"...");
[Link] = '';
}

onClickTryGetCodes(e) {
var promoCode = [Link]("promo-code-new");
var promoObject = { action: "TRYGETCODES" };
[Link] =[Link](promoObject);
[Link]("Fetching codes...");
}

_legacyRemoveUsedDailyCodes(codes) {
if(codes && [Link]) {
[Link](code => {
if(![Link]) {
let counter = 0;
for(let i = 0; i < [Link]; i++) {
if([Link][i].execTimeStamp) {
counter++;
}
}
if(counter == [Link]) {
setTimeout(() => removePromoCode([Link], [Link]),
20000);
}
}
});
}
}

legacyRenderPromotionTable(codes) {
let tableBody = '';
this._legacyRemoveUsedDailyCodes(codes);

for(let c=0; c < [Link]; c++) {


let data = codes[c];
tableBody += '<tr data-promotion-code="' + [Link] + '" data-
promotion-id="' + [Link] + '">';
tableBody += '<td class="align-middle text-left ' +
([Link] ? 'text-warning' : '') + '">';
tableBody += `<a class="action-remove-promo-code" data-
toggle="tooltip" data-placement="left" title="Remove" onclick=""><i class="fa fa-
times-circle"></i></a>`;
tableBody += '<span title="' + ([Link] ? 'Reusable Code'
: 'One-time-only Code') + '">' + [Link] + '</span></td>';
tableBody +='<td class="align-middle" title="' +
([Link] ? 'Reusable Code' : 'One-time-only Code') + '">' +
[Link]([Link]) + '</td>';

for(let i=0, all = [Link]; i < all; i++) {


tableBody +='<td class="align-middle" title="Runned @' +
[Link]([Link][i].execTimeStamp) + '">' +
[Link]([Link][i].status ?? 0) + '</td>';
}
tableBody +='</tr>';
}

[Link]('promo-table-body').innerHTML = tableBody;
}

onClickOnPromoTableBody(e) {
let actionElement = [Link];
if ([Link] === 'I') {
actionElement = [Link];
}
const row = [Link]('tr');
if ([Link]('action-remove-promo-code')) {
[Link]();
var promoCode = [Link]("promo-code-new");
var promoObject = { action: "REMOVE", id: [Link],
code: [Link] };
[Link] =[Link](promoObject);
}
}
}
class UiConfigRenderer extends UiBaseRenderer {
legacyRenderConfigData(data) {
for (const prop in data) {
let element = [Link]('[data-prop="' + prop + '"]');
if(element) {
if([Link] == 'select-one' || [Link] == 'text' ||
[Link] == 'password' || [Link] == 'number' || [Link] == 'time') {
[Link] = data[prop];
[Link] = data[prop];
} else if ([Link] == 'checkbox') {
[Link] = (data[prop] ? "1" : "0");
[Link] = data[prop];
}
}
}

let elCfTryGetCodes = [Link]('[data-


prop="[Link]"]')
let elCredentialsAutologin = [Link]('[data-
prop="[Link]"]');
let elCredentialsMode = [Link]('[data-
prop="[Link]"]');
let elCredentialsEmail = [Link]('[data-
prop="[Link]"]');
let elCredentialsPassword = [Link]('[data-
prop="[Link]"]');
let elDevlogEnabled = [Link]('[data-
prop="[Link]"]');
let elDevlogMaxLines = [Link]('[data-
prop="[Link]"]');
let elJtfeyCredentialsMode = [Link]('[data-
prop="[Link]"]');
let elJtfeyCredentialsUsername = [Link]('[data-
prop="[Link]"]');
let elJtfeyCredentialsPassword = [Link]('[data-
prop="[Link]"]');
let elYCoinCredentialsMode = [Link]('[data-
prop="[Link]"]');
let elYCoinCredentialsUsername = [Link]('[data-
prop="[Link]"]');
let elYCoinCredentialsPassword = [Link]('[data-
prop="[Link]"]');

let elPostpone = [Link]('[data-


prop="[Link]"]');
let elPostponeMin = [Link]('[data-
prop="[Link]"]');
let elPostponeMax = [Link]('[data-
prop="[Link]"]');
[Link] = ([Link] > "0");
[Link] = ([Link] > "0");
if ([Link] && [Link]) {
[Link] = [Link];
[Link] = [Link];
}
[Link] = function (e) {
[Link]('[data-
prop="[Link]"]').disabled = [Link] > 0;
[Link]('[data-
prop="[Link]"]').disabled = [Link] > 0;
if ([Link] > 0) {
[Link]('[data-
prop="[Link]"]').value = [Link];
[Link]('[data-
prop="[Link]"]').value = [Link];
}
}

let elNextRun = [Link]('[data-


prop="[Link]"]');
let elNextRunMin = [Link]('[data-
prop="[Link]"]');
let elNextRunMax = [Link]('[data-
prop="[Link]"]');
let elNextRunUseCountdown = [Link]('[data-
prop="[Link]"]');
[Link] = ([Link] > "0");
[Link] = ([Link] > "0");
if ([Link] && [Link]) {
[Link] = [Link];
[Link] = [Link];
}
[Link] = function (e) {
[Link]('[data-
prop="[Link]"]').disabled = [Link] > 0;
[Link]('[data-
prop="[Link]"]').disabled = [Link] > 0;
if ([Link] > 0) {
[Link]('[data-
prop="[Link]"]').value = [Link];
[Link]('[data-
prop="[Link]"]').value = [Link];
}
}

let elSleepMode = [Link]('[data-


prop="[Link]"]');
let elSleepModeMin = [Link]('[data-
prop="[Link]"]');
let elSleepModeMax = [Link]('[data-
prop="[Link]"]');
[Link] = ![Link];
[Link] = ![Link];
[Link] = function (e) {
[Link]('[data-
prop="[Link]"]').disabled = ![Link];
[Link]('[data-
prop="[Link]"]').disabled = ![Link];
}

[Link] = ![Link];

[Link] = ( (![Link] ||
[Link] == "2") ? true : false);
[Link] = ( (![Link] ||
[Link] == "2") ? true : false);

[Link] = function (e) {


[Link]('[data-
prop="[Link]"]').disabled = ![Link];
if ([Link] == "2") {
[Link]('[data-
prop="[Link]"]').disabled = true;
[Link]('[data-
prop="[Link]"]').disabled = true;
} else {
[Link]('[data-
prop="[Link]"]').disabled = false;
[Link]('[data-
prop="[Link]"]').disabled = false;
}
}

[Link] = function (e) {


if ([Link] == "2") {
[Link]('[data-
prop="[Link]"]').disabled = true;
[Link]('[data-
prop="[Link]"]').disabled = true;
} else {
[Link]('[data-
prop="[Link]"]').disabled = false;
[Link]('[data-
prop="[Link]"]').disabled = false;
}
}

[Link] = ( ([Link]
== "2") ? true : false);
[Link] = ( ([Link]
== "2") ? true : false);
[Link] = function (e) {
if ([Link] == "2") {
[Link]('[data-
prop="[Link]"]').disabled = true;
[Link]('[data-
prop="[Link]"]').disabled = true;
} else {
[Link]('[data-
prop="[Link]"]').disabled = false;
[Link]('[data-
prop="[Link]"]').disabled = false;
}
}

[Link] = ( ([Link]
== "2") ? true : false);
[Link] = ( ([Link]
== "2") ? true : false);
[Link] = function (e) {
if ([Link] == "2") {
[Link]('[data-
prop="[Link]"]').disabled = true;
[Link]('[data-
prop="[Link]"]').disabled = true;
} else {
[Link]('[data-
prop="[Link]"]').disabled = false;
[Link]('[data-
prop="[Link]"]').disabled = false;
}
}

[Link] = ![Link];
[Link] = function (e) {
[Link]('[data-prop="[Link]"]').disabled
= ![Link];
}
}
}
class UiWalletRenderer extends UiBaseRenderer {
legacyRenderWalletTable(data) {
let tableBody = '';

for(let i=0, all = [Link]; i < all; i++) {


tableBody += '<tr class="align-middle" data-id="'+ data[i].id +
'">';
tableBody += '<td class="align-middle">' + data[i].name + '</td>';
tableBody += '<td class="align-middle em-input"><input type="text"
class="w-100" onfocus="[Link]();" data-field="address" data-original="' +
data[i].address + '" value="' + data[i].address + '"></td>';
tableBody += '</tr>';
}

[Link]('wallet-table-body').innerHTML = tableBody;
}
}
class UiSchedulesRenderer extends UiBaseRenderer {
appendEventListeners() {
[Link]('#schedules-toggler').addEventListener('change',
[Link](this));
}

onScheduleToggled(e) {
[Link]();
let actionElement = [Link] !== 'LABEL' ?
[Link]('label') : [Link];
let otherActiveLabels =
[...[Link]('[Link]')].filter(l =>
[Link] != [Link]);
if ([Link] > 0) {
[Link](l => [Link]('active'));
}
[Link]([Link]);
}

toggleSchedule(uuid) {

if (uuid) {
[Link] = uuid;
} else {
if (![Link]) {
[Link] = 'all';
}
}
[...[Link]('#schedule-table-body tr')].forEach((row)
=> {
if ([Link] == 'all') {
[Link]('d-none');
} else if ([Link]('data-schedule') ==
[Link]) {
[Link]('d-none');
} else {
[Link]('d-none');
}
});

if ([Link] == 'all') {
[...[Link]('#console-log tr')].forEach(x => {
[Link]('d-none');
})
} else {
[...[Link]('#console-log tr')].forEach(x => {
if ([Link]('data-schedule') == 'false' ||
[Link]('data-schedule') == [Link]) {
[Link]('d-none');
} else {
[Link]('d-none');
}
})
}
};

renderTBody() {
let rows = [];
[Link]().forEach(sch => {
[Link]([Link](sch));
});
return [Link]('');
}

renderRow(sch) {
let row =
`<tr data-uuid="${[Link]}"
data-order="${[Link]}"
data-added="${[Link] ? 'true' : 'false'}"
data-removed="false"
data-updated="false"
data-originals='${![Link] ? [Link](sch) : ""}'>
<td class="row-handle"><i class="fas fa-grip-vertical"></i></td>
<td><div class="input-group input-group-sm color-picker
colorpicker-element" style="max-width: 125px;">
<div class="input-group-prepend"><span class="input-group-
text"><i class="fas fa-square" style="color: #${[Link]}"></i></span></div>
<input type="text" name="uuid" class="form-control" data-
original-title="" value="${[Link]}">
</div></td>
<td><input type="text" name="name" class="form-control form-
control-sm" value="${[Link]}"></td>
<td>
<button type="button" title="Remove" class="btn btn-default
btn-sm action-schedule-remove"><i class="fa fa-trash"></i></button>
</td>
</tr>`;
return row;
}
}
class UiSiteParameterRenderer extends UiBaseRenderer {
static handlers = new Map();

static registerHandler(name, handler) {


[Link](name, handler);
}

static getHandler(name) {
const handlerClass = [Link](name);
return handlerClass || false;
}

appendEventListeners() {
[Link]('#modal-site-
parameters').addEventListener('click',
[Link](this));
}

onClickOnModalSiteParameter(e) {
const modal = [Link]('#modal-site-parameters');
let actionElement = [Link] === 'I' ? [Link] :
[Link];
if ([Link]('modal-save')) {
[Link]();
let form = [Link]('.form-container form');
if (![Link]()) {
[Link]();
return;
}
let data = [Link](form);
$(modal).modal('hide');
}
}

renderFields(values) {
let fieldsHtml = '';
[Link]( field => {
[Link] = [Link] || [Link](0).toUpperCase() +
[Link](1).toLowerCase().replaceAll('_', ' ');

switch ([Link]) {
case 'credentials_or_autofilled': // TODO: will need to
condition username/email/password!
break;
case 'email':
fieldsHtml += [Link](field);
break;
case 'password':
fieldsHtml += [Link](field);
break;
case 'checkbox':
[Link] = ([Link] === true || [Link] ===
'true' || [Link] === 1 || [Link] === "1") ? true : false;
fieldsHtml += [Link](field);
break;
case 'numberInput':
fieldsHtml += [Link](field);
break;
case 'textInput':
case 'username':
[Link] = 'true';
default:
fieldsHtml += [Link](field);
break;
}
});
const modalSiteParameters = [Link]('modal-site-
parameters');
[Link]('.form-container form').innerHTML =
fieldsHtml;
}

renderEditSiteParameters(args) { // { site_id: 'x' }


const site = [Link](args.site_id);

const siteParameters = [Link](); // async? for external


site parameters that need to be loaded from other stg...

if (!siteParameters) {
[Link](`Site ${[Link]} ${[Link]} does not require
parameters setup.`);
return;
}

if (![Link]) {
[Link](`Handler name is missing`);
return;
}

const handlerClass =
[Link]([Link]);
if (!handlerClass) {
[Link](`Invalid handler class name: $
{[Link]}`);
return;
}

const handler = new handlerClass([Link]);


[Link]();

let fields = [
{ name: 'AUTO_UPDATE_PROMO_CODES', type: 'checkbox', value: 'false'
},
{ name: 'MAX_ROLLS_PER_VISIT', type: 'numberInput', value: 1, min:
0 },
{ name: 'AUTO_LOGIN', type: 'checkbox', value: 'true' },
{ name: 'EMAIL', type: 'email', value: '' },
{ name: 'PASSWORD', type: 'password', value: '' }
];

[Link]( (f, idx) => {


if ([Link] == null || [Link] == undefined) {
[Link] = idx;
}
});
let values = [Link](`site_parameters_${args.site_id}`, true)
|| [];
for(const field of fields) {
let vIdx = [Link](v => [Link] == [Link]);
if (vIdx > -1) {
[Link] = values[vIdx].value;
}
}
values = fields;

[Link](values);

[Link]();
return;
}

class UiRenderer {
constructor () {
[Link] = new UiSitesRenderer(this);
[Link] = new UiSiteParameterRenderer(this);
[Link] = new UiPromosRenderer(this);
[Link] = new UiConfigRenderer(this);
[Link] = new UiWalletRenderer(this);
[Link] = new UiSchedulesRenderer(this);
[Link] = null;
}

initialize() {
[Link]();
}

toast(msg, msgType = "info") {


toastr[msgType](msg);
}

openModal(id, values = null) {


const dlg = [Link]('#modal-dlg');
[Link](".modal-content").forEach(x => [Link]('d-
none'));
switch (id) {
case 'modal-backup':
[Link]('TODO: GM_listValues => loop keys => save json as
blob');
break;

case 'modal-ereport':
case 'modal-config':
case 'modal-site':
[Link]("target-spinner").innerHTML =
[Link]({id: id, siteId: values});
[Link]("modal-spinner").[Link]("d-
none");
[Link]('div').[Link]('modal-lg');
break;
case 'modal-add-site':
[Link]();
[Link](id).[Link]("d-none");
[Link]('div').[Link]('modal-lg');
break;
case 'modal-slAlert':
[Link](id);
[Link]('div').[Link]('modal-lg');
break;
case 'modal-schedules':
[Link](id).querySelector('table
tbody').innerHTML = [Link]();
[Link]('.color-picker');
[Link]('div').[Link]('modal-lg');
[Link](id).[Link]("d-none");
break;
case 'modal-assign-schedule':
[Link](values);
[Link](id).[Link]("d-none");
[Link]('div').[Link]('modal-lg');
break;
case 'modal-site-parameters':
[Link](values);
[Link](id).[Link]("d-none");
[Link]('div').[Link]('modal-lg');
break;
default:
[Link]('div').[Link]('modal-lg');
[Link](id).[Link]("d-none");
break;
}

$(dlg).modal('show');
}

appendEventListeners() {
for (const renderer in this) {
if (this[renderer] && typeof this[renderer].appendEventListeners
=== 'function') {
this[renderer].appendEventListeners();
}
}
$('[data-toggle="tooltip"]').tooltip({
trigger: 'hover'
});
}

appendCSS() {
let css = [Link]('style');
[Link] = `
[Link]-input {
padding-top: 0;
padding-bottom: 0;
}
pre {
height: 145px;
width:100%;
white-space: pre-wrap;
padding-left: 1em;
}
pre span {
display: block;
}
.row-schedule-handle {

}
.grabbable:not(.d-none):not(.in-use) {
cursor: move;
cursor: grab;
cursor: -moz-grab;
cursor: -webkit-grab;
}

.grabbable:not(.d-none):not(.in-use):active {
cursor: grabbing;
cursor: -moz-grabbing;
cursor: -webkit-grabbing;
}

.row-handle {
cursor: grab;
}

.dropdown-item {
cursor: pointer;
}

#schedule-table th,td {
vertical-align: middle;
padding-top: .25rem!important;
padding-bottom: .25rem!important;
}

#schedule-table-body [Link]-input input[readonly] {


background-color:transparent;
border: 0;
font-size: 1em;
}

td[data-field="displayName"] .input-group-prepend .input-group-text


{
background-color: transparent;
border-color: transparent;
font-size: 1em;
}

.custom-switch input,label {
cursor: pointer;
}
`;
[Link](css);
}

addLegacySliderHtml(propName, propValue, text) {


return `<label class="switch"><input type="checkbox" ${propName}="$
{propValue}" data-original="1"><span class="slider round"></span></label> ${text}`;
}

addSliderHtml(field) {
const rndStr = [Link](8);
return `<div class="form-group"><div class="custom-control custom-
switch custom-switch-off-danger custom-switch-on-success">
<input type="checkbox" class="custom-control-input" name="$
{[Link]}" id="${rndStr}" ${[Link] ? 'checked' : ''}>
<label class="custom-control-label" for="${rndStr}">$
{[Link]}</label>
</div></div>`;
}

addInputEmailHtml(field) {
const rndStr = [Link](8);
const pattern = "[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$";
return `<div class="form-group row"><label for="${rndStr}" class="col-
sm-4 col-form-label">${[Link]}</label>
<div class="col-sm-8">
<input type="email" class="form-control" required id="${rndStr}"
placeholder="${[Link] || ' '}" name="${[Link]}" pattern="${pattern}"
value="${[Link] || ''}">
</div></div>`;

addInputPasswordHtml(field) {
const rndStr = [Link](8);
return `<div class="form-group row"><label for="${rndStr}" class="col-
sm-4 col-form-label">${[Link]}</label>
<div class="col-sm-8">
<input type="password" min="${[Link] !== undefined ? [Link] :
''}" min="${[Link] !== undefined ? [Link] : ''}" class="form-control"
required id="${rndStr}" placeholder="${[Link] || ' '}" name="$
{[Link]}" value="${[Link] || ''}">
</div></div>`;
}

addInputTextHtml(field) {
const rndStr = [Link](8);
return `<div class="form-group row"><label for="${rndStr}" class="col-
sm-4 col-form-label">${[Link]}</label>
<div class="col-sm-8">
<input type="text" class="form-control" required="${[Link] ||
'false'}" id="${rndStr}" placeholder="${[Link] || ' '}" name="$
{[Link]}" value="${[Link] || ''}">
</div></div>`;
}

addInputNumberHtml(field) {
const rndStr = [Link](8);
return `<div class="form-group row"><label for="${rndStr}" class="col-
sm-4 col-form-label">${[Link]}</label>
<div class="col-sm-8">
<input type="number" step="${[Link] || 1}" class="form-control"
required id="${rndStr}" placeholder="${[Link] || ' '}" name="$
{[Link]}" value="${[Link] || ''}">
</div></div>`;
}

parseContainer(container) {
let obj = {};
[Link](obj, [Link]);
let inputs = [Link]('input, select');
[Link](function (input) {
if ([Link] == 'checkbox') {
obj[[Link]] = [Link] ? 'true' : 'false';
} else if ([Link] == 'number') {
obj[[Link]] = +[Link];
} else {
obj[[Link]] = [Link];
}
});

for (const p in obj) { // type converter. TODO: add int, float, etc.
if (obj[p] === 'true') { obj[p] = true }
if (obj[p] === 'false') { obj[p] = false }

if (p == 'uuid') {
obj[p] = obj[p].toLowerCase().replace('#', '');
}
if (p == 'originals') {
try {
obj[p] = [Link](obj[p]);
} catch (err) { delete obj[p]; }
}
}
return obj;
}

parseTable(table) {
let rows = [Link]('tbody tr');
let data = [];
[Link]( (r, idx) => {
let obj = [Link](r);
[Link] = '' + idx; // fix order
if (!([Link] && [Link])) { // skip if it was just added and
removed
[Link](obj);
}
});

return data;
}

appendColorPickers(selector) {
$(selector).each(function () {
$(this).colorpicker();
$(this).on('colorpickerChange', function(event) {
$([Link]('.fa-square')).css('color',
[Link]());
});
});
}
}

class EventEmitter {
constructor() {
[Link] = {};
}

on(eventName, callback) {
if (![Link][eventName]) {
[Link][eventName] = [];
}
[Link][eventName].push(callback);
}

emit(eventName, data) {
const eventCallbacks = [Link][eventName];
if (eventCallbacks) {
[Link](callback => {
callback(data);
});
}
}
}

class Timeout {
constructor() {
[Link];
[Link];
[Link] = (() => { [Link]([Link], '') });
let paramTimeout = [Link]('timeout');
if (paramTimeout) {
[Link] = paramTimeout * 60;
} else {
[Link] = [Link]()['[Link]'] * 60
}
[Link] += 30; // add a threshold
[Link]();
}

get elapsed() {
return [Link]() - [Link];
}

restart(addSeconds = false) {
if([Link]) {
clearTimeout([Link]);
}
[Link] = [Link]();
if(addSeconds) {
[Link] = [Link] + addSeconds;
}
[Link] = setTimeout( () => { [Link]() }, [Link] * 1000);
}
}

class Timer {
constructor(params) {
[Link](this, params);
if(!useTimer || ([Link] && !
[Link]().includes([Link]))) {
return;
}
[Link] = [Link] * 1000;

static webTypes() {
return [[Link], [Link],
[Link], [Link], [Link]] // , [Link]]
};

startCheck(webType) {
[Link] = webType;
if(!useTimer || ([Link](webType) && !
[Link]().includes(webType))) {
return;
}
[Link]([Link] + '_lastAccess', [Link]());
[Link] = setInterval(() => {
[Link]();
}, [Link]);
}

stopCheck() {
if(!useTimer) {
return;
}
clearInterval([Link]);
}

tick() {
if(!useTimer) {
return;
}
[Link]([Link] + '_lastAccess', [Link]());
}

isAlive() {
return;
}
}

const wait = ms => new Promise(resolve => setTimeout(resolve, ms || 3000));

class CrawlerWidget {
constructor(params) {
if (!params || (![Link] && ![Link])) {
throw new Error('CrawlerWidget requires a selector or a function
selector parameter');
}
[Link] = [Link] || document;
[Link](this, params);
}

get isUserFriendly() {
if ([Link]) {
[Link] = [Link]([Link]);
return [Link];
} else {
[Link] = [Link]();
return [Link];
}
}
}

class ReadableWidget extends CrawlerWidget {


constructor(params) {
if (params && ![Link]) {
[Link] = [Link]; //default parser
}
super(params);
}

get value() {
if ([Link]) {
return [Link]([Link], [Link]);
} else {
return '';
}
}
}

class TextboxWidget extends CrawlerWidget {


get value() {
if (![Link]) {
return '';
}
return [Link];
}

set value(newValue) {
if (![Link]) {
return '';
}
[Link] = newValue;
return '';
}
}

class ButtonWidget extends CrawlerWidget {

click() {
if ([Link]) {
[Link]();
return [Link](true);
} else {
}
}
}

class SubmitWidget extends CrawlerWidget {


click() {
if ([Link]) {
let frm = [Link];
while([Link] != 'FORM' && [Link] != null) {
frm = [Link];
}
if ([Link] == 'FORM') {
[Link]();
} else {
return;
}
return [Link](true);
} else {
}
}
}

class CountdownWidget extends CrawlerWidget {


constructor(params) {
if (params && ![Link]) {
[Link] = [Link]; //default parser
}
super(params);
}

get timeLeft() {
if ([Link]) {
return [Link]([Link], [Link]);
} else {
throw new Error(`CountdownWidget (selector: '${[Link]}')
cannot be read`);
}
}
}

class Parsers {
static innerText(elm) { // '0.12341234' => '0.12341234'
try {
return [Link];
} catch (err) { }
}
static trimNaNs(elm) { // 'You won 0.12341234 TRX' => '0.12341234'
try {
return [Link](/[^\d.-]/g, '');
} catch (err) { }
}
static splitAndIdxTrimNaNs(elm, options) { // '17.96 Coins (17.50 + 0.46)'
=> 17.96
try {
return [Link]([Link])
[[Link]].replace(/[^\d.-]/g, '');
} catch (err) { }
}
static innerTextIntToFloat(elm) { // 'You won 1234 satoshis' => 0.00001234
try {
let sats = [Link](/\D/g, '');
return sats / 100000000;
} catch (err) { }
}
static innerTextJoinedToInt(elm) { // '7|2|9|6' => 7296
try {
return parseInt([... elm].map( x => [Link]).join(''));
} catch (err) { }
}
static stormGainCountdown(elm) { // '3:01:01' => 120000
try {
let timeLeft = [Link](':');
if (timeLeft[0] == 'Synchronizing') {
}

if([Link] === 3) {
return parseInt(timeLeft[0]) * 60 + parseInt(timeLeft[1]);
}
} catch (err) {
return null;
}
}
static kingBizCountdown(elm) { // '4|2' => 42
try {
let itms = [Link]('.flip-clock-active .up');
if ([Link] > 1 && itms[0].isVisible() && itms[1].isVisible())
{
return parseInt([itms[0].innerText,
itms[1].innerText].join(''));
}
} catch (err) {
return null;
}
}
static freeGrcCountdown(elm) { // 'Wait for 53:31 before next roll' => 53
try {
let val = [Link](':')[0];
val = [Link](/[^\d.-]/g, '');
return parseInt(val);
} catch (err) {
return null;
}
}
static bestChangeCountdown(elm) { // '00:58:35' => 58
try {
if ([Link]) {
let timeLeft = [Link](':');
if ([Link] > 1) {
return parseInt(timeLeft[1]);
}
}
} catch (err) {
return null;
}
}
static freeEthereumIoClaimed(elm) { // 'You won 0.12341234 TRX and rolled
number 7623' => 0.12341234
try {
let line = [Link];
let idx = [Link](/0\./);
return parseFloat([Link](idx, idx + 10));
} catch (err) { }
}
static bfBoxClaimed(elm) {
try {
let currency = [Link]('.free-box__withdraw-
currency').innerText;
let val = [Link]('.free-box__need-
sum').[Link](/ /g,'').split('/')[1];

if (currency == 'Satoshi') {
val = val/100000000;
}
return val;
} catch (err) {
return null;
}
}
static g8ClaimsLeft(elm) {
try {
if ([Link]('\nYou have ')) { // 'Claim 183848
satoshi (0.00012 USD) every 20 Seconds\nYou have 70 claims left today.'
let val = [Link]('\nYou have ')[1].split(' ')[0];
return val;
} else {
return null;
}
} catch (err) {
return null;
}
}
static cbgClaimed(elm) {
try {
if ([Link]('was sent to')) { //?? was sent to you
on...
let val = [Link]().split(' ')[0];
if ([Link]('oshi') ||
[Link]('gwei')) {
val = val/100000000;
}
return val;
} else {
return null;
}
} catch (err) {
return null;
}
}
static dutchysClaimed(elm) { // 'You Won :101 DUTCHY + 20 XP' => 101
try {
let splitted = [Link]('DUTCHY');
return splitted[0].replace(/[^\d.-]/g, '');
} catch (err) { [Link](`@[Link], with element [$
{elm}] Error: ${err}`); }
}
static dutchysClaimedToFloat(elm) { // 'You Won :22437 ADA + 100 XP' =>
0.00022437
try {
let sats = [Link]('+');
sats = sats[0].replace(/\D/g, '');
return sats / 100000000;
} catch (err) { [Link](`@[Link], with
element [${elm}] Error: ${err}`); }
}
static splitAndIdxToInt(elm, options) { // options: { splitter: ':', idx:
1} // '26 Minutes 23' w/spliiter='Minutes' => 26
try {
return parseInt([Link]([Link])
[[Link]].trim());
} catch (err) { [Link](`Error @[Link]: $
{err}`); }
}
static fromTextTimer(elm) { // '0 hours 11 minutes 1 seconds' => 12 minutes
try {
let hours, minutes;
hours = +[Link](' hours')[0].trim();
minutes = +[Link]('hours ')[1].split('minutes')
[0].trim();
return hours * 60 + minutes + 1;
} catch (err) { [Link](`Error @[Link]: $
{err}`); }
}
}
class ImageProcessor {
constructor(img) {
this._img = img;
}

isImageComplete() {
return this._img && this._img.complete;
}

createDrawer(width, height) {
let canvas = [Link]('canvas');
[Link]('width', width);
[Link]('height', height);
let ctx = [Link]('2d');
return {
canvas: canvas,
ctx: ctx
};
}

getDrawer() {
return this._drawer;
}

toCanvas() {
this._drawer = [Link](this._img.width, this._img.height);
this._drawer.[Link](this._img, 0, 0);
}

foreach(filter) {
let imgData = this._drawer.[Link](0, 0,
this._drawer.[Link], this._drawer.[Link]);
for (var x = 0; x < [Link]; x++) {
for (var y = 0; y < [Link]; y++) {
var i = x * 4 + y * 4 * [Link];
var pixel = { r: [Link][i + 0], g: [Link][i + 1],
b: [Link][i + 2] };

pixel = filter(pixel);

[Link][i + 0] = pixel.r;
[Link][i + 1] = pixel.g;
[Link][i + 2] = pixel.b;
[Link][i + 3] = 255;
}
}
this._drawer.[Link](imgData, 0, 0);
}

binarize (threshold) {
var image = this._drawer.[Link]('2d').getImageData(0, 0,
this._drawer.[Link], this._drawer.[Link]);
for (var x = 0; x < [Link]; x++) {
for (var y = 0; y < [Link]; y++) {
var i = x * 4 + y * 4 * [Link];
var brightness = 0.34 * [Link][i] + 0.5 * [Link][i + 1]
+ 0.16 * [Link][i + 2];
[Link][i] = brightness >= threshold ? 255 : 0;
[Link][i + 1] = brightness >= threshold ? 255 : 0;
[Link][i + 2] = brightness >= threshold ? 255 : 0;
[Link][i + 3] = 255;
}
}
this._drawer.[Link]('2d').putImageData(image, 0, 0);
}

invert(filter) {
[Link](function (p) {
p.r = 255 - p.r;
p.g = 255 - p.g;
p.b = 255 - p.b;
return p;
});
}

imgDataToBool(imgData) {
let character = [];
const data = [Link];
for (let i = 0; i < [Link]; i += 4) {
let val = data[i] + data[i+1] + data[i+2];
[Link](val == 0 ? true : false);
}
return character;
}
}

class CaptchaWidget extends CrawlerWidget {


constructor(params) {
super(params);
}

solve() { return true; }

async isSolved() { return false; }


}

class RecaptchaWidget extends CaptchaWidget {


constructor(params) {
let defaultParams = {
selector: function() { return grecaptcha },
waitMs: [1000, 5000],
timeoutMs: 4 * 60 * 1000
};
for (let p in params) {
defaultParams[p] = params[p];
}
super(defaultParams);
}

get isUserFriendly() {
[Link] = grecaptcha;
return [Link];
}

async isSolved() {
return wait().then( () => {
try {
if ([Link] &&
[Link]('getPageId') && [Link]() &&
[Link]('getResponse') && (typeof([Link]) ==
'function')
&& [Link]().length > 0) {
return [Link](true);
}
} catch (err) {}
return [Link]();
});
}
}

class HCaptchaWidget extends CaptchaWidget {


constructor(params) {
let defaultParams = {
selector: '.h-captcha > iframe',
waitMs: [1000, 5000],
timeoutMs: 4 * 60 * 1000
};
for (let p in params) {
defaultParams[p] = params[p];
}
super(defaultParams);
}

async isSolved() {
return wait().then( () => {
if ([Link] && [Link]('data-
hcaptcha-response') && [Link]('data-hcaptcha-response').length >
0) {
return [Link](true);
}
return [Link]();
});
}
}

class BKCaptchaWidget extends CaptchaWidget {


constructor() {
let defaultParams = {
selector: 'img[src="[Link]"]',
waitMs: [1000, 5000],
timeoutMs: 4 * 60 * 1000
};
super(defaultParams);
this._imgProcessor;
this._characters = [];
}

charList() {
return [{"answer":"g","width":8,"height":9,"bools":
[false,true,true,true,true,true,false,true,true,true,false,false,false,true,true,tr
ue,true,true,false,false,false,true,true,false,true,true,false,false,false,true,tru
e,false,false,true,true,true,true,true,false,false,true,true,false,false,false,fals
e,false,false,false,true,true,true,true,true,true,false,true,true,false,false,false
,false,true,true,false,true,true,true,true,true,true,false]},
{"answer":"5","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,false,true,true,false,false,false,false,false,f
alse,true,true,false,false,false,false,false,false,true,true,false,true,true,true,f
alse,false,true,true,true,false,false,true,true,false,false,false,false,false,false
,false,true,true,false,false,false,false,false,false,true,true,true,true,false,fals
e,false,false,true,true,false,true,true,false,false,true,true,false,false,false,tru
e,true,true,true,false,false]},
{"answer":"W","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,false,true,true,false,true,true,true,true,false,true,true,fals
e,true,true,true,true,false,true,true,false,true,true,true,true,true,true,true,true
,true,true,true,true,true,false,false,true,true,true,true,true,false,false,false,fa
lse,true,true]},
{"answer":"O","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,false,false,false,false,true,true,true,true,false,false,false,
false,true,true,true,true,false,false,false,false,true,true,true,true,false,false,f
alse,false,true,true,false,true,true,false,false,true,true,false,false,false,true,t
rue,true,true,false,false]},
{"answer":"N","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,true,false,false,false,true,
true,true,true,true,true,false,false,true,true,true,true,true,true,false,false,true
,true,true,true,false,true,true,false,true,true,true,true,false,true,true,false,tru
e,true,true,true,false,false,true,true,true,true,true,true,false,false,false,true,t
rue,true,true,true,false,false,false,true,true,true,true,true,false,false,false,fal
se,true,true]},
{"answer":"T","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,true,false,false,false,true,true,false,false,fa
lse,false,false,false,true,true,false,false,false,false,false,false,true,true,false
,false,false,false,false,false,true,true,false,false,false,false,false,false,true,t
rue,false,false,false,false,false,false,true,true,false,false,false,false,false,fal
se,true,true,false,false,false,false,false,false,true,true,false,false,false,false,
false,false,true,true,false,false,false]},
{"answer":"q","width":8,"height":9,"bools":
[false,false,true,true,true,false,true,true,false,true,true,false,false,true,true,t
rue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,false,true,true,false,false,tr
ue,true,true,false,false,true,true,true,false,true,true,false,false,false,false,fal
se,false,true,true,false,false,false,false,false,false,true,true]},
{"answer":"l","width":4,"height":10,"bools":
[true,true,true,false,false,true,true,false,false,true,true,false,false,true,true,f
alse,false,true,true,false,false,true,true,false,false,true,true,false,false,true,t
rue,false,false,true,true,false,true,true,true,true]},
{"answer":"B","width":8,"height":10,"bools":
[true,true,true,true,true,true,false,false,true,true,false,false,false,true,true,fa
lse,true,true,false,false,false,false,true,true,true,true,false,false,false,true,tr
ue,false,true,true,true,true,true,true,false,false,true,true,false,false,false,true
,true,false,true,true,false,false,false,false,true,true,true,true,false,false,false
,false,true,true,true,true,false,false,false,true,true,false,true,true,true,true,tr
ue,true,false,false]},
{"answer":"3","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,true,true,false,false,false,true,true,
false,false,false,false,false,false,false,true,true,false,false,false,false,false,t
rue,true,false,false,false,false,true,true,true,false,false,false,false,false,false
,false,true,true,false,false,false,false,false,false,false,true,true,false,false,fa
lse,false,false,false,true,true,true,true,false,false,false,true,true,false,false,t
rue,true,true,true,true,false,false]},
{"answer":"s","width":8,"height":7,"bools":
[false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,t
rue,true,true,false,false,false,false,false,false,false,true,true,true,true,true,tr
ue,false,false,false,false,false,false,false,true,true,true,true,false,false,false,
false,true,true,false,true,true,true,true,true,true,false]},
{"answer":"p","width":8,"height":9,"bools":
[true,true,false,true,true,true,false,false,true,true,true,false,false,true,true,fa
lse,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,true,false,false,tru
e,true,false,true,true,false,true,true,true,false,false,true,true,false,false,false
,false,false,false,true,true,false,false,false,false,false,false]},
{"answer":"L","width":7,"height":10,"bools":
[true,true,false,false,false,false,false,true,true,false,false,false,false,false,tr
ue,true,false,false,false,false,false,true,true,false,false,false,false,false,true,
true,false,false,false,false,false,true,true,false,false,false,false,false,true,tru
e,false,false,false,false,false,true,true,false,false,false,false,false,true,true,f
alse,false,false,false,false,true,true,true,true,true,true,true]},
{"answer":"Z","width":7,"height":10,"bools":
[false,true,true,true,true,true,true,false,false,false,false,false,true,true,false,
false,false,false,false,true,true,false,false,false,false,true,true,false,false,fal
se,false,true,true,false,false,false,false,true,true,false,false,false,false,true,t
rue,false,false,false,false,true,true,false,false,false,false,false,true,true,false
,false,false,false,false,true,true,true,true,true,true,true]},
{"answer":"F","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,fa
lse,true,true,false,false,false,false,false,false,true,true,false,false,false,false
,false,false,true,true,true,true,true,true,false,false,true,true,false,false,false,
false,false,false,true,true,false,false,false,false,false,false,true,true,false,fal
se,false,false,false,false,true,true,false,false,false,false,false,false,true,true,
false,false,false,false,false,false]},
{"answer":"p","width":8,"height":9,"bools":
[true,true,false,true,true,true,false,false,true,true,true,false,false,true,true,fa
lse,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,true,false,false,tru
e,true,false,true,true,false,true,true,true,false,false,true,true,false,false,false
,false,false,false,true,true,false,false,false,false,false,false]},
{"answer":"T","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,true,false,false,false,true,true,false,false,fa
lse,false,false,false,true,true,false,false,false,false,false,false,true,true,false
,false,false,false,false,false,true,true,false,false,false,false,false,false,true,t
rue,false,false,false,false,false,false,true,true,false,false,false,false,false,fal
se,true,true,false,false,false,false,false,false,true,true,false,false,false,false,
false,false,true,true,false,false,false]},
{"answer":"8","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,false,true,true,false,false,true,
true,false,false,false,true,true,true,true,false,false,false,true,true,false,false,
true,true,false,true,true,false,false,false,false,true,true,true,true,false,false,f
alse,false,true,true,false,true,true,false,false,true,true,false,false,false,true,t
rue,true,true,false,false]},
{"answer":"P","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,false,true,true,false,false,false,false,true,tr
ue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,tr
ue,true,true,true,true,true,true,true,true,false,true,true,false,false,false,false,
false,false,true,true,false,false,false,false,false,false,true,true,false,false,fal
se,false,false,false,true,true,false,false,false,false,false,false,true,true,false,
false,false,false,false,false]},
{"answer":"J","width":6,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,false,true,true,false,false,fals
e,false,true,true,false,false,false,false,true,true,false,false,false,false,true,tr
ue,false,false,false,false,true,true,false,false,false,false,true,true,true,false,f
alse,false,true,true,true,true,false,true,true,false,false,true,true,true,false,fal
se]},
{"answer":"y","width":8,"height":9,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,false,false,false,false,true,true,false,true,true,false,false,
true,true,true,false,false,true,true,true,false,true,true,true,false,false,false,fa
lse,false,true,true,false,true,true,true,true,true,true,false]},
{"answer":"r","width":8,"height":7,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,true,true,true,true,tru
e,true,true,true,false,false,false,false,false,false,false,true,true,false,false,fa
lse,true,true,false,false,true,true,true,true,true,false]},
{"answer":"R","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,false,true,true,false,false,false,false,true,tr
ue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,tr
ue,true,true,true,true,true,true,true,true,false,true,true,true,true,true,false,fal
se,false,true,true,false,false,true,true,false,false,true,true,false,false,false,tr
ue,true,false,true,true,false,false,false,false,true,true,true,true,false,false,fal
se,false,true,true]},
{"answer":"M","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,true,false,false,true,true,t
rue,true,true,true,true,true,true,true,true,true,true,false,true,true,false,true,tr
ue,true,true,false,true,true,false,true,true,true,true,false,true,true,false,true,t
rue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,fa
lse,true,true]},
{"answer":"d","width":8,"height":10,"bools":
[false,false,false,false,false,false,true,true,false,false,false,false,false,false,
true,true,false,false,false,false,false,false,true,true,false,false,true,true,true,
false,true,true,false,true,true,false,false,true,true,true,true,true,false,false,fa
lse,false,true,true,true,true,false,false,false,false,true,true,true,true,false,fal
se,false,false,true,true,false,true,true,false,false,true,true,true,false,false,tru
e,true,true,false,true,true]},
{"answer":"E","width":7,"height":10,"bools":
[true,true,true,true,true,true,true,true,true,false,false,false,false,false,true,tr
ue,false,false,false,false,false,true,true,false,false,false,false,false,true,true,
true,true,true,true,false,true,true,false,false,false,false,false,true,true,false,f
alse,false,false,false,true,true,false,false,false,false,false,true,true,false,fals
e,false,false,false,true,true,true,true,true,true,true]},
{"answer":"7","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,t
rue,false,false,false,false,false,false,true,true,false,false,false,false,false,tru
e,true,false,false,false,false,false,true,true,false,false,false,false,false,true,t
rue,false,false,false,false,false,true,true,false,false,false,false,false,true,true
,false,false,false,false,false,true,true,false,false,false,false,false,false,true,t
rue,false,false,false,false,false,false]},
{"answer":"Z","width":7,"height":10,"bools":
[true,true,true,true,true,true,true,false,false,false,false,false,true,true,false,f
alse,false,false,false,true,true,false,false,false,false,true,true,false,false,fals
e,false,true,true,false,false,false,false,true,true,false,false,false,false,true,tr
ue,false,false,false,false,true,true,false,false,false,false,false,true,true,false,
false,false,false,false,true,true,true,true,true,true,true]},
{"answer":"l","width":4,"height":10,"bools":
[true,true,true,false,false,true,true,false,false,true,true,false,false,true,true,f
alse,false,true,true,false,false,true,true,false,false,true,true,false,false,true,t
rue,false,false,true,true,false,true,true,true,true]},
{"answer":"K","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,true,true,
false,true,true,false,false,true,true,false,false,true,true,false,true,true,false,f
alse,false,true,true,true,true,false,false,false,false,true,true,true,true,false,fa
lse,false,false,true,true,false,true,true,false,false,false,true,true,false,false,t
rue,true,false,false,true,true,false,false,false,true,true,false,true,true,false,fa
lse,false,false,true,true]},
{"answer":"6","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,false,true,true,false,false,false,fals
e,false,false,true,true,false,true,true,true,false,false,true,true,true,false,false
,true,true,false,true,true,false,false,false,false,true,true,true,true,false,false,
false,false,true,true,false,true,true,false,false,true,false,false,false,false,true
,true,true,true,false,false]},
{"answer":"H","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,fals
e,true,true,true,true,false,false,false,false,true,true,true,true,false,false,false
,false,true,true,true,true,false,false,false,false,true,true,true,true,false,false,
false,false,true,true]},
{"answer":"5","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,false,true,true,false,false,false,false,false,f
alse,true,true,false,false,false,false,false,false,true,true,false,true,true,true,f
alse,false,true,true,true,false,false,true,true,false,false,false,false,false,false
,false,true,true,false,false,false,false,false,false,true,true,true,true,false,fals
e,false,false,true,true,false,true,true,false,false,true,true,false,false,false,tru
e,true,true,true,false,false]},
{"answer":"Y","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,false,true,true,false,false,true,true,false,false,false,true,true,true,true,f
alse,false,false,false,false,true,true,false,false,false,false,false,false,true,tru
e,false,false,false,false,false,false,true,true,false,false,false,false,false,false
,true,true,false,false,false,false,false,false,true,true,false,false,false,false,fa
lse,false,true,true,false,false,false]},
{"answer":"d","width":8,"height":10,"bools":
[false,false,false,false,false,false,true,true,false,false,false,false,false,false,
true,true,false,false,false,false,false,false,true,true,false,false,true,true,true,
false,true,true,false,true,true,false,false,true,true,true,true,true,false,false,fa
lse,false,true,true,true,true,false,false,false,false,true,true,true,true,false,fal
se,false,false,true,true,false,true,true,false,false,true,true,true,false,false,tru
e,true,true,false,true,true]},
{"answer":"p","width":8,"height":9,"bools":
[true,true,false,true,true,true,false,false,true,true,true,false,false,true,true,fa
lse,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,true,false,false,tru
e,true,false,true,true,false,true,true,true,false,false,true,true,false,false,false
,false,false,false,true,true,false,false,false,false,false,false]},
{"answer":"z","width":6,"height":7,"bools":
[true,true,true,true,true,true,false,false,false,false,true,true,false,false,false,
true,true,false,false,false,true,true,false,false,false,true,true,false,false,false
,true,true,false,false,false,false,true,true,true,true,true,true]},
{"answer":"n","width":8,"height":7,"bools":
[true,true,false,true,true,true,false,false,true,true,true,false,false,true,true,fa
lse,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,fa
lse,true,true,true,true,false,false,false,false,true,true]},
{"answer":"a","width":8,"height":7,"bools":
[false,false,true,true,true,true,true,false,false,true,true,false,false,false,true,
true,false,false,false,false,false,false,true,true,false,true,true,true,true,true,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,tr
ue,true,true,false,true,true,true,true,false,true,true]},
{"answer":"8","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,false,true,true,false,false,true,
true,false,false,false,true,true,true,true,false,false,false,true,true,false,false,
true,true,false,true,true,false,false,false,false,true,true,true,true,false,false,f
alse,false,true,true,false,true,true,false,false,true,true,false,false,false,true,t
rue,true,true,false,false]},
{"answer":"t","width":8,"height":9,"bools":
[false,false,true,true,false,false,false,false,false,false,true,true,false,false,fa
lse,false,true,true,true,true,true,true,false,false,false,false,true,true,false,fal
se,false,false,false,false,true,true,false,false,false,false,false,false,true,true,
false,false,false,false,false,false,true,true,false,false,false,false,false,false,t
rue,true,false,false,true,true,false,false,false,true,true,true,true,false]},
{"answer":"q","width":8,"height":9,"bools":
[false,false,true,true,true,false,true,true,false,true,true,false,false,true,true,t
rue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,false,true,true,false,false,tr
ue,true,true,false,false,true,true,true,false,true,true,false,false,false,false,fal
se,false,true,true,false,false,false,false,false,false,true,true]},
{"answer":"a","width":8,"height":7,"bools":
[false,false,true,true,true,true,true,false,false,true,true,false,false,false,true,
true,false,false,false,false,false,false,true,true,false,true,true,true,true,true,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,tr
ue,true,true,false,true,true,true,true,false,true,true]},
{"answer":"Z","width":7,"height":10,"bools":
[true,true,true,true,true,true,true,false,false,false,false,false,true,true,false,f
alse,false,false,false,true,true,false,false,false,false,true,true,false,false,fals
e,false,true,true,false,false,false,false,true,true,false,false,false,false,true,tr
ue,false,false,false,false,true,true,false,false,false,false,false,true,true,false,
false,false,false,false,false,true,true,true,true,true,true]},
{"answer":"1","width":6,"height":10,"bools":
[false,false,true,true,false,false,false,true,true,true,false,false,true,true,true,
true,false,false,false,false,true,true,false,false,false,false,true,true,false,fals
e,false,false,true,true,false,false,false,false,true,true,false,false,false,false,t
rue,true,false,false,false,false,true,true,false,false,true,true,true,true,true,tru
e]},
{"answer":"m","width":8,"height":7,"bools":
[true,false,true,true,false,true,true,false,true,true,false,true,true,false,true,tr
ue,true,true,false,true,true,false,true,true,true,true,false,true,true,false,true,t
rue,true,true,false,true,true,false,true,true,true,true,false,true,true,false,true,
true,true,true,false,true,true,false,true,true]},
{"answer":"l","width":4,"height":10,"bools":
[true,true,true,false,false,true,true,false,false,true,true,false,false,true,true,f
alse,false,true,true,false,false,true,true,false,false,true,true,false,false,true,t
rue,false,false,true,true,false,true,true,true,true]},
{"answer":"q","width":8,"height":9,"bools":
[false,false,true,true,true,false,true,true,false,true,true,false,false,true,true,t
rue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,false,true,true,false,false,tr
ue,true,true,false,false,true,true,true,false,true,true,false,false,false,false,fal
se,false,true,true,false,false,false,false,false,false,true,true]},
{"answer":"C","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,false,true
,true,true,true,false,false,false,false,false,true,true,true,false,false,false,fals
e,false,false,true,true,false,false,false,false,false,false,true,true,false,false,f
alse,false,false,false,true,true,false,false,false,false,false,false,true,true,fals
e,false,false,false,false,true,false,true,true,false,false,false,true,true,false,fa
lse,true,true,true,true,true,false]},
{"answer":"a","width":8,"height":7,"bools":
[false,false,true,true,true,true,true,false,false,true,true,false,false,false,true,
true,false,false,false,false,false,false,true,true,false,true,true,true,true,true,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,tr
ue,true,true,false,true,true,true,true,false,true,true]},
{"answer":"2","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,false,false,false,false,false,fal
se,true,true,false,false,false,false,false,true,true,false,false,false,false,false,
true,true,false,false,false,false,false,true,true,false,false,false,false,false,tru
e,true,false,false,false,false,false,true,true,false,false,false,false,false,true,t
rue,true,true,true,true,true,true]},
{"answer":"h","width":8,"height":10,"bools":
[true,true,false,false,false,false,false,false,true,true,false,false,false,false,fa
lse,false,true,true,false,false,false,false,false,false,true,true,false,true,true,t
rue,false,false,true,true,true,false,false,true,true,false,true,true,false,false,fa
lse,false,true,true,true,true,false,false,false,false,true,true,true,true,false,fal
se,false,false,true,true,true,true,false,false,false,false,true,true,true,true,fals
e,false,false,false,true,true]},
{"answer":"F","width":7,"height":10,"bools":
[true,true,true,true,true,true,true,true,true,false,false,false,false,false,true,tr
ue,false,false,false,false,false,true,true,false,false,false,false,false,true,true,
true,true,true,true,false,true,true,false,false,false,false,false,true,true,false,f
alse,false,false,false,true,true,false,false,false,false,false,true,true,false,fals
e,false,false,false,true,true,false,false,false,false,false]},
{"answer":"c","width":8,"height":7,"bools":
[false,false,true,true,true,true,true,false,false,true,true,false,false,false,true,
true,true,true,false,false,false,false,false,false,true,true,false,false,false,fals
e,false,false,true,true,false,false,false,false,false,false,false,true,true,false,f
alse,false,true,true,false,false,true,true,true,true,true,false]},
{"answer":"P","width":8,"height":10,"bools":
[true,true,true,true,true,true,true,false,true,true,false,false,false,false,true,tr
ue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,tr
ue,true,true,true,true,true,true,true,true,false,true,true,false,false,false,false,
false,false,true,true,false,false,false,false,false,false,true,true,false,false,fal
se,false,false,false,true,true,false,false,false,false,false,false,true,false,false
,false,false,false,false,false]},
{"answer":"r","width":8,"height":7,"bools":
[true,true,false,true,true,true,false,false,false,true,true,true,false,false,true,t
rue,false,true,true,false,false,false,false,false,false,true,true,false,false,false
,false,false,false,true,true,false,false,false,false,false,false,true,true,false,fa
lse,false,false,false,false,true,true,false,false,false,false,false]},
{"answer":"Y","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,false,true,true,false,false,true,true,false,false,false,true,true,true,true,f
alse,false,false,false,false,true,true,false,false,false,false,false,false,true,tru
e,false,false,false,false,false,false,true,true,false,false,false,false,false,false
,true,true,false,false,false,false,false,false,true,true,false,false,false,false,fa
lse,false,true,true,false,false,false]},
{"answer":"S","width":8,"height":10,"bools":
[false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,t
rue,true,true,false,false,false,false,false,false,true,true,false,false,false,false
,false,false,false,true,true,true,true,true,true,false,false,false,false,false,fals
e,false,true,true,false,false,false,false,false,false,true,true,false,false,false,f
alse,false,false,true,true,true,true,false,false,false,false,true,true,false,true,t
rue,true,true,true,true,false]},
{"answer":"u","width":8,"height":7,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,false,false,false,false,true,true,false,true,true,false,false,
true,true,true,false,false,true,true,true,false,true,true]},
{"answer":"M","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,true,false,false,true,true,t
rue,true,true,true,true,true,true,true,true,true,true,false,true,true,false,true,tr
ue,true,true,false,true,true,false,true,true,true,true,false,true,true,false,true,t
rue,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,fa
lse,true,true]},
{"answer":"S","width":8,"height":10,"bools":
[false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,t
rue,true,true,false,false,false,false,false,false,true,true,false,false,false,false
,false,false,false,true,true,true,true,true,true,false,false,false,false,false,fals
e,false,true,true,false,false,false,false,false,false,true,true,false,false,false,f
alse,false,false,true,true,true,true,false,false,false,false,true,true,false,true,t
rue,true,true,true,true,false]},
{"answer":"g","width":8,"height":9,"bools":
[false,true,true,true,true,true,false,true,true,true,false,false,false,true,true,tr
ue,true,true,false,false,false,true,true,false,true,true,false,false,false,true,tru
e,false,false,true,true,true,true,true,false,false,true,true,false,false,false,fals
e,false,false,false,true,true,true,true,true,true,false,true,true,false,false,false
,false,true,true,false,true,true,true,true,true,true,false]},
{"answer":"U","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,fals
e,true,true,true,false,false,false,false,true,true,true,true,false,false,false,fals
e,true,true,true,true,false,false,false,false,true,true,true,true,false,false,false
,false,true,true,true,true,false,false,false,false,true,true,true,true,false,false,
false,false,true,true,false,true,true,false,false,true,true,false,false,false,true,
true,true,true,false,false]},
{"answer":"k","width":7,"height":10,"bools":
[true,true,false,false,false,false,false,true,true,false,false,false,false,false,tr
ue,true,false,false,false,false,false,true,true,false,false,true,true,false,true,tr
ue,false,true,true,false,false,true,true,true,true,false,false,false,true,true,true
,true,false,false,false,true,true,false,true,true,false,false,true,true,false,false
,true,true,false,true,true,false,false,false,true,true]},
{"answer":"4","width":8,"height":10,"bools":
[false,false,false,false,false,true,true,false,false,false,false,false,true,true,tr
ue,false,false,false,false,true,true,true,true,false,false,false,true,true,false,tr
ue,true,false,false,true,true,false,false,true,true,false,true,true,false,false,fal
se,true,true,false,true,true,true,true,true,true,true,true,false,false,false,false,
false,true,true,false,false,false,false,false,false,true,true,false,false,false,fal
se,false,false,true,true,false]},
{"answer":"A","width":8,"height":10,"bools":
[false,false,false,true,true,false,false,false,false,false,true,true,true,true,fals
e,false,false,true,true,false,false,true,true,false,true,true,false,false,false,fal
se,true,true,true,true,false,false,false,false,true,true,true,true,false,false,fals
e,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false,fal
se,false,true,true,true,true,false,false,false,false,true,true,true,true,false,fals
e,false,false,true,true]},
{"answer":"b","width":8,"height":10,"bools":
[true,true,false,false,false,false,false,false,true,true,false,false,false,false,fa
lse,false,true,true,false,false,false,false,false,false,true,true,false,true,true,t
rue,false,false,true,true,true,false,false,true,true,false,true,true,false,false,fa
lse,false,true,true,true,true,false,false,false,false,true,true,true,true,false,fal
se,false,false,true,true,true,true,true,false,false,true,true,false,true,true,false
,true,true,true,false,false]},
{"answer":"I","width":6,"height":10,"bools":
[true,true,true,true,true,true,false,false,true,true,false,false,false,false,true,t
rue,false,false,false,false,true,true,false,false,false,false,true,true,false,false
,false,false,true,true,false,false,false,false,true,true,false,false,false,false,tr
ue,true,false,false,false,false,true,true,false,false,true,true,true,true,true,true
]},
{"answer":"o","width":8,"height":7,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,false,false,false,false,true,true,false,true,true,false,false,
true,true,false,false,false,true,true,true,true,false,false]},
{"answer":"i","width":6,"height":10,"bools":
[false,false,true,true,false,false,false,false,true,true,false,false,false,false,fa
lse,false,false,false,false,true,true,true,false,false,false,false,true,true,false,
false,false,false,true,true,false,false,false,false,true,true,false,false,false,fal
se,true,true,false,false,false,false,true,true,false,false,true,true,true,true,true
,true]},
{"answer":"C","width":8,"height":10,"bools":
[false,false,true,true,true,true,true,false,false,true,true,false,false,false,true,
true,true,true,false,false,false,false,false,true,true,true,false,false,false,false
,false,false,true,true,false,false,false,false,false,false,true,true,false,false,fa
lse,false,false,false,true,true,false,false,false,false,false,false,true,true,false
,false,false,false,false,true,false,true,true,false,false,false,true,true,false,fal
se,true,true,true,true,true,false]},
{"answer":"e","width":8,"height":7,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,true,true,true,true,tru
e,true,true,true,false,false,false,false,false,false,false,true,true,false,false,fa
lse,true,true,false,false,true,true,true,true,true,false]},
{"answer":"w","width":8,"height":7,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,true,true,false,true,true,false,true,true,true,true,false,true,true,false,tru
e,true,true,true,false,true,true,false,true,true,true,true,true,true,true,true,true
,true,false,true,true,false,false,true,true,false]},
{"answer":"f","width":8,"height":10,"bools":
[false,false,false,true,true,true,true,false,false,false,true,true,false,false,true
,true,false,false,true,true,false,false,true,true,false,false,true,true,false,false
,false,false,false,false,true,true,false,false,false,false,true,true,true,true,true
,true,false,false,false,false,true,true,false,false,false,false,false,false,true,tr
ue,false,false,false,false,false,false,true,true,false,false,false,false,false,fals
e,true,true,false,false,false,false]},
{"answer":"j","width":7,"height":12,"bools":
[false,false,false,false,false,true,true,false,false,false,false,false,true,true,fa
lse,false,false,false,false,false,false,false,false,false,false,true,true,true,fals
e,false,false,false,false,true,true,false,false,false,false,false,true,true,false,f
alse,false,false,false,true,true,false,false,false,false,false,true,true,false,fals
e,false,false,false,true,true,true,true,false,false,false,true,true,true,true,false
,false,false,true,true,false,true,true,true,true,true,false]},
{"answer":"F","width":6,"height":10,"bools":
[true,true,true,true,true,true,true,true,false,false,false,false,true,true,false,fa
lse,false,false,true,true,false,false,false,false,true,true,true,true,true,true,tru
e,true,false,false,false,false,true,true,false,false,false,false,true,true,false,fa
lse,false,false,true,true,false,false,false,false,true,true,false,false,false,false
]},
{"answer":"x","width":8,"height":7,"bools":
[true,true,false,false,false,false,true,true,false,true,true,false,false,true,true,
false,false,false,true,true,true,true,false,false,false,false,false,true,true,false
,false,false,false,false,true,true,true,true,false,false,false,true,true,false,fals
e,true,true,false,true,true,false,false,false,false,true,true]},
{"answer":"e","width":8,"height":7,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,true,true,true,true,tru
e,true,true,true,false,false,false,false,false,false,false,true,true,false,false,fa
lse,true,true,false,false,true,true,true,true,true,false]},
{"answer":"G","width":8,"height":10,"bools":
[false,false,true,true,true,true,true,false,false,true,true,false,false,false,true,
true,true,true,false,false,false,false,false,false,true,true,false,false,false,fals
e,false,false,true,true,false,false,false,false,false,false,true,true,false,false,f
alse,true,true,true,true,true,false,false,false,false,true,true,true,true,false,fal
se,false,false,true,true,false,true,true,false,false,false,true,true,false,false,tr
ue,true,true,true,true,false]},
{"answer":"0","width":8,"height":10,"bools":
[false,false,false,true,true,false,false,false,false,false,true,true,true,true,fals
e,false,false,true,true,false,false,true,true,false,true,true,false,false,false,fal
se,true,true,true,true,false,false,false,false,true,true,true,true,false,false,fals
e,false,true,true,true,true,false,false,false,false,true,true,false,true,true,false
,false,true,true,false,false,false,true,true,true,true,false,false,false,false,fals
e,true,true,false,false,false]},
{"answer":"0","width":8,"height":10,"bools":
[false,false,false,true,true,false,false,false,false,false,true,true,true,true,fals
e,false,false,true,true,false,false,true,true,false,true,true,false,false,false,fal
se,true,true,true,true,false,false,false,false,true,true,true,true,false,false,fals
e,false,true,true,true,true,false,false,false,false,true,true,false,true,true,false
,false,true,true,false,false,false,true,true,true,true,false,false,false,false,fals
e,true,true,false,false,false]},
{"answer":"D","width":8,"height":10,"bools":
[true,true,true,true,true,true,false,false,true,true,false,false,false,true,true,fa
lse,true,true,false,false,false,false,true,true,true,true,false,false,false,false,t
rue,true,true,true,false,false,false,false,true,true,true,true,false,false,false,fa
lse,true,true,true,true,false,false,false,false,true,true,true,true,false,false,fal
se,false,true,true,true,true,false,false,false,true,true,false,true,true,true,true,
true,true,false,false]},
{"answer":"e","width":8,"height":7,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,true,true,true,true,tru
e,true,false,true,false,false,false,false,false,false,false,true,true,false,false,f
alse,true,true,false,false,true,true,true,true,true,false]},
{"answer":"X","width":8,"height":10,"bools":
[true,true,false,false,false,false,true,true,true,true,false,false,false,false,true
,true,false,true,true,false,false,true,true,false,false,false,true,true,true,true,f
alse,false,false,false,false,true,true,false,false,false,false,false,false,true,tru
e,false,false,false,false,false,true,true,true,true,false,false,false,true,true,fal
se,false,true,true,false,true,true,false,false,false,false,true,true,true,true,fals
e,false,false,false,true,true]},
{"answer":"Q","width":8,"height":10,"bools":
[false,false,true,true,true,true,false,false,false,true,true,false,false,true,true,
false,true,true,false,false,false,false,true,true,true,true,false,false,false,false
,true,true,true,true,false,false,false,false,true,true,true,true,false,false,false,
false,true,true,true,true,false,true,true,false,true,true,true,true,false,false,tru
e,true,true,true,false,true,true,false,false,true,true,false,false,false,true,true,
true,true,false,true]}];
}

async isReady() {
return wait().then( () => {
let img = [Link]([Link]);
if(img && [Link]) {
this._imgProcessor = new ImageProcessor(img);
return [Link](true);
}
return [Link]();
});
}

async isSolved() {
return [Link]()
.then( () => [Link]())
.then( (solution) => {
[Link]('input[name="kodecaptcha"]').value =
solution;
return [Link](true);
})
.catch(err => {
return [Link](`Error ${err}`);
});
}

preProcessImage() {
this._imgProcessor.toCanvas();
this._imgProcessor.binarize(200);
this._imgProcessor.invert();
}

cropCharacter(startFrom = 0) {
let imgData =
this._imgProcessor.getDrawer().[Link](startFrom, 0,
this._imgProcessor.getDrawer().[Link] - startFrom,
this._imgProcessor.getDrawer().[Link]);
let newBounds = { left: null, right:null, top: null, bottom: null };
let readingCharacter = false;
let endOfCharacter = null;

for (var x = 0; x < [Link]; x++) {


if (endOfCharacter) {
[Link] = endOfCharacter;
break;
}

let isColumnEmpty = true;


for (var y = 0; y < [Link]; y++) {
var i = x * 4 + y * 4 * [Link];
var pixel = { r: [Link][i + 0], g: [Link][i + 1],
b: [Link][i + 2] };

if (pixel.r + pixel.g + pixel.b == 0) {


if ([Link] == null || [Link] > x) {
[Link] = x;
}
if ([Link] == null || [Link] < x) {
[Link] = x;
}

if ([Link] == null || [Link] > y) {


[Link] = y;
}

if ([Link] == null || [Link] < y) {


[Link] = y;
}
readingCharacter = true;
isColumnEmpty = false;
}
}

if (isColumnEmpty && readingCharacter) {


endOfCharacter = x - 1;
break;
}
}

return {
x: startFrom + [Link],
y: [Link],
width: [Link] - [Link] + 1,
height: [Link] - [Link] + 1,
nextBegins: startFrom + [Link] + 1
};
}

splitInCharacters() {
let chars = [];
let i =0;
do {
[Link]([Link]( i== 0 ? 0 : chars[i-
1].nextBegins ) );
let copy = [Link]('canvas').getContext('2d');
[Link] = chars[i].width;
[Link] = chars[i].height;

let trimmedData =
this._imgProcessor.getDrawer().[Link](chars[i].x, chars[i].y,
chars[i].width, chars[i].height);
[Link](trimmedData, 0, 0);

chars[i].bools = this._imgProcessor.imgDataToBool(trimmedData);
chars[i].dataUrl = [Link]("image/png");

i++;
} while(i < 5);

this._characters = chars;
}

guess(charElm) {
let bestGuess = {
answer: '',
blacksMatched: 0,
blacksMissed: 0,
percentageBlacks: 0,
exactMatch: false
};

let totalPixels = [Link] * [Link];


let totalBlacks = [Link](x => x === true).length;
[Link]().filter(x => [Link] != '').forEach( function (elm) {
if ([Link]) {
return;
}
if ([Link] == [Link] && [Link] == [Link]) {
if ([Link](',') == [Link](',')) {
bestGuess = {
answer: [Link],
percentageBlacks: 100,
exactMatch: true
};
return;
}

let blacksMatched = 0;
let blacksMissed = 0;
let percentageBlacks = 0;
for (let p = 0; p < totalPixels; p++) {
if ([Link][p] === true || [Link][p] === true) {
if ([Link][p] == [Link][p]) {
blacksMatched++;
} else {
blacksMissed++;
}
}
}

if (blacksMatched != 0 || blacksMissed != 0) {
percentageBlacks = blacksMatched/(blacksMatched +
blacksMissed);
}

if (percentageBlacks > [Link]) {


bestGuess = {
answer: [Link],
blacksMatched: blacksMatched,
blacksMissed: blacksMissed,
percentageBlacks: percentageBlacks
};
}
}
});
return bestGuess;
}

async solve() {
let solution = '';
if(this._imgProcessor.isImageComplete()) {
[Link]();
[Link]();

this._characters.forEach( ch => {
let bestGuess = [Link](ch);
solution += [Link];
});
}
return [Link](solution);
}
}

class NoCaptchaWidget extends CaptchaWidget {


constructor(params) {
let defaultParams = {
selector: '[Link]-check-circle',
waitMs: 10000
};
for (let p in params) {
defaultParams[p] = params[p];
}
super(defaultParams);
}

async isSolved() {
return wait().then( () => {
if ([Link]) {
return [Link](true);
}
return [Link]();
});
}
}

class GeeTestCaptchaWidget extends CaptchaWidget {


constructor(params) {
let defaultParams = {
selector:
'.geetest_captcha.geetest_lock_success,.geetest_ghost_success.geetest_success_anima
te',
waitMs: 2000
};
for (let p in params) {
defaultParams[p] = params[p];
}
super(defaultParams);
}

async isSolved() {
return wait().then( () => {
if ([Link]) {
return [Link](true);
}
return [Link]();
});
}
}

class CBL01CaptchaWidget extends CaptchaWidget {


constructor(params) {
let defaultParams = {
selector: '',
waitMs: 2000
};
for (let p in params) {
defaultParams[p] = params[p];
}
super(defaultParams);
}
async isReady() {
return wait(1).then( () => {
if([Link]) {
return [Link](true);
}
return wait().then( () => { [Link](); });
});
}

async solve() {
let answer = [Link]('captchainput').value;
if (answer != '') {
if ([Link]('JJJ')) {
answer = [Link](3);
[Link]('captchainput').value = answer;
}

if ([Link] != 6) {
[Link]('captchainput').value ='';
[Link]();
return wait(10000).then( () => { [Link](); });
} else {
return wait().then( () => { return true; } );
}
} else {
return wait().then( () => { [Link](); });
}
}

async isSolved() {
return [Link]()
.then( () => [Link]())
.then( (solution) => {
return [Link](true);
})
.catch(err => { [Link](err); })
}
}

class D1CaptchaWidget extends CaptchaWidget {


constructor() {
let defaultParams = {
selector: '#submit_captcha span',
waitMs: [1000, 5000],
timeoutMs: 4 * 60 * 1000
};
super(defaultParams);
[Link] = {
submitButton: '#submit',
answerSpan: '#submit_captcha span'
}
this._elements = {
submitButton: new ButtonWidget({selector: '#submit'}),
answerSpan: new ReadableWidget({selector: '#submit_captcha span'})
};
}

async isReady() {
return wait().then( () => {
if(this._elements.[Link]) {
return [Link](true);
}
return [Link]();
});
}

async solve() {
if (this._elements.[Link]) {
let answer = this._elements.[Link];
answer = answer ? [Link]() : answer;
let input = [Link](`input[value="${answer}"`);
if (input) {

[Link]([Link]('i'));
return wait().then( () => { return true; } );
} else {
return [Link](`@D1Captcha input NOT FOUND for answer: $
{answer}`);
}
} else {
return [Link]('Answer span not found!!!');
}
}

async isSolved() {
return [Link]()
.then( () => [Link]())
.then( (solution) => {
return [Link](true);
})
.catch(err => { [Link](err); })
}
}

class Faucet {
constructor(elements, actions = {}) {
this._url = [Link];
this._timeout = new Timeout(); // [Link]);
this._elements = elements;
this._actions = {
preRun: false,
preRoll: false,
altValidation: false,
readClaimed: true,
readBalance: true,
readTimeLeft: true,
readRolledNumber: false,
isMultiClaim: false,
checkIfOutOfFunds: false,
preSaveResult: false
}
this._actions = { ...this._actions, ...actions };
this._params = [Link]().params || {};
this._result = this._actions.isMultiClaim ?
([Link]('tempResults') || {}) : ([Link]() || {});
}
hasCloudflare() {
let h2 = [Link]('h2#challenge-running');
let stage = [Link]('#challenge-stage');
if (h2 || stage) {
return true;
}
return false;
}

useUrlListener() {
if ([Link] === null) {
[Link]('urlchange', (data) => {
if (this._url != [Link]) {
this._url = [Link];
[Link]();
}
});
}
}

resetRun() {
wait().then( () => { [Link](); });
}

init() {
throw new Error('Init not implemented!');
}

login() {
throw new Error('Login not implemented!'); //return NEED_TO_LOGIN
}

async run(action = false) {


if (this._actions.checkIfOutOfFunds) {
[Link]();
}

if (this._actions.preRun) {
await wait().then( () => { [Link]() } );;
}

if (!action) {
[Link]().then( (resolve) => {
[Link]([Link]);
});
} else {
[Link](action);
}
}

perform(action) {
switch(action) {
case 'doRoll':
if(this._actions.preRoll) {
[Link]();
}
this._elements.[Link]().then(() => { [Link]()
});
break;
case 'needToWait':
[Link]();
break;
default:
break;
}
}

async detectAction() {
return wait().then( () => {
if ( [Link]() ) {
return [Link]({action: 'needToWait'});
} else if ( [Link]() ) {
return [Link]({action: 'doRoll'});
} else {
return [Link]();
}
});
}

preRoll() {
throw new Error('PreRoll not implemented!');
}

preRun() {
throw new Error('PreRun not implemented!');
}

altValidation() {
throw new Error('AltValidation not implemented!');
}

isCountdownVisible() {
return this._elements.countdownMinutes &&
this._elements.[Link];
}

isRollButtonVisible() {
return this._elements.rollButton &&
this._elements.[Link];
}

clickRoll() {
try {
this._elements.[Link](false);
this._elements.[Link]();
[Link]();
} catch (err) {
[Link]([Link].CLICK_ROLL_ERROR, err);
}
}

failureValidation() {
throw new Error('FailureValidation not implemented!');
}

async validateRun() {
return wait(this._actions.useFailureValidation ? 6000 : null).then( ()
=> {
if (this._actions.useFailureValidation) {
if ([Link]()) {
return;
}
}
if (this._elements.success?.isUserFriendly) {
return [Link]();
} else if(this._actions.altValidation) {
if([Link]()) {
return [Link]();
}
}
return wait(2000).then( () => { [Link]() });
});
}

async updateResult() {
if(this._actions.readClaimed) {
this._result.claimed = [Link]();
}
if(this._actions.readBalance) {
this._result.balance = [Link]();
}
if(this._actions.readTimeLeft) {
this._result.nextRoll = [Link]();
}
if(this._actions.readRolledNumber) {
this._result.rolledNumber = [Link]();
}
if (this._actions.isMultiClaim) {
[Link]('tempResults', this._result);
return this._actions.postRun ? [Link]() : true;
}
if (this._actions.preSaveResult) {
[Link]();
}
if (this._actions.updateWithoutClosing) {
[Link](this._result);
return this._actions.postRun ? [Link]() : true;
} else {
[Link](this._result);
}
}

readNextRoll() {
try {
if (this._elements.countdownMinutes &&
this._elements.[Link]) {
return
[Link](this._elements.[Link]);
}
} catch (err) { [Link](`@readNextRoll: ${err}`); }
return null;
}

readRolledNumber() {
let rolled = 0;
try {
if(this._elements.[Link]) {
rolled = this._elements.[Link];
}
} catch (err) { [Link](`@readRolledNumber: ${err}`); }
return rolled;
}

readBalance() {
let balance = 0;
try {
if(this._elements.[Link]) {
balance = this._elements.[Link];
}
} catch (err) { [Link](`@readBalance: ${err}`); }
return balance;
}

readClaimed() { //TODO: review if previous claimed should be received as


arg
let claimed = this._result.claimed ?? 0;
if (this._actions.isMultiClaim) {
this._oldClaimed = claimed;
} else {
}

try {
if(this._elements.[Link]) {
claimed = +claimed + +this._elements.[Link];
} else {
}
} catch (err) { [Link](`@readClaimed: ${err}`); }
return claimed;
}

checkIfOutOfFunds() {
let divAlerts =
[...[Link](this._elements.outOfFundsDivSelector)];
[Link]( function (d) {
if ([Link]().includes('not have sufficient
funds')) {
[Link]([Link].FAUCET_EMPTY, [Link]);
return;
}
});
}

setCurrentCaptcha() {
if ([...[Link]('iframe')].map(x => [Link] ||
'').filter(x => [Link]('[Link]')).length > 0) {
return;
}
this._elements.captcha = new RecaptchaWidget();
}
}

class BFRoll extends Faucet {


constructor(coinPrefix, trySpin = false) {
let elements = {
preRunButton: new ButtonWidget({selector: '.[Link]-box__' +
coinPrefix + ' button'}), //'#' + coinPrefix + '_free_box_withdraw_page'}),
captcha: new NoCaptchaWidget({ selector: '.free-box-
withdraw__footer button' }), // .button_red.button_center.button_fullwidth' }),
rollButton: new ButtonWidget({selector: '.free-box-withdraw__footer
button' }), // .button_red.button_center.button_fullwidth'}),
success: new ReadableWidget({selector: '.modal:not(.free-box-
withdraw,fury-wheel-modal), .[Link]'}),
claimed: new ReadableWidget({selector: '.[Link]-box__' +
coinPrefix, parser: [Link]}),
progressBar: new ReadableWidget({selector: '.[Link]-box__' +
coinPrefix + ' .free-box__progress-bar progress'}),
};

let actions = {
preRun: true,
readClaimed: true,
readBalance: false,
readRolledNumber: false
};
super(elements, actions);
[Link] = coinPrefix;
[Link] = trySpin;
}

init() {
if (this._url.includes('[Link] {
[Link]();
return;
} else {
return;
}
}

async spin() {
let clickables = [Link]('.fury-wheel__wheel-
btn, .fury-wheel__btn-wrap, .fury-wheel__btn-content, .fury-wheel__btn-img');
if ([Link] > 0) {
clickables[[Link]([Link]()*[Link])].click();
wait(15000).then ( () => { [Link](this._result); } );
}
return;
}

async preRun() {
return wait().then( () => {
try {
let popup = [Link]('.modal-
wrapper .modal:not(.free-box-withdraw,fury-wheel-modal) .modal__btn-close');
if (popup) {
[Link]();
[Link](); // twice
}
} catch (err) {}

if ([Link]) {
let spinUnavailable =
[Link]('.bonus.bonus_furywheel.wait');
if (spinUnavailable) {
} else {
let spinBtn = [Link]('.wheel-amin');
//bonus bonus_furywheel wait
if (spinBtn) {
[Link]();
wait(10000).then ( () => { [Link]() } );
return wait(60000).then ( () => { [Link](); } );
}
}
}

if (!this._elements.progressBar || !
this._elements.[Link]) {
return [Link]();
}

if (this._elements.[Link]) {
if (!this._elements.[Link]) {
return this._elements.[Link]();
} else {
this._timeout.restart();
[Link](this._result);
return;
}
} else if ([Link]('.free-box').length > 1) {
[Link]([Link], 'Box might not exist
for your account.');
return;
}
return [Link]();
});
}

async validateRun() {
return wait(7000).then( () => {
let gtHook = [Link]('div.geetest_slice_bg');
if (gtHook) {
if ([Link]()) {
return [Link]();
}
}
let popup = [Link]('.modal-
wrapper .modal:not(.free-box-withdraw,fury-wheel-modal) .modal__btn-close');
if (!popup) {
if (this._elements.[Link] && !
this._elements.[Link]) {
this._elements.[Link]();
return [Link]();
}
} else {
try {
if (popup) {
[Link]();
[Link]();
}
} catch (err) {}
}

if (this._elements.[Link]) {
return [Link]();
} else if(this._actions.altValidation) {
if([Link]()) {
return [Link]();
}
}
return [Link]();
});
}
}

class DutchyRoll extends Faucet {


constructor() {
let elements = {
countdownMinutes: new CountdownWidget({selector: '#timer', parser:
[Link], options: { splitter: 'Minutes', idx: 0} }), // "26
Minutes 23"
captcha: new HCaptchaWidget(),
rollButton: new ButtonWidget({selector: '#claim'}), //w/booster
video: '#unlockbutton' & then #claim_boosted
success: new ReadableWidget({selector: '.[Link]
p,.[Link],.[Link],.[Link]'}),
claimed: new ReadableWidget({selector: '.[Link]
p,.[Link],.[Link],.[Link]', parser:
[Link]}) //"You Won 0.00409070 TRX + 20 XP"
};
let actions = {
preRun: true,
readClaimed: true,
readBalance: false,
readRolledNumber: false
};
super(elements, actions);
}

init() {
switch([Link]) {
case '[Link]':
if (this._url.includes('/[Link]')) {
this._elements.claimed = new ReadableWidget({selector:
'.[Link] p,.[Link],.[Link],.[Link]',
parser: [Link]})
} else if (this._url.includes('/[Link]')) {
[Link]([Link].NEED_TO_LOGIN, '');
return;
}
break;
case '[Link]':
if (this._url.includes('/[Link]')) {
this._elements.claimed = new ReadableWidget({selector:
'.[Link] p,.[Link],.[Link],.[Link]',
parser: [Link]})
} else if (this._url.includes('/coin_roll.php')) {
this._elements.claimed = new ReadableWidget({selector:
'.[Link] p,.[Link],.[Link],.[Link]',
parser: [Link]})
} else if (this._url.includes('/[Link]')) {
[Link]([Link].NEED_TO_LOGIN, 'You need
to login using ExpressCrypto (EC-UserId-XXXXXX).');
return;
}
break;
}
[Link]();
return;
}

async preRun() {
if (this._elements.[Link]) {
if ([Link]()['[Link]']) {
this._elements.rollButton = new ButtonWidget({selector:
'#unlockbutton'});
this._elements.confirmBoost = new ButtonWidget({selector:
'#claim_boosted'});
setInterval(() => {
try {
if (this._elements.[Link]) {
this._elements.[Link]();
}
} catch (err) {}
}, 8000);
}
return true;
} else {
[Link]();
await wait();
return [Link]();
}
}
}

class YCoin extends Faucet {


constructor() {
let elements = {
rollButton: new ButtonWidget({selector: 'input[type="submit"]
[value="Get Free Crypto!"]'}),
claimed: new ReadableWidget({selector: '[Link]-info',
parser: [Link]}),
captcha: new HCaptchaWidget(),
balance: new ReadableWidget({selector: '[Link][href="/account?
page=history"]', parser: [Link]}),
success: new ReadableWidget({selector: '[Link]-info'}),
login: {
inputUser: new TextboxWidget({ selector: 'input[name="number"]'
}),
inputPass: new TextboxWidget({ selector:
'input[name="pass"]' }),
inputSubmit: new SubmitWidget({ selector: 'input[type="submit"]
[value="Login!"]' }),
setCredentials: false
},
};

if([Link]()['[Link]'] == 1) {
[Link] = {
username: [Link]()['[Link]'],
password: [Link]()['[Link]']
};
}
let actions = {
preRun: true,
readClaimed: true,
readBalance: true,
readRolledNumber: false,
checkIfOutOfFunds: false
};
super(elements, actions);
}

async preRun() {
let msgDiv;
msgDiv = [Link]('[Link]');
if (msgDiv && [Link]('has been transferred')) {
let result = {};
if ([Link]('0 claims')) {
[Link] = [Link](60 * 24 +
[Link](10, 50));
} else {
[Link] = [Link]('60');
}
[Link] = +[Link](' ')[0];
[Link] = [Link]();
[Link](result);
return;
}

msgDiv = [Link]('[Link]');
if (msgDiv) {
if ([Link]('can claim only')) {
let result = {};
[Link] = [Link](60 * 24 +
[Link](10, 160));
[Link](result);
return;
} else if ([Link]('Please wait')) {
let result = {};
try {
let unit = [Link](' seconds') ? '
seconds' : ' minutes';
let val = [Link]('Please wait ')
[1].replace(/\D/g, '');
if (unit == ' seconds') {
[Link] = [Link](val);
} else {
[Link] = [Link](val);
}
} catch {
[Link] = [Link](60);
}
[Link](result);
return;
}
}
msgDiv = [Link]('[Link]');
if (msgDiv) {
if ([Link]().includes('run out of bitcoin'))
{
[Link]([Link].FAUCET_EMPTY, 'Out of
Funds');
return;
}
}

if (this._elements.[Link]) {
} else {
if (this._elements.rollButton) {
this._elements.[Link]();
return;
}
}
}

async init() {
if (this._url.includes('/faucet')) {
let needToLoginButton =
[Link]('input[type="submit"][value="Login / Signup"]');
if (needToLoginButton) {
[Link]();
return;
}

[Link]();
[Link]();
return;
} else if (this._url.includes('/account')) {
[Link]();
return;
}
}

async doLogin() {
return wait().then( () => {
let container = [Link]('#cc');
if ([Link]('You are now logged in as
account')) {
let toFaucetButton = [Link]('#mmenu
a[href="/faucet"]');
if (toFaucetButton) {
[Link]();
return;
}
return [Link]();
}
if (!this._elements.[Link] || !
this._elements.[Link] || !
this._elements.[Link]) {
return [Link]();
}

let loginErrorDiv = [Link]('#cc .[Link]');


if (loginErrorDiv && [Link]('Invalid')) {
[Link]([Link].LOGIN_ERROR,
[Link]);
return;
}

if (this._elements.[Link] != false) {
this._elements.[Link] =
this._elements.[Link];
this._elements.[Link] =
this._elements.[Link];
}

try {
this._elements.[Link] = true;
} catch (err) {}

if (this._elements.[Link] != '' &&


this._elements.[Link] != '' ) {
this._elements.[Link]();
} else {
[Link]([Link].LOGIN_ERROR, 'No credentials
were provided');
return;
}
});
}

async solveColorCaptcha() {
await wait(2000);
let optionInputs = [...[Link]('#newch
input[type="submit"]')];
let options = [Link](x => [Link]);
let wantedColor = [Link]('#newch p b');
if ([Link] > 0 && wantedColor) {
try {
let knownColors = [Link](nearestColor.STANDARD_COLORS);
let toColorName =
[Link](nearestColor.STANDARD_COLORS);

options = [Link](x => toColorName(x).name);


wantedColor = [Link]();
if (wantedColor == 'grey') { wantedColor = 'gray'; }
let solutionIdx = [Link](x =>
[Link](wantedColor));
if (solutionIdx > -1) {
optionInputs[solutionIdx].click();
return;
}
if (wantedColor == 'green') {
wantedColor = 'lime';
solutionIdx = [Link](x =>
[Link](wantedColor));
if (solutionIdx > -1) {
optionInputs[solutionIdx].click();
return;
}
}
await wait(5000);
[Link]();
} catch (err) {
await wait(15000);
[Link]();
}
} else {
return [Link]();
}
}

class CDiversity extends Faucet {


constructor() {
let elements = {
claimed: new ReadableWidget({selector: '[Link]', parser:
[Link]}),
captcha: new HCaptchaWidget(),
rollButton: new ButtonWidget({selector: 'input[type="submit"]
[value="Get Free Crypto!"]'}),
};
let actions = {
readTimeLeft: true,
readRolledNumber: false,
readBalance: false
};
super(elements, actions);
}

init() {
if([Link]()) {
[Link]([Link], 'Suspicious Activity
Message Displayed');
return;
}

let claimed = [Link]();


if (claimed != 0) {
let result = {
claimed: claimed,
nextRoll: [Link]()
};
[Link](result);
return;
}

let nextRoll = [Link]();


if(nextRoll) {
let result = {
nextRoll: nextRoll
};
[Link](result);
return;
}

[Link]();
}

hasErrorMessage() {
return [Link]().includes('suspicious
activity');
}

isFirstStep() {
return [Link]('form select[name="coin"]') ? true :
false;
}

async doFirstStep() {
let form = [Link]('form');
if (!form) {
[Link]();
return;
}
let coinSelect = [Link]('select[name="coin"]');
if (!coinSelect) {
[Link]();
return;
}
let userInput = [Link]('input[name="ado"]');
if (!userInput) {
[Link]();
return;
}
let submitButton = [Link]('input[type="submit"]');
if (!submitButton) {
[Link]();
return;
}
[Link] = [Link]();
[Link] = this._params.address;

[Link]();
return;
}

getCoin() {
try {
let tds = [Link]('table tr td:nth-child(2)');
return tds[[Link](0, 5)].[Link](' ')[1]
} catch (err) {
return 'BTC';
}
}

isSecondStep() {
let ps = [...[Link]('p')];
return [Link](x => [Link]().includes('one more
step...')) >= 0;
}

async solve() {
if ([Link]()) {
return [Link]();
}
if ([Link]()) {
return [Link]();
}
}

isCountdownVisible() {
let successDiv = [Link]('[Link]');
if (!successDiv) {
return false;
}
if ([Link]('0 claims')) {
return true;
}

return false;
}

readClaimed() {
let successDiv = [Link]('[Link]');
if (successDiv) {
return [Link](' ')[0];
} else {
return 0;
}
}

readNextRoll() {
try {
let successDiv = [Link]('[Link]');
if (successDiv && [Link]('You have')) {
let claimsLeft;
try {
claimsLeft = [Link](' claims')
[0].split('have ')[1];
} catch (err) {}
if (claimsLeft) {
return [Link]([Link](6, 22));
} else if (claimsLeft === '0') {
return [Link](60 * 24 + [Link](10,
160));
}
}
} catch (err) { }

try {
let warnDiv = [Link]('[Link]');
if (warnDiv) {
if ([Link]('You can claim only')) {
return [Link](60 * 24 + [Link](10,
160));
}

if ([Link]('Please wait ')) {


try {
let unit = [Link](' seconds') ? '
seconds' : ' minutes';
let val = [Link]('Please wait ')
[1].split(unit)[0].replace(/\D/g, '');
if (unit == ' seconds') {
return [Link](val);
} else {
return [Link](val);
}
} catch { }
let claimsLeft;
try {
claimsLeft = [Link](' seconds')
[0].split('wait ')[1];
} catch (err) {}
if (claimsLeft) {
return [Link]([Link](6, 22));
}
}
}

} catch (err) { }
return null;
}
}

class CTop extends Faucet {


constructor() {
let elements = {
claimed: new ReadableWidget({selector: '[Link]', parser:
[Link]}),
captcha: new HCaptchaWidget(),
rollButton: new ButtonWidget({selector: 'input[type="submit"]'}),
addressInput: new TextboxWidget({ selector: 'form
input[name="adr"], form input[name="a"]'})
};
let actions = {
readTimeLeft: true,
readRolledNumber: false,
readBalance: false
};
super(elements, actions);
}

init() {
if([Link]('suspicious activity')) {
[Link]([Link], 'Suspicious Activity
Message Displayed');
return;
}
if([Link]('no funds left')) {
[Link]([Link].FAUCET_EMPTY, 'Out of Funds');
return;
}
if([Link]('faucet is currently disabled')) {
[Link]([Link].FAUCET_EMPTY, 'Faucet is
disabled');
return;
}

let claimed = [Link]();


if (claimed != 0) {
let result = {
claimed: claimed,
nextRoll: [Link]()
};
[Link](result);
return;
}

let nextRoll = [Link]();


if(nextRoll) {
let result = {
nextRoll: nextRoll
};
[Link](result);
return;
}

[Link]();
}

hasErrorMessage(searchTerm) {
return [Link]().includes(searchTerm);
}

isFirstStep() {
return this._elements.[Link];
}

async doFirstStep() {
let form = [Link]('form');
if (!form) {
[Link]();
return;
}
if (!this._elements.[Link]) {
[Link]();
return;
}
let submitButton = [Link]('input[type="submit"]');
if (!submitButton) {
[Link]();
return;
}
this._elements.[Link] = this._params.address;

[Link]('form').submit();
return;
}

isSecondStep() {
let ps = [...[Link]('p')];
return [Link](x => [Link]().includes('one more
step...')) >= 0;
}

async solve() {
if ([Link]()) {
return [Link]();
}
if ([Link]()) {
return [Link]();
}
}

isCountdownVisible() {
let successDiv = [Link]('[Link]');
if (!successDiv) {
return false;
}
if ([Link]('0 claims')) {
return true;
}

return false;
}

readClaimed() {
let successDiv = [Link]('[Link]');
if (successDiv) {
return [Link](' ')[0];
} else {
return 0;
}
}

readNextRoll() {
try {
let successDiv = [Link]('[Link]');
if (successDiv && [Link]('You have')) {
let claimsLeft;
try {
claimsLeft = [Link](' claims')
[0].split('have ')[1];
} catch (err) {}
if (claimsLeft) {
return [Link]([Link](12, 22));
} else if (claimsLeft === '0') {
return [Link](60 * 24 + [Link](10,
160));
}
}
} catch (err) { }

try {
let warnDiv = [Link]('[Link]');
if (warnDiv) {
if ([Link]('You can claim only')) {
return [Link](60 * 24 + [Link](10,
160));
}

if ([Link]('Please wait ')) {


try {
let unit = [Link](' seconds') ? '
seconds ' : ' minutes ';
let val = [Link]('Please wait ')
[1].split(unit)[0].replace(/\D/g, '');
if (unit == ' seconds ') {
return [Link](val +
[Link](90, 180));
} else {
return [Link](val +
[Link](1, 5));
}
} catch { }
let claimsLeft;
try {
claimsLeft = [Link](' seconds')
[0].split('wait ')[1];
} catch (err) {}
if (claimsLeft) {
return [Link]([Link](12, 22));
}
}
}

} catch (err) { }
return null;
}
}

class FPB extends Faucet {


constructor(sitePrefix = null) {
let elements = {
rollButton: new ButtonWidget({selector: 'input[type="submit"]
[value="Claim From Faucet"],input[type="submit"][name="claim"]'}),
claimed: new ReadableWidget({selector: '[Link]-info',
parser: [Link]}),
captcha: new HCaptchaWidget(),
success: new ReadableWidget({selector: '[Link]-info'}),
login: {
inputUser: new TextboxWidget({ selector:
'input[name="user_name"]' }),
inputPass: new TextboxWidget({ selector:
'input[name="password"]' }),
rememberMe: new TextboxWidget({ selector:
'input[name="remember_me"]' }),
inputSubmit: new ButtonWidget({ selector: 'input[type="submit"]
[name="login"]' }),
setCredentials: false
},
outOfFundsDivSelector: '.[Link]-info'
};

if([Link]()[sitePrefix + '.[Link]'] == 1) {
[Link] = {
username: [Link]()[sitePrefix +
'.[Link]'],
password: [Link]()[sitePrefix +
'.[Link]']
};
}

let actions = {
readClaimed: true,
readBalance: false,
readRolledNumber: false,
checkIfOutOfFunds: true
};
super(elements, actions);
}

init() {
if (this._url.includes('/dashboard')) {
[Link]();
return;
} else if (this._url.includes('/login')) {
[Link]();
return;
}
}

async doLogin() {
return wait().then( () => {
if (!this._elements.[Link] || !
this._elements.[Link] || !
this._elements.[Link]) {
return [Link]();
}

let loginErrorDiv = [Link]('[Link]-info');


if (loginErrorDiv && [Link]('not valid'))
{
[Link]([Link].LOGIN_ERROR,
[Link]);
return;
}

if (this._elements.[Link] != false) {
this._elements.[Link] =
this._elements.[Link];
this._elements.[Link] =
this._elements.[Link];
}

try {
this._elements.[Link] = true;
} catch (err) {}

if (this._elements.[Link] != '' &&


this._elements.[Link] != '' ) {
this._elements.[Link]().then(() => {
this._elements.[Link]();
return;
});
} else {
[Link]([Link].LOGIN_ERROR, 'No credentials
were provided');
return;
}
});
}

async detectAction() {
return wait().then( () => {
if ( [Link]() ) {
return [Link]({action: 'needToWait'});
} else if ( this._elements.[Link] ) {
return [Link]();
} else if ( [Link]() ) {
return [Link]({action: 'doRoll'});
} else {
return [Link]();
}
});
}

clickRoll() {
try {
try {
[Link](0, [Link]);
} catch (err) { }
this._elements.[Link]();
setTimeout( () => { this._elements.[Link](); }, 5000);
} catch (err) {
[Link]([Link].CLICK_ROLL_ERROR, err);
}
}
}

class VieRoll extends Faucet {


constructor() {
let elements = {
rollButton: new SubmitWidget({selector: '.main-content
button[type="submit"]'}),
claimed: new ReadableWidget({selector: '.swal2-html-container',
parser: [Link]}),
captcha: new HCaptchaWidget(),
success: new ReadableWidget({selector: '.swal2-success-ring'}),
login: {
inputUser: new TextboxWidget({ selector: '#email' }),
inputPass: new TextboxWidget({ selector: '#password' }),
inputSubmit: new SubmitWidget({ selector:
'button[type="submit"]' })
}
};

let actions = {
readClaimed: true,
readBalance: false,
readTimeLeft: false,
readRolledNumber: false,
preSaveResult: false,
preRun: true
};
super(elements, actions);
}

getClaimsQty() {
let statWidgets = [Link]('.[Link]-stats-wid');
if ([Link] < 4) return false;

let claimCounts = statWidgets[3].querySelector('p');


if (!claimCounts) return false;

claimCounts = [Link]('/');
if ([Link] != 2) return false;

return claimCounts[0];
}

async evalClaimsQty() {
let current = [Link]();

if (current) {
current = +current;
} else {
return;
}

let previous = await [Link]('tempClaimsQty') || 0;


if (!isNaN(previous)) previous = +previous;

if (current == previous) {
return;
} else if (current < previous) {
return [Link]();
} else {
await [Link]('tempClaimsQty', current);
}
}

readClaimed() {
let claimed = 0.12;
try {
claimed = +[Link]('.[Link]-stats-wid')
[2].querySelector('p').[Link](' ')[0];
} catch (err) { }
return claimed;
}

async init() {
await [Link]();

if ([Link]('/faucet')) {
[Link]();
return;
} else if ([Link]('/firewall')) {
[Link]();
return;
} else if ([Link]('/dashboard')) {
[Link] = (new URL('faucet', [Link])).href;
return;
} else if ([Link] == '/') {
let loginBtn = [Link]('.[Link]-success');
if (loginBtn) {
[Link]();
return;
} else {
[Link] = (new URL('login',
[Link])).href;
}
return;
} else if (this._url.includes('/login')) {

let credentialsMode = this._params.[Link];


switch(credentialsMode) {
case -1:
[Link]([Link].NEED_TO_LOGIN, 'Manual
login required.');
break;
case 0:
[Link]([Link].NEED_TO_LOGIN, 'Login
required and autologin is not configured.');
break;
default:
[Link]();
break;
}
return;
}
}

async preRun() {
return;
}

async solveFirewall() {
[Link]();

this._elements.[Link]().then(() => {
let btn = new SubmitWidget({selector: 'form:not(.p-3)
button[type="submit"]'});
[Link]();
});
}

async doLogin() {
return wait().then( () => {
if (!this._elements.[Link] || !
this._elements.[Link] || !
this._elements.[Link]) {
return [Link]();
}

let loginErrorDiv = [Link]('[Link]-


danger');
if (loginErrorDiv) {
[Link]([Link].LOGIN_ERROR,
[Link]);
return;
}

if (this._params.[Link] == 1) {
this._elements.[Link] =
this._params.[Link];
this._elements.[Link] =
this._params.[Link];
}

if (this._elements.[Link] != '' &&


this._elements.[Link] != '' ) {
this._elements.[Link]().then(() => {
this._elements.[Link]();
return;
});
} else {
[Link]([Link].LOGIN_ERROR, 'No credentials
were provided');
return;
}
});
}

preSaveResult() {
[Link]();
}

closeSwal() {
let okButton = [Link]('button.swal2-confirm');
if (okButton) {
[Link]();
}
}
}

class GRCRoll extends Faucet {


constructor() {
let elements = {
countdownMinutes: new CountdownWidget({selector: '#roll_wait_text',
parser: [Link]}),
rollButton: new ButtonWidget({selector:
'input[id="roll_button"]'}),
balance: new ReadableWidget({selector: '#balance', parser:
[Link]}),
claimed: new ReadableWidget({selector: '#roll_comment .won',
parser: [Link]}),
rolledNumber: new ReadableWidget({selector: '#roll_result', parser:
[Link]}),
captcha: new NoCaptchaWidget({selector: '#roll_button'}),
success: new ReadableWidget({selector: '#roll_result'})
};
let actions = {
readTimeLeft: true,
readRolledNumber: true
};
super(elements, actions);
}

init() {
if (this._url.includes('#free_roll')) {
if ([Link]('a[href="#login"]').length > 0) {
[Link]([Link].NEED_TO_LOGIN, '');
return;
} else {
[Link]();
return;
}
} else {
return;
}
}

isCountdownVisible() {
return this._elements.countdownMinutes &&
this._elements.[Link] &&
this._elements.[Link] != '';
}
}

class O24Roll extends Faucet {


constructor() {
let elements = {
claimed: new ReadableWidget({selector: '#roll_comment .won',
parser: [Link]})
};
let actions = {
readTimeLeft: true,
readRolledNumber: false,
readBalance: false
};
super(elements, actions);
this._isFMonster = [Link] === '[Link]';
}

init() {
if([Link]('no funds left')) {
[Link]([Link].FAUCET_EMPTY, 'Out of Funds');
return;
}

if ([Link]() || [Link]() != 0) {
[Link]();
return;
}

[Link]();
}

hasErrorMessage(searchTerm) {
return [Link]().includes(searchTerm);
}

getSpotsAvailable() {
try {
let soldSpots =
[Link]('.pos:not(.pfree)').length;
let available = 1024-soldSpots;
return {
sold: '' + soldSpots,
available: '' + available
}
} catch (err) {
}
}

isPrime(num) {
for(var i = 2; i < num; i++){
if(num % i === 0){
return false;
}
}
return num > 1;
}

async solve() {
let spots;
spots = [Link]();
if(!this._isFMonster && !spots) {
[Link]();
return;
}
const findNotPrime =
[Link]('select[name="pr"]').[Link]('not a
prime')
let numbers = [...[Link]('select[name="pr"]
option[value]')].map(x => [Link])
let prime = null;
if (findNotPrime) {
prime = [Link](x => {
return ![Link](x)
});
} else {
prime = [Link](x => {
return [Link](x)
});
}
if(!prime) {
[Link]();
return;
}

let addrInput = [Link]('label input[name="a"]');


if (addrInput) {
[Link] = this._params.address;
} else {
[Link]();
return;
}
await wait([Link](1500, 3000));

if (this._isFMonster) {
let usdtQuestion = [Link]('form p:nth-child(2)');
if (!usdtQuestion || !
[Link]().includes('faucet monitor lists tether
faucets')) {
[Link]();
return;
}
let usdtAnswersList =
[...[Link]('select[name="fm"] option')];
if ([Link] == 0) {
[Link]();
return;
}
usdtAnswersList = [Link](x => [Link]);
let idxCorrect = [Link](x => [Link]() ==
'yes' || [Link]() == 'y');
if (idxCorrect === -1) {
[Link]();
return;
}
[Link]('select[name="fm"]').value =
usdtAnswersList[idxCorrect];
} else {
let answersList = [...[Link]('select[name="tt"]
option')].map(x => [Link]);
if ([Link]([Link])) {
[Link]('select[name="tt"]').value=[Link];
} else if ([Link]([Link])) {
[Link]('select[name="tt"]').value=[Link];
} else {
[Link]();
return;
}
}
await wait([Link](400, 5000));

let primeSelect = [Link]('select[name="pr"]');


[Link] (primeSelect, "mouseenter");
await wait([Link](5600, 29000));
[Link] (primeSelect, "mouseout");
[Link]=[Link]()
await wait([Link](1500, 5000));

let claimForm = [Link]('form');


if(claimForm) {
[Link]();
}
}

isCountdownVisible() {
let pars = [...[Link]('p')];
if ([Link](x => [Link]('wait until next day'))) {
return true;
}

if ([Link](x => [Link]('PROBLEM'))) {


return true;
}

return false;
}

readClaimed() {
let pars = [...[Link]('p')];
let claimedElm = [Link](x => [Link]('been transferred
to your account'));
if (claimedElm) {
return [Link](' ')[0];
} else {
return 0;
}
}

readNextRoll() {
try {
let pars = [...[Link]('p')];
if ([Link](x => [Link]('until next day') ||
[Link]('ALL DAILY CLAIMS') || [Link]('You have 0 claims
left'))) {
return [Link](60 * 24 + [Link](10,
160));
}

if ([Link](x => [Link]('PROBLEM'))) {


return [Link]([Link](6, 22));
}
if ([Link](x => [Link]('You have'))) {
return [Link]([Link](6, 22));
}
} catch (err) { [Link](`@readNextRoll: ${err}`); }
return [Link](60 * 24 + [Link](10, 160));
}
}

class FCryptoRoll extends Faucet {


constructor() {
let elements = {
countdownMinutes: new CountdownWidget({selector: '.sidebar-
links .cursor-not-allowed [Link]', parser: [Link],
options: { splitter: ':', idx: 1} }), // '00:21:28'
rollButton: new ButtonWidget({selector: '.[Link]-center
[Link]-center:not(.hidden)'}),
balance: new ReadableWidget({selector: '[Link]-bg-
yellow', parser: [Link]}), // '405.81 Coins'
claimed: new ReadableWidget({selector: '[Link]-3.w-0 p [Link]-
[Link]-medium', parser: [Link], options: { splitter:
'(', idx: 0} }), // '25.05 Coins (12 + 13.05)'
captcha: new HCaptchaWidget({selector: '#hcap-script > iframe'}),
success: new ReadableWidget({selector: '[Link]-3.w-0 p [Link]-
[Link]-medium'})
};
let actions = {
isMultiClaim: true,
preRoll: true,
postRun: true,
readRolledNumber: false,
};
super(elements, actions);
this._paths = {
faucet: '/task/faucet-claim',
dashboard: '/dashboard'
};
this._linkSelectors = {
Faucet: 'a[href="[Link]
}
[Link]();
}

init() {
this._elements.captcha = new HCaptchaWidget({selector: '#hcap-script >
iframe'});
this._elements.rollButton = new ButtonWidget({selector: '.[Link]-
center [Link]-center:not(.hidden)'});
if (this._url.endsWith(this._paths.dashboard)) {
return [Link]();
} else if (this._url.includes(this._paths.faucet)) {
return wait().then( () => { [Link](); });
}

return;
}

readSections() {
let sections = {};
try {
for (var l in this._linkSelectors) {
sections[l] = {};
sections[l].elm = [Link](this._linkSelectors[l]);
if (sections[l].elm) {
let qty = sections[l].[Link]('[Link]-auto');
sections[l].qty = (qty && !isNaN([Link])) ?
[Link] : 0;
}
}
} catch {}

[Link] = sections;
}

runDashboard() {
[Link]();

if ([Link]['Faucet'].elm) {
[Link]['Faucet'].[Link]();
return;
} else {
return wait().then( () => { [Link](); });
}
}

scrollTo() {
let mainContainer = [Link]('main');
if (mainContainer) {
[Link](0, [Link] -
[Link]);
}
}

preRoll() { // search for 'You don't need to solve any captcha! The system is
telling me that you are a good person :)'
[Link]();
let checkCircleSpan = [Link]('[Link]-
[Link]-0 [Link]-3 svg');
if(checkCircleSpan) {
if
([Link]().includes('the
system is telling me that you are a good person')) {
this._elements.captcha = new NoCaptchaWidget({selector:
'.[Link]-center [Link]-center:not(.hidden)'});
return;
}
}
}

postRun() {

if (this._url.endsWith(this._paths.dashboard) || this._oldClaimed !=
this._result.claimed) {
try {

this._elements.[Link]
rySelector('button');
} catch (err) {
}
this._oldClaimed = null;
[Link]();
if ([Link] != {}) {
if ([Link]['Faucet'].elm) {
[Link]['Faucet'].[Link]();
return;
} else {
}
} else {
}
} else {
}

this._result = [Link]('tempResults');
[Link](this._result);
return;
}

async runPtcList() {
let listItems = [...[Link]('.[Link]-responsive-
3 .[Link]-eye')].map(x => [Link]).filter(x =>
[Link]());
if ([Link] > 0) {
listItems[0].click();
return;
} else {
return wait().then( () => { [Link]() } );
}
}

runPtcSingleStart() {
return [Link]('doRoll');
}

runPtcSingleWait() {
this._elements.captcha = new NoCaptchaWidget({selector:
'[Link]:not(.cursor-not-allowed)' });
this._elements.rollButton = new ButtonWidget({selector:
'[Link]:not(.cursor-not-allowed)' });
return [Link]('doRoll');
}
}

class FPPtc extends Faucet {


constructor() {
let elements = {
claimButton: new ButtonWidget({selector: '#pop-up
[Link]:not([disabled])'}),
claimButtonDisabled: new ButtonWidget({selector: '#pop-up
[Link]'}),
openPtcButton: new ButtonWidget({fnSelector: function() {
let blacklistTitles = ['JOIN US ON [Link]'];
let btn = [...[Link]('button')].filter(x =>
[Link]().includes('view'));
try {
btn = [Link](x => !
[Link]([Link]('h2').innerTex
[Link]()));
} catch (err) {}
return ([Link] > 0) ? btn[0] : null;
}}),
claimed: new ReadableWidget({fnSelector: function() {
let divSpanSuccessClaim = [...[Link]('div
span')].filter(x => [Link]().includes('successfully credited
with'));
return ([Link] > 0) ?
divSpanSuccessClaim[0] : null;
}, parser: [Link]}),
captcha: new GeeTestCaptchaWidget(),
success: new ReadableWidget({selector: '[Link]-3.w-0 p [Link]-
[Link]-medium'})
};
let actions = {
isMultiClaim: true,
preRoll: true,
postRun: true,
readRolledNumber: false,
};
super(elements, actions);
this._paths = {
ptcList: '/ptc',
ptcSingleView: '/ptc/view',
login: '/account/login',
dashboard: '/user-admin'
};
[Link]();
}

init() {
if (this._url.includes(this._paths.ptcSingleView)) {
[Link](true);
return;
} else if (this._url.includes(this._paths.ptcList)) {
[Link]();
return;
} else if (this._url.includes(this._paths.login)) {
[Link]();
return;
} else if (this._url.includes(this._paths.dashboard)) {
return;
}

return;
}

hasExpired() {
return [Link]('The session has expired');
}

hasError() {
return [Link]('must finish watching') ||
[Link]('Tab Closed Error');
}

getETAWaitSeconds(btn) {
try {
let seconds = [Link]('s')[0];
return +seconds;
} catch (err) {
}
return 15;
}

getPayout(btn) {
[Link] = 0;
try {
let payout = [Link](' ')[0];
[Link] = +payout;
} catch (err) {
}
}

async validateClaim() {
await wait(1000);
if ([Link]()) {
[Link]('CLAIM => expired');
await wait(2000);
return false;
}
if (this._elements.[Link]) {
let claimed = this._elements.[Link];
if (claimed) {
[Link]('CLAIM => Returning claimed:', claimed);
await [Link]();
await wait(2000);
return claimed;
}
}
[Link]('@validateClaim => Still waiting...');
return [Link]();
}

async storeClaim() {
let result = [Link]();
[Link] = ([Link] ?? 0) + 1;
[Link] = +([Link] ?? 0) + +[Link];
[Link] = 0;
[Link](result, 'WORKING');
}

async confirmClaim() {
GM_setValue(`[Link]`, [Link]());
await wait(5000);
GM_deleteValue(`[Link]`);
let captcha = new GeeTestCaptchaWidget();

await [Link]();
if (!this._elements.[Link]) {
return;
}
this._elements.[Link]();
let validation = await [Link]();
return [Link]();
}

async startPtc() {
await wait(1000);
let minSeconds =
[Link](this._elements.[Link]);
[Link](this._elements.[Link]);
this._elements.[Link]();
await wait(4000);
return [Link]();
}

async waitPtcSeconds() {
if (this._elements.[Link]) {
return [Link]();
}
if (![Link]('PTC Ads') && [Link]('s
|')) {
await wait(5000);
return [Link]();
}
let iframe = [Link]('iframe[title="ptc-view"]');
if ([Link]('PTC Ads') && iframe) {
await wait(5000);
return [Link]();
}
return [Link]();
}

async doPtcList(isSingle = false) {


if ([Link]('PTC Ads') ||
[Link]('Complete Visit')) {
if (this._elements.[Link]) {
return [Link]();
} else {
if(isSingle) {
await wait(4000);
return [Link](true);
}
if (this._elements.[Link]) {
return [Link]();
} else {
[Link]();
return;
}
}
}
}

async doLogin() {
let username = [Link]('input');
let password = [Link]('input[type="password"]');
let captcha = new GeeTestCaptchaWidget();
let btn = [Link]('button[type="submit"');
if (username && password && btn && [Link] != '' &&
[Link] != '') {
await [Link]();
[Link]();
return;
} else {
[Link]([Link].NEED_TO_LOGIN, '');
}
}
}

function createFBProcessor() {
let countdownMinutes;
let timeout = new Timeout(); // [Link]);
let captcha = new HCaptchaWidget();

function run() {
setTimeout(findCountdownOrRollButton, [Link](2000, 5000));
};
function findCountdownOrRollButton() {
if ( isCountdownVisible() ) {
[Link]();
countdownMinutes =
+[Link]('.free_play_time_remaining.hasCountdown .countdown_amoun
t')[0].innerHTML + 1;
let result = {};
[Link] = readBalance();
[Link] = [Link]([Link]());

[Link](result);
return;
}

if ( isRollButtonVisible() ) {

try {
let doBonus = false; // true;
if (doBonus) {
if (![Link]('bonus_span_free_wof')) {
RedeemRPProduct('free_wof_5');
setTimeout(findCountdownOrRollButton,
[Link](2000, 5000));
return;
}
}
} catch { }

/* For 'Play without captcha accounts' */


if (![Link]) {
clickRoll()
} else {
[Link]().then(() => { clickRoll(); });
}
} else {
setTimeout(findCountdownOrRollButton, [Link](2000,
5000));
}
};
function isCountdownVisible() {
return
[Link]('.free_play_time_remaining.hasCountdown .countdown_amount
').length > 0;
};
function isHCaptchaVisible() {
let hCaptchaFrame = [Link]('.h-captcha > iframe');
if (hCaptchaFrame && [Link]()) {
return true;
}
return false;
};
function isRollButtonVisible() {
return [Link]('free_play_form_button').isVisible();
};
function clickRoll() {
try {
[Link]('free_play_form_button').click();
setTimeout(processRunDetails, [Link](3000, 10000));
} catch (err) {
[Link]([Link].CLICK_ROLL_ERROR, err);
}
};
function processRunDetails() {
if ([Link]('winnings').isVisible()) {
closePopup();

let result = {};


[Link] = readClaimed();
[Link] = readBalance();
if([Link] != 0) {
[Link] = readRolledNumber();
}
[Link](result);
return;
}

if ([Link]('.free_play_result_error').isVisible()) {
[Link]([Link].ROLL_ERROR,
[Link]('.free_play_result_error').innerHTML);
return;
}

if([Link]('free_play_error').isVisible()) {
[Link]([Link].ROLL_ERROR,
[Link]('.free_play_error').innerHTML);
return;
}

if ([Link]('same_ip_error').isVisible()) {
[Link]([Link].ROLL_ERROR,
[Link]('same_ip_error').innerHTML);
return;
}

setTimeout(processRunDetails, [Link](5000, 6000));


};
function closePopup() {
let closePopupBtn = [Link]('.[Link] .close-
reveal-modal');
if (closePopupBtn) {
[Link]();
}
};
function readRolledNumber() {
let rolled = 0;
try {
rolled = parseInt([... [Link]('#free_play_digits
span')].map( x => [Link]).join(''));
} catch { }
return rolled;
};
function readBalance() {
let balance = 0;
try {
balance = [Link]('balance').innerHTML;
} catch { }
return balance;
};
function readClaimed() {
let claimed = 0;
try {
claimed = [Link]('winnings').innerHTML;
} catch { }
return claimed;
};

return {
run: run
};
}

function createBigBtcProcessor() {
let timeout = new Timeout(); // [Link]);
let countdownMinutes;
let captcha = new HCaptchaWidget();
let selectElement = {
loadingDiv: function() {
let loading = [Link]('#loading');
if (loading && [Link]()) {
return true;
} else {
return false;
}
},
addressInput: function() {
return [Link]('#login input[name="address"]');
},
loginButton: function() {
return [Link]('#login input[type="submit"]');
},
claimButton: function() {
return [Link]('claimbutn');
},
countdown: function() { // "You have to wait\n60 minutes"
let cd = [Link]('countdown');
if(cd && [Link]()) {
return parseInt([Link]);
}
return null;
},
claimedAmount: function() {
let elm = [Link]('.[Link]-
[Link]'); //"Yuppie! You won 2 satoshi!"
if(elm && [Link]()) {
let val = parseInt([Link](/\D/g, ''));
if ([Link](val)) {
val = val / 100000000;
}

return val;
} else {
return null;
}
},
balance: function() {
let elm = [Link]('a b');
if (elm && [Link]()) {
let val = parseInt([Link](',', ''));
if ([Link](val)) {
val = val / 100000000;
}

return val;
} else {
return null;
}
},
error: function () {
return null;
}
};

function init() {
[Link](0, [Link]);
let m = [Link]('main'); if (m)
{ [Link]='block'; }
m = [Link]('block-adb-enabled'); if (m)
{ [Link]='none'; }
m = [Link]('ielement'); if (m)
{ [Link]='block'; }
setInterval(() => {
let frames = [...[Link]('iframe')];
[Link](x => {
if (![Link]('hcaptcha')) {
[Link]()
}
});
}, 5000);

if ([Link]('/faucet')) {
setTimeout(runFaucet, [Link](12000, 14000));
return;
} else {
setTimeout(run, [Link](3000, 5000));
return;
}
}

function run() {
try {
setTimeout(waitIfLoading, [Link](12000, 15000));
} catch (err) {
[Link]([Link], err);
}
};
function doLogin() {
let address = [Link]();
if(address && [Link] != [Link]().[Link]) {
[Link] = [Link]().[Link];
} else {
[Link]().click();
return;
}
setTimeout( doLogin , [Link](1000, 2000));
};
function waitIfLoading() {
if ( ![Link]() ) {
doLogin();
return;
} else {
}

setTimeout(waitIfLoading, [Link](5000, 7000));


};
function runFaucet() {
let claimedAmount = [Link]();
if(claimedAmount) {
processRunDetails();
return;
} else if ([Link]()) {
let result = {};

[Link](result);
} else {
[Link]().then(() => { clickClaim(); });
}
}
function clickClaim() {
try {
[Link]().click();
return;
} catch (err) {
[Link]([Link].CLICK_ROLL_ERROR, err);
}
};
function processRunDetails() {
let claimedAmount = [Link]();
let balance = [Link]();
let countdown = [Link]();

if (claimedAmount && balance) {


let result = {};
[Link] = claimedAmount;
[Link] = balance;

[Link](result);
return;
}

setTimeout(processRunDetails, [Link](5000, 6000));


};

return {
init: init
};
}

function createBestChangeProcessor() {
let timeout = new Timeout(); // [Link]);
let countdownMinutes;
let captcha = new HCaptchaWidget({selector: '.hcaptcha > iframe'});
let elements = {
captcha: function() {
return [Link]('.hcaptcha > iframe');
},
container: function() {
return [Link]('#info_bonus');
},
containerOpener: function() {
return [Link]('#tab_bonus a');
},
addressInput: function() {
return [Link]('#bonus_purse');
},
claimButton: function() {
return [Link]('#bonus_button');
},
countdown: function() { // Time left: mm:ss
let elm = [Link]('#bonus_button');
try {
if ([Link]) {
let timeLeft = [Link](':');
if ([Link] > 1) {
return parseInt(timeLeft[1]);
}
}
} catch (err) {
return null;
}
},
claimedAmount: function() {
let elm = [Link]("#bonus_status b");
try {
let sats = [Link](/\D/g, '');
return sats / 100000000;
} catch (err) {
return null;
}
},
balance: function() {
let elm = [Link]("#faucet_unpaid_balance b");
try {
let sats = [Link](/\D/g, '');
return sats / 100000000;
} catch (err) {
return null;
}
}
};

function init() {
run();
}
function run() {
try {
if (![Link]().isUserFriendly()) {
let co = [Link]();
if([Link]()) {
[Link] = [Link];
[Link]();
}
}
setTimeout(findCountdownOrRoll, [Link](4000, 5000));
} catch (err) {
[Link]([Link], err);
}
};
function findCountdownOrRoll() {
let countdown = [Link]();
if(countdown) {
let result = { };
[Link] = [Link]([Link]());

[Link](result);
return;
}

let ai = [Link]();

if ([Link]()) {
if ([Link] != [Link]().[Link]) {
[Link] = [Link]().[Link];
}
[Link]().then(() => { clickClaim(); });
return;
}

setTimeout(findCountdownOrRoll, [Link](10000, 12000));


};

function clickClaim() {
try {
let btn = [Link]();
if([Link]()) {
[Link]();
setTimeout(processRunDetails, [Link](4000, 8000));
} else {
setTimeout(clickClaim, [Link](4000, 8000));
}
return;
} catch (err) {
[Link]([Link].CLICK_ROLL_ERROR, err);
}
};

function processRunDetails() {
let claimedAmount = [Link]();
let balance = [Link]();

if (claimedAmount && balance) {


let result = {};
[Link] = claimedAmount;
[Link] = balance;

[Link](result);
return;
}

setTimeout(processRunDetails, [Link](5000, 6000));


};

return {
init: init
};
}

function createSGProcessor() {
let timerSpans;
function run() {
if(isLoading()) {
setTimeout(run, [Link](5000, 10000));
return;
} else if (hasPopup()) {
closePopup();
setTimeout(run, [Link](5000, 10000));
} else {
if(isMinerActive()) {
processRunDetails();
} else {
setTimeout(run, [Link](5000, 10000));
activateMiner();
}
}
};
function hasPopup() {
if ([Link]('[Link]-
[Link]-text-gray-1')) {
return true;
}
return false;
};
function closePopup() {
try {
[Link]("[Link]-
[Link]-text-gray-1").click();
[Link]('[Link]-
current').[Link]();
} catch { [Link](`@SG: error closing popup`); }
};
function isLoading() {
return [Link]('loader-logo') ? true : false;
};
function isMinerActive() {
timerSpans = [Link]('.[Link]-
[Link]-18 span');

if(timerSpans) {
return true;
} else {
return false;
}
return (!!timerSpans);
};
function activateMiner() {
let activateButton = [Link]("#region-main
[Link]-
[Link]-transparent");
if (activateButton) {
[Link]();
setTimeout(run, [Link](10000, 20000));
} else {
processRunDetails()
}
};

function processRunDetails() {
let result = {};
[Link] = [Link](readCountdown().toString());
[Link] = readBalance();
[Link](result);
};

function readCountdown() {
let synchronizing = [Link]('.[Link]-
[Link]-accent'); // use
let mins = 15;
try {
let timeLeft = [Link](':');
if (timeLeft[0] == 'Synchronizing') {
}

if([Link] === 3) {
mins = parseInt(timeLeft[0]) * 60 + parseInt(timeLeft[1]);
}
} catch (err) { [Link](`SG Error reading countdown: ${err}`); }
return mins;
};
function readBalance() {
let balance = "";
try {
balance = [Link]('[Link]-accent').innerText + "
BTC";
} catch (err) { }
return balance;
};
return {
run: run,
processRunDetails: processRunDetails
};
}

class AutoCMl extends Faucet {


constructor() {
let elements = {
claimed: new ReadableWidget({selector: '[Link]-success',
parser: [Link], options: { splitter: ' ', idx: 0} }),
captcha: new HCaptchaWidget(),
rollButton: new ButtonWidget({selector:
'input[type="submit"].claim-button'}),
addressInput: new TextboxWidget({ selector: 'form[role="form"]
input[type="text"]'})
};
let actions = {
readTimeLeft: false,
readRolledNumber: false,
readBalance: false
};
super(elements, actions);
}

init() {
[Link]();
if([Link]('suspicious activity')) {
[Link]([Link], 'Suspicious Activity
Message Displayed');
return;
}
if([Link]('no funds left') || [Link]('not
have sufficient funds')) {
[Link]([Link].FAUCET_EMPTY, 'Out of Funds');
return;
}

if([Link]('reached the daily claim limit')) {


let result = {
nextRoll: [Link]()
};
[Link](result);
return;
}

let claimed = [Link]();


if (claimed != 0) {
if (![Link]('doge')) {
claimed = claimed/100000000;
}
let result = {
claimed: claimed,
nextRoll: [Link]()
};
[Link](result);
return;
}

let waitTime = [Link]();


if (waitTime) {
let result = {
nextRoll: [Link](waitTime + 1)
};
[Link](result);
return;
}

if ([Link]()) {
return;
}

[Link]();
if (this._elements.[Link]) {
if (this._elements.[Link] != this._params.address) {
this._elements.[Link] = this._params.address;
}
}
[Link]();
}

hideAdBlocker() {
try {
[Link]("page-body").[Link] = "block";
[Link]("blocker-enabled").[Link] = "none";
} catch (err) {}
setInterval(() => {
try {
[Link]("page-body").[Link] = "block";
[Link]("blocker-enabled").[Link] =
"none";
} catch (err) {}
}, 3000);
}

changeCaptcha() {
let selections = [...[Link]('[Link]-center b')];
if ([Link] == 0) {
return false;
}
if ([Link](x =>
[Link]().includes('hcaptcha')).length != 1) {
[Link] = [Link]('?') ? ([Link] +
'&cc=hCaptcha') : ([Link] + '?cc=hCaptcha');
return true;
}
return false;
}

hasErrorMessage(searchTerm) {
return [Link]().includes(searchTerm);
}

hasWaitTime() {
try {
let pInfos = [...[Link]('[Link]-
info')].filter(x => [Link]().includes('you have to wait'));
if ([Link] == 1) {
let time = +pInfos[0].[Link]().replace('you have
to wait ', '').split(' ')[0];
return time;
}
} catch (err) {}
return false;
}

readNextRoll() {
try {
let spans = [...[Link]('[Link] [Link]-md-5ths
span:not(.glyphicon)')];
let idxClaimsLeft = [Link](x =>
[Link]('daily claims left'));
if (idxClaimsLeft > -1) {
if (spans[idxClaimsLeft].[Link]('0')) {
return [Link](60 * 24 + [Link](10,
160));
} else {
return [Link]([Link](5, 12));
}
}
} catch (err) { [Link](`@readNextRoll: ${err}`); }
return [Link](60 * 24 + [Link](10, 160));
}
}

class CClicks extends Faucet {


constructor() {
let elements = {
claimed: new ReadableWidget({selector: '[Link]-success',
parser: [Link]}),
captcha: new HCaptchaWidget(),
rollButton: new ButtonWidget({selector: '#myModal
input[type="submit"].btnclaim'}),
addressInput: new TextboxWidget({ selector: '#myModal
input[type="text"]'}),
openModalButton: new ButtonWidget({selector: 'button[data-
target="#myModal"]'})
};
let actions = {
readTimeLeft: false,
readRolledNumber: false,
readBalance: false
};
super(elements, actions);
}

async init() {
if ([Link]()) {
return;
}

if([Link]('suspicious activity')) {
[Link]([Link], 'Suspicious Activity
Message Displayed');
return;
}
if([Link]('no funds left') || [Link]('not
have sufficient funds')) {
[Link]([Link].FAUCET_EMPTY, 'Out of Funds');
return;
}
if([Link]('reached the daily claim limit') ||
[Link]('reached the daily limit')) {
let result = {
nextRoll: [Link](60 * 8 + [Link](15,
40))
};
[Link](result);
return;
}
let claimed = [Link]();
if (claimed != 0) {
let result = {
claimed: claimed,
nextRoll: [Link]()
};
[Link](result);
return;
}

if ([Link]()) {
return;
}

if (this._elements.[Link]) {
this._elements.[Link]();
await wait([Link](1000, 2000));
}

if (this._elements.[Link]) {
if (this._elements.[Link] != this._params.address) {
this._elements.[Link] = this._params.address;
}
}
[Link]();
}

changeCaptcha() {
let selections = [...[Link]('[Link]-center b')];
if ([Link] == 0) {
return false;
}
if ([Link](x =>
[Link]().includes('hcaptcha')).length != 1) {
[Link] = [Link]('?') ? ([Link] +
'&cc=hCaptcha') : ([Link] + '?cc=hCaptcha');
return true;
}
return false;
}

hasErrorMessage(searchTerm) {
return [Link]().includes(searchTerm);
}

readNextRoll() {
try {
let p = [Link]('[Link]-success');
if (p && [Link]().includes('daily')) {
p = [Link]('\n')[1];
p = +[Link](' daily')[0];

if (p > 0) {
return [Link]([Link](3, 9));
} else {
return [Link](60 * 8 + [Link](15,
40));
}
}
return [Link]([Link](3, 9));
} catch (err) { [Link](`@readNextRoll: ${err}`); }
return [Link](60 * 8 + [Link](15, 40));
}
}

let landing, instance, siteTimer;


let useTimer;

class Site {
constructor(params) {
[Link](this, {
schedule: '4a70e0', // Owner!
id: null,
name: null,
cmc: null, // REVIEW LOCATION
coinRef: null, // REVIEW LOCATION. Only for CFs?
url: null, // REVIEW FORMAT. Only one/'start' url? What about
complex scripts/rotators/SLs?
rf: null, // ...
type: null, // REVIEW DEFAULT. It should be something like
'Crawler' or 'Handler' and the site params should depend on this value
clId: null,
wallet: null, // should be part of site parameters/crawler based?
enabled: false,
lastClaim: 0,
aggregate: 0,
balance: 0,
stats: {},
nextRoll: null,
params: {}, // should have schedule overrides and be called
customExecution, scheduleParamaters or something like that
firstRun: true,
isExternal: false,
}, params);

[Link]();

setLegacyConditionalDefaults() {
if ([Link] == [Link]) {
[Link] = '65329c';
}

if ([Link] == [Link]) {
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 0;
}

if ([Link] == [Link]) {
[Link]['[Link]'] = true;
[Link]['[Link]'] = true;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 15;
[Link]['[Link]'] = 20;
}
if ([Link] == [Link]) {
[Link]['[Link]'] = true;
[Link]['[Link]'] = false;
[Link]['[Link]'] = true;
[Link]['[Link]'] = false;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 300;
[Link]['[Link]'] = 360;
}
if ([Link] == [Link]) {
[Link]['[Link]'] = true;
[Link]['[Link]'] = false;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 15;
[Link]['[Link]'] = 40;
}
if ([Link] == [Link]) {
[Link]['[Link]'] = true;
[Link]['[Link]'] = true;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 30;
[Link]['[Link]'] = 35;
}
if ([Link] == [Link]) {
[Link]['[Link]'] = true;
[Link]['[Link]'] = false;
[Link]['[Link]'] = true;
[Link]['[Link]'] = false;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 26;
[Link]['[Link]'] = 35;
[Link]['[Link]'] = true;
[Link]['[Link]'] = 3;
[Link]['[Link]'] = true;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 12;
[Link]['[Link]'] = 18;
}
if ([Link] == [Link]) {
[Link]['[Link]'] = true;
[Link]['[Link]'] = false;
[Link]['[Link]'] = 0;
[Link]['[Link]'] = 22;
[Link]['[Link]'] = 45;
}
}

static _sites = [];


static getAll() {
return Site._sites;
}

static getById(siteId) {
return [Link]().find(x => [Link] == siteId) || false;
}

static createFromDataArray(newSites) {
if (![Link](newSites)) {
newSites = [...newSites];
}
[Link](s => [Link]().push(new Site(s)));
}

static add(data) {
let newSite = new Site(data);
[Link]().push(newSite);

let schedule = [Link]([Link]);

if (!schedule) {
try {
schedule = [Link]()[0];
} catch (err) {
[Link]('No schedules found! Reseting to default
schedules');
let defaultSchedule = new Schedule({ uuid: '4a70e0', name:
'Default' });
let sampleSchedule = new Schedule({ uuid: '65329c', name:
'CF' });
if ([Link]().length == 0) {
[Link](defaultSchedule);
[Link](sampleSchedule);
}
schedule = [Link]()[0];
}
}

if (!schedule) {
[Link]('Schedule NOT found');
[Link](data);
return;
}
[Link](newSite);

[Link]('siteAdded', {
siteId: [Link],
siteName: [Link],
scheduleId: [Link]
});
}

static remove(siteId) {
let idx = this._sites.findIndex(x => [Link] === siteId);
if (idx > -1 && this._sites[idx].isExternal) {
let siteName = this._sites[idx].name;
this._sites = [Link]().filter(x => [Link] !== siteId);
[Link]().forEach(sch => {
[Link](siteId);
});
[Link]('siteRemoved', {
siteId: siteId,
siteName: siteName
});
}

static sortAll() {
[Link]().sort( function(a,b) {
if (a === b) {
return 0;
} else if ([Link] === null && [Link] === null) {
let aHasLoginError = [Link]?.errors?.errorType == 2;
let bHasLoginError = [Link]?.errors?.errorType == 2;
if (aHasLoginError) {
return -1;
} else if (bHasLoginError) {
return 1;
}
return [Link] > [Link] ? -1 : 1
} else if ([Link] === null) {
return 1;
} else if ([Link] === null) {
return -1;
} else {
return [Link]() < [Link]() ? -1 : 1;
}
});
}

static setAsRunAsap(siteId) {
let site = [Link](siteId);
if (!site) return false;

try {
let schedule = [Link]([Link]);
if ([Link] == [Link]) {
[Link](`Setting ASAP as 1st in schedule time + 1`);
[Link] = new
Date([Link]() + 1);
} else {
let now = new Date();
if (![Link]?.nextRoll) {
[Link](`Setting ASAP as now()`);
[Link] = now;
} else if (now < [Link]) {
[Link](`Setting ASAP as now()`);
[Link] = now;
} else {
[Link](`Setting ASAP as 1st in schedule time - 1`);
[Link] = new
Date([Link]() - 1);
}
}
[Link] = true;

[Link](`[${[Link]}] ${[Link]} updated to run ASAP


from Site`);
[Link]('siteUpdated', site);
return;
} catch (err) {
[Link](err);
[Link]({msg: `Error setting faucet to run ASAP from Site: $
{err}`});
}
}

changeSchedule(newScheduleId) {
let oldScheduleId = null;
if ([Link]) {
oldScheduleId = [Link];
[Link]([Link])?.removeSite([Link]);
}
[Link] = newScheduleId;
let newSchedule = [Link]([Link]);
[Link](this); // maybe use just the ids...
[Link]('siteChangedSchedule', {
siteId: [Link],
scheduleId: [Link],
oldScheduleId: oldScheduleId
});
}

static saveAll() {
[Link]('webList', Site._sites.map(x => [Link]()), true);
}

toStorage() { // Single site


if (![Link]) {
return {
id: [Link],
isExternal: [Link] || false,
name: [Link],
schedule:[Link],
lastClaim: [Link],
aggregate: [Link],
balance: [Link],
stats: [Link],
nextRoll: [Link],
enabled: [Link],
params: [Link]
};
} else {
return {
id: [Link],
url: [Link],
clId: [Link],
type: [Link],
cmc: [Link],
rf: [Link],
name: [Link],
isExternal: [Link] || false,
schedule:[Link],
lastClaim: [Link],
aggregate: [Link],
balance: [Link],
stats: [Link],
nextRoll: [Link],
enabled: [Link],
params: [Link]
};
}
}

update(items) { // this should be for Parameters or Execution (custom)


[Link] = [Link] || {};
[Link]( item => {
[Link][[Link]] = [Link];
});
[Link]({schedule: [Link], siteName: [Link], msg: `Site $
{[Link]} updated`});
}

getSiteParameters() {
if ([Link] == [Link]) {
[Link] = {
handler: 'CF',
fields: [
{ name: 'try_get_codes', type: 'checkbox', value: 'false',
text: 'Auto update promo codes' },
{ name: 'max_rolls_per_visit', type: 'numberInput', value:
1, min: 0 },
{ name: 'autologin', type: 'checkbox', value: 'true', text:
'Autologin when necessary' },
{ name: 'credentials_mode', type:
'credentials_or_autofilled', value: '2' },
{ name: 'email', type: 'email', value: '' },
{ name: 'password', type: 'password', value: '' }
]
};
}
return [Link] || false;
}
}
class Schedule {
constructor(params) {
[Link](this, {
uuid: '4a70e0',
name: 'default_schedule',
status: [Link],
currentSite: null,
sites: [],
tab: null,
timer: null, // TBD
timeWaiting: 0,
timeUntilNext: null,
worker: null
}, params)
[Link] = new Timer({ isManager: true, delaySeconds: 30, uuid:
[Link], webType: null });
}

static schedules = [];

static getAll() {
return [Link];
}

static getById(scheduleId) {
return [Link]().find(x => [Link] == scheduleId) || false;
}

static add(newSchedule) {
[Link]().push(newSchedule);
}

static getAllForCrud() {
return [Link]().map(x => {
return {
uuid: [Link],
name: [Link],
hasSites: [Link] && [Link] > 0
};
});
}

static async initialize() {

[Link]();

let defaultSchedule = new Schedule({ uuid: '4a70e0', name:


'Default' });
let sampleSchedule = new Schedule({ uuid: '65329c', name: 'CF' });
if ([Link]().length == 0) {
[Link](defaultSchedule);
[Link](sampleSchedule);
return;
}

let idxDefault = [Link]().findIndex(x => [Link] == '4a70e0');


if (idxDefault == -1) {
[Link](defaultSchedule);
}
};

static saveAll() {
[Link]('schedules', [Link](x => {
return {
uuid: [Link],
name: [Link]
};
}), true);
}

static loadAll() {
[Link] = [];
let schedulesJson = [Link]('schedules', true) || [];
[Link](function(element) {
[Link]().push(new Schedule({
uuid: [Link],
name: [Link],
}));
});
}

sortSites() {
[Link]( function(a,b) {
if (a === b) {
return 0;
} else if ([Link] === null && [Link] === null) {
let aHasLoginError = [Link]?.errors?.errorType == 2;
let bHasLoginError = [Link]?.errors?.errorType == 2;
if (aHasLoginError) {
return -1;
} else if (bHasLoginError) {
return 1;
}
return [Link] > [Link] ? -1 : 1
} else if ([Link] === null) {
return 1;
} else if ([Link] === null) {
return -1;
} else {
return [Link]() < [Link]() ? -1 : 1;
}
});
}

static crud(data) {
let isInvalid = false;
try {
const orphanSites = [];
[Link](x => {
if ([Link]) {
if ([Link]([Link])) {
isInvalid = true;
} else {
let newSchedule = new Schedule({
uuid: [Link],
name: [Link],
order: [Link]
})
[Link]().push(newSchedule);
[Link]();
}
} else if ([Link]) {
let pos = [Link]().findIndex(s => [Link] ==
[Link]);
[Link](...[Link]()[pos].sites);
[Link]().splice(pos, 1);
} else {
let sch = [Link]().find(s => [Link] ==
[Link]);
if ([Link]([Link]) && ([Link]([Link]) !
= sch)) {
isInvalid = true;
} else {
[Link] = [Link];
}
[Link] = [Link];
[Link] = [Link];
}
});

[Link]().sort((a, b) => [Link] - [Link]);

if ([Link] > 0) {
[Link](x => {
[Link] = [Link]()[0].uuid;
});

[Link]()[0].[Link](...orphanSites);
}
[Link]();
} catch (err) {
[Link](err);
return false;
}
if (isInvalid) {
return false;
}
return true;
}

addSite(site) { [Link](site) }
removeSite(siteId) {
if ([Link](x => [Link] === siteId) > -1) {
[Link] = [Link](x => [Link] !== siteId);
[Link]();
}
}

setCurrentSite() {
[Link] = [Link][0];
}

start() {
[Link] = [Link];
[Link] = setTimeout(() => {
[Link]();
}, 2000);
}

checkNextRoll() {
if ([Link] != [Link]) {
return;
}
[Link]();
clearTimeout([Link]);
if(![Link] || [Link] == null) {
[Link](`#wait-times span[data-schedule="$
{[Link]}"]`).setAttribute('data-nextroll', 'UNDEFINED');
[Link] = [Link];
return;
}

if([Link]() < [Link]()) {


[Link]({ schedule: [Link], siteName: [Link], msg:
`Opening ${[Link]}`});
[Link](`#wait-times span[data-schedule="$
{[Link]}"]`).setAttribute('data-nextroll', 'RUNNING');
[Link]();
[Link] = null;
return;
} else {
[Link] = [Link]() -
[Link]() + [Link](1000, 2000);

[Link](`#wait-times span[data-schedule="$
{[Link]}"]`).setAttribute('data-nextroll', [Link]());
[Link] = setTimeout(() => {
[Link]();
}, [Link]);
[Link] = [Link];
}
}

getCustomOrDefaultVal(param, useOverride = false) {


let val;

if (useOverride) {
if ([Link] &&
[Link](param)) {
val = [Link][param];
if (val != -1) {
return val;
}
}
}

return [Link]()[param];
}

useOverride(param) {
let overrideFlag = param + '.override';
return [Link] &&
[Link][overrideFlag];
}

closeTab() {
try {
[Link]();
} catch (err) {
[Link]('Error while trying to close tab', err);
}
};

reopenTab() {
[Link] = GM_openInTab([Link], { active: !
[Link]('[Link]',
[Link]('[Link]')) });
};

open(promoCodes) {
[Link] = [Link];
let navUrl = [Link];
try {
let params = [Link] || {};
[Link] = [Link] || { "test":
"test_value" };

if(promoCodes) {
navUrl = new URL('promotion/' + promoCodes[0],
[Link]);
[Link]({ schedule: [Link], siteName: [Link],
msg: `Opening ${[Link]} with ${[Link]} Promo Codes [$
{[Link](',')}]`});
[Link] = promoCodes;
}

if ([Link]) {
if([Link]([Link]) &&
[Link] > 0) {
navUrl = new URL([Link] +
[Link][[Link](0, [Link] - 1)]);
}
}

if ([Link]) {
try {
[Link] = [Link](x => [Link] ==
[Link])?.address;
if (![Link]) {
throw new Error('Address is not defined.');
}
} catch {
[Link]({ schedule: [Link], siteName:
[Link], msg: `Unable to launch ${[Link]}: Address not
detected > add it to the wallet.`});
[Link]();
return;
}
}
if([Link] == [Link]) {
[Link] = [Link]()['[Link]'] ==
'1' ? [Link](x => [Link] == 1).address : [Link];
}
[Link] = [Link]('[Link]',
[Link]('[Link]'));
[Link] = [Link];

if([Link] == [Link]) {
switch([Link]) {
case '77':
[Link] = 'fpb';
break;
case '83':
[Link] = 'fbch';
break;
case '92':
[Link] = 'shost';
break;
}
}

if([Link] == [Link]) {
[Link] = {
mode: [Link]()['[Link]'],
username: [Link]()['[Link]'],
password: [Link]()['[Link]']
};
}

[Link]([Link], [Link], navUrl,


[Link], params);
setTimeout(() => {
[Link]();
}, 15000);

if ([Link] && ![Link]) {


[Link](); // [Link]();
} else {
}

[Link]([Link]);
let noSignUpList = [ [Link], [Link],
[Link].G8, [Link].O24, [Link], [Link],
[Link], [Link] ];
let hrefOpener = [Link];
if ([Link]([Link])) {
hrefOpener = (new URL([Link],
'[Link]
}

[Link] = GM_openInTab(hrefOpener, { active: !


[Link]('[Link]',
[Link]('[Link]')) });
} catch(err) {
[Link]({ schedule: [Link], msg: `Error opening tab: ${err}`});
}
};

waitForResult() {
if([Link]()) {
return;
}

if([Link]([Link])) {
[Link](); // rename to something else...
return;
}

[Link] += 15;
if([Link]([Link]) && [Link]()) {
[Link](); // rename to something else...
return;
}

[Link](); // this should just be the error and timeout


check
return;

};

analyzeResult() {

let currentSchedule = [Link]([Link]);


[Link] = [Link] || {};
[Link] = [Link] || false;

if ([Link]) {
[Link](currentSchedule);

if ([Link]) {
[Link]({ schedule: [Link], msg: `Closing working tab per
process request` });
[Link]();
}

if ([Link]()['[Link]'] && [Link]


== [Link]) {
let promoCode =
[Link]([Link]);
if (promoCode) {
[Link] = 0;

[Link] = new Date(754000 +


+[Link]);
[Link](false);
[Link](promoCode);
return;
}
}
} else {
[Link]({ schedule: [Link], siteName: [Link], msg:
`Unable to read last run result, for ID: ${[Link]} > $
{[Link]}`});
}

[Link] = 0;
[Link] = [Link];
[Link]([Link]);
[Link](true);
[Link](true);
return;
}

waitOrMoveNext() {
if ([Link]) {
if (![Link] || ([Link] && [Link])) {
[Link] =
[Link]('[Link]',
[Link]('[Link]')) * 60 + 9999;
}
}
if (![Link]([Link]) && ![Link]()) {
[Link]({ schedule: [Link],
siteName: [Link],
elapsed: [Link],
msg: `Waiting for ${[Link]} results...`});
setTimeout(() => {
[Link]();
}, 15000);
return;
}

if ([Link]([Link])) {
[Link] = [Link]([Link]); //
[Link]([Link]);

[Link]({ schedule: [Link], siteName: [Link],


msg: `${[Link]} closed with error: $
{[Link]([Link],[Link])} $
{[Link]}`});

if([Link]()) {
return;
}
}
if ([Link]()) {
if ([Link]) {
[Link] = 0;
[Link] = null;
[Link]({ schedule: [Link], siteName: [Link],
msg: `Closing ${[Link]}` });
try {
[Link]();
} catch (err) { [Link]('Unable to close working
tab', err); }
[Link]();
return;
} else {
if([Link]) {
[Link] += 1;
} else {
[Link] = 1;
}

[Link]({ schedule: [Link], siteName: [Link],


msg: `Waited too much time for ${[Link]}
results: triggering timeout` });
}
}

[Link]();
return;
}

hasTimedOut() { // here or on a site level???


let val = [Link]('[Link]',
[Link]('[Link]')) * 60;
return ([Link] > val);
};

sleepIfBan() { // This should be a SiteType hook


if( ([Link] == [Link].IP_BAN &&
[Link]()['[Link]'] > 0)
|| ( ([Link] ==
[Link].IP_RESTRICTED || [Link] ==
[Link].IP_BAN) && [Link]()['[Link]'] > 0) ) {
if([Link] == [Link]) {
[Link]().filter(x => [Link] && [Link] ==
[Link])
.forEach( function(el) {
[Link] =
[Link]([Link]([Link]([Link]()
['[Link]'] * 60, 2)).toDate());
});
}

[Link]([Link]);
[Link](true);
[Link] = 0;
[Link] = [Link];
[Link]([Link]);
[Link](true);
return true;
}
return false;
}

updateWebListItem(currentSchedule) {
let result = [Link];

[Link]({ schedule: [Link],


msg: `Updating data: ${[Link](result)}` });
[Link] = 0;
[Link] = null;

if ([Link]) {
try {
[Link] = parseFloat([Link]);
} catch { }
if(!isNaN([Link])) {
[Link] = [Link];
[Link] += [Link];
}
}
if([Link]) {
[Link] = [Link];
}
[Link] = [Link]([Link] ?
[Link]() : null);
if([Link]) { // TODO: move to a processResult hook
for(let i = 0; i < [Link]; i++) {
let item = [Link][i];
[Link]([Link],
[Link], [Link]);
}
}
if([Link]) {
[Link]([Link]);
}
}

getNextRun(nextRollFromCountdown) {
let useCustom = [Link]('[Link]');
let useCountdown =
[Link]('[Link]', useCustom);
let nextRunMode = [Link]('[Link]',
useCustom);
let min = [Link]('[Link]',
useCustom);
let max = [Link]('[Link]',
useCustom);
let nextRun;

if (useCountdown && nextRollFromCountdown) {


nextRun = nextRollFromCountdown;
} else {
let minutes = (nextRunMode == 0) ? [Link](min, max) :
nextRunMode;
let msDelay = [Link](minutes, 1);

nextRun = [Link](msDelay).toDate();
}
nextRun = [Link](nextRun)
return nextRun;
}

errorTreatment() { // Move to group custom getNextRoll


try {
switch([Link]) {
case [Link].NEED_TO_LOGIN:
[Link] = false;
[Link] = null;
return true;
case [Link].FAUCET_EMPTY: // retry in 8 hours
[Link] = true;
[Link] = new Date(new
Date().setHours(new Date().getHours() + 8));
return true;
}
} catch {}
return false;
}

sleepCheck(nextRun) {
let useCustom = [Link]('[Link]');
let sleepMode = [Link]('[Link]',
useCustom);

if (sleepMode) {
let intNextRunTime = [Link]() * 100 +
[Link]();
let min = [Link]('[Link]',
useCustom).replace(':', '');
let max = [Link]('[Link]',
useCustom).replace(':', '');

if (+min < +max) {


if (+min < intNextRunTime && intNextRunTime < +max) {
[Link]([Link](0, 2), [Link](-2), 10, 10);
[Link]({ schedule: [Link],
msg: `Next run adjusted by Sleep Mode: $
{[Link](nextRun)}` });
}
} else if (+min > +max) {
if (intNextRunTime > +min || intNextRunTime < +max) {
[Link]([Link](0, 2), [Link](-2), 10, 10);
if ([Link]() < [Link]()) {
[Link]([Link]() + 1);
}
[Link]({ schedule: [Link],
msg: `Next run adjusted by Sleep Mode: $
{[Link](nextRun)}` });
}
}
}
return nextRun;
}

moveAfterNormalRun() {
[Link] = [Link](null);
[Link]([Link]);
[Link](true);
[Link] = 0;
[Link] = [Link];
[Link]([Link]);
[Link](true);
}

moveNextAfterTimeoutOrError() {
let useCustom = [Link]('[Link]');

let mode = [Link]('[Link]',


useCustom);
let min = [Link]('[Link]',
useCustom);
let max = [Link]('[Link]',
useCustom);

let minutes = (mode == 0) ? [Link](min, max) : mode;


let msDelay = [Link](minutes, 5);

[Link] =
[Link]([Link](msDelay).toDate());
if([Link]()) {
}

[Link]([Link]);
[Link](true);
[Link] = 0;
[Link] = [Link];
[Link]([Link]);
[Link](true);
}
}

function createManager() {
let timestamp = null;
let intervalUiUpdate;
let getFeedInterval;

let userWallet = [];

const sites = [
{ id: '1', name: 'CF ADA', cmc: '2010', coinRef: 'ADA', url: new
URL('[Link] rf: '?ref=335463', type:
[Link], clId: 45 },
{ id: '2', name: 'CF BNB', cmc: '1839', coinRef: 'BNB', url: new
URL('[Link] rf: '?ref=161127', type:
[Link], clId: 42 },
{ id: '3', name: 'CF BTC', cmc: '1', coinRef: 'BTC', url: new
URL('[Link] rf: '?ref=490252', type:
[Link], clId: 40 },
{ id: '4', name: 'CF DASH', cmc: '131', coinRef: 'DASH', url: new
URL('[Link] rf: '?ref=124083', type:
[Link], clId: 156 },
{ id: '5', name: 'CF ETH', cmc: '1027', coinRef: 'ETH', url: new
URL('[Link] rf: '?ref=204076', type:
[Link], clId: 44 },
{ id: '6', name: 'CF LINK', cmc: '1975', coinRef: 'LINK', url: new
URL('[Link] rf: '?ref=78652', type:
[Link], clId: 157 },
{ id: '7', name: 'CF LTC', cmc: '2', coinRef: 'LTC', url: new
URL('[Link] rf: '?ref=117042', type:
[Link], clId: 47 },
{ id: '8', name: 'CF NEO', cmc: '1376', coinRef: 'NEO', url: new
URL('[Link] rf: '?ref=100529', type:
[Link], clId: 158 },
{ id: '9', name: 'CF STEAM', cmc: '825', coinRef: 'STEEM', url: new
URL('[Link] rf: '?ref=117686', type:
[Link], clId: 49 },
{ id: '10', name: 'CF TRX', cmc: '1958', coinRef: 'TRX', url: new
URL('[Link] rf: '?ref=145047', type:
[Link], clId: 41 },
{ id: '11', name: 'CF USDC', cmc: '3408', coinRef: 'USDC', url: new
URL('[Link] rf: '?ref=100434', type:
[Link], clId: 51 },
{ id: '12', name: 'CF USDT', cmc: '825', coinRef: 'USDT', url: new
URL('[Link] rf: '?ref=181230', type:
[Link], clId: 43 },
{ id: '13', name: 'CF XEM', cmc: '873', coinRef: 'XEM', url: new
URL('[Link] rf: '?ref=295274', type:
[Link], clId: 46 },
{ id: '14', name: 'CF XRP', cmc: '52', coinRef: 'XRP', url: new
URL('[Link] rf: '?ref=808298', type:
[Link], clId: 48 },
{ id: '15', name: 'StormGain', cmc: '1', url: new
URL('[Link] rf: 'friend/BNS27140552', type:
[Link], clId: 35 },
{ id: '16', name: 'CF DOGE', cmc: '74', coinRef: 'DOGE', url: new
URL('[Link] rf: '?ref=97166', type:
[Link], clId: 50 },
{ id: '17', name: '[Link]', cmc: '1', url: new
URL('[Link] rf: '?r=41092365', type: [Link], clId:
36 },
{ id: '18', name: 'FaucetPay PTC', cmc: '825', url: new
URL('[Link] rf: '?r=41092365', type: [Link],
clId: 159 },
{ id: '52', name: 'BigBtc', cmc: '1', wallet: [Link].FP_BTC, url:
new URL('[Link] rf: '?id=39255652', type: [Link], clId:
200 },
{ id: '53', name: 'BestChange', cmc: '1', url: new
URL('[Link] rf: ['[Link]?
nt=bonus&p=1QCD6cWJNVH4Cdnz85SQ2qtTkAwGr9fvUk'], type: [Link], clId:
163 },
{ id: '58', name: 'BF BTC', cmc: '1', url: new
URL('[Link] rf: ['?r=608c5cfcd91e762043540fd9'], type:
[Link], clId: 1 },
{ id: '61', name: 'Dutchy', cmc: '-1', url: new
URL('[Link] rf: '?r=corecrafting', type:
[Link], clId: 141 },
{ id: '62', name: 'Dutchy Monthly Coin', cmc: '-1', url: new
URL('[Link] rf: '?r=corecrafting',
type: [Link], clId: 141 },
{ id: '68', name: 'CF SHIBA', cmc: '5994', coinRef: 'SHIBA', url: new
URL('[Link] rf: '?ref=18226', type:
[Link], clId: 167 },
{ id: '78', name: 'CF Cake', cmc: '7186', coinRef: 'CAKE', url: new
URL('[Link] rf: '?ref=699', type:
[Link], clId: 197 },
{ id: '80', name: 'FreeGRC', cmc: '833', url: new
URL('[Link] rf: '', type: [Link], clId: 207
},
{ id: '81', name: 'CF Matic', cmc: '3890', coinRef: 'MATIC', url: new
URL('[Link] rf: '?ref=6435', type:
[Link], clId: 210 },
{ id: '84', name: 'JTFey', cmc: '-1', url: new URL('[Link]
[Link]/faucet'), rf: ['?r=corecrafting'], type: [Link], clId: 213 },
{ id: '85', name: 'O24', cmc: '1', wallet: [Link].FP_BTC, url:
new URL('[Link] rf: ['?
r=1QCD6cWJNVH4Cdnz85SQ2qtTkAwGr9fvUk'], type: [Link].O24, clId: 97 },
{ id: '87', name: 'CF BTT', cmc: '16086', coinRef: 'BTT', url: new
URL('[Link] rf: '?ref=2050', type:
[Link], clId: 218 },
{ id: '89', name: 'CF BFG', cmc: '11038', coinRef: 'BFG', url: new
URL('[Link] rf: '?ref=117', type:
[Link], clId: 219 },
{ id: '93', name: 'YCoin', cmc: '1', url: new
URL('[Link] rf: ['?ref=4729452'], type: [Link],
clId: 234 },
{ id: '94', name: 'CDiversity', cmc: '-1', wallet:
[Link].FP_MAIL, url: new URL('[Link] rf: ['?
r=1J3sLBZAvY5Vk9x4RY2qSFyL7UHUszJ4DJ'], type: [Link], clId: 235 },
{ id: '96', name: 'Top Ltc', cmc: '2', wallet: [Link].FP_LTC,
url: new URL('[Link] rf: ['?
r=MWSsGAQTYD7GH5o4oAehC8Et5PyMBfhnKK'], type: [Link], clId: 239 },
{ id: '97', name: 'Top Bnb', cmc: '1839', wallet: [Link].FP_BNB,
url: new URL('[Link] rf: ['?
r=0x1e8CB8A79E347C54aaF21C0502892B58F97CC07A'], type: [Link], clId: 240 },
{ id: '98', name: 'Top Doge', cmc: '74', wallet: [Link].FP_DOGE,
url: new URL('[Link] rf: ['?
r=D8Xgghu5gCryukwmxidFpSmw8aAKon2mEQ'], type: [Link], clId: 241 },
{ id: '99', name: 'Top Trx', cmc: '1958', wallet: [Link].FP_TRX,
url: new URL('[Link] rf: ['?
r=TK3ofbD3AyXotN2111UvnwCzr2YaW8Qmx7'], type: [Link], clId: 242 },
{ id: '100', name: 'Top Eth', cmc: '1027', wallet: [Link].FP_ETH,
url: new URL('[Link] rf: ['?
r=0xC21FD989118b8C0Db6Ac2eC944B53C09F7293CC8'], type: [Link], clId: 243 },
{ id: '101', name: 'Top Bch', cmc: '1831', wallet: [Link].FP_BCH,
url: new URL('[Link] rf: ['?
r=qq2qlpzs4rsn30utrumezpkzezpteqj92ykdgfeq5u'], type: [Link], clId: 244 },
{ id: '102', name: 'Top Zec', cmc: '1437', wallet: [Link].FP_ZEC,
url: new URL('[Link] rf: ['?
r=t1erPs9qw3SgnX7kJPmR4uKFnLaoVww2jCy'], type: [Link], clId: 245 },
{ id: '103', name: 'FMonster', cmc: '825', wallet:
[Link].FP_USDT, url: new URL('[Link] rf: '', type:
[Link].O24, clId: 246 },
{ id: '104', name: 'Auto-C BNB', cmc: '1839', wallet:
[Link].FP_BNB, url: new URL('[Link] rf: ['?
r=0x1e8CB8A79E347C54aaF21C0502892B58F97CC07A'], type: [Link], clId:
247 },
{ id: '105', name: 'Auto-C DOGE', cmc: '74', wallet:
[Link].FP_DOGE, url: new URL('[Link] rf: ['?
r=D8Xgghu5gCryukwmxidFpSmw8aAKon2mEQ'], type: [Link], clId: 248 },
{ id: '106', name: 'ClClicks DOGE', cmc: '74', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 61 },
{ id: '107', name: 'ClClicks LTC', cmc: '2', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 62 },
{ id: '108', name: 'ClClicks TRX', cmc: '1958', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 63 },
{ id: '109', name: 'ClClicks BTC', cmc: '1', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 252 },
{ id: '110', name: 'ClClicks SOL', cmc: '5426', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 253 },
{ id: '111', name: 'ClClicks BNB', cmc: '1839', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 254 },
{ id: '112', name: 'CrClicks DOGE', cmc: '74', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 257 },
{ id: '113', name: 'CrClicks LTC', cmc: '2', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 258 },
{ id: '114', name: 'CrClicks TRX', cmc: '1958', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 259 },
{ id: '115', name: 'CrClicks BTC', cmc: '1', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 256 },
{ id: '116', name: 'CrClicks SOL', cmc: '5426', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 261 },
{ id: '117', name: 'CrClicks BNB', cmc: '1839', wallet:
[Link].FP_USERNAME, url: new URL('[Link] rf: ['?
r=corecrafting'], type: [Link], clId: 260 },
];

const wallet = [
{ id: '99', name: 'FaucetPay Username', type:
[Link].FP_USERNAME },
{ id: '100', name: 'FaucetPay Email', type: [Link].FP_MAIL },
{ id: '101', name: 'FaucetPay BTC (Bitcoin)', type: [Link].FP_BTC
},
{ id: '102', name: 'FaucetPay BNB (Binance Coin)', type:
[Link].FP_BNB },
{ id: '103', name: 'FaucetPay BCH (Bitcoin Cash)', type:
[Link].FP_BCH },
{ id: '104', name: 'FaucetPay DASH (Dash)', type:
[Link].FP_DASH },
{ id: '105', name: 'FaucetPay DGB (DigiByte)', type:
[Link].FP_DGB },
{ id: '106', name: 'FaucetPay DOGE (Dogecoin)', type:
[Link].FP_DOGE },
{ id: '107', name: 'FaucetPay ETH (Ethereum)', type:
[Link].FP_ETH },
{ id: '108', name: 'FaucetPay FEY (Feyorra)', type: [Link].FP_FEY
},
{ id: '109', name: 'FaucetPay LTC (Litecoin)', type:
[Link].FP_LTC },
{ id: '110', name: 'FaucetPay TRX (Tron)', type: [Link].FP_TRX },
{ id: '111', name: 'FaucetPay USDT (Tether TRC20)', type:
[Link].FP_USDT },
{ id: '112', name: 'FaucetPay ZEC (Zcash)', type:
[Link].FP_ZEC },
{ id: '113', name: 'FaucetPay SOL (Solana)', type:
[Link].FP_SOL },
{ id: '114', name: 'FaucetPay MATIC (Polygon)', type:
[Link].FP_MATIC },
{ id: '116', name: 'FaucetPay ADA (Cardano)', type: [Link].FP_ADA
},
{ id: '200', name: 'ExpressCrypto (EC-UserId-XXXXXX)', type:
[Link] },
{ id: '1', name: 'BTC Alternative Address', type: [Link] }
];

async function start() {


await [Link]();
[Link](getCFlist(), [Link]());
[Link]();
[Link]([Link]().map(x => [Link]));
update();
[Link](userWallet);
intervalUiUpdate = setInterval(readUpdateValues, 10000);
[Link]().forEach(x => {
[Link]();
});
if ([Link]('#console-log').innerText == 'Loading...') {
[Link]('#console-log').innerHTML =
'<table><tr><td><b>Running...</b></td></tr></table>';
}
getFeedInterval = setInterval(getCodesFeed, 25000);
};

let loader = function() {


async function initialize() {
setTimestamp();
await [Link]();
await initializeSites();
initializeUserWallet();
initializePromotions();
initializeHistory();
};
async function initializeSites() {
[Link](sites);
await updateSitesWithStoredData();
await addSitesToSchedules();
};
async function updateSitesWithStoredData() {
let storedData = [Link]('webList', true);
if (storedData) {
[Link]( function (stored) {
if ([Link]) {
[Link] = new URL([Link]);
[Link](stored);
}
let site = [Link]([Link]);
if (!site) {
return;
}
for (const prop in stored) {
site[prop] = stored[prop];
}
if (![Link]) {
[Link] = null;
} else {
[Link] = [Link] ? new Date([Link])
: new Date();
}
if ([Link] || [Link]) {
[Link] = false;
}
})
}
};
async function addSitesToSchedules() {
[Link]().forEach(site => {
let scheduleOfSite = [Link]([Link]);
if (!scheduleOfSite) {
[Link](`Attention! Site ${[Link]} has a reference
to a schedule that does not exist: (${[Link]})`);
scheduleOfSite = [Link]()[0];
[Link](`Assigning it to first schedule ($
{[Link]}) instead.`);
[Link] = [Link]; // use .changeSchedule
to save the change???
}
[Link](site);
});
};
function initializeUserWallet() {
addWallets();
addStoredWalletData();
};
function addWallets() {
[Link](x => [Link](x));
[Link](function (element, idx, arr) {
arr[idx].address = '';
});
};
function addStoredWalletData() {
let storedData = [Link]('userWallet', true);
if(storedData) {
[Link]( function (element) {
let idx = [Link](x => [Link] == [Link]);
if(idx != -1) {
userWallet[idx].address = [Link] ??
userWallet[idx].address;
}
});
}
};
function initializePromotions() {
let storedData = [Link]('CFPromotions', true);
if (storedData) {
let mig00200799 = false;
try {
mig00200799 = [Link]().[Link](x =>
[Link] == '00200799' && ![Link]);
} catch (err) {}
let allCFs = [Link]().map( cf =>
[Link] );
[Link]( function (element, idx, arr) {
arr[idx].added = new Date([Link]);
arr[idx].[Link]( function (el, i, a) {
a[i].execTimeStamp = ([Link] != null) ? new
Date([Link]) : null;
if (mig00200799 && [Link] == 4) {
a[i].status = 1;
}
});
[Link]( function (cf) {
if (!arr[idx].[Link]( x => [Link] == cf ))
{
let newCf = { id: cf, status: 1, execTimeStamp:
null };
arr[idx].[Link](newCf);
}
});
});
if (mig00200799) {
[Link]('00200799');
}
[Link](storedData);
}
};
function initializeHistory() {
[Link]();
};
function setTimestamp() {
timestamp = [Link]();
[Link]('timestamp', timestamp);
};
return {
initialize: initialize
};
}();
function getCodesFeed(force = false) {
clearInterval(getFeedInterval);
if (!force) {
let tryGet = [Link]()['[Link]'] || false;
if (!tryGet) {
return;
}
}

let nextFeed = [Link](2 * 60 * 60 * 1000, 4 * 60 * 60 *


1000);
getFeedInterval = setInterval(getCodesFeed, nextFeed)

GM_xmlhttpRequest({
method: "GET",
url: "[Link]
A248&requests[cf_codes]",
timeout: 10000,
onload: function(response) {
try {
let txt = [Link];
let parsed = [Link](txt);
if ([Link]) {
let newCodes = [];
for(let i = 0; i < parsed.cf_codes.length; i++) {
let item = parsed.cf_codes[i];
let newCode = {};
[Link] = [Link];
[Link] = item.is_one_time == '1';
newCode['expiration' + 'Date'] =
item.expiration_date.replace(' ', 'T') + 'Z';
newCode['expiration' + 'Date'] = new
Date(newCode['expiration' + 'Date']);
[Link](newCode);
}
[Link](newCodes);

[Link]([Link]());
}
} catch(err) {
[Link]('unexpected error parsing codes list');
[Link](err);
}
},
onerror: function(e) {
[Link]('error getting codes');
[Link](e);
},
ontimeout: function() {
[Link]('timeout getting codes');
},
});
}
function readUpdateValues(forceCheck = false) {
readPromoCodeValues();
readModalData();

if(true) {
let updateDataElement = [Link]('update-data');
let updateValues = [Link]();

if (updateValues != '') {
[Link] = '';
let updateObj = [Link](updateValues);
if([Link]) {
[Link](function (element, idx,
arr) {
try {
let site = [Link]([Link]);

[Link] = [Link];

if ([Link] != [Link]) {
[Link] = [Link];
if([Link]) {
[Link] = new Date(idx);
} else {
[Link] = null;
}
}
[Link]({ schedule: [Link],
msg: `Faucet updated. New name: $
{[Link]}. Active: ${[Link]}` });
} catch (err) {
[Link]({ schedule: [Link],
msg: `Error updating faucet data: ${err}` });
}
});
}

if([Link]) {
[Link](function (element) {
try {
let itemIndex = [Link](x => [Link] ==
[Link]);
userWallet[itemIndex].address = [Link];

[Link]({ msg: `Wallet Address updated [$


{userWallet[itemIndex].name}]: ${userWallet[itemIndex].address}` });
} catch (err) {
[Link]({ msg: `Error updating wallet/address: $
{err}` });
}
});

[Link](userWallet);
saveUserWallet();
}

if([Link]) {
try {
[Link]([Link]);
[Link]({ msg: `Config updated. Reloading in a few
seconds...` });
[Link]();
return;
} catch (err) {
[Link]({ msg: `Error updating config: ${err}` });
}

if([Link]) {
[Link]( (x) => {
try {
updateSite([Link], [Link]);
} catch (err) {
[Link]({ msg: `Error updating site: ${err}` });
}
});
}

if([Link] || [Link] ||
[Link]) {
resyncAll({ withUpdate: true });
return;
}
}
}
if(forceCheck) {
resyncAll({ withUpdate: false });
}
};
function resyncAll(options = { withUpdate: false} ) {
if ([Link]) {
update(true);
}
[Link]().forEach(x => {
[Link]();
});
}
function updateSite(id, items) {
let site = [Link](id);
if (site) {
[Link] = [Link] || {};
[Link]( (item) => {
[Link][[Link]] = [Link];
});

[Link]({ schedule: [Link], siteName: [Link],


msg: `Site ${[Link]} updated` });
}
}
function readModalData() { // This should be migrated and dissapear!
if([Link]('modal-spinner').isVisible()) {
let targetObject = [Link]([Link]('target-
spinner').innerHTML);
let target = [Link];
if (target == 'modal-ereport') {
let temp = [Link]();
[Link]('log-textarea').value = [Link]('\
n');
} else if (target == 'modal-config') {
[Link]([Link]());
} else if (target == 'modal-site') {
let site = [Link]([Link]);
[Link](site,
[Link]());
}
[Link]('modal-spinner').[Link]('d-
none');
[Link](target).[Link]('d-none');
[Link]('target-spinner').innerHTML = '';
}
}
function sortSites () { // Temporary, just to decouple it...
[Link]();
[Link]().forEach( schedule => [Link]() );
};
function update(sortIt = true) {
if(sortIt) {
sortSites();
[Link]().forEach( schedule => [Link]() );
}

[Link]();
[Link]().forEach(site => {
[Link](site);
});
[Link]([Link]().map(x => [Link]));
convertToFiat();
[Link](); // y reordenar
[Link]([Link]());
updateRollStatsSpan();
};

function saveUserWallet() {
const data = [Link](x => {
return {
id: [Link],
address: [Link]
};});

[Link]('userWallet', data, true);


}

function isObsolete() {
let savedTimestamp = [Link]('timestamp');
if (savedTimestamp && savedTimestamp > timestamp) {
[Link]({ msg: '<b>STOPING EXECUTION!<b> A new Manager UI window was
opened. Process should continue there' });
clearInterval(intervalUiUpdate);
return true;
}
return false;
};

function readPromoCodeValues() {
let promoCodeElement = [Link]('promo-code-new');
let promoDataStr = [Link]();

if (promoDataStr == '') {
return;
}

let promoData = [Link](promoDataStr);

if([Link]) {
switch ([Link]) {
case 'FORCESTOPFAUCET':
[Link]().forEach(s => {
if ([Link] != [Link]) {
[Link] = false;
[Link]();
}
});

update(true);
[Link]('all');
setTimeout(() => {
[Link]();
}, 3000);

[Link] = '';
break;
case 'ADD':
[Link]([Link], [Link]);
[Link] = '';
[Link]('promo-text-input').value = '';
[Link]("Code " + [Link] + " added!");
[Link]({ msg: `Promo code ${[Link]} added` });

[Link]([Link]());
break;
case 'REMOVEALLPROMOS':
[Link]();
[Link] = '';
[Link]("Promo codes removed!");
[Link]({ msg: `Promo codes removed` });

[Link]([Link]());
break;
case 'REMOVE':
if([Link]([Link], [Link]) != -1)
{
[Link]({ msg: `Promo code ${[Link]}
removed` });
} else {
[Link]({ msg: `Unable to remove code ${[Link]}`
});
}
[Link] = '';

[Link]([Link]());
break;
case 'TRYGETCODES':
getCodesFeed(true);
[Link] = '';
[Link]("Looking for new codes!");
break;
}
}
};

function updateRollStatsSpan() {
let rollsSpanElement = [Link]('rolls-span');
[Link] = [Link]().join(',');
};

function getCFlist() {
let items;
items = [Link]().filter(f => [Link] === [Link]);
items = [Link](x => {
return {
id: [Link],
name: [Link]
};});
[Link]((a, b) => ([Link] > [Link]) ? 1 : -1);

return items;
};

function closeWorkingTab(schedule) {
let sc = [Link]().find(x => [Link] == schedule);
if (sc) [Link]()
};
function reloadWorkingTab(schedule) {
let sc = [Link]().find(x => [Link] == schedule);
if (sc) {
[Link]();
[Link]();
}
};
function getAllSites() {
return [Link]();
}
return{
start: start,
getFaucetsForPromotion: getCFlist,
closeWorkingTab: closeWorkingTab,
reloadWorkingTab: reloadWorkingTab,
getAllSites: getAllSites,
resyncAll: resyncAll,
isObsolete: isObsolete,
update: update,
userWallet: userWallet,
readUpdateValues: readUpdateValues
};
}
function createUi() {

let injectables = {
managerJs: function () {

[Link] = null;
[Link] = [Link];

[Link] = function sendErrorReport() {


try {
let header = new Headers();
[Link]("Content-Type", "application/json");
let description = [Link]("log-
message").value;
let log = [Link]("log-
textarea").[Link]('\n');
let content = {"description":description, "log":log};
let opt = { method: "POST", header, mode: "cors", body:
[Link](content) };

fetch("[Link]
opt).then(response => {
}).catch(err => {
[Link]("[error] " + [Link]);
});
} catch { }
};

[Link] = function getUpdateObject() {


let updateObject;
var updateData = [Link]("update-data");
if ([Link] != "") {
updateObject = [Link]([Link]);
} else {
updateObject = { runAsap: { ids: [], changed: false},
editSingle: { changed: false, items: [] }, wallet: { changed: false, items: []},
config: { changed: false, items: []}, site: { changed: false, list: []} };
}
return updateObject;
};

[Link] = function removePromoCode(id, code) {


var promoCode = [Link]("promo-code-new");
var promoObject = { action: "REMOVE", id: id, code: code };
[Link] =[Link](promoObject);
};

[Link] = {
save: function() {
let updateObject = getUpdateObject();
[Link]("#wallet-table-body tr").forEach(
function(row) {
let textInput = [Link](".em-input input");
if([Link] != [Link]) {
let single = { id: [Link], address:
[Link]() };
[Link](single);
[Link] = true;
}
});
if([Link]) {
[Link]("update-data").innerHTML =
[Link](updateObject);
toastr["info"]("Wallet will be updated as soon as
possible");
}
},
toggleJson: function(val) {
if ([Link]('#wallet-json').isVisible()) {
if(val != 'cancel') {
[Link]();
}
} else {
[Link]();
}
[Link]('.footer-json').[Link]('d-
none');
[Link]('.footer-
table').[Link]('d-none');
[Link]('#wallet-
table').[Link]('d-none');
[Link]('#wallet-json').[Link]('d-
none');
},
toJson: function() {
let j = [];
[Link]('#wallet-table-body
tr').forEach(function (row) {
[Link]({ id: [Link], address:
[Link]('.em-input input').value });
});
[Link]('#wallet-json').value =
[Link](j);
},
fromJson: function() {
let j = [Link]([Link]('#wallet-
json').value);
[Link]('#wallet-table-body
tr').forEach(function (row) {
let element = [Link](x => [Link] == [Link]);
if (element) {
[Link]('.em-input input').value =
[Link];
}
});
},
cancel: function() {
[Link]("#wallet-table-body .em-input
input").forEach( function(x) {
[Link] = [Link];
});
}
};

[Link] = {
save: function() {
let updateObject = getUpdateObject();
[Link]("#modal-config [data-original]
[data-prop]").forEach(function(elm) {
let single = { prop: [Link], value:
[Link] };
if([Link] != [Link] && ([Link] ==
"select-one" || [Link] == "text" || [Link] == "password" || [Link] ==
"number" || [Link] == "time") ) {
[Link] = [Link];
[Link](single);
[Link] = true;
} else if ([Link] == "checkbox" &&
(([Link] == "0" && [Link]) || ([Link] == "1" && !
[Link])) ) {
[Link] = [Link];
[Link](single);
[Link] = true;
}
});
if([Link]) {
[Link]("update-data").innerHTML =
[Link](updateObject);
toastr["info"]("Config will be updated as soon as
possible");
}
},
cancel: function() {
[Link]("#modal-config [data-original]
[data-prop]").forEach(function(elm) {
if([Link] == "select-one" || [Link] == "text" ||
[Link] == "password" || [Link] == "number" || [Link] == "time") {
[Link] = [Link];
} else if ([Link] == "checkbox") {
[Link] = ([Link] == "1" ? true :
false)
}
});
}
};
[Link] = {
save: function() {
let updateObject = getUpdateObject();
let faucet = { id: [Link]("#faucet-
name").[Link], items: [] };
[Link]("#modal-site [data-original]
[data-site-prop]").forEach(function(elm) {
let single = { prop: [Link], value:
[Link] };
if([Link] != [Link] && ([Link] ==
"select-one" || [Link] == "text" || [Link] == "password" || [Link] ==
"number" || [Link] == "time") ) {
[Link] = [Link];
[Link](single);
[Link] = true;
} else if ([Link] == "checkbox" &&
(([Link] == "0" && [Link]) || ([Link] == "1" && !
[Link])) ) {
[Link] = [Link];
[Link](single);
[Link] = true;
}
});
if([Link]) {
[Link](faucet);
[Link]("update-data").innerHTML =
[Link](updateObject);
toastr["info"]("Site will be updated as soon as
possible");
}

},
cancel: function() {
[Link]("#modal-site [data-original]
[data-site-prop]").forEach(function(elm) {
if([Link] == "select-one" || [Link] == "text" ||
[Link] == "password" || [Link] == "number" || [Link] == "time") {
[Link] = [Link];
} else if ([Link] == "checkbox") {
[Link] = ([Link] == "1" ? true :
false)
}
});
}
};

[Link] = {
save: function() {
sendErrorReport();
},
cancel: function() {
}
};

[Link] = function modalSave(content) {


switch(content) {
case "wallet":
[Link]();
break;
case "ereport":
[Link]();
break;
case "config":
[Link]();
break;
case "site":
[Link]();
break;
case "slAlert":
[Link]();
break;
}
};

[Link] = function modalCancel(content) {


if(content == "wallet") {
[Link]();
} else if ("ereport") {
[Link]();
}
[Link]("modal-content").forEach(x =>
[Link]("d-none"));
};

[Link] = function updateValues(type, values) {


let updateObject = getUpdateObject();
if (type == "runAsap") {
[Link]([Link]);
[Link] = true;
[Link]("update-data").innerHTML =
[Link](updateObject);
[Link]("Faucet will be updated to run as soon as
possible");
}
};

[Link] = null;
[Link] = function
startSchedulesInterval(uuids) {
if ([Link]) {
clearInterval([Link]);
}

let innerWaitTimes = '';


[Link](x => {
innerWaitTimes += `<span data-schedule="${x}" data-
nextroll="UNDEFINED" class="mx-1"><i class="fas fa-square pr-1" style="color: #$
{x};"></i><span></span></span>`;
});

let container = [Link]('#wait-times');


[Link] = innerWaitTimes;
[Link] = setInterval(() => {
[...[Link]('#wait-times >
span')].forEach(sp => {
let nroll = [Link]('data-nextroll');
let spanScheduleId = [Link]('data-schedule');
if (nroll == 'UNDEFINED') {
[Link]('span').innerText = '-';
} else if (nroll == 'RUNNING') {
[Link]('span').innerText = 'Running';
let inUseElm = [Link](`#schedule-
table tr[data-schedule="${spanScheduleId}"]`);
if (inUseElm) {
[Link]('in-use');
}
} else {
let timeVal = +nroll - [Link]();
[Link]('span').innerText =
[Link]();
if (timeVal < -60000) {
[Link](`Resync required: ${timeVal}`);
}
}
})
}, 1000);
}
[Link] = {
open: function (req, details = null, params = null) {
let btn = [Link]("confirm-req-btn");
[Link]('data-request', req);
[Link]('data-params', params ?
[Link](params) : '{}');

if(details) {
[Link]("#confirmable-modal
p").innerText = details;
}
return;
},
accept: function () {
let btn = [Link]("confirm-req-btn");
let req = { type: '', params: {}};
[Link] = [Link]('data-request');
[Link] = [Link]([Link]('data-params'));
switch([Link]) {
case 'removeAllPromos':
[Link]();
break;
case 'forceStopFaucet':
[Link]();
break;
default:
break;
}
}
}

[Link] = function removeAllPromos() {


var promoCode = [Link]("promo-code-new");
var promoObject = { action: "REMOVEALLPROMOS" };
[Link] =[Link](promoObject);
toastr["info"]("Removing all promo codes... please wait");
};

[Link] = function forceStopFaucet() {


var promoCode = [Link]("promo-code-new");
var promoObject = { action: "FORCESTOPFAUCET" };
[Link] =[Link](promoObject);
toastr["info"]("Trying to stop... Please wait for reload");
};

[Link] = function openStatsChart() {


if(myBarChart) { [Link](); }
let statsFragment = [Link]("stats-fragment");
if ([Link] === "block")
{ [Link] = "none"; [Link]("stats-
button").innerText = "Lucky Number Stats"; } else {
[Link] = "block";
[Link]("stats-button").innerText = "Close Stats";
var canvas = [Link]("barChart");
var ctx = [Link]("2d");
var dataSpan = [Link]("rolls-span");
var data = {
labels: ["0000-9885", "9886-9985", "9986-9993", "9994-
9997", "9998-9999", "10000"],
datasets: [ { fill: false, backgroundColor:
[ "#990000", "#660066", "#000099", "#ff8000", "#ffff00", "#00ff00"],
data: [Link](",") } ] };
var options = { plugins: { legend: { display: false } },
title: { display: true, text: "Rolled Numbers", position: "top" }, rotation: -0.3 *
[Link] };
myBarChart = new Chart(ctx, { type: "doughnut", data: data,
options: options });
}
};

[Link] = {
load: function(id, destination) {
let hideShortlinkAlerts =
[Link]("hideShortlinkAlerts");
hideShortlinkAlerts = hideShortlinkAlerts ?
[Link](hideShortlinkAlerts) : false;

if (hideShortlinkAlerts) {
} else {
[Link](id).[Link]("d-none");
}
},
save: function () {
[Link]("hideShortlinkAlerts",
[Link]([Link]("hideShortlinkAlerts").checked));
[Link]("[Link] "_blank");
}
}
}
};

let logLines = [];


function init(cfFaucets, schedules) {
appendJavaScript();
appendHtml(schedules);
updateSchedulesToggler();
appendEventListeners();
appendWidgets();
setupEventerListeners();

createPromoTable(cfFaucets);
try {
[Link]('.page-title h1').innerHTML = 'Auto Claim';
} catch (err) {}
};
function setupEventerListeners() {
[Link]('siteUpdated', (site) => {
[Link](); // en todos los sites...
let schedule = [Link]([Link]);
[Link](); // solo en el schedule de este site
[Link](); // solo en el schedule de este site
[Link]();
[Link](site); // solo la row de este site
[Link](); // y reordenar

[Link](); // solo en el schedule de este site


convertToFiat();
});
}
function appendWidgets() {
$('.tableSortable').sortable({
placeholder:'sort-highlight',
handle:'.row-handle',
cursor: 'grabbing',
axis: 'y',
stop: function(event, ui) {
$("[Link]-sortable tr").each(function(index) {
$(this).attr("data-order", index);
});
}
});
$('#promo-daily').bootstrapSwitch();
$('#bss-log').bootstrapSwitch({
onSwitchChange(event, state) {
$('#console-log').collapse('toggle');
},
onInit: function(event, state) {
this.$[Link]('.bootstrap-switch-
container').find('.bootstrap-switch-handle-on').first().addClass('fa fa-
eye').text('');
this.$[Link]('.bootstrap-switch-
container').find('.bootstrap-switch-handle-off').first().addClass('fa fa-eye-
slash').text('');
}
});
};
function updateSchedulesToggler() {
let container = [Link]('#schedules-toggler');
let html = '<label class="btn btn-outline-primary active" data-
schedule="all"><input type="radio" name="options" autocomplete="off"
checked="true"> All</label>';
[Link]().forEach(x => {
html += `<label class="btn btn-outline-primary" data-schedule="$
{[Link]}">
<i class="fas fa-square pr-1" style="color: #${[Link]};"></i>$
{[Link]}
<input type="radio" name="options" autocomplete="off">
</label>`;
});
[Link] = html;
startSchedulesInterval([Link]().map(x => [Link]));
[Link]('all');
};
function appendEventListeners() {
[Link]('.dropdown-settings-
menu').addEventListener('click', function(e) {
let actionElement = [Link] === 'I' ?
[Link] : [Link];
if ([Link]) {
[Link]();
[Link]([Link]);
}
});

const modalSchedules = [Link]('#modal-schedules');


[Link]('click', function(e) {
let actionElement = [Link] === 'I' ?
[Link] : [Link];
if ([Link]('action-schedule-add')) {
[Link]();
let rows = [Link]('table tbody tr');
let rndColor = [Link]();
let rowTemplate = [Link]({
uuid: rndColor,
name: rndColor,
order: [Link],
added: true
});
$([Link]('table tbody tr:last-
child')).after(rowTemplate);
[Link]('table tbody tr:last-
child .color-picker');
} else if ([Link]('action-schedule-
remove')) {
let rows = [Link]('table tbody
tr:not(.d-none)');
if ([Link] <= 1) {
alert('You need to keep at least 1 schedule');
} else {
let current = [Link]('tr');
if ([Link] === 'true') {
[Link]();
} else {
[Link] = 'true';
[Link]('d-none');
}
}
} else if ([Link]('modal-save')) {
let data =
[Link]([Link]('table'));
let isValid = [Link](data);
updateSchedulesToggler();
[Link]({withUpdate: true});
if (!isValid) {
[Link]('Some schedules might have errors/invalid
colors', 'warning');
}
}
});
};
function appendJavaScript() {
addJS_Node (null, null, [Link]);
};
function addCardHtml(obj) {
return `<div class="card m-1"><div
class="card-header">${[Link]}</div><div class="card-body
px-4">${[Link]}</div></div>`;
};
function addRandomBetween(propSelect, propMin, propMax) {
return `<table><tr><td>
<select class="form-control" ${[Link]}="$
{[Link]}">
<option value="0">Random between...</option><option value="15">15
minutes</option><option value="30">30 minutes</option><option value="35">35
minutes</option><option value="45">45 minutes</option><option value="65">65
minutes</option><option value="90">90 minutes</option><option value="120">120
minutes</option>
</select></td>
<td><input type="number" data-original="" ${[Link]}="$
{[Link]}" min="1" value="15" step="5"
class="form-control"></td><td>and</td><td><input type="number" data-original="" $
{[Link]}="${[Link]}" value="65" step="5"
class="form-control"></td><td>minutes</td></tr></table>`;
}
function appendHtml(schedules) {
let html ='';
let tgt = [Link]('[Link]-3');
if (tgt) {
let rowDiv = [Link]('div');
[Link] = '<div class="row py-3 ac-log"><div class="col-12
justify-content-center"><div class="card"><div class="card-body" id="referral-
table"></div></div></div></div>';
[Link](rowDiv);
}

html += '<div class="modal fade" id="confirmable-modal" tabindex="-1"


role="dialog" aria-hidden="true">';
html += '<div class="modal-dialog modal-sm modal-dialog-centered"><div
class="modal-content">';
html += '<div class="modal-header"><h4 class="modal-title">Are you
sure?</h4><button type="button" class="close" data-dismiss="modal" aria-
label="Close"><span aria-hidden="true">×</span></button></div>';
html += '<div class="modal-body"><p></p></div>';
html += '<div class="modal-footer justify-content-between"><button
type="button" class="btn btn-default" data-dismiss="modal">No</button>';
html += '<button type="button" class="btn btn-primary" data-
dismiss="modal" id="confirm-req-btn"
onclick="[Link]()">Yes</button></div>';
html += '</div></div>';
html += '</div>';

html += '<div class="modal fade" id="modal-dlg" tabindex="-1"


role="dialog" data-backdrop="static" aria-hidden="true">';
html += ' <div class="modal-dialog modal-lg modal-dialog-centered
modal-dialog-scrollable" role="document">';
html += '<div class="modal-content bg-beige" id="modal-spinner"><div
class="modal-body"><div class="d-flex justify-content-center"><span id="target-
spinner" class="d-none"></span><span class="spinner-border spinner-border-sm"
role="status" aria-hidden="true"></span>Loading data</div></div></div>';

html += ' <div class="modal-content bg-beige d-none" id="modal-


ereport">';
html += ' <div class="modal-header"><h5 class="modal-title"><i
class="fa fa-history"></i> Submit an Error</h5></div>';
html += ' <div class="modal-body">';
html += ' <div class="alert alert-danger">Don\'t send private
information as data might be publicly access.</div>';
html += ' <textarea rows="4" id="log-message" class="form-control"
placeholder="PLEASE do not send logs without describing here the issue you are
facing..."></textarea>';
html += ' <label for="log-textarea">Log</label>';
html += ' <textarea rows="10" id="log-textarea" class="form-
control"></textarea>';
html += ' </div>';
html += ' <div class="modal-footer"><a class="btn m-2 anchor btn-
outline-danger align-middle" onclick="modalCancel(\'ereport\')" data-
dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += ' <a class="btn m-2 anchor btn-outline-success align-middle"
onclick="modalSave(\'ereport\')" data-dismiss="modal"><i class="fa fa-paper-
plane"></i> Send</a></div>';
html += ' </div>';

html += ' <div class="modal-content bg-beige d-none" id="modal-


wallet">';
html += ' <div class="modal-header"><h5 class="modal-title"><i
class="fa fa-wallet"></i> Your Addresses</h5></div>';
html += ' <div class="modal-body">';
html += ' <div><table class="table custom-table-striped"
id="wallet-table">';
html += ' <thead><tr><th class="">Name</th><th
class="">Address</th></tr></thead>';
html += ' <tbody class="overflow-auto" id="wallet-table-
body"></tbody></table><textarea rows="14" id="wallet-json" class="d-none
w-100"></textarea>';
html += ' </div>';
html += ' </div>';
html += '<div class="modal-footer">';
html += '<div class="footer-json d-none">';
html += '<a class="btn m-2 anchor btn-outline-danger align-middle"
onclick="[Link](\'cancel\')"><i class="fa fa-times-circle"></i>
Cancel</a>';
html += '<a class="btn m-2 anchor btn-outline-primary align-middle"
onclick="[Link]()"><i class="fa fa-edit"></i> Confirm</a></div>';
html += '<div class="footer-table"><a class="btn m-2 anchor btn-
outline-primary align-middle" onclick="[Link]()"><i class="fa fa-
edit"></i> Edit as JSON</a>';
html += '<a class="btn m-2 anchor btn-outline-danger align-middle"
onclick="modalCancel(\'wallet\')" data-dismiss="modal"><i class="fa fa-times-
circle"></i> Cancel</a>';
html += '<a class="btn m-2 anchor btn-outline-success align-middle"
onclick="modalSave(\'wallet\')" data-dismiss="modal"><i class="fa fa-check-
circle"></i> Save</a></div></div>';
html += ' </div>';
html += ' <div class="modal-content bg-beige d-none" id="modal-
info">';
html += ' <div class="modal-header"><h5 class="modal-title"><i
class="fa fa-info"></i> Info</h5></div>';
html += ' <div class="modal-body">';
html += '<ul>';
html += '<li>First of all, make sure you visit our <a
href="[Link] target="_blank">discord</a> server for
specific issues with the script. Unfortunately, our original server and user
account was disabled after +2 years. We are trying to bring the community together
in a new one now.</li>';
html += `<li>The script comes with <b>2 schedules</b> (Default and CF).
You can add more from <i>Settings > Schedules...</i><br>About the
<i>Schedules</i>:`;
html += `<ul><li>Each schedule will open a new tab, so:<br>N schedules
= N simultaneous tabs.</li>`;
html += `<li>Each schedule has it's own list of sites.<br>You can have
N sites per schedule, but each site can be in just 1 schedule to avoid
overlapping.</li>`;
html += `<li>We suggest you to test how many tabs you can run
simultaneously before creating too many schedules.<br>Usually, with 4 or 5 it will
run smoothly.</li></ul>`;
html += `</li>`;
html += '<li>Almost all sites in the list require an external hCaptcha
solver or similar scripts/extensions. You can find our free suggestions in Settings
> Other requirements...</li>';
html += '<li>Stormgain requires a GeeTest solver. You can use <a
href="[Link] target="_blank">this script</a> to
solve the captchas through 2Captcha API service.</li>';
html += `<li>Some sites pay directly to <a href="[Link]
r=freebtc" target="_blank"><i class="fa fa-external-link-alt"></i> FaucetPay</a>.
You need to add your FP addresses at <i>Settings > Wallet...</i> to claim from
those sites.</li>`;
html += `<li>You can set default configurations at <i>Settings >
Defaults...</i></li>`;
html += `<li>At <i>Settings > Defaults</i>, you will also find <i>Site
Specific</i> settings like credentials for auto login.</li>`;
html += '<li>You can override configurations for a specific site using
the edit (<i class="fa fa-clock"></i>) buttons</li>';
html += '<li>When enabling a new site, try it first with the tab on
focus, to detect potential issues</li>';
html += '</ul>';
html += ' </div>';
html += '<div class="modal-footer">';
html += '<a class="btn m-2 anchor btn-outline-warning align-middle"
data-dismiss="modal"><i class="fa fa-edit"></i> Close</a></div>';
html += ' </div>';

html += '<div class="modal-content bg-beige" id="modal-schedules">';


html += ' <div class="modal-header py-2"><h5 class="modal-title"><i
class="fa fa-stopwatch"></i> Schedules</h5>';
html += ' <div class="ml-auto"><button type="button" class="btn
btn-default btn-sm action-schedule-add">';
html += ' <i class="fa fa-plus"></i> Add Schedule';
html += ' </button></div>';
html += ' </div>';
html += ' <div class="modal-body">';
html += '<div class="callout callout-warning m-0"><p class="text-
justify">Each schedule opens sites in a new/different tab.<br>Colors must be
unique.</p></div>';
html += ' <table class="table">';
html += ' <thead>';
html += ' <tr><th></th><th class="text-center"
width="35%">Color</th><th class="text-center">Name</th><th></th></tr>';
html += ' </thead>';
html += ' <tbody class="tableSortable">';
html += ' </tbody>';
html += ' </table>';
html += ' </div>';
html += ' <div class="modal-footer">';
html += ' <a class="btn m-2 anchor btn-outline-danger align-middle"
data-dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += ' <a class="btn m-2 anchor btn-outline-success align-middle
modal-save" data-dismiss="modal"><i class="fa fa-check-circle"></i> Save</a>';
html += ' </div>';
html += '</div>';

html += '<div class="modal-content bg-beige" id="modal-assign-


schedule">';
html += ' <div class="modal-header py-2"><h5 class="modal-title"><i
class="fa fa-exchange-alt"></i> Move to...</h5>';
html += ' </div>';
html += ' <div class="modal-body">';
html += ' <div class="form-container">';
html += ' <input type="hidden" name="site_id" value="not_set">';
html += ' <input type="hidden" name="original_schedule_id"
value="not_set">';
html += ' <label class="control-label">Schedule</label>';
html += ' <select class="form-control" name="schedule">';
html += ' </select>';
html += ' </div>';
html += ' </div>';
html += ' <div class="modal-footer">';
html += ' <a class="btn m-2 anchor btn-outline-danger align-middle"
data-dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += ' <a class="btn m-2 anchor btn-outline-success align-middle
modal-save" data-dismiss="modal"><i class="fa fa-check-circle"></i> Save</a>';
html += ' </div>';
html += '</div>';

html += '<div class="modal-content bg-beige" id="modal-add-site">';


html += ' <div class="modal-header py-2"><h5 class="modal-title"><i
class="fa fa-code"></i> Add Site...</h5>';
html += ' </div>';
html += ' <div class="modal-body">';
html += ' <div class="form-container">';
html += [Link]({ required: true, name:
'site_name', value: '', text: 'Display name'});
html += [Link]({ required: true, name: 'site_url',
value: '', text: 'Url to open', placeholder: 'Example: [Link]
});
html += ' <label class="control-label">Schedule</label>';
html += ' <select class="form-control" name="schedule">';
html += ' </select>';
html += ' </div>';
html += ' </div>';
html += ' <div class="modal-footer">';
html += ' <a class="btn m-2 anchor btn-outline-danger align-middle"
data-dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += ' <a class="btn m-2 anchor btn-outline-success align-middle
modal-save" data-dismiss="modal"><i class="fa fa-check-circle"></i> Save</a>';
html += ' </div>';
html += '</div>';

html += '<div class="modal-content bg-beige" id="modal-site-


parameters">';
html += ' <div class="modal-header py-2"><h5 class="modal-title"><i
class="fa fa-edit"></i> Edit Site Arguments...</h5>';
html += ' </div>';
html += ' <div class="modal-body">';
html += ' <div class="form-container"><form action="">';
html += ` <div>Soon you'll be able to edit the site's specific
settings here (credentials, withdrawal configuration, etc.)<br>`;
html += `You'll also see the site specific requirements, like required
captcha solvers.<br>Meanwhile, go to Settings > Defaults > Site Specifics.<br>If
there's something to configurate for this site, it'll be listed there.`;
html += `<br>You can find a general requirements list in Settings >
Other requirements...</div>`;
html += ' </form></div>';
html += ' </div>';
html += ' <div class="modal-footer">';
html += ' <a class="btn m-2 anchor btn-outline-danger align-middle"
data-dismiss="modal"><i class="fa fa-times-circle"></i> Close</a>';
html += ' </div>';
html += '</div>';

html += ' <div class="modal-content bg-beige d-none" id="modal-


slAlert">';
html += ' <div class="modal-header"><h5 class="modal-
title">Attention</h5></div>';
html += ' <div class="modal-body">';
html += ' <div class="alert alert-warning">You will be redirected
to a shortlink, and after completing it the new Twitter Daily Promo Code will be
added to your table.<br>';
html += 'This is an optional contribution. You can still get the code
the old fashion way.</div>';
html += [Link]('id', 'hideShortlinkAlerts',
`Stop warning me before a shortlink`);
html += ' </div>';
html += '<div class="modal-footer"><a class="btn m-2 anchor btn-
outline-danger align-middle" onclick="modalCancel(\'slAlert\')" data-
dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += '<a class="btn m-2 anchor btn-outline-success align-middle"
onclick="modalSave(\'slAlert\')" data-dismiss="modal"><i class="fa fa-external-
link-alt"></i> Lets Go!</a></div>';
html += ' </div>';

html += ' <div class="modal-content bg-beige d-none" id="modal-


site">';
html += ' <div class="modal-header"><h5 class="modal-title"><i
class="fa fa-clock"></i> <span id="faucet-name" data-id=""></span> Schedule
Parameters</h5></div>';
html += ' <div class="modal-body">';
html += ' <div class="alert alert-warning">Override Settings for
the selected faucet.<br>Faucet-specific configurations will be moved here
soon.</div>';
html += ' <div class="row">';

html += ' <div class="col-md-12 col-sm-12">';


html += addCardHtml({
header: [Link]('data-site-prop',
'[Link]', 'Override Work Mode'),
body: [Link]('data-site-prop',
'[Link]', 'Open tab in background')
});
html += addCardHtml({
header: [Link]('data-site-prop',
'[Link]', 'Override Next Run'),
body: `<div>${[Link]('data-site-prop',
'[Link]', 'Use faucet countdown when possible')}</div>` +
`<label class="control-label">Otherwise wait:</label>` +
addRandomBetween({ name: 'data-site-prop', value:
'[Link]' }, { name: 'data-site-prop', value: '[Link]' },
{ name: 'data-site-prop', value: '[Link]' })
});
html += addCardHtml({
header: [Link]('data-site-prop',
'[Link]', 'Override Sleep Mode'),
body: [Link]('data-site-prop',
'[Link]', 'Sleep mode') +
`<table><tr><td>Don't claim between </td><td><input type="time"
data-original="" data-site-prop="[Link]"
class="form-control"></td><td>and</td>
<td><input type="time" data-original="" data-site-
prop="[Link]" class="form-control"></td></tr></table>`
});
html += ' <div class="card m-1"><div class="card-
header">Timeout</div>';
html += ' <div class="card-body px-4">';
html += addCardHtml({
header: [Link]('data-site-prop',
'[Link]', 'Override Timeout'),
body: `<table><tr><td>After</td><td><input type="number" data-
original="" data-site-prop="[Link]" min="2" value="5" step="1"
class="form-control"></td><td>minutes</td></tr></table>`
});
html += addCardHtml({
header: [Link]('data-site-prop',
'[Link]', 'Override Postpone'),
body: `<label class="control-label">After timeout/error, postpone
for:</label>` +
addRandomBetween({ name: 'data-site-prop', value:
'[Link]' }, { name: 'data-site-prop', value:
'[Link]' }, { name: 'data-site-prop', value:
'[Link]' })
});
html += ' </div>';
html += ' </div>';
html += ' </div>';
html += ' </div>';
html += ' </div>';
html += '<div class="modal-footer"><a class="btn m-2 anchor btn-
outline-danger align-middle" onclick="modalCancel(\'site\')" data-
dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += '<a class="btn m-2 anchor btn-outline-success align-middle"
onclick="modalSave(\'site\')" data-dismiss="modal"><i class="fa fa-check-
circle"></i> Save</a></div>';
html += ' </div>';

html += '<div class="modal-content bg-beige d-none" id="modal-


config">';
html += ' <div class="modal-header"><h5 class="modal-title"><i
class="fa fa-cog"></i> Settings</h5></div>';
html += ' <div class="modal-body">';
html += ' <div class="row">';

html += ' <div class="col-md-12 col-sm-12">';


html += ' <div class="card card-info m-1"><div class="card-
header">Defaults<div class="card-tools"><button type="button" class="btn btn-white
btn-sm" data-card-widget="collapse" title="Collapse"><i class="fas
fa-minus"></i></button></div></div>';
html += ' <div class="card-body px-4">';
html += `<div>${[Link]('data-prop',
'[Link]', 'Open tabs in background')}</div>`;
html += `<div>${[Link]('data-prop',
'[Link]', 'Use extra timer to detect ad redirects faster')}</div>`;

html += addCardHtml({
header: 'Next Run',
body: `<div>${[Link]('data-prop',
'[Link]', 'Use faucet countdown when possible')}</div>` +
`<label class="control-label">Otherwise wait:</label>` +
addRandomBetween({ name: 'data-prop', value: '[Link]' },
{ name: 'data-prop', value: '[Link]' }, { name: 'data-prop', value:
'[Link]' })
});
html += addCardHtml({
header: 'Timeout',
body: `<table><tr><td>After</td><td><input type="number" data-
original="" data-prop="[Link]" min="2" value="5" step="1" class="form-
control"></td><td>minutes</td></tr></table>` +
`<label class="control-label">After timeout/error, postpone
for:</label>` +
addRandomBetween({ name: 'data-prop', value:
'[Link]' }, { name: 'data-prop', value:
'[Link]' }, { name: 'data-prop', value:
'[Link]' })
});
html += addCardHtml({
header: 'Logging',
body: `<div>${[Link]('data-prop',
'[Link]', 'Store log (enables the \'Log\' button)')}</div>` +
`<table><tr><td>Max log size in lines:</td><td><input type="number"
data-original="" data-prop="[Link]" min="100" step="100" class="form-
control"></td></tr></table>`
});
html += addCardHtml({
header: [Link]('data-prop',
'[Link]', 'Sleep mode'),
body: `<table><tr><td>Don't claim between </td><td><input
type="time" data-original="" data-prop="[Link]" class="form-
control"></td><td>and</td>
<td><input type="time" data-original="" data-
prop="[Link]" class="form-control"></td></tr></table>`
});
html += ' </div></div>';
html += ' </div>';

html += ' <div class="col-md-12 col-sm-12">';


html += ' <div class="card card-info m-1"><div class="card-
header">Site Specifics<div class="card-tools"><button type="button" class="btn btn-
white btn-sm" data-card-widget="collapse" title="Collapse"><i class="fas fa-
minus"></i></button></div></div>';
html += ' <div class="card-body px-4">';

html += ' <div class="card m-1 collapsed-card"><div


class="card-header">CryptosFaucets<div class="card-tools"><button type="button"
class="btn btn-white btn-sm" data-card-widget="collapse" title="Collapse"><i
class="fas fa-plus"></i></button></div></div>';
html += ' <div class="card-body px-4" style="display:
none;">';
html += ' <div><label class="switch"><input type="checkbox"
data-prop="[Link]" ><span class="slider round"></span></label> Roll once per
round </div>';
html += ' <div><label class="switch"><input type="checkbox"
data-prop="[Link]" ><span class="slider round"></span></label> Try to use
promo codes every day (disable it if you are facing too many captcha timeouts)
</div>';
html += ' <div><label class="switch"><input type="checkbox"
data-prop="[Link]" ><span class="slider round"></span></label> Auto update
promo codes </div>';
html += ' <div><label class="switch"><input type="checkbox"
data-prop="[Link]" ><span class="slider round"></span></label> Autologin when
necessary</div>';
html += ' <select class="form-control" data-
prop="[Link]">';
html += ' <option value="1">Use Email and
Password</option><option value="2">Filled by 3rd party
software/extension</option>';
html += ' </select>';
html += ' <label class="control-label">E-Mail</label>';
html += ' <input maxlength="200" type="text" data-
prop="[Link]" required="required" class="form-control"
placeholder="Email address..."/>';
html += ' <label class="control-label">Password</label>';
html += ' <input maxlength="200" type="password" data-
prop="[Link]" required="required" class="form-control"
placeholder="Password..."/>';
html += ' <label class="control-label">Hours to wait If IP is
banned:</label>';
html += ' <select class="form-control" data-
prop="[Link]">';
html += ' <option value="0">Disabled</option><option
value="2">2</option><option value="4">4</option><option value="8">8</option><option
value="16">16</option><option value="24">24</option><option
value="26">26</option>';
html += ' </select>';
html += ' </div></div>';

html += ' <div class="card m-1 collapsed-card"><div


class="card-header">JTFey<div class="card-tools"><button type="button" class="btn
btn-white btn-sm" data-card-widget="collapse" title="Collapse"><i class="fas fa-
plus"></i></button></div></div>';
html += ' <div class="card-body px-4" style="display:
none;">';
html += ' <label class="control-label">Login Mode</label>';
html += ' <select class="form-control" data-
prop="[Link]">';
html += ' <option value="1">Use Username and
Password</option><option value="2">Filled by 3rd party
software/extension</option>';
html += ' </select>';
html += ' <label class="control-label">E-Mail</label>';
html += ' <input maxlength="200" type="text" data-
prop="[Link]" required="required" class="form-control"
placeholder="Email address..."/>';
html += ' <label class="control-label">Password</label>';
html += ' <input maxlength="200" type="password" data-
prop="[Link]" required="required" class="form-control"
placeholder="Password..."/>';
html += ' </div></div>';

html += ' <div class="card m-1 collapsed-card"><div


class="card-header">FaucetPay PTC<div class="card-tools"><button type="button"
class="btn btn-white btn-sm" data-card-widget="collapse" title="Collapse"><i
class="fas fa-plus"></i></button></div></div>';
html += ' <div class="card-body px-4" style="display:
none;">';
html += ' <div><label class="switch"><input type="checkbox"
data-prop="[Link]" ><span class="slider round"></span></label> Random
PTC order </div>';
html += ' <label class="control-label">Max duration per
run:</label>';
html += ' <select class="form-control" data-
prop="[Link]">';
html += ' <option value="5">5 minutes</option><option
value="10">10 minutes</option><option value="15">15 minutes</option><option
value="30">30 minutes</option>';
html += ' </select>';
html += ' </div></div>';

html += ' <div class="card m-1 collapsed-card"><div


class="card-header">Dutchy<div class="card-tools"><button type="button" class="btn
btn-white btn-sm" data-card-widget="collapse" title="Collapse"><i class="fas fa-
plus"></i></button></div></div>';
html += ' <div class="card-body px-4" style="display:
none;">';
html += ' <div><label class="switch"><input type="checkbox"
data-prop="[Link]" ><span class="slider round"></span></label> Try
boosted roll </div>';
html += ' </div></div>';

html += ' <div class="card m-1 collapsed-card"><div


class="card-header">BestChange<div class="card-tools"><button type="button"
class="btn btn-white btn-sm" data-card-widget="collapse" title="Collapse"><i
class="fas fa-plus"></i></button></div></div>';
html += ' <div class="card-body px-4" style="display:
none;">';
html += ' <label class="control-label">BTC Address:</label>';
html += ' <select class="form-control" data-
prop="[Link]">';
html += ' <option value="101">Faucet Pay BTC</option><option
value="1">BTC Alt Address</option>';
html += ' </select>';
html += ' </div></div>';

html += ' <div class="card m-1 collapsed-card"><div


class="card-header">Yes Coiner<div class="card-tools"><button type="button"
class="btn btn-white btn-sm" data-card-widget="collapse" title="Collapse"><i
class="fas fa-plus"></i></button></div></div>';
html += ' <div class="card-body px-4" style="display:
none;">';
html += ' <label class="control-label">Login Mode</label>';
html += ' <select class="form-control" data-
prop="[Link]">';
html += ' <option value="1">Use Username and
Password</option><option value="2">Filled by 3rd party
software/extension</option>';
html += ' </select>';
html += ' <label class="control-label">E-Mail</label>';
html += ' <input maxlength="200" type="text" data-
prop="[Link]" required="required" class="form-control"
placeholder="Account number..."/>';
html += ' <label class="control-label">Password</label>';
html += ' <input maxlength="200" type="password" data-
prop="[Link]" required="required" class="form-control"
placeholder="Password..."/>';
html += ' </div></div>';

html += ' </div></div>';


html += ' </div>';
html += ' </div>';
html += '</div>';
html += '<div class="modal-footer"><a class="btn m-2 anchor btn-
outline-danger align-middle" onclick="modalCancel(\'config\')" data-
dismiss="modal"><i class="fa fa-times-circle"></i> Cancel</a>';
html += '<a class="btn m-2 anchor btn-outline-success align-middle"
onclick="modalSave(\'config\')" data-dismiss="modal"><i class="fa fa-check-
circle"></i> Save</a></div>';
html += ' </div>';

html += '</div>';
html += '</div>';

html += '<section id="table-struct" class="fragment "><div


class="container-fluid "><div class="py-1 "><div class="row mx-0 justify-content-
center">';
html += '<a class="btn m-2 anchor btn-outline-danger align-middle"
data-toggle="modal" data-target="#confirmable-modal"
onclick="[Link](\'forceStopFaucet\', \'Running faucet will be disabled
and the manager will reload.\')"><i class="fa fa-stop-circle"></i>Force Stop</a>';
html += '</div>';

html += '<div class="card">';

html += '<div class="card-header">';


html += '<div class="d-flex p-0">';

html += '<div id="schedules-toggler" class="btn-group btn-group-toggle"


data-toggle="buttons">';
html += '</div>';

html += '<div class="card-tools ml-auto mt-2 mr-1">';


html += '<input type="checkbox" data-toggle="switch" data-label-
text="Log" title="Show/Hide Log" id="bss-log" checked>';

html += `<button type="button" class="btn btn-flat btn-sm btn-outline-


primary mx-1 dropdown-toggle" data-toggle="dropdown" aria-expanded="false"><i
class="fa fa-cog"></i> Settings</button>
<div class="dropdown-menu text-sm dropdown-settings-menu" style="">
<a class="dropdown-item btn-open-dialog" data-target="modal-config"><i
class="fa fa-cog"></i>&nbsp;Defaults...</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item btn-open-dialog" data-target="modal-
schedules"><i class="fa fa-stopwatch"></i>&nbsp;Schedules...</a>
<a class="dropdown-item btn-open-dialog" data-target="modal-wallet"><i
class="fa fa-wallet"></i>&nbsp;Wallets...</a>
<a class="dropdown-item btn-open-dialog" data-target="modal-
requirements"><i class="fa fa-exclamation-circle"></i>&nbsp;Other
requirements...</a>
<!-- <a class="dropdown-item btn-open-dialog" data-target="modal-
sites"><i class="fa fa-window-restore"></i>&nbsp;Sites...</a> -->
<div class="dropdown-divider"></div>
<a class="dropdown-item btn-open-dialog" data-target="modal-info"><i
class="fa fa-info"></i>&nbsp;Help/Info...</a>
</div>`;

html += '<button type="button" class="btn btn-tool" data-card-


widget="collapse"><i class="fas fa-minus"></i></button>';
html += '<button type="button" class="btn btn-tool mx-1" data-card-
widget="maximize"><i class="fas fa-expand"></i></button>';
html += '</div></div>';
html += '<div id="wait-times" class="row mx-0 p-0 justify-content-
center"></div>';
html += '</div>';

html += '<div class="card-body table-responsive p-0" style="height:


400px;" id="schedule-container">';
html += '<pre class="collapse show"
id="console-log"><b>Loading...</b></pre>';
html += '</div>';

html += '</div>';

html += '</div>';
html += '<span id="update-data"
style="display:none;"></span></section>';
html += '<section id="table-struct-promo" class="fragment "><div
class="container-fluid "><div class="py-1 ">';

html += '<div class="card"><div class="card-header"><h3 class="card-


title font-weight-bold">Promo Codes</h3><span id="promo-code-new"
style="display:none;"></span>';
html += '<div class="card-tools">';

html += '<div class="input-group input-group-sm btn-tool">';


html += '<input id="promo-text-input" type="text" name="table_search"
class="form-control float-right" placeholder="CF Promo Code..."
style="width:130px;">';
html += '<input type="checkbox" data-toggle="switch" title="Check if
the code can be reused every 24hs" id="promo-daily" data-on-text="Daily" data-off-
text="1 Time">';
html += '<div class="input-group-append"><button type="submit"
class="btn btn-default" id="promo-button""><i class="fas fa-plus"></i>
Add</button></div>';
html += '<div class="input-group-append"><button type="submit"
class="btn btn-default btn-outline-danger mx-1" data-toggle="modal" data-
target="#confirmable-modal" onclick="[Link](\'removeAllPromos\', \'All
promo codes will be removed.\')"><i class="fas fa-times-circle"></i> Remove
All</button></div>';
html += '<div class="input-group-append"><button type="submit"
class="btn btn-default btn-outline-primary" id="button-try-get-codes"><i class="fas
fa-bolt"></i> Try to Get Codes</button></div>';
html += '<div class="input-group-append"><button type="button"
class="btn btn-tool btn-sm mx-1" data-card-widget="collapse" title="Collapse"><i
class="fas fa-minus"></i></button></div>';
html += '<div class="input-group-append"><button type="button"
class="btn btn-tool btn-sm mx-1" data-card-widget="maximize" title="Maximize"><i
class="fas fa-expand"></i></button></div>';
html += '</div>';
html += '</div>';

html += '</div>';
html += '<div class="card-body table-responsive p-0" id="promo-
container">';
html += '</div></div>';

html +='</div></div></section>';
html += '<section class="fragment"><div class="container-fluid ">';
html += '<div class="row justify-content-center"><a class="btn m-2
anchor btn-outline-primary" id="stats-button" onclick="openStatsChart()">CF Lucky
Number Stats</a></div>';
html +='<div class="py-1" id="stats-fragment"
style="display:none;"><div class="row align-items-center text-center justify-
content-center">';
html += '<div class="col-md-12 col-lg-8"><canvas
id="barChart"></canvas><span id="rolls-span"
style="display:none;"></span></div></div></div></div></div></section>';

let wrapper = [Link]('div');


[Link] = [Link]();

let target = [Link]('referral-table');


[Link](wrapper, target);
[Link]('schedule-
container').appendChild( createScheduleTable() );

if ([Link]('.main-header .[Link]-auto')) {
let discord = [Link]('li');
[Link]('nav-item');
[Link] = '<a class="btn btn-primary btn-sm m-1"
href="[Link] target="_blank"><div class=""><span
class="badge badge-pill badge-warning mr-2"
title="">(new)</span>discord</div></a>';
[Link]('.main-header .[Link]-
auto').prepend(discord);
} else {
let discord = [Link]('div');
[Link] = '<a class="btn m-2 btn-primary"
href="[Link] target="_blank"><div class=""><span
class="badge badge-pill badge-warning mr-2"
title="">(new)</span>discord</div></a>';
[Link]('.navbar-nav').prepend(discord);
}
addHtml({
target: '#modal-dlg .modal-dialog',
where: 'afterbegin',
content: `<div class="modal-content bg-beige d-none" id="modal-
requirements">
<div class="modal-header"><h5 class="modal-title"><i class="fa fa-exclamation-
circle"></i> Other requirements</h5></div>
<div class="modal-body">
<div class="callout callout-warning m-3">
<p class="text-justify">Some sites might require specific tools like
captcha solvers that are not including in the script.</p>
</div>
<div>
<table class="table custom-table-striped" id="requirements-table">
<thead><tr><th class="">Name</th><th class="">Description</th><th
class="">Suggestion</th></tr></thead>
<tbody class="overflow-auto" id="requirements-table-body">
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<a class="btn m-2 anchor btn-outline-danger align-middle" data-
dismiss="modal"><i class="fa fa-times-circle"></i> Close</a>
</div>
</div>`
});
addTemplateTag({
id: 'tpl-requirement-row',
content:
`<tr><td>{name}</td><td>{description}</td><td>{suggestion}</td></tr>`
});
const tempRequirementsList = [
{ id: '1', name: 'HCaptcha Solver', description: 'A solver for
HCaptcha challenges', suggestion: `Latest github version of hektCaptcha extension
(free)<br><a href="[Link] target="_blank"><i class="fa fa-
external-link-alt"></i> Visit</a>` },
{ id: '2', name: 'Recaptcha Solver', description: 'A solver for
ReCaptcha challenges', suggestion: `Latest github version of hektCaptcha extension
(free)<br><a href="[Link] target="_blank"><i class="fa fa-
external-link-alt"></i> Visit</a>` },
{ id: '3', name: 'Cloudflare Challenge Bypass', description: 'A
solver for Cloudflare/Turnstile challenges', suggestion: `Auto clicker user script
(free)<br><a href="[Link] target="_blank"><i class="fa
fa-external-link-alt"></i> Visit</a>` },
{ id: '6', name: 'Active Tab/Window', description: 'The site
requires the tab to be active. A good option is Tab Revolver Extension, which will
loop the tabs opened in a specific window.', suggestion: `<a
href="[Link] target="_blank"><i class="fa fa-external-link-
alt"></i> User Script</a> or <a href="[Link] target="_blank"><i
class="fa fa-external-link-alt"></i> Extension</a>` },
];
for(let r=0; r< [Link]; r++) {
let req = tempRequirementsList[r];
useTemplate({
templateId: 'tpl-requirement-row',
target: '#requirements-table-body',
where: 'afterbegin',
replacements: req
});
}
};
function createPromoTable(faucets) {
let table = [Link]('table');
let inner = '';
[Link]('table', 'custom-table-striped');
[Link]('id','promo-table');

inner += '<caption style="text-align: -webkit-center;">✔️


Pending
Accepted ⚪Used Before ❌ Invalid code ❗ Unknown error ⚪ No code</caption>';
inner += '<thead><tr><th class="">Code</th><th class="">Added</th>';

for (let i = 0, all = [Link]; i < all; i++) {


inner += '<th data-faucet-id="' + faucets[i].id + '">' +
faucets[i].name + '</th>';
}

inner += '</tr></thead><tbody id="promo-table-body"></tbody></table>';

[Link] = inner
[Link]('promo-container').appendChild( table );
};
function createScheduleTable() {
let table = [Link]('table');
let inner;
[Link]('table', 'custom-table-striped', 'table-head-
fixed', 'text-nowrap');
[Link]('id','schedule-table');

inner = '<thead><tr>';
inner += '<th scope="col" class="edit-status d-none em-only"
style="">Active</th><th class="">Next Roll</th><th class=""></th><th
class="">Name</th><th class="text-center">Last Claim</th>';
inner += '<th class="text-center">Aggregate</th><th class="text-
center">Balance</th><th class="text-center em-hide" id="converted-balance-
col">FIAT</th>';
inner += '<th scope="col" class="text-center em-hide">Msgs</th>';
inner += '<th scope="col" class="" style="">';
inner += `<div class="btn-group btn-group-sm">
<button type="button" data-toggle="tooltip" title="Add site..."
class="btn btn-default action-add-external-site em-hide">
<i class="fa fa-plus"></i>
</button>
<button type="button" title="Cancel" class="btn btn-danger action-edit-
all-sites-cancel em-only d-none"><i class="fa fa-times-circle"></i> Cancel</button>
<button type="button" title="Save" class="btn btn-success action-edit-
all-sites-save em-only d-none"><i class="fa fa-check-circle"></i> Save</button>
<button type="button" data-toggle="tooltip" title="Edit all..."
class="btn btn-default action-edit-all-sites em-hide"><i class="fa fa-toggle-
off"></i></button>
</div>`;
inner += '</th></tr></thead><tbody id="schedule-table-body"></tbody>';
[Link] = inner;

return table;
};
function renderLogRow(data) {
let tr = [Link]('tr');
[Link] = [Link];
[Link] = [Link]();
[Link] = [Link] || '';
[Link] = [Link] || '';
let color = [Link] ? `#${[Link]}` : `transparent`;
let showIt = ![Link] || ![Link]
|| [Link] == 'all' ||
[Link] == [Link];
if (!showIt) {
[Link]('d-none');
}

let tds = '';


tds += `<td>${[Link]([Link])}</td>`;
tds += `<td><i class="fas fa-square pr-1" style="color:
${color};"></i></td>`;
if ([Link]) {
tds += `<td>${[Link]} [Elapsed time: ${[Link]}
seconds]</td>`;
} else {
tds += `<td>${[Link]}</td>`;
}
[Link] = tds;

[Link]('#console-log table').appendChild(tr);
};
function log(data) {
if (!data || ![Link]) {
[Link](`Log attempt without data or msg!`, data);
return;
}
[Link] = new Date();
[Link] = [Link] || false;
[Link] = [Link] || false;
[Link] = [Link] || false;

if([Link]()['[Link]']) {
if ([Link]) {
} else {
}
};

if ([Link]) {
let previous = [Link](x => [Link] == [Link] && [Link]
== [Link]);
if (previous) {
[Link] = [Link];
[Link] = [Link];
[Link]( (a, b) => [Link]() - [Link]());
} else {
[Link](data);
}
} else {
[Link](data);
}
while([Link] > 30) {
[Link]();
}

[Link]('#console-log table').innerHTML = '';


[Link](r => renderLogRow(r));
};
function legacyLog(data, elapsed = false) {
if (!data || ![Link]) {
return;
}
elapsed = [Link] || false;
let msg = [Link];
if ([Link]) {
msg = `[${[Link]}] ${[Link]}`;
}

if([Link]()['[Link]']) { [Link](msg,
elapsed) };
if(msg) {
let waitingIdx = [Link](line => {
let waitingMsg= [Link]('&nbsp')[1];
if (waitingMsg == msg) {
return true;
}
});

let previous = waitingIdx > -1 ?


logLines[waitingIdx].split('&nbsp')[1] : '';
if (elapsed && (previous == msg)) {
logLines[waitingIdx] = [Link]() + '&nbsp' +
msg + '&nbsp[Elapsed time:&nbsp' + elapsed + '&nbspseconds]';
} else {
while([Link] > 20) {
[Link]();
}
[Link]([Link]() + '&nbsp' + msg);
}

[Link]('console-log').innerHTML = [Link](x
=> {
const regex = /\[([0-9a-fA-F]+)\]/;
const match = [Link](x);
let colorNumber = null;
if (match !== null) {
colorNumber = match[1];
}

let showIt = !colorNumber || ![Link] ||


[Link] == 'all' || [Link] == colorNumber;

const formattedMsg = [Link](/\[([0-9a-fA-F]+)\]/, '<i


class="fas fa-square pr-1" style="color: #$1;"></i>');

let line = `<span data-schedule="${colorNumber ? colorNumber :


''}" class="${showIt ? '' : 'd-none'}">${formattedMsg}</span>`;
return line;
}).join('');
}
};
return {
init: init,
log: log
}
}

async function init() {


eventer = new EventEmitter();
persistence = new Persistence();
shared = [Link]();
useTimer = [Link]()['[Link]'];
if ([Link]('[Link] {
landing = [Link];
instance = [Link];
manager = createManager();
CFPromotions = [Link]();
uiRenderer = new UiRenderer();
[Link]();
ui = createUi();
CFHistory = [Link]();

await [Link]();
try {
if (![Link]('sidebar-collapse'))
[Link]('a[data-widget="pushmenu"]').click()
} catch {}
setTimeout( () => { [Link](); }, 10000);
} else {
instance = [Link];
detectWeb();
}
}
init();
})();

You might also like