Fetch upstream

This commit is contained in:
lukew3 2021-06-03 10:35:20 -04:00
commit e36a349dc4
24 changed files with 1692 additions and 139 deletions

View file

@ -14,13 +14,8 @@ Sometimes your browser has old files cached and the bug you are experiencing mig
**Describe the bug** <!-- A clear and concise description of what the bug is. -->
<!--
**Did it happen in incognito mode?**
Sometimes things work in incognito mode, which allows me to further track down the issue.
-->
<!-- **Did it happen in incognito mode?**
Sometimes things work in incognito mode, which allows me to further track down the issue. -->
**To Reproduce** <!-- Steps to reproduce the behavior: -->
@ -39,11 +34,4 @@ Sometimes things work in incognito mode, which allows me to further track down t
- Browser [] <!-- e.g. Chrome, Firefox, Safari, etc... -->
- Browser Version [] <!-- e.g. 22 -->
**Smartphone:** <!-- if you encountered an issue while using Monkeytype on your smartphone please complete the following information, delete this section if not -->
- Device: [] <!-- e.g. iPhone6, Google Pixel 4, etc... -->
- OS: [] <!-- e.g. IOS 8.1, Android 11, etc... -->
- Browser [] <!-- e.g. stock browser, Safari, Chrome -->
- Browser Version [] <!-- e.g. 22 -->
**Additional context** <!-- Add any other context about the problem here. -->

View file

@ -1,18 +1,27 @@
Adding a language or a theme? For languages, make sure to edit the `_list.json`, `_groups.json` files, and add the `language.json` file as well. For themes, make sure to add the `theme.css` file. It will not work if you don't follow these steps!
<!-- please read the comments -->
Please reference any issues and or PRs related to your pull request.
<!-- Adding a language or a theme? For languages, make sure to edit the `_list.json`, `_groups.json` files, and add the `language.json` file as well. For themes, make sure to add the `theme.css` file. It will not work if you don't follow these steps!
If your change is visual (mainly themes) it would be extra awesome if you could include a screenshot.
<!-- pro tip: you can check checkboxes by putting an x inside the brackets [x] -->
-->
### Checklist <!-- please check the items you have completed -->
### Description
<!-- Please describe the change(s) made in your PR -->
<!-- please check the items you have completed -->
### Checklist
- [] I have read the [`CODE_OF_CONDUCT.md`](https://github.com/Miodec/monkeytype/blob/master/CODE_OF_CONDUCT.md) and the [`CONTRIBUTING.md`](https://github.com/Miodec/monkeytype/blob/master/CONTRIBUTING.md)
- [] If my PR is a new language or theme I modified the appropriate files to incorporate the language or theme
- [] I checked if my PR has any bugs or other issues that could reduce the stability of the project
- [] I understand that the maintainer has the right to reject my PR and it may not get accepted.
- [] I understand that the maintainer has the right to reject my contribution and it may not get accepted.
- [] If my PR is a new language or theme I modified the appropriate files to incorporate the language or theme <!-- Delete if that is not the case-->
<!-- the issue(s) your PR resolves if any -->
<!-- the issue(s) your PR resolves if any (delete if that is not the case) -->
<!-- please also reference any issues and or PRs related to your pull request -->
Resolves #
<!-- pro tip: you can check checkboxes by putting an x inside the brackets [x] -->

View file

@ -2454,6 +2454,44 @@ exports.checkLeaderboards = functions.https.onRequest(
}
request = request.body.data;
if (request.token === undefined) {
response.status(200).send({
data: {
status: -999,
message: "No token",
},
});
return;
}
let tokenDecoded;
try {
tokenDecoded = await admin.auth().verifyIdToken(request.token);
} catch (e) {
response.status(200).send({
data: {
status: -999,
message: "Bad token",
},
});
return;
}
request.emailVerified = tokenDecoded.email_verified;
request.uid = tokenDecoded.uid;
// name:
// banned:
// verified:
// discordId
let userData = await db.collection("users").doc(request.uid).get();
userData = userData.data();
request.name = userData.name;
request.banned = userData.banned;
request.verified = userData.verified;
request.discordId = userData.discordId;
request.lbMemory = userData.lbMemory;
function verifyValue(val) {
let errCount = 0;
if (val === null || val === undefined) {
@ -2488,15 +2526,8 @@ exports.checkLeaderboards = functions.https.onRequest(
return;
}
let emailVerified = await admin
.auth()
.getUser(request.uid)
.then((user) => {
return user.emailVerified;
});
try {
if (emailVerified === false) {
if (request.emailVerified === false) {
response.status(200).send({
data: {
needsToVerifyEmail: true,

View file

@ -74,6 +74,7 @@ Promise.all([Misc.getLanguageList(), Misc.getFunboxList()]).then((values) => {
defaultResultFilters.funbox[funbox.name] = true;
});
// filters = defaultResultFilters;
load();
});
export function getFilters() {
@ -110,7 +111,12 @@ export function load() {
// let newTags = $.cookie("activeTags");
try {
let newResultFilters = window.localStorage.getItem("resultFilters");
if (newResultFilters != undefined && newResultFilters !== "") {
if (
newResultFilters != undefined &&
newResultFilters !== "" &&
Misc.countAllKeys(newResultFilters) >=
Misc.countAllKeys(defaultResultFilters)
) {
filters = JSON.parse(newResultFilters);
save();
} else {
@ -129,8 +135,6 @@ export function reset() {
save();
}
load();
export function updateActive() {
let aboveChartDisplay = {};
Object.keys(getFilters()).forEach((group) => {
@ -398,10 +402,10 @@ $(".pageAccount .topFilters .button.currentConfigFilter").click((e) => {
filters["language"][Config.language] = true;
}
if (Funbox.active === "none") {
if (Config.funbox === "none") {
filters.funbox.none = true;
} else {
filters.funbox[Funbox.active] = true;
filters.funbox[Config.funbox] = true;
}
filters["tags"]["none"] = true;

View file

@ -1815,7 +1815,7 @@ export let defaultCommands = {
input: true,
exec: (input) => {
UpdateConfig.setCustomLayoutfluid(input);
if (Funbox.active === "layoutfluid") TestLogic.restart();
if (Config.funbox === "layoutfluid") TestLogic.restart();
// UpdateConfig.setLayout(
// Config.customLayoutfluid
// ? Config.customLayoutfluid.split("_")[0]

View file

@ -74,6 +74,7 @@ let defaultConfig = {
flipTestColors: false,
capsLockBackspace: false,
layout: "default",
funbox: "none",
confidenceMode: "off",
indicateTypos: false,
timerStyle: "mini",
@ -209,7 +210,7 @@ export function togglePunctuation() {
export function setMode(mode, nosave) {
if (TestUI.testRestarting) return;
if (mode !== "words" && Funbox.active === "memory") {
if (mode !== "words" && config.funbox === "memory") {
Notifications.add("Memory funbox can only be used with words mode.", 0);
return;
}
@ -237,11 +238,11 @@ export function setMode(mode, nosave) {
$("#top .config .quoteLength").addClass("hidden");
} else if (config.mode == "custom") {
if (
Funbox.active === "58008" ||
Funbox.active === "gibberish" ||
Funbox.active === "ascii"
config.funbox === "58008" ||
config.funbox === "gibberish" ||
config.funbox === "ascii"
) {
Funbox.setAcitve("none");
Funbox.setActive("none");
TestUI.updateModesNotice();
}
$("#top .config .wordCount").addClass("hidden");
@ -327,6 +328,13 @@ export function setFavThemes(themes, nosave) {
}
}
export function setFunbox(funbox, nosave) {
config.funbox = funbox ? funbox : "none";
if (!nosave) {
saveToLocalStorage();
}
}
//blind mode
export function toggleBlindMode() {
let blind = !config.blindMode;
@ -845,10 +853,10 @@ export function toggleLiveAcc() {
export function setHighlightMode(mode, nosave) {
if (
mode === "word" &&
(Funbox.active === "nospace" ||
Funbox.active === "read_ahead" ||
Funbox.active === "read_ahead_easy" ||
Funbox.active === "read_ahead_hard")
(config.funbox === "nospace" ||
config.funbox === "read_ahead" ||
config.funbox === "read_ahead_easy" ||
config.funbox === "read_ahead_hard")
) {
Notifications.add("Can't use word highlight with this funbox", 0);
return;
@ -1533,6 +1541,7 @@ export function apply(configObj) {
setPlaySoundOnClick(configObj.playSoundOnClick, true);
setStopOnError(configObj.stopOnError, true);
setFavThemes(configObj.favThemes, true);
setFunbox(configObj.funbox, true);
setRandomTheme(configObj.randomTheme, true);
setShowAllLines(configObj.showAllLines, true);
setSwapEscAndTab(configObj.swapEscAndTab, true);

View file

@ -121,7 +121,7 @@ function handleBackspace(event) {
} else {
TestLogic.input.setCurrent(TestLogic.input.popHistory());
TestLogic.corrected.setCurrent(TestLogic.corrected.popHistory());
if (Funbox.active === "nospace") {
if (Config.funbox === "nospace") {
TestLogic.input.setCurrent(
TestLogic.input.current.substring(
0,
@ -194,7 +194,7 @@ function handleSpace(event, isEnter) {
if (!TestLogic.active) return;
if (TestLogic.input.current === "") return;
// let nextWord = wordsList[TestLogic.words.currentIndex + 1];
// if ((isEnter && nextWord !== "\n") && (isEnter && Funbox.active !== "58008")) return;
// if ((isEnter && nextWord !== "\n") && (isEnter && Config.funbox !== "58008")) return;
// if (!isEnter && nextWord === "\n") return;
event.preventDefault();
@ -204,7 +204,7 @@ function handleSpace(event, isEnter) {
}
let currentWord = TestLogic.words.getCurrent();
if (Funbox.active === "layoutfluid" && Config.mode !== "time") {
if (Config.funbox === "layoutfluid" && Config.mode !== "time") {
// here I need to check if Config.customLayoutFluid exists because of my scuffed solution of returning whenever value is undefined in the setCustomLayoutfluid function
const layouts = Config.customLayoutfluid
? Config.customLayoutfluid.split("#")
@ -246,14 +246,14 @@ function handleSpace(event, isEnter) {
TestStats.pushKeypressWord(TestLogic.words.currentIndex);
// currentKeypress.count++;
// currentKeypress.words.push(TestLogic.words.currentIndex);
if (Funbox.active !== "nospace") {
if (Config.funbox !== "nospace") {
Sound.playClick(Config.playSoundOnClick);
}
Replay.addReplayEvent("submitCorrectWord");
} else {
//incorrect word
PaceCaret.handleSpace(false, currentWord);
if (Funbox.active !== "nospace") {
if (Config.funbox !== "nospace") {
if (!Config.playSoundOnError || Config.blindMode) {
Sound.playClick(Config.playSoundOnClick);
} else {
@ -697,7 +697,7 @@ function handleAlpha(event) {
//simulate space press in nospace funbox
if (
(Funbox.active === "nospace" &&
(Config.funbox === "nospace" &&
TestLogic.input.current.length === TestLogic.words.getCurrent().length) ||
(event.key === "\n" && thisCharCorrect)
) {
@ -814,7 +814,7 @@ $(document).keydown(function (event) {
handleBackspace(event);
}
if (event.key === "Enter" && Funbox.active === "58008" && wordsFocused) {
if (event.key === "Enter" && Config.funbox === "58008" && wordsFocused) {
event.key = " ";
}

View file

@ -728,3 +728,14 @@ export function setCharAt(str, index, chr) {
if (index > str.length - 1) return str;
return str.substring(0, index) + chr + str.substring(index + 1);
}
//https://www.reddit.com/r/learnjavascript/comments/8ohug3/how_to_recursively_count_keys_in_an_object/e03fytn/
function countAllKeys(obj) {
if (typeof obj !== "object" || obj === null) {
return 0;
}
const keys = Object.keys(obj);
let sum = keys.length;
keys.forEach((key) => (sum += countAllKeys(obj[key])));
return sum;
}

View file

@ -1,5 +1,6 @@
import * as Funbox from "./funbox";
import * as UI from "./ui";
import Config from "./config";
let mappedRoutes = {
"/": "pageTest",
@ -19,7 +20,7 @@ export function handleInitialPageClasses(pathname) {
(function (history) {
var pushState = history.pushState;
history.pushState = function (state) {
if (Funbox.active === "memory" && state !== "/") {
if (Config.funbox === "memory" && state !== "/") {
Funbox.resetMemoryTimer();
}
return pushState.apply(history, arguments);

View file

@ -448,7 +448,7 @@ export function updateDiscordSection() {
function setActiveFunboxButton() {
$(`.pageSettings .section.funbox .button`).removeClass("active");
$(
`.pageSettings .section.funbox .button[funbox='${Funbox.funboxSaved}']`
`.pageSettings .section.funbox .button[funbox='${Config.funbox}']`
).addClass("active");
}

View file

@ -6,9 +6,7 @@ import * as ManualRestart from "./manual-restart-tracker";
import Config, * as UpdateConfig from "./config";
import * as Settings from "./settings";
export let active = "none";
export let funboxSaved = "none";
export let modeSaved = null;
let modeSaved = null;
let memoryTimer = null;
let memoryInterval = null;
@ -76,13 +74,13 @@ export function startMemoryTimer() {
}
export function reset() {
active = "none";
resetMemoryTimer();
}
export function toggleScript(...params) {
if (active === "tts") {
if (Config.funbox === "tts") {
var msg = new SpeechSynthesisUtterance();
console.log("Speaking");
msg.text = params[0];
msg.lang = "en-US";
window.speechSynthesis.cancel();
@ -90,9 +88,11 @@ export function toggleScript(...params) {
}
}
export async function activate(funbox, mode) {
export async function activate(funbox) {
let mode = modeSaved;
if (funbox === undefined || funbox === null) {
funbox = funboxSaved;
funbox = Config.funbox;
}
if (Misc.getCurrentLanguage().ligatures) {
if (funbox == "choo_choo" || funbox == "earthquake") {
@ -124,10 +124,8 @@ export async function activate(funbox, mode) {
ManualRestart.set();
if (mode === "style") {
if (funbox != undefined) {
if (funbox != undefined)
$("#funBoxTheme").attr("href", `funbox/${funbox}.css`);
active = funbox;
}
if (funbox === "simon_says") {
rememberSetting(
@ -220,7 +218,6 @@ export async function activate(funbox, mode) {
UpdateConfig.setHighlightMode("letter", true);
TestLogic.restart(false, true);
}
active = funbox;
}
// if (funbox !== "layoutfluid" || mode !== "script") {
@ -233,16 +230,8 @@ export async function activate(funbox, mode) {
return true;
}
export function setFunbox(funbox, mode) {
if (TestLogic.active) {
Notifications.add(
"You can only change the funbox before starting a test.",
0
);
return false;
}
if (funbox === "none") loadMemory();
funboxSaved = funbox;
modeSaved = mode;
active = funbox;
UpdateConfig.setFunbox(funbox);
return true;
}

View file

@ -130,7 +130,7 @@ export function show(data, mode2) {
$("#result .stats .leaderboards .bottom").html(string);
}
export function check(completedEvent) {
export async function check(completedEvent) {
try {
if (
completedEvent.funbox === "none" &&
@ -162,13 +162,14 @@ export function check(completedEvent) {
delete lbRes.chartData;
/*
CloudFunctions.checkLeaderboards({
uid: completedEvent.uid,
lbMemory: DB.getSnapshot().lbMemory,
// uid: completedEvent.uid,
token: await firebase.auth().currentUser.getIdToken(),
// lbMemory: DB.getSnapshot().lbMemory,
// emailVerified: DB.getSnapshot().emailVerified,
name: DB.getSnapshot().name,
banned: DB.getSnapshot().banned,
verified: DB.getSnapshot().verified,
discordId: DB.getSnapshot().discordId,
// name: DB.getSnapshot().name,
// banned: DB.getSnapshot().banned,
// verified: DB.getSnapshot().verified,
// discordId: DB.getSnapshot().discordId,
result: lbRes,
})
*/
@ -178,8 +179,21 @@ export function check(completedEvent) {
result: lbRes,
})
.then((data) => {
Misc.clearTimeouts(textTimeouts);
show(data.data, completedEvent.mode2);
if (data.data.status === -999) {
if (data.data.message === "Bad token") {
$("#result .stats .leaderboards").addClass("hidden");
Notifications.add(
"Bad token. This could mean your client is out of date and is sending data in the old format. Please refresh and clear your cache.",
-1
);
} else {
$("#result .stats .leaderboards").addClass("hidden");
Notifications.add(data.data.message, -1);
}
} else {
Misc.clearTimeouts(textTimeouts);
show(data.data, completedEvent.mode2);
}
})
.catch((e) => {
$("#result .stats .leaderboards").addClass("hidden");

View file

@ -197,7 +197,7 @@ export function setRandomQuote(rq) {
export function punctuateWord(previousWord, currentWord, index, maxindex) {
let word = currentWord;
if (Funbox.funboxSaved === "58008") {
if (Config.funbox === "58008") {
if (currentWord.length > 3) {
if (Math.random() < 0.75) {
let special = ["/", "*", "-", "+"][Math.floor(Math.random() * 4)];
@ -336,7 +336,7 @@ export function startTest() {
TimerProgress.update(TestTimer.time);
TestTimer.clear();
if (Funbox.active === "memory") {
if (Config.funbox === "memory") {
Funbox.resetMemoryTimer();
$("#wordsWrapper").addClass("hidden");
}
@ -433,7 +433,7 @@ export async function init() {
if (Config.mode === "words" && Config.words === 0) {
wordsBound = 100;
}
if (Funbox.funboxSaved === "plus_one") {
if (Config.funbox === "plus_one") {
wordsBound = 2;
}
let wordset = language.words;
@ -462,7 +462,7 @@ export async function init() {
}
}
if (Funbox.funboxSaved === "rAnDoMcAsE") {
if (Config.funbox === "rAnDoMcAsE") {
let randomcaseword = "";
for (let i = 0; i < randomWord.length; i++) {
if (i % 2 != 0) {
@ -472,17 +472,17 @@ export async function init() {
}
}
randomWord = randomcaseword;
} else if (Funbox.funboxSaved === "gibberish") {
} else if (Config.funbox === "gibberish") {
randomWord = Misc.getGibberish();
} else if (Funbox.funboxSaved === "58008") {
} else if (Config.funbox === "58008") {
// UpdateConfig.setPunctuation(false, true);
UpdateConfig.setNumbers(false, true);
randomWord = Misc.getNumbers(7);
} else if (Funbox.funboxSaved === "specials") {
} else if (Config.funbox === "specials") {
UpdateConfig.setPunctuation(false, true);
UpdateConfig.setNumbers(false, true);
randomWord = Misc.getSpecials();
} else if (Funbox.funboxSaved === "ascii") {
} else if (Config.funbox === "ascii") {
UpdateConfig.setPunctuation(false, true);
UpdateConfig.setNumbers(false, true);
randomWord = Misc.getASCII();
@ -774,7 +774,7 @@ export function restart(
document.querySelector("#liveWpm").innerHTML = "0";
document.querySelector("#liveAcc").innerHTML = "100%";
if (Funbox.active === "memory") {
if (Config.funbox === "memory") {
Funbox.startMemoryTimer();
if (Config.keymapMode === "next") {
UpdateConfig.setKeymapMode("react");
@ -792,15 +792,15 @@ export function restart(
mode2 = randomQuote.id;
}
let fbtext = "";
if (Funbox.active !== "none") {
fbtext = " " + Funbox.active;
if (Config.funbox !== "none") {
fbtext = " " + Config.funbox;
}
$(".pageTest #premidTestMode").text(
`${Config.mode} ${mode2} ${Config.language}${fbtext}`
);
$(".pageTest #premidSecondsLeft").text(Config.time);
if (Funbox.active === "layoutfluid") {
if (Config.funbox === "layoutfluid") {
UpdateConfig.setLayout(
Config.customLayoutfluid
? Config.customLayoutfluid.split("#")[0]
@ -874,7 +874,7 @@ export function calculateWpmAndRaw() {
if (words.getCurrent() == input.current) {
correctWordChars += input.current.length;
}
if (Funbox.active === "nospace") {
if (Config.funbox === "nospace") {
spaces = 0;
}
chars += input.current.length;
@ -889,7 +889,7 @@ export function calculateWpmAndRaw() {
export function addWord() {
let bound = 100;
if (Funbox.active === "plus_one") bound = 1;
if (Config.funbox === "plus_one") bound = 1;
if (
words.length - input.history.length > bound ||
(Config.mode === "words" &&
@ -942,7 +942,7 @@ export function addWord() {
}
}
if (Funbox.active === "rAnDoMcAsE") {
if (Config.funbox === "rAnDoMcAsE") {
let randomcaseword = "";
for (let i = 0; i < randomWord.length; i++) {
if (i % 2 != 0) {
@ -952,13 +952,13 @@ export function addWord() {
}
}
randomWord = randomcaseword;
} else if (Funbox.active === "gibberish") {
} else if (Config.funbox === "gibberish") {
randomWord = Misc.getGibberish();
} else if (Funbox.active === "58008") {
} else if (Config.funbox === "58008") {
randomWord = Misc.getNumbers(7);
} else if (Funbox.active === "specials") {
} else if (Config.funbox === "specials") {
randomWord = Misc.getSpecials();
} else if (Funbox.active === "ascii") {
} else if (Config.funbox === "ascii") {
randomWord = Misc.getASCII();
}
@ -1379,7 +1379,7 @@ export function finish(difficultyFailed = false) {
keyDuration: TestStats.keypressTimings.duration.array,
consistency: consistency,
keyConsistency: keyConsistency,
funbox: Funbox.funboxSaved,
funbox: Config.funbox,
bailedOut: bailout,
chartData: chartData,
customText: cdata,
@ -1562,6 +1562,7 @@ export function finish(difficultyFailed = false) {
);
}
if (!window.navigator.onLine) {
AccountButton.loading(false);
Notifications.add("You are offline. Result not saved.", -1);
} else {
axiosInstance
@ -1732,9 +1733,9 @@ export function finish(difficultyFailed = false) {
}
if (
Config.mode != "custom" &&
Funbox.funboxSaved !== "gibberish" &&
Funbox.funboxSaved !== "ascii" &&
Funbox.funboxSaved !== "58008"
Config.funbox !== "gibberish" &&
Config.funbox !== "ascii" &&
Config.funbox !== "58008"
) {
testType += "<br>" + lang;
}
@ -1747,8 +1748,8 @@ export function finish(difficultyFailed = false) {
if (Config.blindMode) {
testType += "<br>blind";
}
if (Funbox.funboxSaved !== "none") {
testType += "<br>" + Funbox.funboxSaved.replace(/_/g, " ");
if (Config.funbox !== "none") {
testType += "<br>" + Config.funbox.replace(/_/g, " ");
}
if (Config.difficulty == "expert") {
testType += "<br>expert";
@ -1802,9 +1803,9 @@ export function finish(difficultyFailed = false) {
$("#result .stats .source").addClass("hidden");
}
if (Funbox.funboxSaved !== "none") {
let content = Funbox.funboxSaved;
if (Funbox.funboxSaved === "layoutfluid") {
if (Config.funbox !== "none") {
let content = Config.funbox;
if (Config.funbox === "layoutfluid") {
content += " " + Config.customLayoutfluid.replace(/#/g, " ");
}
ChartController.result.options.annotation.annotations.push({

View file

@ -310,7 +310,7 @@ function countChars() {
spaces++;
}
}
if (Funbox.active === "nospace") {
if (Config.funbox === "nospace") {
spaces = 0;
correctspaces = 0;
}

View file

@ -40,7 +40,7 @@ export function start() {
let acc = Misc.roundTo2(TestStats.calculateAccuracy());
if (Funbox.active === "layoutfluid" && Config.mode === "time") {
if (Config.funbox === "layoutfluid" && Config.mode === "time") {
const layouts = Config.customLayoutfluid
? Config.customLayoutfluid.split("#")
: ["qwerty", "dvorak", "colemak"];

View file

@ -524,9 +524,9 @@ export function updateModesNotice() {
);
}
if (Funbox.active !== "none") {
if (Config.funbox !== "none") {
$(".pageTest #testModesNotice").append(
`<div class="text-button" commands="commandsFunbox"><i class="fas fa-gamepad"></i>${Funbox.active.replace(
`<div class="text-button" commands="commandsFunbox"><i class="fas fa-gamepad"></i>${Config.funbox.replace(
/_/g,
" "
)}</div>`

View file

@ -138,7 +138,7 @@ export function changePage(page) {
TestStats.resetIncomplete();
ManualRestart.set();
TestLogic.restart();
Funbox.activate(Funbox.funboxSaved, Funbox.modeSaved);
Funbox.activate(Config.funbox);
} else if (page == "about") {
setPageTransition(true);
TestLogic.restart();
@ -147,7 +147,7 @@ export function changePage(page) {
history.pushState("about", null, "about");
$(".page.pageAbout").addClass("active");
});
Funbox.activate("none", null);
Funbox.activate("none");
TestConfig.hide();
SignOutButton.hide();
} else if (page == "settings") {
@ -158,7 +158,7 @@ export function changePage(page) {
history.pushState("settings", null, "settings");
$(".page.pageSettings").addClass("active");
});
Funbox.activate("none", null);
Funbox.activate("none");
Settings.update();
TestConfig.hide();
SignOutButton.hide();
@ -184,7 +184,7 @@ export function changePage(page) {
SignOutButton.show();
}
);
Funbox.activate("none", null);
Funbox.activate("none");
Account.update();
TestConfig.hide();
}
@ -199,7 +199,7 @@ export function changePage(page) {
history.pushState("login", null, "login");
$(".page.pageLogin").addClass("active");
});
Funbox.activate("none", null);
Funbox.activate("none");
TestConfig.hide();
SignOutButton.hide();
}

View file

@ -1 +1,291 @@
google.com, pub-7261919841327810, DIRECT, f08c47fec0942fa0
google.com, pub-7261919841327810, DIRECT, f08c47fec0942fa0
#V 29.04.2021 VH
#A9
#------------------------------------------------------------------------------------------------------
aps.amazon.com,70247b00-ff8f-4016-b3ab-8344daf96e09,DIRECT # Amazon UAM
appnexus.com,806,DIRECT,f5ab79cb980f11d1 # Xandr TAM
smartadserver.com,3490,DIRECT # Smart TAM
sovrn.com,237754,DIRECT,fafdf38b16bf6b2b # Sovrn TAM
lijit.com,237754,DIRECT,fafdf38b16bf6b2b # Sovrn TAM
pubmatic.com,159401,DIRECT,5d62403b186f2ace # Pubmatic TAM
pubmatic.com,160006,RESELLER,5d62403b186f2ace # Pubmatic UAM
pubmatic.com,160096,RESELLER,5d62403b186f2ace # Pubmatic UAM
openx.com,542378302,DIRECT,6a698e2ec38604c6 # OpenX TAM
rubiconproject.com,18020,RESELLER,0bfd66d529a55807 # Rubicon UAM
appnexus.com,1908,RESELLER,f5ab79cb980f11d1 # DistrictM TAM
districtm.io,100749,RESELLER,3fd707be9c4527c3 # DistrictM TAM
adtech.com,12068,RESELLER,e1a5b5b6e3255540 # Verizon UAM
ad-generation.jp,12474,RESELLER,7f4ea9029ac04e53 # Ad Generation JP UAM
appnexus.com,3663,RESELLER,f5ab79cb980f11d1 # Yahoo JP UAM
rhythmone.com,1654642120,RESELLER,a670c89d4a324e47 # Unruly RMO UAM
yahoo.com,55029,RESELLER,e1a5b5b6e3255540 # Verizon UAM
yieldmo.com, 2467323546544578775, DIRECT # Yieldmo TAM
conversantmedia.com, 41150, DIRECT, 03113cd04947736d # Conversant TAM
Triplelift.com,5241,DIRECT,6c33edb13117fd86 # Triplelift TAM
indexexchange.com,193067,DIRECT,50b1c356f2c5c8fc # Index TAM
EMXDGT.com,1741, DIRECT, 1e1d41537f7cad7f # EMX Digital TAM
Appnexus.com, 1356, RESELLER, f5ab79cb980f11d1 # EMX Digital TAM
smaato.com,1100044650,RESELLER,07bcf65f187117b4 # Smaato UAM
gumgum.com,14141,RESELLER,ffdef49475d318a9 # GumGum UAM
admanmedia.com, 663, DIRECT # Adman TAM
appnexus.com, 8804, RESELLER, f5ab79cb980f11d1 # Adman TAM
pubmatic.com, 158481, RESELLER, 5d62403b186f2ace # Adman TAM
smartadserver.com, 3713, RESELLER # Adman TAM
openx.com, 540866936, RESELLER, 6a698e2ec38604c6 # Adman TAM
admanmedia.com,726,RESELLER # Adman UAM
yahoo.com, 58855, DIRECT, e1a5b5b6e3255540 # Verizon TAM
#OB
#------------------------------------------------------------------------------------------------------
vdopia.com, 15297, DIRECT, 49a66ce31a704197 # Chocolate OB
chocolateplatform.com, 15297, DIRECT, 49a66ce31a704197 # Chocolate OB
adingo.jp, 24379, DIRECT # Fluct OB
improvedigital.com, 1640, DIRECT # Improve OB
indexexchange.com, 188416, DIRECT, 50b1c356f2c5c8fc # Index OB
openx.com, 540368327, RESELLER, 6a698e2ec38604c6 # OpenX OB
rubiconproject.com, 17902, RESELLER, 0bfd66d529a55807 # Rubicon OB
pubmatic.com, 158940, DIRECT, 5d62403b186f2ace # Pubmatic OB
smartadserver.com, 3490, DIRECT # Smart RTB OB
sonobi.com, ae3eca5cbd, DIRECT, d1a215d9eb5aee9e # Sonobi OB
lijit.com, 237754-eb, DIRECT, fafdf38b16bf6b2b # Sovrn OB
video.unrulymedia.com, 2864567592, DIRECT # Unruly RONE OB
rhythmone.com, 985572675, DIRECT, a670c89d4a324e47 # Unruly RONE OB
yieldmo.com, 2440034292147889057, DIRECT # Yieldmo OB
advertising.com, 28621, DIRECT # Verizon OB
tremorhub.com, hpwve, RESELLER, 1a4e959a1b50034a # Telaria OB
telaria.com, hpwve, RESELLER, 1a4e959a1b50034a # Telaria OB
#Prebid
#------------------------------------------------------------------------------------------------------
33across.com,Qp92QD-Kr6yoFaKkGJozW, DIRECT, bbea06d9c4d2853c # 33Across
google.com, pub-5781531207509232, DIRECT, f08c47fec0942fa0 # AdX
google.com, pub-4968145218643279, DIRECT, f08c47fec0942fa0 # Adx Test
google.com, pub-4968145218643279, RESELLER, f08c47fec0942fa0 # Adx Test
google.com, pub-2553634189837243, DIRECT, f08c47fec0942fa0 # AdS
adagio.io, 1090, DIRECT # Adagio
rubiconproject.com, 19116, RESELLER, 0bfd66d529a55807 # Adagio
pubmatic.com, 159110, RESELLER, 5d62403b186f2ace # Adagio
improvedigital.com, 1790, RESELLER # Adagio
onetag.com, 6b859b96c564fbe, RESELLER # Adagio
adform.com, 2767, RESELLER # AdForm
adyoulike.com, c1314a52de718f3c214c00173d2994f9, Direct # Adyoulike
appnexus.com, 9733, RESELLER # Adyoulike
openx.com, 540847510, RESELLER, 6a698e2ec38604c6 # Adyoulike
rubiconproject.com, 20736, RESELLER, 0bfd66d529a55807 # Adyoulike
amxrtb.com, 105199358, DIRECT # Appmonet
smartadserver.com, 3056, RESELLER # Appmonet
appnexus.com, 11786, RESELLER # Appmonet
appnexus.com, 9393, RESELLER # Appmonet
lijit.com, 260380, RESELLER, fafdf38b16bf6b2b # Appmonet
indexexchange.com, 191503, RESELLER # Appmonet
pubmatic.com, 158355, RESELLER, 5d62403b186f2ace # Appmonet
criteo.com, B-062405, DIRECT, 9fac4a4a87c2a44f # Criteo
districtm.io, 100749, DIRECT # DistrictM
appnexus.com, 1908, RESELLER,f5ab79cb980f11d1 # DistrictM
appnexus.com, 7944, RESELLER,f5ab79cb980f11d1 # DistrictM
improvedigital.com, 1012, DIRECT # Improve prebid
indexexchange.com, 183921, DIRECT, 50b1c356f2c5c8fc # Index Exchange Display and Video
Media.net,8CU5786QK, DIRECT # Media.net
openx.com, 537100188, RESELLER, 6a698e2ec38604c6 # Media.net
pubmatic.com, 159463, RESELLER, 5d62403b186f2ace # Media.net
onetag.com, 5d49f482552c9b6, Reseller # Media.net
loopme.com, 10509, RESELLER, 6c8d5f95897a5a3b # LoopMe
loopme.com, 11398, RESELLER, 6c8d5f95897a5a3b # LoopMe
loopme.com, 10509, DIRECT, 6c8d5f95897a5a3b # LoopMe
rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807 # LoopMe
engagebdr.com, 10181, RESELLER # LoopMe
openx.com, 537144009, DIRECT, 6a698e2ec38604c6 # OpenX
pubmatic.com,159234,DIRECT,5d62403b186f2ace # Pubmatic
pubmatic.com,159234,RESELLER,5d62403b186f2ace # Pubmatic
pubmatic.com, 160552, RESELLER, 5d62403b186f2ace # Pubmatic oRTB
richaudience.com, 1XvIoD5o0S, DIRECT # Rich Audience
adform.com, 1941, DIRECT # Rich Audience
adform.com, 1942, DIRECT # Rich Audience
advertising.com, 7574, DIRECT # Rich Audience
appnexus.com, 8233, DIRECT # Rich Audience
appnexus.com, 2928, DIRECT # Rich Audience
pubmatic.com, 81564, DIRECT, 5d62403b186f2ace # Rich Audience
pubmatic.com, 156538, DIRECT, 5d62403b186f2ace # Rich Audience
rubiconproject.com, 13510, DIRECT # Rich Audience
spotx.tv, 173175, DIRECT # Rich Audience
spotx.tv, 173177, DIRECT # Rich Audience
spotxchange.com, 173175, DIRECT # Rich Audience
spotxchange.com, 173177, DIRECT # Rich Audience
ironsrc.com, 5fa94677b2db6a00015b22a9, DIRECT # Rise
risecodes.com, 5fa94677b2db6a00015b22a9, DIRECT # Rise
Pubmatic.com, 160295, RESELLER, 5d62403b186f2ace # Rise
spotxchange.com, 304965, RESELLER, 7842df1d2fe2db34 # Rise
spotx.tv, 304965, RESELLER, 7842df1d2fe2db34 # Rise
indexexchange.com, 185996, DIRECT # Rise
rubiconproject.com, 13762, RESELLER, 0bfd66d529a55807 # Rubicon
sharethrough.com, 31c129df, DIRECT, d53b998a7bd4ecd2 # Sharethrough
indexexchange.com, 186046, RESELLER # Sharethrough
rubiconproject.com, 18694, RESELLER, 0bfd66d529a55807 # Sharethrough
smartadserver.com, 3490, DIRECT # Smart RTB Display and Video
appnexus.com, 3703, RESELLER, f5ab79cb980f11d1 # Smart RTB
rubiconproject.com, 16114, RESELLER, 0bfd66d529a55807 # Smart RTB
sonobi.com, 116da9d98c, DIRECT, d1a215d9eb5aee9e # Sonobi
rhythmone.com, 1059622079, RESELLER, a670c89d4a324e47 # Sonobi
contextweb.com, 560606, RESELLER, 89ff185a4c4e857c # Sonobi
sovrn.com, 237754, DIRECT, fafdf38b16bf6b2b # Sovrn
themediagrid.com,FLBAK7,DIRECT,35d5010d7789b49d # Themediagrid
themediagrid.com,LTW57M,DIRECT,35d5010d7789b49d # Themediagrid New
triplelift.com, 6059, DIRECT, 6c33edb13117fd86 # Triplelift
appnexus.com, 1314, RESELLER, f5ab79cb980f11d1 # Triplelift
ucfunnel.com, pub-627DB429DDBB82ADFEE44B8DE4E78376, DIRECT # Ucfunnel
aralego.com, pub-627DB429DDBB82ADFEE44B8DE4E78376, DIRECT # Aralego
adiiix.com, pub-627DB429DDBB82ADFEE44B8DE4E78376, DIRECT # Adiiix
undertone.com, 3860, DIRECT # Undertone
appnexus.com, 2234, RESELLER # Undertone
openx.com, 537153564, RESELLER, 6a698e2ec38604c6 # Undertone
rubiconproject.com, 22412, RESELLER, 0bfd66d529a55807 # Undertone
advertising.com, 28650, RESELLER # Undertone
aol.com, 55305, DIRECT # Verizon
yahoo.com, 55305, DIRECT # Verizon
adtech.com, 4596, DIRECT # Verizon
aolcloud.net, 4596, DIRECT # Verizon
appnexus.com, 806, DIRECT, f5ab79cb980f11d1 # Xandr
appnexus.com,1908,RESELLER,f5ab79cb980f11d1 # Xandr
appnexus.com, 7911, RESELLER # Yieldmo
rubiconproject.com, 17070, RESELLER, 0bfd66d529a55807 # Yieldmo
yieldmo.com, 2440034636282143652, DIRECT # Yieldmo
#Video
#------------------------------------------------------------------------------------------------------
advertising.com, 2694, DIRECT # Verizon AOL video
google.com, pub-5781531207509232, DIRECT, f08c47fec0942fa0 # AdX
google.com, pub-4968145218643279, DIRECT, f08c47fec0942fa0 # Adx Test
google.com, pub-4968145218643279, RESELLER, f08c47fec0942fa0 # Adx Test
google.com, pub-2553634189837243, DIRECT, f08c47fec0942fa0 # AdS
aniview.com, 5f2063121d82c82557194737, RESELLER, 78b21b97965ec3f8 # Aniview
advertising.com, 23089, RESELLER # Aniview
appnexus.com, 9382, RESELLER, f5ab79cb980f11d1 # Aniview
google.com, pub-5717092533913515, RESELLER, f08c47fec0942fa0 # Aniview
google.com, pub-4586415728471297, RESELLER, f08c47fec0942fa0 # Aniview
pubmatic.com, 159941, RESELLER, 5d62403b186f2ace # Aniview
smartadserver.com, 2786, DIRECT # Aniview
improvedigital.com, 1147, DIRECT # Aniview
appnexus.com, 10112, RESELLER # Aniview
appnexus.com, 7445, DIRECT # Adbility
google.com, pub-7452201096415972, DIRECT, f08c47fec0942fa0 # Adbility
smartclip.net, 8153, DIRECT # Adbility
spotxchange.com, 245212, DIRECT, 7842df1d2fe2db34 # Adbility
spotx.tv, 245212, DIRECT, 7842df1d2fe2db34 # Adbility
adform.com, 2767, RESELLER # AdForm
appnexus.com, 806, DIRECT # Xandr video
spotxchange.com,81557, RESELLER, 7842df1d2fe2db34 # Digiteka
spotx.tv, 81557, RESELLER, 7842df1d2fe2db34 # Digiteka
spotxchange.com, 182292, RESELLER, 7842df1d2fe2db34 # Digiteka
spotx.tv, 182292, RESELLER, 7842df1d2fe2db34 # Digiteka
google.com, pub-7026431251527825, RESELLER, f08c47fec0942fa0 # Digiteka
google.com, pub-5549723401598621, DIRECT, f08c47fec0942fa0 # Digiteka
freewheel.tv, 1953, DIRECT # Freewheel
freewheel.tv, 187721, DIRECT # Freewheel
freewheel.tv, 211121, DIRECT # Freewheel
freewheel.tv, 196129, DIRECT # Freewheel
freewheel.tv, 228641, DIRECT # Freewheel
freewheel.tv, 187865, DIRECT # Freewheel
freewheel.tv, 211129, DIRECT # Freewheel
freewheel.tv, 196145, DIRECT # Freewheel
freewheel.tv, 228649, DIRECT # Freewheel
improvedigital.com, 1012, DIRECT # Improve prebid
indexexchange.com, 183921, DIRECT, 50b1c356f2c5c8fc # Index video
ironsrc.com, 5fa94677b2db6a00015b22a9, DIRECT # IronSource
ironsrc.com, 5a169d7d9515390002000001, DIRECT # IronSource
openx.com, 537140488, Direct, 6a698e2ec38604c6 # IronSource
Pubmatic.com, 159087, DIRECT, 5d62403b186f2ace # IronSource
Advertising.com, 8693, DIRECT # IronSource
lkqd.net, 304, DIRECT, 59c49fa9598a0117 # LKQD video
lkqd.com, 304, RESELLER, 59c49fa9598a0117 # LKQD video
loopme.com, 10509, RESELLER, 6c8d5f95897a5a3b # LoopMe
loopme.com, 10509, DIRECT, 6c8d5f95897a5a3b # LoopMe
rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807 # LoopMe
engagebdr.com, 10181, RESELLER # LoopMe
onetag.com, 59c7d7f65f9d658, DIRECT # OneTag
openx.com, 540134228, DIRECT, 6a698e2ec38604c6 # OpenX video
openx.com, 540634629, DIRECT, 6a698e2ec38604c6 # OpenX video
pubmatic.com,159234,DIRECT,5d62403b186f2ace # Pubmatic Video
pubmatic.com, 160552, RESELLER, 5d62403b186f2ace # Pubmatic oRTB
richaudience.com, 1XvIoD5o0S, DIRECT # Rich Audience
risecodes.com, 5fa94677b2db6a00015b22a9, DIRECT # Rise Codes RTB
rubiconproject.com, 13762, DIRECT, 0bfd66d529a55807 # Rubicon video
smartadserver.com, 3490, DIRECT # Smartadserver video
spotx.tv, 141412, DIRECT, 7842df1d2fe2db34 # Spotx video
spotxchange.com, 141412, DIRECT, 7842df1d2fe2db34 # Spotx video
springserve.com, 550, DIRECT, a24eb641fc82e93d # SpringServe
beachfront.com, 4969, RESELLER, e2541279e8e2ca4d # SpringServe
advertising.com, 26282, RESELLER # SpringServe
pubmatic.com, 157310, RESELLER, 5d62403b186f2ace # SpringServe
rhythmone.com, 2968119028, RESELLER, a670c89d4a324e47 # SpringServe
spotxchange.com, 239904, RESELLER, 7842df1d2fe2db34 # SpringServe
spotx.tv, 239904, RESELLER, 7842df1d2fe2db34 # SpringServe
contextweb.com, 561910, RESELLER, 89ff185a4c4e857c # SpringServe
openx.com, 540226160, RESELLER, 6a698e2ec38604c6 # SpringServe
openx.com, 540255318, RESELLER, 6a698e2ec38604c6 # SpringServe
ssp.ynxs.io, 185, RESELLER # SpringServe
teads.tv, 16676, DIRECT, 15a9c44f6d26cbe1 # Teads video
tremorhub.com, hpwve, RESELLER, 1a4e959a1b50034a # Telaria video
telaria.com, hpwve, RESELLER, 1a4e959a1b50034a # Telaria video
video.unrulymedia.com, UNRX-PUB-29dad46b-9bec-43c7-b950-c59d09cc8c71, DIRECT # Unruly RONE
video.unrulymedia.com, 985572675, DIRECT # Unruly RONE
rhythmone.com, 2864567592, DIRECT, a670c89d4a324e47 # Unruly RONE
vidoomy.com, 56924, DIRECT # Vidoomy
aol.com, 22762, DIRECT # Vidoomy
freewheel.tv, 872257, DIRECT # Vidoomy
freewheel.tv, 894193, DIRECT # Vidoomy
lkqd.com, 430, DIRECT, 59c49fa9598a0117 # Vidoomy
lkqd.net, 430, DIRECT, 59c49fa9598a0117 # Vidoomy
openx.com, 540804929, DIRECT, 6a698e2ec38604c6 # Vidoomy
spotx.tv, 218443, DIRECT, 7842df1d2fe2db34 # Vidoomy
spotxchange.com, 218443, DIRECT, 7842df1d2fe2db34 # Vidoomy
emxdgt.com, 1495, DIRECT, 1e1d41537f7cad7f # Vidoomy
appnexus.com, 1356, DIRECT, f5ab79cb980f11d1 # Vidoomy
#Rich Media
#------------------------------------------------------------------------------------------------------
openx.com, 539640546, RESELLER, 6a698e2ec38604c6 # JustP
appnexus.com, 7118, RESELLER # JustP
improvedigital.com, 185, RESELLER # JustP
indexexchange.com, 189872, RESELLER # JustP
pubmatic.com, 160210, RESELLER, 5d62403b186f2ace # JustP
rhythmone.com,4116102010,RESELLER,a670c89d4a324e47 # JustP
video.unrulymedia.com,4116102010, RESELLER # JustP
#Affiliate
#------------------------------------------------------------------------------------------------------
revcontent.com, 130780, DIRECT # Rev Content
appnexus.com, 7666, RESELLER, f5ab79cb980f11d1 # Rev Content
my6sense.com, 9732, RESELLER # Rev Content
engagebdr.com, 10304, RESELLER # Rev Content
synacor.com, 82291, RESELLER, e108f11b2cdf7d5b # Rev Content
indexexchange.com, 192143, RESELLER # Rev Content
target.my.com, 10731977, DIRECT # Target
pubmatic.com, 10731977, RESELLER # Target
admixer.com, 10731977, RESELLER # Target
onetag.com, 59d216e971852f2, RESELLER # Target
admixer.net, 2878f07c-cc3f-4f8a-a26c-8e6033a539a6, RESELLER # Target
betweendigital.com, 43092, RESELLER # Target
e-planning.net, ec771b05828a67fa, RESELLER # Target
improvedigital.com, 1532, RESELLER # Target
lijit.com, 273644, RESELLER # Target
loopme.com, 11278, RESELLER # Target
onetag.com, 5d1628750185ace, RESELLER # Target
openx.com, 540298543, RESELLER # Target
openx.com, 541031350, RESELLER # Target
openx.com, 541177349, RESELLER # Target
pubmatic.com, 156631, RESELLER # Target
pubmatic.com, 158154, RESELLER # Target
pubmatic.com, 159542, RESELLER # Target
pubmatic.com, 159668, RESELLER # Target
rhythmone.com, 3880497124, RESELLER # Target
rubiconproject.com, 19724, RESELLER # Target
rubiconproject.com, 20744, RESELLER # Target
sovrn.com, 273644, RESELLER # Target

View file

@ -21,6 +21,10 @@
"name": "arabic",
"languages": ["arabic"]
},
{
"name": "malagasy",
"languages": ["malagasy", "malagasy_1k"]
},
{
"name": "malay",
"languages": ["malay"]

View file

@ -12,6 +12,8 @@
,"french_2k"
,"french_10k"
,"arabic"
,"malagasy"
,"malagasy_1k"
,"malay"
,"mongolian"
,"mongolian_10k"

View file

@ -0,0 +1,206 @@
{
"name": "malagasy",
"leftToRight": true,
"words": [
"izany",
"no",
"izy",
"anaka",
"hoy",
"ny",
"efa",
"ka",
"zakao",
"tsia",
"rainy",
"tsy",
"avy",
"izao",
"fa",
"atao",
"hoe",
"tsara",
"anie",
"izay",
"teto",
"anao",
"nefa",
"nisy",
"hono",
"ho",
"aho",
"ry",
"dada",
"ve",
"ity",
"ary",
"aminy",
"dia",
"vita",
"teny",
"misy",
"olona",
"azo",
"eny",
"ianao",
"ilay",
"raha",
"sy",
"hita",
"tody",
"dieny",
"aoka",
"eto",
"mba",
"loza",
"be",
"soa",
"ratsy",
"mamy",
"na",
"samy",
"hafa",
"asa",
"tokoa",
"io",
"natao",
"ireny",
"any",
"azy",
"noho",
"hahay",
"tia",
"ihany",
"koa",
"sady",
"saina",
"ireo",
"poeta",
"anefa",
"mety",
"akory",
"maha",
"eo",
"avo",
"isaky",
"isika",
"tena",
"feo",
"ao",
"manao",
"adidy",
"araka",
"injao",
"amina",
"iza",
"inona",
"fomba",
"mandà",
"asany",
"afaka",
"irery",
"tonga",
"azoko",
"toa",
"mila",
"iray",
"hatao",
"andry",
"momba",
"kosa",
"anny",
"zony",
"hiasa",
"mbola",
"aina",
"mahay",
"biby",
"anaty",
"aza",
"kokoa",
"ampy",
"olana",
"hery",
"toy",
"ara",
"antsy",
"nosy",
"vao",
"maro",
"dihy",
"vary",
"sisa",
"maso",
"aleo",
"very",
"may",
"vava",
"tsapa",
"tany",
"taona",
"tiako",
"ery",
"anay",
"loha",
"lova",
"malagasy",
"omeny",
"lanja",
"afa",
"miala",
"inty",
"àry",
"tao",
"teo",
"miova",
"ray",
"iny",
"saigy",
"fiara",
"tsiny",
"resy",
"hisy",
"aminy",
"milza",
"liana",
"azao",
"vola",
"dimy",
"arivo",
"krizy",
"firy",
"tsena",
"feno",
"lasa",
"manko",
"kiry",
"miasa",
"voho",
"dika",
"roa",
"telo",
"lany",
"hay",
"dia",
"maty",
"kanto",
"sy",
"aty",
"amidy",
"foana",
"boky",
"jamba",
"adika",
"radio",
"te",
"nanao",
"ireto",
"an'ny",
"ala",
"hazo",
"tiana",
"aloka",
"manja",
"lahy"
]
}

File diff suppressed because it is too large Load diff

View file

@ -1,22 +1,10 @@
{
"language": "german",
"groups": [
[
0,
100
],
[
101,
300
],
[
301,
600
],
[
601,
9999
]
[0, 100],
[101, 300],
[301, 600],
[601, 9999]
],
"quotes": [
{
@ -698,7 +686,7 @@
"id": 113
},
{
"text": "Um halb neun griff Mr Dursley nach der Aktentasche, gab seiner Frau einen Schmatz auf die Wange und versuchte es auch bei Dudley mit einem Abschiedskuss. Der ging jedoch daneben, weil Dudley gerade einen Wutanfall hatte und die Wände mit seinem Haferbrei bewarf. >>Kleiner Schlingel<<, gluckste Mr Dursley, während er nach draußen ging. Er setzte sich in den Wagen und fuhr rückwärts die Einfahrt zu Nummer 4 hinaus.",
"text": "Um halb neun griff Mr Dursley nach der Aktentasche, gab seiner Frau einen Schmatz auf die Wange und versuchte es auch bei Dudley mit einem Abschiedskuss. Der ging jedoch daneben, weil Dudley gerade einen Wutanfall hatte und die Wände mit seinem Haferbrei bewarf. \"Kleiner Schlingel\", gluckste Mr Dursley, während er nach draußen ging. Er setzte sich in den Wagen und fuhr rückwärts die Einfahrt zu Nummer 4 hinaus.",
"source": "Harry Potter und der Stein der Weisen",
"length": 414,
"id": 114
@ -788,4 +776,4 @@
"id": 128
}
]
}
}

View file

@ -43,7 +43,7 @@ a:hover {
}
#logo,
.word letter.correct {
#typingTest .word letter.correct {
animation-name: shadow;
animation-duration: 5s;
animation-iteration-count: 1;