Compare commits

..

2 Commits

Author SHA1 Message Date
e8a4a9740e Merge branch 'dev' into feature/sync 2021-08-22 05:13:37 -05:00
7f1a1add8c Revert "Temporarily remove device sync"
This reverts commit da018fc64d.
2021-05-09 18:22:15 -05:00
750 changed files with 19361 additions and 16387 deletions

6
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "gradle"
directory: "/"
schedule:
interval: "monthly"

View File

@@ -7,25 +7,59 @@ on:
paths-ignore:
- '**.md'
jobs:
Test:
runs-on: self-hosted
timeout-minutes: 30
Build:
runs-on: ubuntu-latest
steps:
- name: Check out source code
uses: actions/checkout@v4
uses: actions/checkout@v1
- name: Build project
- name: Install Java Development Kit 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build Project
run: ./build.sh build
- name: Run Android tests
run: ./build.sh android-tests-parallel 28 29 30 32 33 34
- name: Upload artifacts
if: always()
uses: actions/upload-artifact@v4
- name: Upload Build Artifacts
uses: actions/upload-artifact@v2
with:
name: build
path: |
build/*log
uhabits-android/build/outputs
name: uhabits-android
path: uhabits-android/build/outputs/
AndroidTest:
needs: Build
runs-on: macOS-10.15
timeout-minutes: 60
strategy:
matrix:
api: [
23,
24,
25,
26,
27,
28,
# 29, # Crashes constantly, see: https://issuetracker.google.com/issues/159732638
# 30, # Not available yet
# 31, # Not available yet
]
steps:
- name: Check out source code
uses: actions/checkout@v1
- name: Download Previously Built APK
uses: actions/download-artifact@v2
with:
name: uhabits-android
path: uhabits-android/build/outputs/
- name: Install flock
run: |
brew install util-linux
echo "/usr/local/opt/util-linux/bin" >> $GITHUB_PATH
- name: Run Android Tests
run: ./build.sh android-tests ${{ matrix.api }}

6
.gitignore vendored
View File

@@ -12,9 +12,13 @@
.idea
.secret
build
build/
captures
local.properties
node_modules
*xcuserdata*
*.sketch
/design
/releases
/screenshots
crowdin.yml
kotlin-js-store

16
.secret/decrypt.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/sh
cd "$(dirname "$0")"
if [ -z "$GPG_PASSWORD" ]; then
echo Env variable GPG_PASSWORD must be defined
exit 1
fi
gpg \
--quiet \
--batch \
--yes \
--decrypt \
--passphrase="$GPG_PASSWORD" \
--output secret.tar.gz \
secret
tar -xzf secret.tar.gz
rm secret.tar.gz

BIN
.secret/secret Normal file

Binary file not shown.

View File

@@ -1,78 +1,5 @@
# Changelog
## [2.2.0] -- 2024-01-30
### Added
- Add support for Android 14 (@iSoron, @hiqua)
- Allow user to change app language (@leondzn)
### Fixed
- Implement workaround to make notifications non-dismissible in Android 14 (@iSoron, #1872)
- Fix splash screen background color in dark mode (@SIKV, #1888)
## [2.1.3] -- 2023-08-28
### Fixed
- Use text input on Samsung devices (@iSoron, #1719)
- Prevent crash if alarm permission is revoked (@iSoron)
- Adjust widget colors (@iSoron)
- Fix bug preventing screens from updating at midnight (@iSoron)
- Fix skip button in locales that use comma instead of dot (@iSoron, #1721)
## [2.1.2] -- 2023-05-26
### Fixed
- Fix bug that caused widget to enter checkmark on wrong date (@iSoron, #1541)
- Fix widget corners on Android 12 (@iSoron)
- Fix bug that caused notes to be lost when editing a checkmark (@iSoron, #1566)
- Prevent soft keyboard from covering entry popup (@iSoron)
- Accept comma (instead of dot) in certain locales (@iSoron)
### Changed
- Remove update delay after entering a checkmark (@iSoron)
### Removed
- Remove stack widgets (@iSoron)
## [2.1.1] -- 2022-09-24
### Fixed
- Fix Tasker plugin (@iSoron, #1503)
## [2.1.0] -- 2022-09-10
### Added
- Allow user to add notes to specific dates (@vbh, #1103)
- Allow user to track "at most" numerical habits (@KristianTashkov, #1101)
- Allow user to add skips to measurable habits (@kalina559, #1319)
- Bring back custom frequencies (x times in y days) (@hiqua, #1079)
- Improve number picker (@hiqua, @iSoron, #1082, #1370)
- Add new checkmark and number picker (@iSoron, #1370)
- Allow user to import numerical habits from HabitBull (@hiqua, #1278)
- Add support for Android 13 themed icons (@cheeeeer, #1497)
### Removed
- Hide snooze button Android 12 notifications (@hiqua, #1226)
- Remove preference to set LED lights (@iSoron)
### Changed
- Hide failed habits along with completed ones (@hiqua, #1052)
- Cycle through all checkmark states when toggling (@iSoron)
- Add delay after toggling a habit (@hiqua, @kalina559, #1147)
- Small theme improvements (@KristianTashkov, #1113)
- Left-align habit notes (@iSoron)
- Increase target SDK to 31 (@hiqua)
### Fixed
- Fix small dialog buttons (@kalina559, #1096)
- Fix invalid CSV files (@hiqua, #1177)
- Fix small issues in calendar chart (@kalina559, #1314)
- Resort habit list after edit (@hiqua, #1350)
- Fix marker scaling in frequency display (@eduebernal, #1425)
- Fix widgets not working correctly on API 33 (@iSoron, #1488)
### Refactoring & Testing
- Replace raster icons by vector assets (@kalina559)
- Remove JVM dependencies from uhabits-core module (@sgallese)
- Add various missing tests (@sgallese)
- Upgrade project dependencies (@hiqua, @sgallese)
## [2.0.3] - 2021-08-21
### Fixed
- Improve automatic checkmarks for monthly habits (@iSoron, #947)

View File

@@ -1,6 +1,6 @@
# Copyright Notices
## ActiveAndroid
### ActiveAndroid
<https://github.com/pardom/ActiveAndroid>
@@ -18,7 +18,7 @@
See the License for the specific language governing permissions and
limitations under the License.
## Android Open Source Project
### Android Open Source Project
<https://source.android.com/>
@@ -36,7 +36,7 @@
See the License for the specific language governing permissions and
limitations under the License.
## FontAwesome
### FontAwesome
<http://fontawesome.io>
@@ -59,7 +59,7 @@ under the SIL OFL 1.1.
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
## Material Design Icons
### Material Design Icons
<https://github.com/google/material-design-icons>
@@ -67,7 +67,7 @@ Material design icons are the official icon set from Google that are designed
under the material design guidelines. Available under the Creative Common
Attribution 4.0 International License (CC-BY 4.0).
## Android Flow Layout
### Android Flow Layout
<https://github.com/ApmeM/android-flowlayout>
@@ -87,7 +87,7 @@ Extended linear layout that wrap its content when there is no place in the curre
License for the specific language governing permissions and limitations
under the License.
## Dagger 2
### Dagger 2
<https://github.com/google/dagger>
@@ -108,7 +108,7 @@ A fast dependency injector for Android and Java.
See the License for the specific language governing permissions and
limitations under the License.
## AutoFactory
### AutoFactory
<https://github.com/google/auto/tree/master/factory>
@@ -128,7 +128,7 @@ A source code generator for JSR-330-compatible factories.
See the License for the specific language governing permissions and
limitations under the License.
## Retrolambda
### Retrolambda
<https://github.com/orfjackal/retrolambda>
@@ -138,7 +138,7 @@ Backport of Java 8's lambda expressions to Java 7, 6 and 5
This software is released under the Apache License 2.0.
The license text is at http://www.apache.org/licenses/LICENSE-2.0
## PebbleKit SDK
### PebbleKit SDK
<https://github.com/pebble/pebble-android-sdk/>
@@ -147,7 +147,7 @@ Android PebbleKit SDK to talk to the Pebble via Bluetooth
The MIT License (MIT)
Copyright (c) 2014 - 2015 Pebble Technology
## AppIntro
### AppIntro
<https://github.com/PaoloRotolo/AppIntro>
@@ -168,7 +168,7 @@ Make a cool intro for your Android app.
See the License for the specific language governing permissions and
limitations under the License.
## ButterKnife
### ButterKnife
<https://github.com/JakeWharton/butterknife>
@@ -188,7 +188,7 @@ Bind Android views and callbacks to fields and methods
See the License for the specific language governing permissions and
limitations under the License.
## opencsv
### opencsv
<http://opencsv.sourceforge.net/>

View File

@@ -1,13 +1,13 @@
<h1 align="center">Loop Habit Tracker</h1>
<p align="center">
<a href="https://github.com/iSoron/uhabits/actions?query=workflow%3A%22Build+%26+Test%22">
<img alt="Build & Test" src="https://github.com/iSoron/uhabits/workflows/Build%20&%20Test/badge.svg" />
<img src="https://github.com/iSoron/uhabits/workflows/Build%20&%20Test/badge.svg" />
</a>
<a href="https://github.com/iSoron/uhabits/releases/latest">
<img alt="release" src="https://img.shields.io/github/v/release/iSoron/uhabits" />
<img src="https://img.shields.io/github/v/release/iSoron/uhabits" />
</a>
<a href="https://github.com/iSoron/uhabits/discussions">
<img alt="GitHub" src="https://img.shields.io/badge/GitHub-Discussions-%23fc4ebc" />
<img src="https://img.shields.io/badge/GitHub-Discussions-%23fc4ebc" />
</a>
</p>
@@ -17,8 +17,8 @@ show you how your habits improved over time. It is completely ad-free and open
source.
<p align="center">
<a href="https://play.google.com/store/apps/details?id=org.isoron.uhabits&utm_source=global_co&utm_medium=prtnr&utm_content=Mar2515&utm_campaign=PartBadge&pcampaignid=MKT-AC-global-none-all-co-pr-py-PartBadges-Oct1515-1"><img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png" height="80px"/></a>
<a href="https://f-droid.org/app/org.isoron.uhabits"><img alt="Get it on F-Droid" src="https://f-droid.org/badge/get-it-on.png" height="80px"/></a>
<a href="https://play.google.com/store/apps/details?id=org.isoron.uhabits&utm_source=global_co&utm_medium=prtnr&utm_content=Mar2515&utm_campaign=PartBadge&pcampaignid=MKT-AC-global-none-all-co-pr-py-PartBadges-Oct1515-1"><img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge-border.png" height="75px"/></a>
<a href="https://f-droid.org/app/org.isoron.uhabits"><img alt="Get it on F-Droid" src="https://i.imgur.com/baSPE7X.png" height="75px"/></a>
</p>
## Screenshots
@@ -32,23 +32,32 @@ source.
## Features
* **Beautiful, minimalistic and lightweight interface.** Loop has an elegant and minimalistic interface that is very easy to use, even for first-time users. Highly optimized for speed, the app works well even on older phones.
* <b>Beautiful, minimalistic and lightweight interface.</b>
Loop has an elegant and minimalistic interface that is very easy to use, even for first-time users. Highly optimized for speed, the app works well even on older phones.
* **Habit score.** Loop has an advanced formula for calculating the strength of your habits. Every repetition makes your habit stronger and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your progress, unlike many other don't-break-the-chain apps.
* <b>Habit score.</b>
Loop has an advanced formula for calculating the strength of your habits. Every repetition makes your habit stronger and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your progress, unlike many other don't-break-the-chain apps.
* **Flexible schedules.** In addition to daily habits, Loop supports habits with more complex schedules, such as 3 times per week or every other day.
* <b>Flexible schedules.</b>
In addition to daily habits, Loop supports habits with more complex schedules, such as 3 times per week or every other day.
* **Reminders.** Schedule notifications to remind you of your habits. Each habit can have its own reminder, at a chosen time of the day. Easily check or dismiss your habit directly from the notification.
* <b>Reminders.</b>
Schedule notifications to remind you of your habits. Each habit can have its own reminder, at a chosen time of the day. Easily check or dismiss your habit directly from the notification.
* **Widgets.** Be reminded of your habits whenever you unlock your phone. Colorful widgets allow you to track your habits directly from your home screen, without even opening the app.
* <b>Widgets.</b>
Be reminded of your habits whenever you unlock your phone. Colorful widgets allow you to track your habits directly from your home screen, without even opening the app.
* **Take control of your data.** If you want to further analyze your data, or move it to another service, Loop allows you to export it to spreadsheets (CSV) or to a database file (SQLite). For power users, checkmarks can be added through other apps, such as Tasker.
* <b>Take control of your data.</b>
If you want to further analyze your data, or move it to another service, Loop allows you to export it to spreadsheets (CSV) or to a database file (SQLite). For power users, checkmarks can be added through other apps, such as Tasker.
* **No limitations.** Track as many habits as you wish. Loop imposes no artificial limits on how many habits you can have. All features are available to all users. There are no in-app purchases.
* <b>No limitations.</b>
Track as many habits as you wish. Loop imposes no artificial limits on how many habits you can have. All features are available to all users. There are no in-app purchases.
* **Completely ad-free and open source.** There are no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The app is completely open-source (GPLv3).
* <b>Completely ad-free and open source.</b>
There are no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The app is completely open-source (GPLv3).
* **Works offline and respects your privacy.** Loop doesn't require an Internet connection or online account registration. Your confidential data is never sent to anyone. Neither the developers nor any third-parties have access to it.
* <b>Works offline and respects your privacy.</b>
Loop doesn't require an Internet connection or online account registration. Your confidential data is never sent to anyone. Neither the developers nor any third-parties have access to it.
## Installing
@@ -81,11 +90,11 @@ contribute, even if you are not a software developer.
is already completed, you are also very welcome to join and proofread it.
* **Write some code.** If you are an Android developer, you are very welcome to
contribute with code. Please see the [guidelines](https://github.com/iSoron/uhabits/blob/dev/docs/GUIDELINES.md).
contribute with code. Please see `docs/GUIDELINES.md`.
## License
<img align="right" alt="GPL v3" src="https://www.gnu.org/graphics/gplv3-88x31.png">
<img align="right" src="https://www.gnu.org/graphics/gplv3-88x31.png">
Copyright (C) 2016-2021 Álinson Santos Xavier <isoron@gmail.com>

View File

@@ -1,11 +1,25 @@
plugins {
alias(libs.plugins.agp) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.ksp) apply false
alias(libs.plugins.ktlint.plugin) apply false
alias(libs.plugins.shadow) apply false
val kotlinVersion = "1.5.0"
id("com.android.application") version ("4.2.0") apply (false)
id("org.jetbrains.kotlin.android") version kotlinVersion apply (false)
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false)
id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)
id("org.jetbrains.kotlin.multiplatform") version kotlinVersion apply (false)
id("org.jlleitschuh.gradle.ktlint") version "10.1.0"
}
apply {
from("gradle/translators.gradle.kts")
from("translators.gradle.kts")
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven(url = "https://plugins.gradle.org/m2/")
maven(url = "https://oss.sonatype.org/content/repositories/snapshots/")
maven(url = "https://kotlin.bintray.com/ktor")
maven(url = "https://kotlin.bintray.com/kotlin-js-wrappers")
}
}

149
build.sh
View File

@@ -21,12 +21,11 @@ ADB="${ANDROID_HOME}/platform-tools/adb"
ANDROID_OUTPUTS_DIR="uhabits-android/build/outputs"
AVDMANAGER="${ANDROID_HOME}/cmdline-tools/latest/bin/avdmanager"
AVD_PREFIX="uhabitsTest"
EMULATOR="${ANDROID_HOME}/emulator/emulator"
EMULATOR="${ANDROID_HOME}/tools/emulator"
GRADLE="./gradlew --stacktrace --quiet"
PACKAGE_NAME=org.isoron.uhabits
SDKMANAGER="${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager"
VERSION=$(grep versionName uhabits-android/build.gradle.kts | sed -e 's/.*"\([^"]*\)".*/\1/g')
BOOT_TIMEOUT=360
if [ -z $VERSION ]; then
echo "Could not parse app version from: uhabits-android/build.gradle.kts"
@@ -38,11 +37,6 @@ if [ ! -f "${ANDROID_HOME}/platform-tools/adb" ]; then
exit 1
fi
if [ ! -f "$EMULATOR" ]; then
echo "Error: Not found: $EMULATOR"
exit 1
fi
# Logging
# -----------------------------------------------------------------------------
@@ -69,14 +63,14 @@ fail() {
core_build() {
log_info "Building uhabits-core..."
$GRADLE ktlintCheck || fail
$GRADLE lintDebug || fail
$GRADLE :uhabits-core:build || fail
}
# Android
# -----------------------------------------------------------------------------
android_setup() {
# shellcheck disable=SC2016
android_test() {
API=$1
AVDNAME=${AVD_PREFIX}${API}
@@ -91,63 +85,25 @@ android_setup() {
$AVDMANAGER delete avd --name $AVDNAME
log_info "Creating new Android virtual device (API $API)..."
(echo "y" | $SDKMANAGER --install "system-images;android-$API;google_apis;x86_64") || return 1
(echo "y" | $SDKMANAGER --install "system-images;android-$API;default;x86_64") || return 1
$AVDMANAGER create avd \
--name $AVDNAME \
--package "system-images;android-$API;google_apis;x86_64" \
--package "system-images;android-$API;default;x86_64" \
--device "Nexus 4" || return 1
flock -u 10
) 10>/tmp/uhabitsTest.lock
log_info "Launching emulator..."
$EMULATOR \
-avd $AVDNAME \
-port 6${API}0 \
1>/dev/null 2>&1 &
$EMULATOR -avd $AVDNAME -port 6${API}0 1>/dev/null 2>&1 &
log_info "Waiting for emulator to boot..."
export ADB="$ADB -s emulator-6${API}0"
timeout $BOOT_TIMEOUT $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82'
if [ $? -ne 0 ]; then
log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds."
return 1
fi
log_info "Saving snapshot..."
$ADB emu avd snapshot save fresh-install
}
android_boot_attempt() {
API=$1
AVDNAME=${AVD_PREFIX}${API}
log_info "Stopping Android emulator..."
while [[ -n $(pgrep -f ${AVDNAME}) ]]; do
pkill -9 -f ${AVDNAME}
done
log_info "Launching emulator..."
$EMULATOR \
-avd $AVDNAME \
-port 6${API}0 \
-snapshot fresh-install \
-no-snapshot-save \
-wipe-data \
1>/dev/null 2>&1 &
log_info "Waiting for emulator to boot..."
export ADB="$ADB -s emulator-6${API}0"
sleep 5
timeout $BOOT_TIMEOUT $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82'
if [ $? -ne 0 ]; then
log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds."
return 1
fi
log_info "Disabling animations..."
$ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82' || return 1
$ADB root || return 1
sleep 5
log_info "Disabling animations..."
$ADB shell settings put global window_animation_scale 0 || return 1
$ADB shell settings put global transition_animation_scale 0 || return 1
$ADB shell settings put global animator_duration_scale 0 || return 1
@@ -155,24 +111,6 @@ android_boot_attempt() {
log_info "Acquiring wake lock..."
$ADB shell 'echo android-test > /sys/power/wake_lock' || return 1
}
android_boot() {
for attempt in {1..5}; do
android_boot_attempt $1 && return 0
sleep 5
done
log_error "Too many failed attempts. Aborting."
return 1
}
# shellcheck disable=SC2016
android_test() {
API=$1
AVDNAME=${AVD_PREFIX}${API}
android_boot $API || return 1
if [ -n "$RELEASE" ]; then
log_info "Installing release APK..."
$ADB install -r ${ANDROID_OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || return 1
@@ -184,25 +122,14 @@ android_test() {
$ADB install -r ${ANDROID_OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || return 1
for size in medium large; do
log_info "Running $size instrumented tests..."
OUT_INSTRUMENT=${ANDROID_OUTPUTS_DIR}/instrument-${API}.txt
OUT_LOGCAT=${ANDROID_OUTPUTS_DIR}/logcat-${API}.txt
FAILED_TESTS=""
for i in {1..10}; do
log_info "Running $size instrumented tests (attempt $i)..."
$ADB shell am instrument \
-r -e coverage true -e size "$size" $FAILED_TESTS \
-w ${PACKAGE_NAME}.test/androidx.test.runner.AndroidJUnitRunner \
| ts "%.s" | tee "$OUT_INSTRUMENT"
FAILED_TESTS=$(tools/parseInstrument.py "$OUT_INSTRUMENT")
SUCCESS=$?
if [ $SUCCESS -eq 0 ]; then
log_info "$size tests passed."
break
fi
done
if [ $SUCCESS -ne 0 ]; then
$ADB shell am instrument \
-r -e coverage true -e size $size \
-w ${PACKAGE_NAME}.test/androidx.test.runner.AndroidJUnitRunner \
| tee $OUT_INSTRUMENT
if grep "\(INSTRUMENTATION_STATUS_CODE.*-1\|FAILURES\|ABORTED\|onError\|Error type\|crashed\)" $OUT_INSTRUMENT; then
log_error "Some $size instrumented tests failed."
log_error "Saving logcat: $OUT_LOGCAT..."
$ADB logcat -d > $OUT_LOGCAT
@@ -211,51 +138,26 @@ android_test() {
$ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/
return 1
fi
log_info "$size tests passed."
done
return 0
}
android_test_parallel() {
# Launch background processes
PIDS=""
for API in $*; do
(
LOG=build/android-test-$API.log
mkdir -p build
log_info "API $API: Running tests..."
android_test $API 1>$LOG 2>&1
ret_code=$?
if [ $ret_code = 0 ]; then
if android_test $API 1>$LOG 2>&1; then
log_info "API $API: Passed"
else
log_error "API $API: Failed"
log_error "API $API: Failed. See $LOG for more details."
fi
pkill -9 -f ${AVD_PREFIX}${API}
exit $ret_code
)&
PIDS+=" $!"
done
# Check exit codes
success=0
for pid in $PIDS; do
wait $pid
ret_code=$?
if [ $ret_code != 0 ]; then
success=1
fi
echo pid=$pid ret_code=$ret_code success=$success
done
# Print all logs
for API in $*; do
echo "::group::Android Tests (API $API)"
cat build/android-test-$API.log
echo "::endgroup::"
done
return $success
wait
}
android_build() {
@@ -327,14 +229,12 @@ CI/CD script for Loop Habit Tracker.
Usage:
build.sh build [options]
build.sh android-setup <API>
build.sh android-tests <API> [options]
build.sh android-tests-parallel <API> <API>... [options]
build.sh android-accept-images [options]
Commands:
build Build the app and run small tests
android-setup Create Android virtual machine
android-tests Run medium and large Android tests on an emulator
android-tests-parallel Tests multiple API levels simultaneously
android-accept-images Copy fetched images to corresponding assets folder
@@ -370,17 +270,18 @@ main() {
core_build
android_build
;;
android-setup)
shift; _parse_opts "$@"
android_setup $1
;;
android-tests)
shift; _parse_opts "$@"
if [ -z $1 ]; then
_print_usage
exit 1
fi
android_test $1
for attempt in {1..5}; do
log_info "Running Android tests (attempt $attempt)..."
android_test $1 && return 0
done
log_error "Maximum number of attempts reached. Failing."
return 1
;;
android-tests-parallel)
shift; _parse_opts "$@"

View File

@@ -9,17 +9,17 @@ This pages describes how to download and build the app from the source code. If
## Build using Android Studio
### Step 1: Install git
**Step 1: Install git**
The package `git` is required for downloading the source code of the app and submitting changes GitHub. Please see [the git book](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) for further instructions. If you are planning to submit pull requests in the future, it is recommended to [generate and configure your SSH keys](https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent).
### Step 2: Download and install Android Studio
**Step 2: Download and install Android Studio**
Although Android Studio can be downloaded [from their official website](https://developer.android.com/studio/), a much better option is to install it through [JetBrains Toolbox](https://www.jetbrains.com/toolbox-app/). This tool, developed by the same developers of Android Studio, allows you to easily upgrade and downgrade the IDE, or switch between stable, beta and canary versions. After downloading and installing JetBrains Toolbox, simply click the install button near Android Studio to install the newest stable version of IDE. Beta and canary versions have not been tested and may not work correctly.
After installation, launch Android Studio. If this is the first time you launch it, you will need to go through a wizard to setup the IDE. The default options should work fine. The wizard will download all additional components necessary for development, including the emulator, so it may take a while.
### Step 3: Download the source code
**Step 3: Download the source code**
To create a complete copy of the source code repository, open the terminal (Linux/macOS) or Git Bash (Windows), navigate to the desired folder, then run:
```bash
@@ -27,13 +27,13 @@ git clone https://github.com/iSoron/uhabits.git
```
The repository will be downloaded to the directory `uhabits`.
### Step 4: Open and run the project on Android Studio
**Step 4: Open and run the project on Android Studio**
1. Launch Android Studio and select "Open an existing Android Studio project".
2. When the IDE asks you for the project location, select `uhabits` and click "Ok".
3. Android Studio will spend some time indexing the project. When this is complete, click the toolbar icon "Sync Project with Gradle File", located near the right corner of the top toolbar.
4. The operation will likely fail several times due to missing Android SDK components. Each time it fails, click the link "Install missing platforms", "Install build tools", etc, and try again.
5. To test the application, create a virtual Android device using the menu "Tools" and "AVD Manager". The default options should work fine, but feel free to customize the device.
5. To test the application, create a virtual Android device using the menu "Tools" and "AVD Manager". The default options should work fine, but free to customize the device.
6. Click the menu "Run" and "uhabits-android". The application should launch.
@@ -41,7 +41,7 @@ The repository will be downloaded to the directory `uhabits`.
The following instructions were tested on **Ubuntu Linux 18.04 LTS** and may need to be modified for other operating systems.
### Step 1: Install basic packages
**Step 1: Install basic packages**
To build the application, some basic packages are required. The package `git` is required to download the source code, while `openjdk-8-jdk-headless` is required for compiling Java and Kotlin files.
@@ -53,14 +53,14 @@ sudo apt-get install -y git openjdk-8-jdk-headless
**IMPORTANT:** Newer JDK versions have not been tested and may not work correctly.
### Step 2: Install Android SDK tools
**Step 2: Install Android SDK tools**
The Android SDK tools contains many necessary tools for developing and debugging Android applications. It can be obtained as part of Android Studio, but, for simple command line usage, it can also be downloaded individually.
1. Download the file `sdk-tools-linux-4333796.zip` (or a newer version) from <https://developer.android.com/studio/#downloads>, and extract it somewhere. In this guide, we assume that it was extracted to `/opt/android-sdk/tools`; that is, the script `/opt/android-sdk/tools/bin/sdkmanager` should exist.
1. Download the file `sdk-tools-linux-4333796.zip` (or a newer version) from https://developer.android.com/studio/#downloads, and extract it somewhere. In this guide, we assume that it was extracted to `/opt/android-sdk/tools`; that is, the script `/opt/android-sdk/tools/bin/sdkmanager` should exist.
2. Append the following lines to `~/.profile`, so that other tools can locate your Android SDK installation. It is necessary to restart your terminal for these changes to take effect.
```bash
```
export PATH="$PATH:/opt/android-sdk/tools/bin"
export PATH="$PATH:/opt/android-sdk/platform-tools"
export ANDROID_HOME="/opt/android-sdk"
@@ -71,7 +71,7 @@ export ANDROID_HOME="/opt/android-sdk"
yes | sdkmanager --licenses
```
### Step 3: Download the source code
**Step 3: Download the source code**
To create a complete copy of the source code repository, navigate to your home directory and run:
```bash
@@ -79,11 +79,13 @@ git clone https://github.com/iSoron/uhabits.git
```
The repository will be downloaded to the directory `uhabits`.
### Step 4: Compile the source code
**Step 4: Compile the source code**
1. Navigate to the directory `uhabits`
2. Run `./gradlew assembleDebug --stacktrace`
If the compilation is successful, a debug APK will be generated somewhere inside the folder `uhabits-android/build/`. Currently, the full path is `./uhabits-android/build/outputs/apk/debug/uhabits-android-debug.apk`, but it may change in the future.
If the compilation is successful, a debug APK will be generated somewhere inside the folder `uhabits-android/build/`. Currently, the full path is the following, but it may change in the future:
./uhabits-android/build/outputs/apk/debug/uhabits-android-debug.apk
The APK can be installed using the tool `adb`, which should have been automatically installed at `/opt/android-sdk/platform-tools/adb` during compilation of the project.

View File

@@ -12,6 +12,17 @@
Please see `docs/BUILD.md` and `docs/TEST.md`
## Directory Layout
* `docs` Documentation for developers.
* `landing` Source code for our [landing page](http://loophabits.org/).
* `uhabits-android` Android-specific code.
* `uhabits-core` Common code used by all platforms (Android, iOS).
* `uhabits-core-legacy` Proof-of-concept module, developed to evaluate the feasibility of using Kotlin multiplatform for the app; not currently used, and it will be removed soon, once all useful code is ported to the other modules.
* `uhabits-ios` Experimental iOS port of Loop. Not currently used in production.
* `uhabits-server` Source code for any server-side components the app (for example, device sync).
* `uhabits-web` Experimental web port of Loop. Not currently used in production.
## Branching Policy
This repository uses the [git-flow branching model](https://nvie.com/posts/a-successful-git-branching-model/). Basically, there are two main branches, `dev` and `master`. All the development takes place in the `dev` branch. After the new features have been implemented and tested, they are merged into the `master` branch and a new version of the app is released. Please submit your pull requests against the `dev` branch.

View File

@@ -2,25 +2,51 @@
Loop Habit Tracker has a fairly large number of automated tests to reduce the chance of bugs being silently introduced in our code base. The tests are divided into three categories:
- **Unit tests:** These tests run very quickly on the developer's computer, inside a JVM, and do not need an Android emulator or device. They typically test the correctness of core functions of the application, such as the computation of scores and streaks.
- **Instrumented tests:** These tests require an Android emulator or device. _Medium_ instrumented tests are still quite fast to run, since only individual classes are tested. The app itself does not need to be launched. Examples include _view tests_, which render our custom views on the device and compare them against prerendered images. _Large_ instrumented tests launch the application on an Android emulator and interact with it by touching the screen, much like a regular user.
* **Small tests:** These tests run very quickly on the developer's computer, inside a JVM, and do not need an Android emulator or device. They typically test the correctness of core functions of the application, such as the computation of scores and streaks.
* **Medium tests:** These tests require an Android emulator or device, but they are still quite fast to run, since only individual classes are tested. The app itself does not need to be launched. Examples include *view tests*, which render our custom views on the device and compare them against prerendered images.
* **Large tests:** These are end-to-end tests, which launch the application on an Android emulator and interact with it by touching the screen, much like a regular user.
## Running unit tests
## Running small tests
Unit tests can be launched by running `./gradlew test` or by right-clicking a particular class/method in Android Studio and selecting "Run testMethod()" or "Run ClassTest". An alternative way is to use `build.sh`, the script used by our continuous integration server. By running `./build.sh build`, the script will automatically build and run all small tests.
Small tests can be launched by running `./gradlew test` or by right-clicking a particular class/method in Android Studio and selecting "Run testMethod()" or "Run ClassTest". An alternative way is to use `build.sh`, the script used by our continuous integration server. By running `./build.sh build`, the script will automatically build and run all small tests.
## Running instrumented tests
## Running medium tests
To run medium tests, it is recommended to use the `build.sh` script.
To run medium tests, it is recommended to use the `build.sh` script:
1. Run `./build.sh android-setup API` to create the emulator, where `API` is the desired API level.
2. Run `./build.sh android-tests API` to run the tests on a single API.
3. Run `./build.sh android-tests-parallel API API...` to run the tests on multiple APIs in parallel.
./build.sh build
./build.sh medium-tests
Note that instrumented tests are designed to run on a clean install, inside an emulator. They will not work on actual devices. All tests are also designed for a particular screen size, namely the Nexus 4 configuration (4.7" 768x1280 xhdpi), and a particular locale, namely English (US). Furthermore:
- No additional apps should be installed on the device;
- The homescreen must look exactly like it was when the emulator was originally created, with no additional icons or widgets;
- All animations must be manually disabled.
For this script to succeed, make sure that an emulator is currently running, or that a device (with developer mode activated) is connected via USB.
If there are failing view tests (that is, if some custom views do not render exactly like the prerendered images we have), then both the actual and expected images will be automatically downloaded from the device to the folder `uhabits-android/build/outputs`. After verifying the differences, if you feel that the actual images are actually fine and should replace the prerendered ones, then run `./build.sh android-accept-images`.
**WARNING!** This script will uninstall the app prior to testing it, and therefore delete all user data!
If there are failing view tests (that is, if some custom views do not render exactly like the prerendered images we have), then the script `./build.sh fetch-images` can be used to download both the actual and the expected images from the device. The images will be downloaded from the device into the folder `tmp/`. After verifying the differences, if you feel that the actual images are actually fine and should replace the prerendered ones, then run `./build.sh accept-images`.
## Running large tests
Large tests are significantly more complicated to run. In particular, they require:
* An Android emulator; they will **not** work on actual devices;
* A vanilla x86 AOSP image; they will **not** work with Google API images;
* A particular screen size, namely the Nexus 4 configuration on Android Studio (4.7 768x1280 xhdpi);
* A particular locale, namely English (US).
Furthermore:
* No additional apps should be installed on the device;
* The homescreen must look exactly like it was when the emulator was originally created, with no additional icons or widgets;
* Developer mode must be activated, and all animations must be manually disabled.
Only the following Android versions are supported by our test suite:
* Android 7.0 (API 24)
* Android 7.1.1 (API 25)
* Android 8.0 (API 26)
* Android 8.1 (API 27)
* Android 9.0 (API 28)
* Android 10.0 (API 29)
After creating an emulator and configuring it exactly as described above, launch it, wait for it to finish booting up, then run `./build.sh large-tests`. As mentioned before, this script will uninstall the app before testing it, and therefore will delete all the user data.

View File

@@ -1,11 +1,5 @@
org.gradle.parallel=false
org.gradle.daemon=true
org.gradle.jvmargs=-Xms2048m -Xmx2048m
org.gradle.jvmargs=-Xms2048m -Xmx2048m -XX:MaxPermSize=2048m
android.useAndroidX=true
android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
org.gradle.configureondemand=true
org.gradle.warning.mode=all
org.gradle.caching=true

View File

@@ -1,102 +0,0 @@
[versions]
agp = "8.8.0"
annotation = "1.9.1"
appcompat = "1.7.0"
appintro = "6.3.1"
commonsCodec = "1.16.0"
commonsIo = "1.3.2"
commonsLang3 = "3.14.0"
dagger = "2.55"
desugar = "2.1.4"
dexmaker = "2.28.3"
espresso = "3.6.1"
guava = "33.2.1-android"
hamcrest = "2.2"
jsr250 = "1.0"
jsr305 = "3.0.2"
junit = "1.2.1"
junitJupiter = "5.10.1"
junitVersion = "4.13.2"
konfetti-xml = "2.0.2"
kotlin = "2.1.10"
kotlinxCoroutinesCoreCommon = "1.3.8"
ksp = "2.1.10-1.0.30"
ktlint-plugin = "11.6.1"
ktor = "1.6.8"
ktxCoroutine = "1.10.1"
legacy-support = "1.0.0"
material = "1.12.0"
mockito-kotlin = "5.4.0"
opencsv = "5.9"
rules = "1.6.1"
shadow = "8.1.1"
sqliteJdbc = "3.45.1.0"
uiautomator = "2.3.0"
[libraries]
annotation = { group = "androidx.annotation", name = "annotation", version.ref = "annotation" }
appIntro = { group = "com.github.AppIntro", name = "AppIntro", version.ref = "appintro" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
commons-codec = { module = "commons-codec:commons-codec", version.ref = "commonsCodec" }
commons-io = { module = "org.apache.commons:commons-io", version.ref = "commonsIo" }
commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commonsLang3" }
dagger = { group = "com.google.dagger", name = "dagger", version.ref = "dagger" }
dagger-compiler = { group = "com.google.dagger", name = "dagger-compiler", version.ref = "dagger" }
desugar_jdk_libs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "desugar" }
dexmaker-mockito = { group = "com.linkedin.dexmaker", name = "dexmaker-mockito", version.ref = "dexmaker" }
espresso-contrib = { group = "androidx.test.espresso", name = "espresso-contrib", version.ref = "espresso" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso" }
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" }
jsr250-api = { group = "javax.annotation", name = "jsr250-api", version.ref = "jsr250" }
jsr305 = { group = "com.google.code.findbugs", name = "jsr305", version.ref = "jsr305" }
junit = { group = "androidx.test.ext", name = "junit", version.ref = "junit" }
junit-junit = { module = "junit:junit", version.ref = "junitVersion" }
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junitJupiter" }
konfetti-xml = { group = "nl.dionsegijn", name = "konfetti-xml", version.ref = "konfetti-xml" }
kotlin-stdlib-jdk8 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" }
kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "ktxCoroutine" }
kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "ktxCoroutine" }
kotlinx-coroutines-core-common = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-common", version.ref = "kotlinxCoroutinesCoreCommon" }
kotlinx-coroutines-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "ktxCoroutine" }
ktor-client-android = { group = "io.ktor", name = "ktor-client-android", version.ref = "ktor" }
ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
ktor-client-jackson = { group = "io.ktor", name = "ktor-client-jackson", version.ref = "ktor" }
ktor-client-json = { group = "io.ktor", name = "ktor-client-json", version.ref = "ktor" }
ktor-client-mock = { group = "io.ktor", name = "ktor-client-mock", version.ref = "ktor" }
ktor-jackson = { group = "io.ktor", name = "ktor-jackson", version.ref = "ktor" }
legacy-preference-v14 = { group = "androidx.legacy", name = "legacy-preference-v14", version.ref = "legacy-support" }
legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacy-support" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockito-kotlin" }
opencsv = { group = "com.opencsv", name = "opencsv", version.ref = "opencsv" }
rules = { group = "androidx.test", name = "rules", version.ref = "rules" }
sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqliteJdbc" }
uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" }
[bundles]
androidTest = [
"annotation",
"dagger",
"dexmaker-mockito",
"espresso-contrib",
"espresso-core",
"junit",
"ktor-client-mock",
"ktor-jackson",
"mockito-kotlin",
"rules",
"uiautomator"
]
test = [
"dagger",
"junit-junit",
"mockito-kotlin",
]
[plugins]
agp = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
ktlint-plugin = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint-plugin" }
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

2
landing/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
out/
.sass-cache

27
landing/Makefile Normal file
View File

@@ -0,0 +1,27 @@
haml := src/*.haml
sass := src/*.sass
html := $(patsubst src/%, out/%, $(patsubst %.haml,%.html,$(wildcard $(haml))))
css := $(patsubst src/%, out/%, $(patsubst %.sass,%.css,$(wildcard $(sass))))
src := $(wildcard src/**)
compile: $(html) $(css)
@rsync -rupE assets/ out/
out/%.css: src/%.sass $(src)
@echo ' sass $<'
@mkdir -p `dirname $@`
@sass $< $@
out/%.html: src/%.haml $(src)
@echo ' haml $<'
@mkdir -p `dirname $@`
@haml -E UTF-8 $< $@
push:
rsync -avP out/ axavier.org:/www/loophabits.org/
clean:
@rm -rfv out
@rm -rfv tmp

27
landing/README.md Normal file
View File

@@ -0,0 +1,27 @@
Loop Habit Tracker Landing Page
===============================
This folder contains the source code that generates the project landing page, currently hosted at https://loophabits.org/
Pull requests with ideas for improving it are very welcome.
Build instructions
------------------
1. Install `haml`:
```bash
sudo apt install ruby-haml
```
2. Install `pandoc-ruby`:
```bash
gem install pandoc-ruby
```
3. Run `Makefile`
```bash
make
```
4. View the results (using, for example, [npm serve](https://www.npmjs.com/package/serve))
```bash
npm serve out/
```

1
landing/assets/faq.html Normal file
View File

@@ -0,0 +1 @@
<meta http-equiv="Refresh" content="0; url='https://github.com/iSoron/uhabits/discussions/689'" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
landing/assets/lib/js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

106
landing/src/index.haml Normal file
View File

@@ -0,0 +1,106 @@
!!! 5
%html
%head
%meta(charset="UTF-8")
%link(href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet" type="text/css")
%meta(name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no")
%title Loop Habit Tracker
%link(rel="stylesheet" type="text/css" href="lib/css/bootstrap.min.css")
%link(rel="stylesheet" type="text/css" href="index.css")
%body
.navbar.navbar-expand-md.navbar-light.bg-light
%a.navbar-brand(href="/")
%b Loop
Habit Tracker
%button.navbar-toggler(type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation")
%span.navbar-toggler-icon
#navbar.collapse.navbar-collapse
%ul.navbar-nav.mr-auto.mt-2.mt-lg-0
%li.nav-item
%a.nav-link(href="faq.html") FAQ
%li.nav-item
%a.nav-link(href="privacy.html") Privacy
%li.nav-item
%a.nav-link(href="https://source.loophabits.org") Source Code
%li.nav-item
%a.nav-link(href="https://translate.loophabits.org") Translate
.jumbotron.jumbotron-fluid
.site-wrapper
.container
.row.vertical-align
.col-md
%h1.display-4
Get your life on track
%p.lead
With daily reminders, beautiful charts and insightful statistics,
Loop Habit Tracker&trade; helps you create and maintain great habits. Completely free and open-source.
.store-badges
%a(href="https://play.google.com/store/apps/details?id=org.isoron.uhabits")
%img(src="images/google-play.png")
%a(href="https://f-droid.org/en/packages/org.isoron.uhabits/")
%img(src="images/f-droid.png")
.col-md
.s2
%img.screenshot(src="screenshots/uhabits1.png")
.s1
%img.screenshot(src="screenshots/uhabits4.png")
.section.screenshots
%span
%a(href="screenshots/uhabits1.png")
%img(src="screenshots/uhabits1_th.png")
%a(href="screenshots/uhabits2.png")
%img(src="screenshots/uhabits2_th.png")
%a(href="screenshots/uhabits3.png")
%img(src="screenshots/uhabits3_th.png")
%span
%a(href="screenshots/uhabits4.png")
%img(src="screenshots/uhabits4_th.png")
%a(href="screenshots/uhabits5.png")
%img(src="screenshots/uhabits5_th.png")
.section
.feature-header
%h1
Features
.container
.row
.col-md
%ul
%li
%h3 Habit score
Loop has an advanced formula for calculating the strength of your habits. Every repetition makes your habit stronger and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your progress, unlike many other don't-break-the-chain apps.
%li
%h3 Flexible schedules
In addition to daily habits, Loop supports habits with more complex schedules, such as 3 times per week or every other day.
%li
%h3 Reminders
Schedule notifications to remind you of your habits. Each habit can have its own reminder, at a chosen time of the day. Easily check or dismiss your habit directly from the notification.
%li
%h3 Widgets
Be reminded of your habits whenever you unlock your phone. Colorful widgets allow you to track your habits directly from your home screen, without even opening the app.
.col-md
%ul
%li
%h3 Take control of your data
If you want to further analyze your data, or move it to another service, Loop allows you to export it to spreadsheets (CSV) or to a database file (SQLite). For power users, check marks can be added through task automation apps such as Tasker.
%li
%h3 No limitations
Track as many habits as you wish. Loop imposes no artificial limits on how many habits you can have. All features are available to all users, and there are no in-app purchases.
%li
%h3 Completely ad-free and open source
There are no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The app is completely open-source (GPLv3).
%li
%h3 Works offline and respects your privacy
Loop doesn't require an Internet connection or online account registration. Your confidential data is never sent to anyone. Neither the developers nor any third-parties have access to it.
.section.footer
Copyright © 2016&ndash;2020, Alinson Santos Xavier. All Rights Reserved.
%script(type="text/javascript" src="lib/js/jquery.min.js")
%script(type="text/javascript" src="lib/js/bootstrap.bundle.min.js")

104
landing/src/index.sass Normal file
View File

@@ -0,0 +1,104 @@
html, body
max-width: 100%
overflow-x: hidden
body
font-family: 'Open Sans', sans-serif
padding-bottom: 0
a, a:hover
text-decoration: none
.navbar
box-shadow: rgba(0,0,0,0.4) 0px 0px 20px
background-color: white !important
.nav-link
margin: 0px 18px
.section
background-color: transparent
padding: 18px 0px
.container
ul
list-style-type: none
h3
font-size: 16px
font-weight: bold
margin: 18px 0px 0px 0px
.screenshots
text-align: center
background-color: #222
img
margin: 0.5%
border-radius: 10px
border: 3px solid #fff2
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5)
max-width: 17%
.footer
color: #888
background-color: #222
text-align: center
font-size: 12px
.jumbotron
background: linear-gradient(rgba(0,30,200,0.8),rgba(90,30,150,0.5)), url("images/hero-background-filter.jpg")
box-shadow: rgba(0,0,0,0.5) 0px 0px 20px
margin: 0
h1
max-width: 25rem
font-weight: bold
color: white
p
max-width: 40rem
color: white
.screenshot
box-shadow: rgba(0, 0, 0, 0.5) 5px 5px 20px
padding: 0px 0px 0px 0px
border-radius: 10px
border: 2px solid rgba(255, 255, 255, 0.2)
background-color: transparent
max-width: 300px
.store-badges
margin: 2rem 1rem
img
opacity: 0.8
height: 75px
img:hover
opacity: 1.0
.s1
padding-bottom: 50px
padding-left: 50px
.s2
position: absolute
top: 50px
left: 175px
.feature-header
text-align: center
font-weight: bold
padding: 18px
.align-right
text-align: right
.vertical-align
display: flex
align-items: center
.content
max-width: 800px
margin: 18px auto
padding: 0px 18px
//padding-left: 120px
h2, h3, h4
margin: 27px 0px 9px 0px
h2, h3
//margin-left: -120px
h4
//margin-left: -60px
font-size: 16px
font-weight: bold

32
landing/src/privacy.haml Normal file
View File

@@ -0,0 +1,32 @@
!!! 5
%html
%head
%meta(charset="UTF-8")
%link(href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet" type="text/css")
%meta(name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no")
%title Privacy | Loop Habit Tracker
%link(rel="stylesheet" type="text/css" href="lib/css/bootstrap.min.css")
%link(rel="stylesheet" type="text/css" href="index.css")
%body
.navbar.navbar-expand-md.navbar-light.bg-light
%a.navbar-brand(href="/")
%b Loop
Habit Tracker
%button.navbar-toggler(type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation")
%span.navbar-toggler-icon
#navbar.collapse.navbar-collapse
%ul.navbar-nav.mr-auto.mt-2.mt-lg-0
%li.nav-item
%a.nav-link(href="faq.html") FAQ
%li.nav-item
%a.nav-link(href="privacy.html") Privacy
%li.nav-item
%a.nav-link(href="https://source.loophabits.org") Source Code
%li.nav-item
%a.nav-link(href="https://translate.loophabits.org") Translate
%body
.content
:markdown
#{File.open("src/privacy.md").read}

14
landing/src/privacy.md Normal file
View File

@@ -0,0 +1,14 @@
## Privacy Policy
- All data provided to Loop Habit Tracker is only stored locally in your
device. Loop Habit Tracker does not upload your data anywhere. The
developers of Loop Habit Tracker do not have access to your data.
- Your data is not shared with any 3rd parties. Loop Habit Tracker does not
include any advertisement libraries or any 3rd party tracking (analytics)
code, such as Google Analytics or Facebook SDK.
- If you have activated "backup & reset" in your phone settings (Settings /
Backup & Reset / Back up my data), you should be aware that Android itself
will periodically save a copy of your phone's data in Google's servers. The
developers of Loop Habit Tracker do not have access to this data.

View File

@@ -1,32 +1,14 @@
pluginManagement {
repositories {
gradlePluginPortal()
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
jcenter()
google()
}
resolutionStrategy.eachPlugin {
if (requested.id.id == "com.android.application") {
useModule("com.android.tools.build:gradle:${requested.version}")
}
}
}
include(":uhabits-android", ":uhabits-core")
dependencyResolutionManagement {
@Suppress("UnstableApiUsage")
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
maven(url = "https://plugins.gradle.org/m2/")
maven(url = "https://oss.sonatype.org/content/repositories/snapshots/")
maven(url = "https://jitpack.io")
}
}
include(":uhabits-android", ":uhabits-core")
include(":uhabits-android", ":uhabits-core", ":uhabits-server")

30
tools/androidStringsToKt.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
input=$1
locale_name=$2
cat <<END
// --------------------------------------------------------------------------
// THIS FILE WAS AUTOMATICALLY GENERATED
//
// Please do not submit pull request to modify it. Corrections to translations
// may be submitted at https://translate.loophabits.org/
// --------------------------------------------------------------------------
package org.isoron.uhabits.i18n
END
prefix="override "
if [ "$locale_name" == "" ]; then
prefix="open "
echo "open class Strings() {"
else
echo "class Strings$locale_name : Strings() {"
fi
grep "<string name" "$1" | \
grep -v translatable | \
sed 's/&amp;/\&/g' | \
sed 's/^.*name="\([^"]*\)">\([^<]*\)<.*/ '"$prefix"'val \1 = "\2"/'
echo "}"

46
tools/convertAllStrings.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/bash
INPUT_DIR=../android/uhabits-android/src/main/res/
OUTPUT_DIR=../core/src/commonMain/kotlin/org/isoron/uhabits/i18n/
convert() {
./androidStringsToKt.sh $INPUT_DIR/$1/strings.xml "$2" > $OUTPUT_DIR/Strings$2.kt
}
#convert values ""
convert values-ar Arabic
convert values-bg Bulgarian
convert values-ca Catalan
convert values-cs Czech
convert values-da Danish
convert values-de German
convert values-el Greek
convert values-eo Esperanto
convert values-es Spanish
convert values-eu Basque
convert values-fa Persian
convert values-fi Finnish
convert values-fr French
convert values-hi Hindi
convert values-hr Croatian
convert values-hu Hungarian
convert values-in Indonesian
convert values-it Italian
convert values-iw Hebrew
convert values-ja Japanese
convert values-ko Korean
convert values-nl Dutch
convert values-no-rNO Norwegian
convert values-pl Polish
convert values-pt-rBR PortugueseBR
convert values-pt-rPT PortuguesePT
convert values-ro Romanian
convert values-ru Russian
convert values-sl Slovak
convert values-sr Serbian
convert values-sv Swedish
convert values-tr Turkish
convert values-uk Ukrainian
convert values-vi Vietnamese
convert values-zh-rCN ChineseCN
convert values-zh-rTW ChineseTW

View File

@@ -1,67 +0,0 @@
#!/usr/bin/env python3
"""
Android Instrumentation Test Parser
Given a raw Android Instrumentation log (produced by "adb shell am instrument -r ...") this script
return zero if all tests pass and non-zero if some tests fail. In case of failure, this script
also prints arguments that, if passed to "am instrument", will cause it to re-run just the tests
that failed. This script additionally prints warnings about the tests on the STDERR; e.g. slow tests.
"""
import sys
import re
STATUS_START = 1
STATUS_DISABLED = -3
SLOW_TEST_THRESHOLD = 5.0
COLOR_RED = '\033[91m'
COLOR_YELLOW = '\033[93m'
COLOR_END = '\033[0m'
def error(msg):
sys.stderr.write("%s%s%s\n" % (COLOR_RED, msg, COLOR_END))
def warning(msg):
sys.stderr.write("%s%s%s\n" % (COLOR_YELLOW, msg, COLOR_END))
log_filename = sys.argv[1]
current_class, current_method = None, None
failed_tests = []
am_args = "-e class "
exit_code = 1
for line in open(log_filename).readlines():
matches = re.findall('^([0-9.]*)', line)
current_time = float(matches[0])
matches = re.findall('INSTRUMENTATION_STATUS: class=(.*)', line)
if len(matches) > 0:
current_class = matches[0]
matches = re.findall('INSTRUMENTATION_STATUS: test=(.*)', line)
if len(matches) > 0:
current_method = matches[0]
matches = re.findall('OK \([0-9]* tests?\)', line)
if len(matches) > 0:
exit_code = 0
matches = re.findall('INSTRUMENTATION_STATUS_CODE: ([-0-9]*)', line)
if len(matches) > 0:
status_code = int(matches[0])
if (status_code < 0) and (status_code != STATUS_DISABLED):
am_args += f"{current_class}#{current_method},"
failed_tests.append(f"{current_class}#{current_method}")
if status_code == STATUS_START:
initial_time = current_time
else:
elapsed_time = current_time - initial_time
if(elapsed_time > SLOW_TEST_THRESHOLD):
warning("SLOW %s#%s (%.2f seconds)" % (current_class, current_method, elapsed_time))
if len(failed_tests) > 0:
for test in failed_tests:
error("FAIL %s" % test)
print(am_args[:-1])
sys.exit(exit_code)

View File

@@ -1,536 +1,377 @@
Name,Languages,"Translated (Words)","Target Words","Approved (Words)",Voted,"""+"" votes received","""-"" votes received","Winning (Words)",Joined
"Alinson Xavier (iSoron)","Portuguese, Brazilian; Japanese; Chinese Simplified; Italian; Spanish; Portuguese; French; Hungarian; Chinese Traditional; Turkish; Russian; Arabic; Polish; German; Korean; Bulgarian; Catalan; Greek; Slovenian; Hindi; Serbian (Cyrillic); Ukrainian; Czech; Danish; Dutch; Indonesian; Croatian; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Tamil; Telugu; Hebrew; Esperanto; Afrikaans; Norwegian; Armenian; Slovak; Serbian (Latin); Uyghur",15497,18825,1308,0,2094,111,4315,"2016-03-05 18:35:27"
"Slobodan Simić (Слободан Симић) (slsimic)","Serbian (Latin); Serbian (Cyrillic)",2072,1852,2139,12,30,0,2015,"2021-02-03 14:26:07"
dukelc,Slovak,1107,1052,0,0,0,0,0,"2020-08-27 14:02:41"
"Oglaigh Rystard (oglaignaheireann)","Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian",1103,1037,1327,1,22,13,954,"2017-03-31 09:13:19"
Avalysion,Georgian,1057,895,0,0,0,0,0,"2023-06-30 20:05:15"
"Mathew TK (mathew2006)",Malayalam,1057,1885,0,0,0,0,0,"2023-12-16 01:57:49"
REMOVED_USER,Hebrew,1051,944,1122,14,1,0,954,"2020-10-11 20:10:51"
"David (Cliff122)",Swedish,1040,1019,725,6,37,0,700,"2020-01-21 13:56:55"
"Intan Ayunda (Intan_Ayunda)",Indonesian,818,811,985,0,0,0,729,"2020-10-14 07:51:58"
dusanstrgar,Slovenian,770,730,0,0,0,0,0,"2017-03-31 10:30:28"
"Mihail Stefanov (MStefanov)",Bulgarian,755,794,3,0,2,4,2,"2017-03-31 16:09:02"
Osoitz,Basque,751,683,0,9,0,0,3,"2018-01-23 14:07:47"
"Alinson Xavier (iSoron)","Portuguese, Brazilian; Japanese; Spanish; Portuguese; Italian; Chinese Simplified; French; Hungarian; German; Arabic; Hindi; Slovenian; Catalan; Greek; Korean; Bulgarian; Chinese Traditional; Polish; Russian; Serbian (Cyrillic); Turkish; Ukrainian; Czech; Indonesian; Croatian; Danish; Dutch; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Telugu; Tamil; Afrikaans; Esperanto; Hebrew",14808,17227,1282,0,1779,80,4274,"2016-03-05 18:35:27"
"Slobodan Simić (Слободан Симић) (slsimic)","Serbian (Latin); Serbian (Cyrillic)",2054,1831,2114,12,33,0,1991,"2021-02-03 14:26:07"
"Oglaigh Rystard (oglaignaheireann)","Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian",1103,1037,1327,1,13,6,954,"2017-03-31 09:13:19"
"David (Cliff122)",Swedish,1040,1019,725,6,0,0,700,"2020-01-21 13:56:55"
"Omer I.S. (omeritzics)",Hebrew,1000,900,1097,14,1,0,946,"2020-10-11 20:10:51"
dukelc,Slovak,919,880,0,0,0,0,0,"2020-08-27 14:02:41"
"Intan Ayunda (Intan_Ayunda)",Indonesian,800,793,962,0,0,0,711,"2020-10-14 07:51:58"
KMakoto,"Chinese Traditional",745,1146,949,0,0,0,745,"2019-10-22 04:19:52"
Tomairuka,Japanese,709,1842,1033,43,12,0,585,"2020-12-12 12:14:22"
"Evren (evrenkiymaz)",Turkish,688,604,0,71,31,22,0,"2020-10-04 03:39:16"
andaryon,Czech,681,606,0,108,21,0,0,"2021-11-25 10:20:45"
"Antti Kallio (antti.kallio)",Finnish,668,539,0,5,0,0,0,"2021-07-03 05:54:44"
"Evren (evrenkiymaz)",Turkish,688,604,0,71,5,1,0,"2020-10-04 03:39:16"
"David Nos (david.nos)","Catalan; Spanish",667,731,0,0,1,0,0,"2020-01-04 10:15:36"
androide74,Italian,662,681,0,2,0,0,0,"2020-02-06 15:46:28"
"Dmitriy Bogdanov (di72nn)",Russian,643,589,1197,0,50,0,515,"2017-03-31 10:00:48"
reyhoon,Persian,624,759,0,1,3,2,0,"2020-10-01 18:17:23"
"Saeed Esmaili (saaeed.es20)",Persian,586,795,0,5,4,0,0,"2020-11-26 15:41:15"
fabian.bouchal,German,548,527,0,6,4,5,72,"2020-01-07 06:43:37"
"Isti (eisti)",Hungarian,528,476,0,0,1,0,0,"2020-12-03 12:02:51"
Aravinth_Earth,Tamil,511,961,0,12,0,0,0,"2024-02-23 12:37:28"
boban77,Czech,509,461,0,2,45,0,0,"2020-04-30 13:18:24"
"Martim Parente (martimparente)",Portuguese,505,542,0,38,0,0,0,"2020-08-26 10:22:11"
"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,91,"2017-04-28 07:23:01"
"Antti Kallio (antti.kallio)",Finnish,650,525,0,0,0,0,0,"2021-07-03 05:54:44"
androide74,Italian,644,659,0,2,0,0,0,"2020-02-06 15:46:28"
Tomairuka,Japanese,633,1636,909,43,0,0,564,"2020-12-12 12:14:22"
"Dmitriy Bogdanov (di72nn)",Russian,625,572,1197,0,36,0,515,"2017-03-31 10:00:48"
reyhoon,Persian,624,759,0,1,3,1,0,"2020-10-01 18:17:23"
Osoitz,Basque,610,545,0,9,0,0,3,"2018-01-23 14:07:47"
"Saeed Esmaili (saaeed.es20)",Persian,568,774,0,5,4,0,0,"2020-11-26 15:41:15"
fabian.bouchal,German,548,527,0,6,0,3,72,"2020-01-07 06:43:37"
boban77,Czech,509,461,0,2,0,0,0,"2020-04-30 13:18:24"
"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,103,"2017-04-28 07:23:01"
REMOVED_USER,Norwegian,501,498,501,0,148,0,501,"2017-07-05 19:02:25"
"Martim Parente (Sharlimar)",Portuguese,497,534,0,38,0,0,0,"2020-08-26 10:22:11"
"chrrris1987 (Chrrris1987)",Dutch,467,478,0,23,0,0,0,"2020-02-03 05:26:04"
"黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,22,"2020-01-17 23:16:03"
"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0,"2020-01-26 11:58:36"
"Arkadiusz Bubak (epitek)",Polish,458,416,52,24,15,4,0,"2020-11-05 05:11:58"
"Radek Kuklík (kuklik.radek)",Czech,453,392,0,100,0,0,0,"2022-10-08 10:04:24"
"黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,24,"2020-01-17 23:16:03"
"Arkadiusz Bubak (epitek)",Polish,458,416,29,24,0,3,0,"2020-11-05 05:11:58"
marco.baturan,Esperanto,452,452,0,0,0,0,0,"2020-06-23 02:49:46"
"Sief Tarek (sieftarek135)",Arabic,447,455,0,0,1,4,0,"2021-02-07 14:35:21"
"Alparslan Şakçi (sakci)",Turkish,436,372,0,118,2,0,0,"2022-01-14 12:03:11"
JY3,"Chinese Simplified",432,741,298,0,2,0,227,"2021-03-08 08:53:35"
"Sief Tarek (sieftarek135)",Arabic,447,455,0,0,0,0,0,"2021-02-07 14:35:21"
"Samuel Guay (SamGuay)",French,426,486,0,6,0,0,0,"2020-06-25 07:14:38"
"Diana Karaseva (Sun_Dianka)",Russian,399,373,0,10,1,0,209,"2020-01-30 06:40:02"
"Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,29,6,399,"2017-06-21 01:37:32"
"Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,0,3,399,"2017-06-21 01:37:32"
luiandresgonzalez,Spanish,383,403,0,1,28,0,0,"2020-07-11 14:20:44"
"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,239,"2020-01-09 19:35:48"
"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,252,"2020-01-09 19:35:48"
"Sølv Ræven (soelvraeven)",Danish,370,370,0,0,0,0,0,"2020-11-28 16:46:18"
strikeCunny2245,Icelandic,363,368,0,0,0,0,0,"2023-08-07 08:05:53"
"Isti (eisti)",Hungarian,367,329,0,0,0,0,0,"2020-12-03 12:02:51"
"Anh Quân (dangquanuet)",Vietnamese,362,530,0,42,2,0,0,"2017-10-29 12:27:44"
"Alexander Haronitakis (kanakis)",Greek,349,372,0,0,0,0,0,"2023-09-13 04:10:43"
gapszi,Hungarian,348,301,0,86,0,0,0,"2019-04-08 01:35:54"
JY3,"Chinese Simplified",345,585,278,0,1,0,207,"2021-03-08 08:53:35"
"Mahdi Nasiri (mahdi.nasiri)",Persian,343,465,0,39,3,1,0,"2017-07-14 09:17:25"
Seoyul,Korean,339,825,0,0,27,0,0,"2017-06-21 08:11:39"
"Magimai Prakasam (magimai)",Tamil,336,831,0,12,2,0,0,"2018-04-15 21:16:08"
"Star7 (Star7-crowdin)","Chinese Simplified",330,561,0,0,0,0,0,"2025-02-10 08:41:34"
Susanamesa,Spanish,306,342,0,11,0,0,0,"2023-01-01 23:56:35"
"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,4,2,0,"2020-05-26 19:47:58"
"Magimai Prakasam (magimai)",Tamil,336,831,0,12,0,0,0,"2018-04-15 21:16:08"
"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,0,0,0,"2020-05-26 19:47:58"
"Elina Salminen (salminen.elina.m)",Finnish,297,227,0,0,0,0,0,"2021-01-06 01:28:57"
Blinkin,Dutch,297,334,0,5,1,0,0,"2021-06-14 10:30:05"
ayane.m,Japanese,292,863,0,1,8,0,23,"2019-11-20 03:28:26"
c.m,Greek,276,293,0,124,0,0,0,"2024-07-13 14:49:43"
"Marius Teufelweich (teufelweich)",German,267,272,611,4,23,3,146,"2021-03-12 04:11:38"
"Sumin Son (todaypp)",Korean,266,221,0,7,0,0,0,"2023-06-09 05:28:30"
hypnotichemionus,"Chinese Simplified",249,430,0,0,8,0,19,"2020-03-08 01:46:25"
"Israa Z (sosozozo)",Arabic,240,266,0,81,14,0,3,"2017-11-27 14:10:50"
ayane.m,Japanese,292,863,0,1,3,0,22,"2019-11-20 03:28:26"
Blinkin,Dutch,284,318,0,1,0,0,0,"2021-06-14 10:30:05"
"Marius Teufelweich (teufelweich)",German,249,256,606,4,2,0,146,"2021-03-12 04:11:38"
cobalt59,German,237,234,0,1,24,1,132,"2017-06-05 05:18:33"
"QWERT (lurenjia01)","Chinese Simplified",236,407,0,0,8,0,19,"2020-03-08 01:46:25"
beriain,Basque,234,235,0,0,2,0,0,"2017-03-31 15:42:28"
pnhpnh,Vietnamese,225,343,0,1,3,0,0,"2017-11-27 12:06:07"
"Dika Fitrian Dwi Putra (OsamuDazai)",Indonesian,221,215,0,0,0,0,48,"2020-07-13 04:40:27"
easyrepro,Telugu,214,297,0,0,4,0,0,"2020-06-12 12:52:10"
easyrepro,Telugu,214,297,0,0,0,0,0,"2020-06-12 12:52:10"
taras-ko,Ukrainian,211,183,0,1,4,0,19,"2017-10-26 16:52:22"
"vinayak sharma (vinayak0504)",Hindi,211,456,0,0,0,0,0,"2023-05-18 18:31:51"
sojusnik,German,207,200,1,0,30,0,66,"2017-04-03 17:11:56"
"Andrij Mizyk (andm)",Ukrainian,204,178,0,40,1,0,53,"2021-04-01 03:56:20"
axmed99,Ukrainian,203,177,0,40,0,0,53,"2021-04-01 03:56:20"
"Heru Yen (heruyen)",Indonesian,201,201,0,0,0,0,25,"2020-06-29 18:39:15"
"Vijaykumar Borkar (vjkumar)",Hindi,200,364,0,11,0,0,0,"2021-08-06 16:12:15"
_translator,French,199,227,0,11,0,0,0,"2021-07-06 07:54:12"
bearsdens,Romanian,198,210,0,0,0,0,0,"2022-08-28 17:08:33"
Ishmaeel,Turkish,193,174,0,129,17,6,0,"2017-10-04 03:54:00"
REMOVED_USER,Spanish,192,201,0,2,5,0,0,"2021-05-21 17:58:22"
bruhwut,Vietnamese,189,292,0,1,0,0,0,"2021-05-21 07:16:30"
Ishmaeel,Turkish,193,174,0,129,6,0,0,"2017-10-04 03:54:00"
"Aputsiak Niels Janussen (aputtu)",Danish,187,200,0,0,0,0,0,"2019-08-28 05:47:42"
_translator,French,181,206,0,11,0,0,0,"2021-07-06 07:54:12"
fbruna17,Danish,181,179,0,1,0,0,0,"2021-01-28 15:48:47"
Bryanx,Dutch,179,168,0,5,2,0,0,"2019-11-21 17:08:12"
"Ivan Vlahov (vlahovivan)",Croatian,179,176,0,0,0,0,0,"2024-01-25 08:12:11"
"Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,12,"2021-01-18 07:33:23"
"Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,33,"2021-01-18 07:33:23"
Bryanx,Dutch,174,165,0,5,0,0,0,"2019-11-21 17:08:12"
"Pierre GALIEGUE (pierre.galiegue)",French,171,194,0,24,4,0,0,"2020-08-16 11:41:35"
plitwin,Polish,168,151,0,2,55,0,49,"2021-01-20 06:18:37"
DionysosDV,Greek,165,153,0,0,27,4,0,"2021-02-27 19:05:25"
bruhwut,Vietnamese,171,268,0,1,0,0,0,"2021-05-21 07:16:30"
DionysosDV,Greek,165,153,0,0,0,0,0,"2021-02-27 19:05:25"
"Gustavo Lima (GustavoLima)",Portuguese,158,177,0,1,4,10,0,"2020-08-26 10:35:05"
"Alex V. (elvitalex)",Romanian,154,166,0,24,0,0,0,"2022-08-03 17:40:00"
"Ravi Rami (ramiravi)",Hindi,151,248,0,0,0,0,0,"2021-10-10 09:19:40"
oscfd,Spanish,155,166,0,1,4,0,0,"2021-05-21 17:58:22"
plitwin,Polish,145,128,0,1,16,0,26,"2021-01-20 06:18:37"
"Lương Vĩnh Khang (LuongVinhKhang)",Vietnamese,144,256,0,0,46,1,0,"2017-08-10 10:05:58"
azzamsa,Indonesian,142,136,0,48,0,1,26,"2017-06-16 18:29:45"
"yoding (yodingc)","Chinese Traditional; Chinese Simplified",141,271,0,10,0,0,0,"2021-07-07 01:45:45"
"Neysa Nasywa (neysanasywa)",Indonesian,140,141,0,0,0,0,60,"2020-11-18 10:32:10"
mohmans,Arabic,139,141,0,12,7,1,0,"2020-11-23 02:48:00"
"Eilif Adelvice (adelvice)",Spanish,139,154,0,96,6,0,0,"2021-08-05 07:20:21"
"Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,13,1,0,"2018-02-15 22:41:15"
carllacan,Catalan,134,155,0,2,0,0,0,"2021-11-13 13:12:07"
"Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,11,0,0,"2018-02-15 22:41:15"
roptat,French,132,154,0,112,89,5,0,"2017-04-19 16:54:47"
"Trần Thái (tranhoangthai2001)",Vietnamese,127,186,0,8,1,0,0,"2018-03-01 10:51:39"
"OP Smosher (teenwolffan44)","Serbian (Cyrillic)",124,122,0,0,0,0,18,"2020-11-05 09:41:35"
"Tad Wohlrapp (TadWohlrapp)",German,124,122,0,0,2,0,0,"2022-06-28 04:55:41"
4001982248998,Esperanto,122,119,0,0,0,0,0,"2017-10-08 04:13:02"
"StoP4Me (Lcqp)",Romanian,121,119,0,0,6,0,0,"2018-05-06 18:51:59"
alalloush,Arabic,118,129,0,2,17,6,0,"2017-03-31 12:37:17"
"Brenda Correa (brenda.14)",Spanish,117,127,0,0,0,1,0,"2022-05-16 02:34:13"
Sebastian05067,Spanish,114,133,0,55,32,0,0,"2017-05-14 00:48:16"
"StoP4Me (Lcqp)",Romanian,121,119,0,0,3,0,0,"2018-05-06 18:51:59"
alalloush,Arabic,118,129,0,2,2,0,0,"2017-03-31 12:37:17"
"Eilif Adelvice (adelvice)",Spanish,116,126,0,96,0,0,0,"2021-08-05 07:20:21"
Sebastian05067,Spanish,114,133,0,55,28,0,0,"2017-05-14 00:48:16"
"Tanya (MagicUnderHood)",Russian,114,98,0,19,0,0,54,"2019-04-21 10:44:03"
REMOVED_USER,Arabic,111,106,0,22,23,3,0,"2018-01-05 07:01:45"
REMOVED_USER,Arabic,111,106,0,22,21,2,0,"2018-01-05 07:01:45"
mohmans,Arabic,109,103,0,2,0,0,0,"2020-11-23 02:48:00"
"Iabin Arteaga (iabin)",Spanish,108,111,0,4,21,0,0,"2017-08-26 21:08:54"
"Ivan Krušlin (krux3r)",Croatian,108,122,503,0,0,0,108,"2017-03-31 09:15:24"
"Iabin Arteaga (iabin)",Spanish,108,111,0,4,21,1,0,"2017-08-26 21:08:54"
REMOVED_USER,Finnish,105,90,0,0,0,0,0,"2019-08-12 06:58:48"
2kaafone,Finnish,105,90,0,0,0,0,0,"2019-08-12 06:58:48"
"Adam Jurkiewicz (hasztagg)",Polish,104,105,529,0,0,0,104,"2017-03-31 09:50:51"
"PILHA PARK (pilhaha)",Korean,101,88,0,0,0,0,0,"2023-06-30 23:51:41"
"just a name bro (justanamebr0)",Danish,98,109,0,0,1,0,0,"2019-06-19 11:57:55"
"Nam Nguyen (namnl2706)",Vietnamese,95,137,0,0,0,0,0,"2020-08-18 23:02:33"
"손유정 (yuwon1213)",Korean,95,57,0,0,1,3,0,"2021-03-30 05:25:33"
"손유정 (yuwon1213)",Korean,95,57,0,0,0,0,0,"2021-03-30 05:25:33"
ranmagen,Hebrew,91,78,0,0,0,0,0,"2021-02-16 05:44:31"
LoneWanderer,"Chinese Traditional",90,137,0,4,0,0,0,"2020-09-29 05:24:48"
ikkaz,Indonesian,89,84,0,5,0,0,4,"2019-09-02 19:58:54"
"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0,"2020-09-02 23:34:42"
"Irene K (Heaun)",Korean,88,75,0,25,2,0,0,"2020-03-16 11:31:12"
ikkaz,Indonesian,89,84,0,5,0,0,4,"2019-09-02 19:58:54"
"Irene K (Heaun)",Korean,88,75,0,25,0,0,0,"2020-03-16 11:31:12"
Prosta4ok_ua,Ukrainian,87,84,0,1,0,0,17,"2020-01-23 19:43:41"
"Kumar Anand (kumar0500)",Hindi,87,125,0,0,0,0,0,"2020-11-07 02:46:09"
G.kio,Russian,87,82,0,0,1,0,0,"2023-08-24 19:43:00"
"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,13,"2020-07-04 03:42:09"
"Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,1,0,0,"2020-02-05 01:20:00"
helectron,Persian,84,102,0,1,1,0,0,"2021-03-02 04:10:51"
"Bruces Lee (aplusbdesign)",Korean,82,66,0,0,2,0,0,"2021-08-23 11:27:18"
Tiralka,French,79,91,0,92,1,0,0,"2018-02-09 18:39:01"
"Jacob Roller (jdr28070)",Korean,79,61,0,0,1,1,0,"2020-01-03 11:36:40"
"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,18,"2020-07-04 03:42:09"
helectron,Persian,84,102,0,1,0,0,0,"2021-03-02 04:10:51"
"Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,0,0,0,"2020-02-05 01:20:00"
"Sofia Neves (sofiasonev)","Portuguese, Brazilian",79,84,0,1,0,0,46,"2020-03-12 18:19:46"
"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,5,0,0,"2017-09-02 05:34:12"
"Jacob Roller (jdr28070)",Korean,79,61,0,0,0,0,0,"2020-01-03 11:36:40"
Tiralka,French,79,91,0,92,1,0,0,"2018-02-09 18:39:01"
"Israa Z (sosozozo)",Arabic,79,87,0,43,12,0,3,"2017-11-27 14:10:50"
"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,0,0,0,"2017-09-02 05:34:12"
"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0,"2020-02-21 22:46:12"
"Michael (quelbs)",German,76,75,0,1,0,0,39,"2020-08-18 07:39:26"
"Anna Maria Stålberg (stalberg.annamaria)",Swedish,76,77,0,111,4,0,0,"2023-01-16 04:08:25"
"Radoslaw Biernacki (radoslaw.biernacki)",Polish,70,74,0,56,5,0,1,"2020-12-15 17:55:31"
"Oliver Gronowski (OliverGronowski)",German,70,69,0,5,3,0,0,"2021-05-14 16:37:10"
mimizuk,Japanese,68,193,0,0,2,1,39,"2022-05-18 10:10:38"
Ryeore,Polish,68,61,0,66,0,0,0,"2022-07-27 12:22:33"
"Oliver Gronowski (OliverGronowski)",German,70,69,0,5,0,0,0,"2021-05-14 16:37:10"
RealDonald,Dutch,67,69,0,121,10,0,0,"2017-06-23 20:10:12"
"Dpd Eng (dpdeng)",Korean,67,48,0,0,1,0,0,"2022-10-15 10:56:44"
sirekanyan,"Armenian; Russian",66,65,0,0,0,0,0,"2020-04-18 11:32:52"
"Константин К. (kocyak1991)",Russian,64,60,0,0,1,2,0,"2018-06-10 13:39:37"
yukitsubaki,Japanese,64,185,0,32,0,0,36,"2020-01-01 13:17:44"
Suuis,Hindi,64,110,0,0,0,0,0,"2023-07-02 11:50:22"
"Laura Sophie (laurasophie20)",German,62,67,0,4,0,0,0,"2018-01-06 14:21:24"
"Alparslan Sakci (sakci)",Turkish,61,55,0,11,0,0,0,"2021-06-10 11:59:22"
raden20,Indonesian,61,62,177,0,1,0,64,"2017-04-09 22:04:23"
"y (veggente)",Korean,61,56,0,0,0,1,0,"2022-06-28 10:41:18"
"Jan Wojtecki (j4nw)",Polish,58,46,0,0,0,0,26,"2017-11-02 05:42:14"
"Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,13,4,0,"2017-09-17 08:00:31"
"Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,11,4,0,"2017-09-17 08:00:31"
"Peter Williams (williamspete001)",Japanese,55,147,0,2,0,0,3,"2020-01-01 13:17:44"
"Андрій Козицький (andriikozytskyi1108)",Ukrainian,52,52,0,0,1,0,0,"2018-10-22 01:45:08"
"Nil riera (nilriera2000)",Catalan,52,61,0,1,2,0,0,"2021-06-22 16:37:44"
"Nil riera (nilriera2000)",Catalan,52,61,0,1,0,0,0,"2021-06-22 16:37:44"
REMOVED_USER,Italian,51,52,0,2,0,0,0,"2017-08-21 05:15:31"
govindap,"Japanese; Hindi",51,114,0,6,3,1,0,"2020-06-02 20:15:52"
"Neoone (Neooneqq)",Romanian,51,54,0,0,0,0,0,"2022-05-05 20:42:11"
govindap,"Japanese; Hindi",51,114,0,6,1,0,0,"2020-06-02 20:15:52"
"Mare Geldenhuys (mare.geldenhuys)",Afrikaans,50,57,0,0,0,0,0,"2017-10-20 18:00:14"
"Behnood HRazy (behnoodhr)",Persian,49,70,0,0,0,0,0,"2017-11-25 10:57:21"
"Mahmoud Magdy (M7moudManson)",Arabic,49,60,0,6,12,6,0,"2021-08-21 09:01:38"
"tat bz (Tat_i)",German,48,56,0,55,0,0,27,"2021-03-26 05:12:54"
J3ll3nl,Dutch,48,48,0,0,17,1,3,"2017-03-31 11:56:09"
"tat bz (Tat_i)",German,48,56,0,55,0,1,27,"2021-03-26 05:12:54"
"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29,"2019-09-18 09:51:59"
andowero,Czech,47,38,0,0,8,0,0,"2020-01-20 02:29:01"
andowero,Czech,47,38,0,0,0,0,0,"2020-01-20 02:29:01"
vach,Armenian,47,36,0,0,0,0,0,"2020-04-18 16:53:12"
"Rahul Shishodia (rahul.shishodia.10)",Hindi,46,85,0,6,5,1,0,"2018-12-24 22:18:19"
"Coni Ragni (coni2ragnii)",Spanish,46,46,0,0,0,0,0,"2021-02-28 20:18:37"
Cp0204,"Chinese Simplified",45,72,0,0,0,0,0,"2019-08-20 11:04:27"
"cc (cavaz)",Italian,44,41,0,0,0,0,0,"2017-04-01 04:21:08"
"Andrej Šutovský (16andrej.s)",Slovak,44,41,0,0,0,0,0,"2022-06-12 18:01:16"
"Boban Jagertraum (boban40)",Czech,43,38,0,2,31,1,0,"2017-03-31 09:39:16"
"Kamil Dziadek (prso94)",Polish,43,39,0,0,11,0,0,"2020-04-06 17:12:06"
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38,"2017-04-06 02:40:24"
andreea.muscalagiu,Romanian,42,52,0,1,0,0,0,"2017-10-22 07:19:49"
"Boban Jagertraum (boban40)",Czech,43,38,0,2,1,1,0,"2017-03-31 09:39:16"
"Kamil Dziadek (prso94)",Polish,43,39,0,0,2,0,0,"2020-04-06 17:12:06"
"Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0,"2020-11-08 20:44:01"
"Ali Elsheikh (aelsheikh1987)",Arabic,42,41,0,0,0,0,0,"2021-06-16 10:17:26"
"Mateusz Duda (MateuszDuda)",Polish,42,42,0,0,20,0,0,"2021-08-17 11:27:11"
"Mr Habti (donhabti)",Arabic,41,40,0,0,0,0,0,"2023-02-20 10:52:50"
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38,"2017-04-06 02:40:24"
andreea.muscalagiu,Romanian,42,52,0,1,0,0,0,"2017-10-22 07:19:49"
"Mateusz Duda (MateuszDuda)",Polish,42,42,0,0,0,0,0,"2021-08-17 11:27:11"
MStefanov,Bulgarian,41,55,2,0,2,0,2,"2017-03-31 16:09:02"
"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0,"2018-03-07 09:24:22"
"Neeraj Verma (verma.neeraj.in)",Hindi,40,65,0,0,1,0,0,"2018-07-23 07:16:41"
"Ali Zali (stm19951995)",Persian,40,60,0,0,0,0,0,"2020-03-23 19:57:26"
"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39,"2017-03-31 09:49:35"
Anshoe,Tamil,38,65,0,14,3,0,0,"2018-01-02 11:06:52"
"Pavel Protasov (pvphome)",Russian,38,33,0,0,0,0,0,"2024-02-09 03:40:33"
dusanstrgar,Slovenian,39,41,0,0,0,0,0,"2017-03-31 10:30:28"
Anshoe,Tamil,38,65,0,14,0,0,0,"2018-01-02 11:06:52"
anasshm,Arabic,37,36,0,9,0,0,0,"2019-01-27 04:07:22"
hrexen,Armenian,37,37,0,0,0,0,0,"2020-12-09 02:30:34"
REMOVED_USER,Swedish,36,33,0,5,2,0,0,"2018-09-29 17:47:33"
"Abdulrahman (D7M)",Arabic,36,39,0,0,4,0,0,"2020-01-29 18:55:30"
"Abdulrahman (D7M)",Arabic,36,39,0,0,0,0,0,"2020-01-29 18:55:30"
"Maria Chushnyakova (maria.ch)",Russian,36,31,0,3,0,0,0,"2021-08-17 03:23:58"
xphsis,Basque,36,31,0,0,0,0,0,"2022-01-02 08:16:19"
"長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,32,"2018-12-14 10:52:44"
"milad farahani (miladfarmahini90)",Persian,33,44,0,18,1,0,3,"2017-08-31 16:09:00"
REMOVED_USER,Swedish,36,33,0,5,1,0,0,"2018-09-29 17:47:33"
"長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,24,"2018-12-14 10:52:44"
"Luis E. Perichon (luisperichon)",Spanish,33,40,0,104,0,0,0,"2017-09-04 13:46:06"
"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,17,0,2,"2020-01-29 07:27:40"
JoeLi,"Chinese Traditional",31,70,0,12,0,0,24,"2017-06-25 05:32:48"
REMOVED_USER,Russian,31,30,0,2,4,0,3,"2018-12-03 23:55:47"
"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,5,0,2,"2020-01-29 07:27:40"
"milad farahani (miladfarmahini90)",Persian,33,44,0,18,1,0,3,"2017-08-31 16:09:00"
andriikozytskyi2625,Ukrainian,31,23,0,0,0,0,0,"2019-07-08 00:16:41"
Moastafa,Arabic,31,25,0,0,0,4,0,"2020-07-06 11:37:53"
"hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,1,0,0,"2020-08-03 15:23:34"
Moastafa,Arabic,31,25,0,0,0,0,0,"2020-07-06 11:37:53"
"hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,0,0,0,"2020-08-03 15:23:34"
REMOVED_USER,Russian,31,30,0,2,4,0,3,"2018-12-03 23:55:47"
JoeLi,"Chinese Traditional",31,70,0,12,0,0,24,"2017-06-25 05:32:48"
yancyn,"Chinese Simplified",30,40,0,0,0,0,1,"2020-05-18 20:06:03"
"Siniša Sabljić (ssabljic)",Croatian,30,37,0,0,0,0,0,"2023-11-13 15:51:00"
"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0,"2020-02-09 20:44:35"
"Ruud Schouten (ruudschouten)",Dutch,29,32,0,41,3,0,0,"2017-07-22 17:49:17"
"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,1,0,"2020-02-09 20:44:35"
avelneve,Indonesian,29,28,0,0,0,0,0,"2022-04-13 13:26:10"
bzhn,Ukrainian,29,26,0,0,4,0,0,"2022-06-18 17:09:13"
"Gergő Mihály (mihalygergo97)",Hungarian,28,69,0,0,0,0,0,"2024-02-13 08:35:57"
"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0,"2018-01-14 12:58:19"
"Niraj Yadav (neverforgetniraj)",Hindi,26,48,0,0,0,0,0,"2017-04-11 02:26:50"
"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0,"2017-05-05 16:13:00"
"Radoslaw Biernacki (radoslaw.biernacki)",Polish,26,24,0,8,0,0,1,"2020-12-15 17:55:31"
"Jonny I (jonny99dj)",Italian,26,26,0,5,0,0,0,"2017-10-07 07:35:34"
"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0,"2018-01-14 12:58:19"
Pan_Filuta,Czech,25,21,0,5,11,0,3,"2017-04-29 12:55:14"
"Eddie (eddieattaboy)","Chinese Traditional",25,34,0,1,0,0,0,"2020-11-04 21:48:05"
REMOVED_USER,Catalan,24,25,0,2,0,0,0,"2019-06-26 14:59:47"
"Caner Başaran (basarancaner)",Turkish,23,21,0,0,26,1,0,"2017-04-09 06:34:59"
Pan_Filuta,Czech,25,21,0,5,4,0,3,"2017-04-29 12:55:14"
"eduard83 (barbany.eduard)",Catalan,24,25,0,2,0,0,0,"2019-06-26 14:59:47"
"Ľuboš Čaky (lubos.caky)",Slovak,23,22,0,0,0,0,0,"2019-07-02 16:51:44"
"A Aa (ylayzlmimashisafyoutub)",Arabic,23,33,0,34,3,2,0,"2021-09-27 15:34:26"
"Caner Başaran (basarancaner)",Turkish,23,21,0,0,21,0,0,"2017-04-09 06:34:59"
hodanli,Turkish,22,26,0,0,1,0,0,"2017-11-03 14:33:41"
REMOVED_USER,Polish,22,23,0,6,9,0,0,"2021-02-24 03:42:01"
gnu-ewm,Polish,22,23,0,6,0,0,0,"2021-02-24 03:42:01"
"Neeraj Verma (verma.neeraj.in)",Hindi,22,37,0,0,1,0,0,"2018-07-23 07:16:41"
"Alcarkse (alexis.brusle)",French,21,25,0,7,11,0,0,"2017-08-06 09:32:29"
"Hugo Nogueira (hfrnogueira86)",Portuguese,21,22,0,0,0,0,0,"2023-01-09 22:51:24"
"Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0,"2020-05-17 10:34:42"
olbotta,Italian,20,25,0,2,0,0,0,"2021-06-06 04:22:55"
"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,2,0,"2017-06-20 07:30:22"
"Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0,"2020-05-17 10:34:42"
"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0,"2017-10-21 03:01:04"
sheeCesu,French,19,18,0,48,4,0,0,"2017-12-21 17:01:39"
"사자솥 (toke1597)",Korean,19,19,0,0,0,0,0,"2020-02-04 13:36:11"
can13,Turkish,19,14,0,8,0,0,0,"2021-01-03 10:39:03"
KenKailer,Arabic,19,25,0,0,0,0,0,"2022-05-10 06:16:54"
"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,1,0,"2017-06-20 07:30:22"
"사자솥 (toke1597)",Korean,19,19,0,0,0,0,0,"2020-02-04 13:36:11"
axikman11111,Uyghur,18,19,0,0,0,0,0,"2018-10-13 12:25:31"
"Sanjay Krishna (sjaykh)",Malayalam,18,42,0,0,0,0,0,"2024-06-01 08:57:37"
"Chuang-Chen Chiu (peterChiu9952)","Chinese Traditional",18,28,0,0,0,0,0,"2024-07-02 09:36:59"
AlexanderS,German,18,16,0,8,0,0,0,"2025-02-02 16:58:09"
"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0,"2017-08-22 22:56:13"
Adeline31,French,17,20,0,3,1,0,0,"2019-12-06 00:00:11"
takoyakibento,Korean,17,13,0,3,0,0,0,"2020-08-01 08:44:15"
"Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0,"2021-01-03 02:26:54"
Annelotte,Dutch,17,20,0,0,0,0,0,"2022-11-09 08:33:20"
wppoqqqi,Korean,17,18,0,4,0,0,0,"2024-11-30 04:22:21"
"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0,"2017-08-22 22:56:13"
takoyakibento,Korean,17,13,0,3,0,0,0,"2020-08-01 08:44:15"
Adeline31,French,17,20,0,3,0,0,0,"2019-12-06 00:00:11"
engineeringforgood,Russian,16,15,0,0,0,0,16,"2021-01-22 03:32:35"
bretzel15,German,16,20,0,0,0,0,0,"2020-04-06 02:49:14"
"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0,"2017-07-05 18:37:08"
DebatablySane,Bulgarian,16,15,0,48,0,0,0,"2017-07-10 15:13:18"
bretzel15,German,16,20,0,0,1,0,0,"2020-04-06 02:49:14"
engineeringforgood,Russian,16,15,0,0,0,0,16,"2021-01-22 03:32:35"
"M7md Salahaddin (m7mdsalahaddin)",Arabic,16,16,0,1,0,0,0,"2024-07-17 18:49:07"
"Bhava Tharini (bhavidanush)",Tamil,15,37,0,0,0,0,0,"2019-10-09 05:43:11"
"Ch. (sftblw)",Korean,15,17,0,1,0,0,0,"2023-01-25 19:22:34"
iamsurajbobade,Hindi,14,30,0,0,0,0,0,"2018-05-21 11:23:27"
"Zeynep Esen (nezihaesen50)",Turkish,14,13,0,0,0,0,0,"2020-01-28 07:05:15"
"Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0,"2020-02-18 12:38:54"
"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0,"2020-04-14 13:22:49"
"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0,"2020-06-21 17:16:11"
"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,1,0,0,"2020-06-23 02:40:01"
"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0,"2020-06-23 02:40:01"
"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0,"2020-09-15 11:32:01"
"Faiz Ahamed (faiznewton)",Tamil,14,31,0,0,0,0,0,"2021-05-06 23:06:46"
"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0,"2020-04-14 13:22:49"
iamsurajbobade,Hindi,14,30,0,0,0,0,0,"2018-05-21 11:23:27"
"Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0,"2020-02-18 12:38:54"
"Maro Chr (caprisunglasses)",Greek,14,17,0,0,0,0,0,"2021-08-17 06:53:33"
"pi hobbes (uwe_silv)",Japanese,14,46,0,0,0,0,14,"2022-01-15 02:57:14"
"Mar Tous (mtousfernandez)",Catalan,14,18,0,0,0,0,0,"2022-08-16 17:55:28"
Ferhatt,Turkish,14,13,0,3,0,0,0,"2022-12-13 12:52:20"
alchemiker,German,14,13,0,0,0,0,0,"2024-09-03 10:16:04"
"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0,"2019-01-31 14:29:15"
"Dave (xdave)",Hungarian,13,11,0,0,0,0,0,"2020-03-02 20:56:50"
"Uwe Mönks (schirinowski)",German,13,12,0,0,0,0,0,"2021-02-18 04:00:41"
Herbie_23,Italian,13,15,0,0,0,0,0,"2022-01-17 17:35:40"
"Ana Kelly Vale (anakvale)","Portuguese, Brazilian",13,21,0,4,0,0,2,"2022-03-30 00:15:37"
"Minsu (cknblue)",Korean,13,10,0,1,0,0,0,"2022-05-18 00:26:54"
"shreyas (techiespace)",Hindi,12,20,0,0,0,0,0,"2018-06-10 01:14:26"
"Dave (xdave)",Hungarian,13,11,0,0,0,0,0,"2020-03-02 20:56:50"
soura2,Arabic,12,13,0,0,0,0,0,"2020-01-13 19:23:47"
"Ammar Naif (Ammar_Naif)",Arabic,12,12,0,6,0,0,0,"2022-01-15 05:16:41"
"Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11,"2017-06-16 20:21:06"
Vmrc,French,11,12,0,2,0,0,0,"2020-11-02 05:35:06"
"shreyas (techiespace)",Hindi,12,20,0,0,0,0,0,"2018-06-10 01:14:26"
"Sonu Sharma (riteetude)",Hindi,11,23,0,0,0,0,0,"2021-05-30 19:38:00"
"Lucas Depetris (lucasdepetrisd)","Spanish; Catalan; Italian; French",11,12,0,12,0,0,0,"2023-10-24 21:16:21"
"Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0,"2017-10-18 18:26:29"
Vmrc,French,11,12,0,2,0,0,0,"2020-11-02 05:35:06"
"Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11,"2017-06-16 20:21:06"
"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0,"2020-09-11 08:11:32"
"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,0,0,"2020-08-03 02:27:28"
"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0,"2018-05-06 09:23:57"
"Edwin van Rooij (edwinvrooij)",Dutch,10,13,0,17,0,0,0,"2018-11-05 03:59:10"
"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,1,0,"2020-08-03 02:27:28"
"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0,"2020-09-11 08:11:32"
"Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0,"2017-10-18 18:26:29"
"Ahmed Mosaad (ahmed.mosaad2018)",Arabic,10,12,0,6,0,0,0,"2021-02-03 18:45:43"
"Hrant Hakobian (hrastgh1)",Armenian,10,9,0,0,0,0,0,"2021-08-29 15:22:10"
"Milan Siebenbürger (lennyd)",Czech,10,7,0,1,1,0,0,"2022-01-30 07:09:42"
"Zesar Cebrián (Txorrota)",Spanish,10,44,0,0,0,0,0,"2022-02-09 01:34:32"
"Слави Велчев (BRO36S) (gg13656)",Bulgarian,10,11,0,9,0,0,0,"2025-01-09 08:47:04"
"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0,"2018-03-22 01:37:55"
"Suhaili Hassan (kucingsyg96)",Indonesian,9,10,0,0,0,0,0,"2018-06-10 11:55:09"
"Martin Vostatek (martinvostatek)",Czech,9,8,0,32,3,0,0,"2019-01-21 13:52:36"
"Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,26,0,0,"2020-01-02 09:55:48"
omoise,French,9,11,0,1,0,0,0,"2023-12-26 14:27:17"
"Martin Vostatek (martinvostatek)",Czech,9,8,0,32,2,0,0,"2019-01-21 13:52:36"
"Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,19,0,0,"2020-01-02 09:55:48"
"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0,"2018-03-22 01:37:55"
Rex123,Persian,8,8,0,0,0,0,0,"2017-07-01 00:47:42"
"Jakob Weickmann (jweickm)",Japanese,8,21,0,0,0,0,8,"2021-10-05 11:10:25"
"Andrey ZaXeLoN (waragaa)",Russian,7,7,0,8,1,0,0,"2017-09-18 21:37:42"
"Vladimir Pavlychev (vovs03)",Russian,7,9,0,0,0,0,0,"2017-12-18 02:46:56"
"Konstantin (KZhidovinov)",Russian,7,7,0,0,0,0,0,"2020-01-29 13:35:12"
pkorove,Greek,7,7,0,0,1,0,0,"2020-03-07 11:36:12"
ftfoi,Norwegian,7,6,0,0,0,0,0,"2020-04-11 20:42:35"
"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0,"2020-09-26 20:31:56"
"Felipe Chagas (chagretes)","Portuguese, Brazilian",7,8,0,0,3,0,5,"2022-01-10 12:20:25"
"Tomáš Miklovič (zyppi)",Slovak,7,7,0,0,0,0,0,"2022-09-11 15:12:06"
"Sam (SorodonSorodon)",German,6,6,0,13,0,0,0,"2017-04-14 11:09:27"
ChloeLiang,Japanese,6,22,0,0,1,0,3,"2017-08-08 05:02:59"
"닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0,"2017-10-09 23:08:15"
ftfoi,Norwegian,7,6,0,0,0,0,0,"2020-04-11 20:42:35"
"Vladimir Pavlychev (KeyJoo)",Russian,7,9,0,0,0,0,0,"2017-12-18 02:46:56"
pkorove,Greek,7,7,0,0,0,0,0,"2020-03-07 11:36:12"
erfan2927,Persian,6,6,0,0,0,0,0,"2018-04-09 02:12:44"
"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0,"2018-05-20 17:24:19"
"Sam (SorodonSorodon)",German,6,6,0,13,0,0,0,"2017-04-14 11:09:27"
"닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0,"2017-10-09 23:08:15"
"Sarita Cajas (sarayanacajas)",Spanish,6,4,0,0,1,0,0,"2021-05-14 14:27:59"
"خالد (mkhrafi1999)",Arabic,6,3,0,6,0,0,0,"2023-06-25 00:36:13"
"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0,"2017-08-28 09:53:59"
andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0,"2017-09-03 05:24:43"
"Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2,"2018-01-06 23:00:43"
ChloeLiang,Japanese,6,22,0,0,1,0,3,"2017-08-08 05:02:59"
"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0,"2021-01-03 11:00:33"
"Tomáš Hrabáček (Hrabyyy)",Czech,5,3,0,0,0,0,0,"2021-05-27 11:58:11"
"Guerra Ivaneth (rossanaiva-04)",Spanish,5,7,0,0,0,0,0,"2019-02-03 16:48:59"
"Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2,"2018-01-06 23:00:43"
"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0,"2017-08-28 09:53:59"
"Micaela Pighin (micaelapiighin)",Spanish,5,6,0,1,0,0,0,"2019-10-09 23:32:42"
"Manuel (Mannivu)",Italian,5,6,0,0,0,0,0,"2021-01-03 11:00:33"
"Tomáš Hrabáček (Hrabyyy)",Czech,5,3,0,0,2,0,0,"2021-05-27 11:58:11"
"Vitor Henrique (vitorhcl)","Portuguese, Brazilian",5,8,0,1,0,0,0,"2022-03-08 20:00:59"
SubhamJena,Hindi,5,12,0,3,0,0,0,"2023-04-19 11:13:19"
"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0,"2018-09-20 11:46:22"
"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0,"2019-03-25 07:12:34"
bziuum,Polish,4,4,0,0,6,0,0,"2020-09-01 09:08:01"
andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0,"2017-09-03 05:24:43"
marmo,German,4,4,0,0,0,0,0,"2021-01-13 01:16:35"
"Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,1,"2021-04-21 15:33:29"
"Mo Heydari (Mrheydari)",Dutch,4,4,0,0,0,0,0,"2023-02-21 04:54:49"
"Srekaravarshan N K (srekaravarshan)",Tamil,4,4,0,0,0,0,0,"2023-04-22 06:08:57"
"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0,"2019-03-25 07:12:34"
"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0,"2018-09-20 11:46:22"
bziuum,Polish,4,4,0,0,0,0,0,"2020-09-01 09:08:01"
"Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,0,"2021-04-21 15:33:29"
Magidxz,Arabic,3,3,0,0,0,0,0,"2021-01-05 05:02:54"
"mohammadali barati (mabaraty)",Persian,3,3,0,0,0,0,0,"2021-07-10 05:54:44"
"Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0,"2020-08-27 22:43:16"
"Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0,"2020-03-18 23:34:35"
REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-11-18 09:02:37"
"Thoum Ptrgnt (thomas.petrignet)",French,3,3,0,2,0,3,0,"2017-09-23 19:25:52"
"Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0,"2018-12-28 14:31:02"
carsten_kafke,German,3,3,0,43,0,0,3,"2017-10-27 13:27:47"
"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0,"2017-12-30 17:54:26"
"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0,"2018-01-19 15:20:27"
"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0,"2018-01-21 17:45:48"
"Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-06 22:24:54"
"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-21 09:08:59"
"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,2,0,3,"2018-09-15 04:39:22"
REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-11-18 09:02:37"
"Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0,"2018-12-28 14:31:02"
"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0,"2019-01-08 14:41:10"
atomjani,Hungarian,3,3,0,0,0,0,0,"2019-01-19 00:49:25"
"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2019-07-31 20:42:20"
"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-21 09:08:59"
"Péter Bernát (bernatp)",Hungarian,3,2,0,0,0,0,0,"2019-11-30 15:50:33"
"Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0,"2020-03-18 23:34:35"
"Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0,"2020-08-27 22:43:16"
Magidxz,Arabic,3,3,0,0,0,0,0,"2021-01-05 05:02:54"
"mohammadali barati (mabaraty)",Persian,3,3,0,0,0,0,0,"2021-07-10 05:54:44"
"Tejaswini Boppana (Tejaswini)",Telugu,3,1,0,0,0,0,0,"2021-08-27 23:48:55"
"Craig Foobar (craig.foobar)",German,3,3,0,25,1,0,0,"2022-02-20 16:55:47"
Katarin,Ukrainian,3,3,0,0,0,0,0,"2022-03-17 14:44:59"
ayet,Arabic,3,3,0,0,0,0,0,"2023-08-16 20:18:12"
REMOVED_USER,Ukrainian,2,2,0,0,0,0,0,"2017-06-15 12:24:44"
"Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2,"2017-07-13 06:56:17"
omerfarukbas,Turkish,2,3,0,19,2,0,0,"2017-08-14 16:10:35"
"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0,"2017-09-23 01:42:57"
"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3,"2018-09-15 04:39:22"
"Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-06 22:24:54"
atomjani,Hungarian,3,3,0,0,0,0,0,"2019-01-19 00:49:25"
"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0,"2020-06-13 15:24:17"
"FAy FAy (fayfayfay52)","Chinese Traditional",2,5,0,0,0,0,0,"2017-10-06 08:53:21"
"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0,"2018-04-17 22:00:41"
amei,"Portuguese, Brazilian",2,2,0,0,0,0,0,"2018-04-19 19:42:28"
"Jimmy Young (Jimmyyoung)","Chinese Traditional",2,4,0,0,0,0,2,"2018-04-22 04:00:19"
chavs1997,Russian,2,2,0,9,0,0,0,"2018-05-18 16:58:19"
Soroor_SI,Persian,2,2,0,0,0,0,0,"2018-06-10 06:28:27"
"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0,"2018-09-22 09:38:27"
"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0,"2018-04-17 22:00:41"
"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0,"2018-09-22 16:33:36"
"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0,"2019-01-31 12:06:57"
amei,"Portuguese, Brazilian",2,2,0,0,0,0,0,"2018-04-19 19:42:28"
"Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,0,0,0,"2020-01-10 14:19:41"
"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0,"2019-03-30 13:24:16"
"조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0,"2019-06-16 22:25:31"
"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0,"2019-12-01 11:47:00"
"Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,1,0,0,"2020-01-10 14:19:41"
"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0,"2020-06-13 15:24:17"
"Walid Baazia (walidbaazia2005)",Arabic,2,1,0,0,0,0,0,"2021-01-27 12:47:34"
"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0,"2019-12-01 11:47:00"
LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2,"2018-04-22 04:00:19"
"Ño Bí Tã (pt614553)",Arabic,2,8,0,1,0,0,0,"2021-05-22 20:41:01"
"Judith Ayala (Azul1612)",Spanish,2,1,0,0,0,1,0,"2021-05-18 17:07:19"
"Ño Bí Tã (pt614553)",Arabic,2,8,0,1,0,2,0,"2021-05-22 20:41:01"
"Héctor Mañas García (hectodium)",Catalan,2,3,0,0,0,0,0,"2021-10-02 20:32:09"
"Sidali Aymen (sidaliaymen950)",Arabic,2,2,0,0,0,0,0,"2022-01-31 18:50:59"
"Ahmed Bazazo (ahmedbazazo)",Arabic,2,2,0,0,0,0,0,"2022-02-19 20:11:09"
"HypemanKEK (rocasta.dodvi)",Russian,2,2,0,0,0,0,0,"2023-01-13 03:45:06"
"Gmas (gustmaes1)",Dutch,2,2,0,0,0,0,0,"2023-01-26 13:52:54"
"Катерина Ховалкина (katerina959)",Russian,2,2,0,1,0,0,0,"2023-05-18 14:50:30"
"Pratheba Devanathan (devprath05)",Tamil,2,2,0,0,1,0,0,"2023-06-05 12:35:45"
"Gordon James Campbell (gordonjamescampbell)",Catalan,2,2,0,0,0,0,0,"2023-06-23 23:23:46"
"Suren Airyanam (suren.airyanam)",Persian,2,2,0,0,0,0,0,"2023-10-21 18:01:41"
axq,German,2,1,0,1,0,0,0,"2024-02-29 17:14:13"
"Hades Mori (Hades_Mori)",Ukrainian,2,2,0,0,0,0,0,"2024-07-03 07:14:58"
REMOVED_USER,Ukrainian,2,2,0,0,0,0,0,"2017-06-15 12:24:44"
"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0,"2018-09-22 09:38:27"
"Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2,"2017-07-13 06:56:17"
"조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0,"2019-06-16 22:25:31"
omerfarukbas,Turkish,2,3,0,19,2,0,0,"2017-08-14 16:10:35"
"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0,"2017-09-23 01:42:57"
"Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0,"2020-09-26 23:26:15"
axd,Spanish,1,1,0,15,0,0,0,"2017-09-12 05:48:51"
iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0,"2017-03-18 17:56:29"
"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1,"2017-07-06 14:18:39"
axd,Spanish,1,1,0,15,1,0,0,"2017-09-12 05:48:51"
REMOVED_USER,Russian,1,2,0,6,1,0,1,"2019-12-26 05:37:01"
"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0,"2017-12-14 06:35:58"
"Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0,"2018-01-09 10:46:00"
jonesses,German,1,1,0,1,0,0,1,"2021-01-01 08:03:18"
"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1,"2017-07-06 14:18:39"
"박찌 (perpact20)",Korean,1,1,0,0,0,0,0,"2018-02-10 10:11:44"
"Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0,"2018-12-01 14:31:21"
"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0,"2019-01-15 03:50:10"
"Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0,"2018-01-09 10:46:00"
"Maria Fefelova (mashafefel)",Russian,1,1,0,0,0,0,0,"2019-05-18 02:03:56"
"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0,"2019-06-07 17:43:08"
REMOVED_USER,Russian,1,2,0,6,1,0,1,"2019-12-26 05:37:01"
"Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0,"2020-09-26 23:26:15"
jonesses,German,1,1,0,1,0,0,1,"2021-01-01 08:03:18"
"monir s (ms.alam)",Persian,1,1,0,1,0,0,0,"2022-05-23 06:34:00"
"Daniel Luque (LuqueDaniel)",Spanish,1,1,0,0,0,0,0,"2022-06-30 20:37:07"
Liboide,Spanish,1,1,0,0,0,0,0,"2022-11-03 23:57:45"
"K RITE (kriteshojha5)",Hindi,1,1,0,1,0,0,0,"2024-08-14 17:28:55"
"Angelos (angelos1993)",Arabic,1,1,0,0,0,0,0,"2024-11-20 07:38:18"
"Bora Atıcı (Brtc)",Turkish,1,2,0,0,0,0,0,"2025-03-07 20:33:19"
EmanAmini,,0,0,0,0,0,0,0,"2017-03-31 13:27:43"
AnggaRifandi,,0,0,0,0,0,0,0,"2017-03-31 19:28:35"
"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0,"2017-04-09 10:08:13"
"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0,"2017-04-15 04:04:00"
"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0,"2019-01-15 03:50:10"
"Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0,"2018-12-01 14:31:21"
"Dagna Q (dagnaq)",,0,0,0,0,0,0,0,"2017-08-06 01:42:52"
Kamalakannan,,0,0,0,0,0,0,0,"2017-05-14 11:40:23"
"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0,"2017-07-05 21:12:02"
"Dagna Q (dagnaq)",,0,0,0,0,0,0,0,"2017-08-06 01:42:52"
"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0,"2019-08-12 21:58:30"
sanyoniket,,0,0,0,0,0,0,0,"2019-07-23 12:58:40"
REMOVED_USER,,0,0,0,0,0,0,0,"2020-02-01 03:47:48"
"vi ve (VimalV)",,0,0,0,0,0,0,0,"2021-02-08 02:35:45"
"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0,"2019-06-09 19:47:02"
"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0,"2018-02-07 04:13:51"
"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0,"2017-08-18 18:37:18"
"LeMeD (LeMeS)",French,0,0,0,2,0,0,0,"2021-02-06 15:35:00"
ava_rfie,Persian,0,0,0,1,0,0,0,"2019-06-09 16:19:24"
"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0,"2021-01-23 13:09:59"
EwanB,,0,0,0,0,0,0,0,"2019-11-19 10:04:38"
Fazy1380,,0,0,0,0,0,0,0,"2021-04-10 11:02:53"
"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0,"2017-04-09 10:08:13"
"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0,"2017-04-15 04:04:00"
"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0,"2018-03-13 02:09:35"
"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0,"2020-10-13 04:38:26"
Hayder21,,0,0,0,0,0,0,0,"2019-12-31 10:56:24"
T-v-Gerwen,Dutch,0,0,0,47,0,0,0,"2018-03-02 10:26:33"
"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0,"2019-12-16 09:08:39"
"Samuel Przeździęk (samek22)",Polish,0,0,0,1,0,0,0,"2021-08-01 00:49:01"
"Saiprasath B (Saiprasath)",,0,0,0,0,0,0,0,"2021-07-11 11:10:41"
shuvo786,,0,0,0,0,0,0,0,"2019-11-13 00:18:12"
"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0,"2020-06-01 14:18:18"
Itch,,0,0,0,0,0,0,0,"2017-10-16 09:18:42"
"Muhammet Furkan ALMACI (furkan.almaci)",Turkish,0,0,0,1,0,0,0,"2017-10-29 13:44:56"
"Manny Farsangy (manifarsangi)",Persian,0,0,0,12,0,0,0,"2021-08-10 05:32:28"
"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0,"2019-10-20 13:52:24"
"Thomas Orlita (Thomas995)",Czech,0,0,0,1,0,0,0,"2017-12-24 04:08:27"
Irsgram,Russian,0,0,0,1,0,0,0,"2019-09-30 16:42:20"
EmanAmini,,0,0,0,0,0,0,0,"2017-03-31 13:27:43"
mushin,,0,0,0,0,0,0,0,"2020-02-02 04:08:05"
"Elmo (oberknecht)",,0,0,0,0,0,0,0,"2020-04-16 08:45:50"
AnggaRifandi,,0,0,0,0,0,0,0,"2017-03-31 19:28:35"
"darkkingredian (rediancool)",,0,0,0,0,0,0,0,"2021-07-27 16:04:32"
"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0,"2018-09-02 05:31:53"
"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0,"2019-01-25 14:35:02"
mdrobulis,,0,0,0,0,0,0,0,"2018-05-24 01:40:42"
"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0,"2018-02-11 11:07:36"
"Arjun K. (arjunkdot)",,0,0,0,0,0,0,0,"2020-09-20 11:16:18"
REMOVED_USER,Czech,0,0,0,18,0,0,0,"2018-03-27 06:19:52"
martyaberger,,0,0,0,0,0,0,0,"2019-01-01 18:48:08"
BongTran,Vietnamese,0,0,0,2,0,0,0,"2018-04-24 05:16:07"
"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0,"2019-07-24 15:03:42"
"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0,"2018-10-29 03:57:21"
rooban23,,0,0,0,0,0,0,0,"2020-09-15 11:49:14"
"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0,"2019-12-31 12:47:29"
valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0,"2020-02-02 14:45:02"
"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0,"2020-08-12 13:03:49"
REMOVED_USER,,0,0,0,0,0,0,0,"2018-10-27 15:34:36"
REMOVED_USER,,0,0,0,0,0,0,0,"2018-08-24 00:17:43"
Elham1361,,0,0,0,0,0,0,0,"2018-10-27 12:01:06"
dongchen.yue,German,0,0,0,4,0,0,0,"2020-09-12 15:05:59"
"Ahnaf Tajwar (atn4404)",,0,0,0,0,0,0,0,"2018-10-16 11:13:30"
AsadullahIlyas,,0,0,0,0,0,0,0,"2019-01-04 06:14:15"
droidahmed,Arabic,0,0,0,7,0,0,0,"2018-01-31 02:18:49"
philfr49,French,0,0,0,2,0,0,0,"2018-09-03 14:20:32"
"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0,"2018-05-06 12:10:27"
"Balaji Jayaraman (jkbalaji1103)",,0,0,0,0,0,0,0,"2017-10-30 22:12:27"
"Wellington Ribeiro (wellington.rib)",,0,0,0,0,0,0,0,"2017-11-16 07:32:25"
"Javid IRAN (twitteriran98)",Persian,0,0,0,1,0,0,0,"2017-11-25 16:47:25"
REMOVED_USER,Czech,0,0,0,1,0,0,0,"2017-12-24 04:08:27"
AhmedDz,Arabic,0,0,0,1,0,0,0,"2017-12-31 10:12:31"
"박인호 (wphestiraid)",Korean,0,0,0,2,0,0,0,"2018-01-05 00:33:14"
"Pumpith Ungsupanit (pumpithu)",,0,0,0,0,0,0,0,"2019-01-19 23:47:57"
Sandhu564.,,0,0,0,0,0,0,0,"2020-12-14 01:27:45"
"Quentin Hibon (hiq)",,0,0,0,0,0,0,0,"2021-02-07 16:39:31"
AhmedDz,Arabic,0,0,0,1,0,0,0,"2017-12-31 10:12:31"
"Shuvashish Sahoo (shuvashish76)",,0,0,0,0,0,0,0,"2020-09-17 09:10:09"
REMOVED_USER,,0,0,0,0,0,0,0,"2018-01-05 16:56:12"
NairaDNV,Spanish,0,0,0,9,0,0,0,"2018-01-05 19:10:33"
Raulbertassi,,0,0,0,0,0,0,0,"2018-01-07 17:23:18"
"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0,"2018-01-20 02:18:32"
farbod66,Persian,0,0,0,1,0,0,0,"2018-01-20 11:04:23"
droidahmed,Arabic,0,0,0,7,0,0,0,"2018-01-31 02:18:49"
"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0,"2018-02-07 04:13:51"
"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0,"2018-02-11 11:07:36"
T-v-Gerwen,Dutch,0,0,0,47,0,0,0,"2018-03-02 10:26:33"
"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0,"2018-03-13 02:09:35"
REMOVED_USER,Czech,0,0,0,18,0,0,0,"2018-03-27 06:19:52"
BongTran,Vietnamese,0,0,0,2,0,0,0,"2018-04-24 05:16:07"
"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0,"2018-05-06 12:10:27"
mdrobulis,,0,0,0,0,0,0,0,"2018-05-24 01:40:42"
REMOVED_USER,,0,0,0,0,0,0,0,"2018-08-24 00:17:43"
"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0,"2018-09-02 05:31:53"
philfr49,French,0,0,0,2,0,0,0,"2018-09-03 14:20:32"
"Ahnaf Tajwar (atn4404)",,0,0,0,0,0,0,0,"2018-10-16 11:13:30"
Elham1361,,0,0,0,0,0,0,0,"2018-10-27 12:01:06"
REMOVED_USER,,0,0,0,0,0,0,0,"2018-10-27 15:34:36"
"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0,"2018-10-29 03:57:21"
martyaberger,,0,0,0,0,0,0,0,"2019-01-01 18:48:08"
AsadullahIlyas,,0,0,0,0,0,0,0,"2019-01-04 06:14:15"
"Pumpith Ungsupanit (pumpithu)",,0,0,0,0,0,0,0,"2019-01-19 23:47:57"
"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0,"2019-01-25 14:35:02"
ava_rfie,Persian,0,0,0,1,0,0,0,"2019-06-09 16:19:24"
"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0,"2019-06-09 19:47:02"
sanyoniket,,0,0,0,0,0,0,0,"2019-07-23 12:58:40"
"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0,"2019-07-24 15:03:42"
"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0,"2019-08-12 21:58:30"
Irsgram,Russian,0,0,0,1,0,0,0,"2019-09-30 16:42:20"
"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0,"2019-10-20 13:52:24"
shuvo786,,0,0,0,0,0,0,0,"2019-11-13 00:18:12"
EwanB,,0,0,0,0,0,0,0,"2019-11-19 10:04:38"
"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0,"2019-12-16 09:08:39"
Hayder21,,0,0,0,0,0,0,0,"2019-12-31 10:56:24"
"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0,"2019-12-31 12:47:29"
REMOVED_USER,,0,0,0,0,0,0,0,"2020-02-01 03:47:48"
mushin,,0,0,0,0,0,0,0,"2020-02-02 04:08:05"
valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0,"2020-02-02 14:45:02"
"Elmo (oberknecht)",,0,0,0,0,0,0,0,"2020-04-16 08:45:50"
"Карлен Шаухаев (KarlenShaukhaev)",,0,0,0,0,0,0,0,"2020-04-27 08:53:49"
"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0,"2020-06-01 14:18:18"
"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0,"2020-08-12 13:03:49"
dongchen.yue,German,0,0,0,4,0,0,0,"2020-09-12 15:05:59"
rooban23,,0,0,0,0,0,0,0,"2020-09-15 11:49:14"
REMOVED_USER,,0,0,0,0,0,0,0,"2020-09-17 09:10:09"
"Arjun K. (arjunkdot)",,0,0,0,0,0,0,0,"2020-09-20 11:16:18"
"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0,"2020-10-13 04:38:26"
"reza golestanzadeh (reza.golestanzadeh)",Persian,0,0,0,1,0,0,0,"2020-10-21 12:07:20"
Sandhu564.,,0,0,0,0,0,0,0,"2020-12-14 01:27:45"
dimateos,,0,0,0,0,0,0,0,"2021-01-10 06:29:52"
"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0,"2021-01-23 13:09:59"
"LeMeD (LeMeS)",French,0,0,0,2,0,0,0,"2021-02-06 15:35:00"
"Quentin Hibon (hiq)",,0,0,0,0,0,0,0,"2021-02-07 16:39:31"
"vi ve (VimalV)",,0,0,0,0,0,0,0,"2021-02-08 02:35:45"
Fazy1380,,0,0,0,0,0,0,0,"2021-04-10 11:02:53"
"Saiprasath B (Saiprasath)",,0,0,0,0,0,0,0,"2021-07-11 11:10:41"
"darkkingredian (rediancool)",,0,0,0,0,0,0,0,"2021-07-27 16:04:32"
"Samuel Przeździęk (samek22)",Polish,0,0,0,1,0,0,0,"2021-08-01 00:49:01"
"Manny Farsangy (manifarsangi)",Persian,0,0,0,12,0,0,0,"2021-08-10 05:32:28"
"Masataka Yakura (myakura)",Japanese,0,0,0,1,0,0,0,"2021-09-03 22:10:36"
"Said Tahsin Dane (tasomaniac)",,0,0,0,0,0,0,0,"2021-09-25 05:31:01"
"akmal shafiq (mohdakmalshafiq)",,0,0,0,0,0,0,0,"2021-11-01 01:04:50"
catemlitten,Japanese,0,0,0,1,0,0,0,"2021-11-17 15:06:02"
HemanthMeda,Telugu,0,0,0,4,0,0,0,"2021-12-01 14:02:14"
"Yunsu Kim (yunsukim86)",Korean,0,0,0,2,0,0,0,"2022-01-14 06:33:43"
"Sylwuskak (sylwuskak)",Polish,0,0,0,1,0,0,0,"2022-01-25 04:19:53"
"Pro AAA (pro1010)",Arabic,0,0,0,1,0,0,0,"2022-02-14 03:32:44"
"Baran Özavcı (n2141n)",Turkish,0,0,0,1,0,0,0,"2022-02-26 04:32:51"
deepbird,,0,0,0,0,0,0,0,"2022-04-11 03:21:05"
ashik8113,,0,0,0,0,0,0,0,"2022-04-13 11:58:26"
" (manuL96)",,0,0,0,0,0,0,0,"2022-05-06 23:34:55"
"Agnel (agnelwaghela)",,0,0,0,0,0,0,0,"2022-06-19 10:32:33"
"Ruslan Zaynetdinov (theRuslan)",Russian,0,0,0,6,0,0,0,"2022-07-06 10:48:31"
"Marcel (flaced)",German,0,0,0,1,0,0,0,"2022-08-19 15:19:26"
pixx1,German,0,0,0,6,0,0,0,"2022-08-22 00:38:13"
"Onder Nuray (ondernuray)",,0,0,0,0,0,0,0,"2022-08-30 08:16:27"
"Md Faridul Islam (mdfaridulislam509)",,0,0,0,0,0,0,0,"2022-09-04 06:25:20"
Felone,,0,0,0,0,0,0,0,"2022-09-10 08:04:02"
Sawwwwwplan,,0,0,0,0,0,0,0,"2022-09-10 11:35:14"
"Fatima (fatima.a)",Arabic,0,0,0,1,0,0,0,"2022-09-20 09:48:25"
DomiAlt,,0,0,0,0,0,0,0,"2022-10-02 15:44:26"
Erwindly,Polish,0,0,0,1,0,0,0,"2022-11-01 04:12:58"
"Deniz Çelik (DenizCelik)",,0,0,0,0,0,0,0,"2022-11-09 02:13:11"
Watashiwanilli,,0,0,0,0,0,0,0,"2022-11-14 10:12:21"
"Maxence LIGAN (Daddy_Caramel)",,0,0,0,0,0,0,0,"2022-12-23 04:43:30"
wstroobandt,Dutch,0,0,0,1,0,0,0,"2023-01-03 17:52:42"
"ニキホロブ蒼井 (abhigyahazra)",,0,0,0,0,0,0,0,"2023-01-08 21:37:53"
"Afrim Kamberi (afrimkamberi)",,0,0,0,0,0,0,0,"2023-01-17 05:20:06"
ViacheslavLabs,Ukrainian,0,0,0,5,0,0,0,"2023-01-21 15:34:40"
Basta,,0,0,0,0,0,0,0,"2023-03-04 16:13:57"
raselh,,0,0,0,0,0,0,0,"2023-03-15 03:33:21"
"Adrian Miozga (AdrianMiozga)",Polish,0,0,0,13,0,0,0,"2023-03-25 17:00:53"
"Atlas Steel (atlas.steel.erbil)",,0,0,0,0,0,0,0,"2023-05-16 05:23:32"
"Sathyakumar Ps (sathyakumar63)",,0,0,0,0,0,0,0,"2023-05-24 11:44:23"
"Abdul nafih (nafih_zain_)",,0,0,0,0,0,0,0,"2023-05-25 06:24:31"
"Bernhard (bernikr)",German,0,0,0,1,0,0,0,"2023-06-12 11:18:18"
"Anna Boda (annaboda08)",Hungarian,0,0,0,1,0,0,0,"2023-07-03 13:28:12"
"Rubén CH (chruben45)",Spanish,0,0,0,1,0,0,0,"2023-07-24 12:39:51"
"Vinicius (exteraDev)",,0,0,0,0,0,0,0,"2023-08-08 15:47:45"
"mugdad alhammad (alhammad5057)",,0,0,0,0,0,0,0,"2023-08-13 22:36:01"
"Arthur Waldes (arthurwaldes)",,0,0,0,0,0,0,0,"2023-08-22 15:38:12"
"Mahmoud Hatem (mahmoudhatem)",Arabic,0,0,0,1,0,0,0,"2023-09-12 05:12:34"
"Jacques Francky Salomon (jacquesfranckysalomon)",,0,0,0,0,0,0,0,"2023-10-14 20:55:30"
"Mohammad Hashem (hashemchattogram)",,0,0,0,0,0,0,0,"2023-10-27 02:15:39"
Aylinddd,Persian,0,0,0,1,0,0,0,"2023-11-07 22:50:37"
Dinock,German,0,0,0,1,0,0,0,"2023-11-10 07:08:23"
zelfoxx,German,0,0,0,12,0,0,0,"2023-11-22 11:11:44"
REMOVED_USER,,0,0,0,0,0,0,0,"2023-11-28 17:42:55"
"Dennis Li (Dennis_Li)","Chinese Simplified",0,0,0,1,0,0,0,"2023-12-24 21:12:43"
REMOVED_USER,Russian,0,0,0,5,0,0,0,"2024-01-01 17:15:06"
"Daniill l (daniill)",,0,0,0,0,0,0,0,"2024-01-12 02:42:52"
"NONE NAME (RagnarGraves)",Spanish,0,0,0,1,0,0,0,"2024-02-18 01:39:39"
lu21232512,,0,0,0,0,0,0,0,"2024-04-15 12:40:05"
"Oscariño (oscarinhooo)",,0,0,0,0,0,0,0,"2024-07-07 08:47:25"
"Vladimir Sveshnikov (proloxy)",Russian,0,0,0,6,0,0,0,"2024-07-12 03:27:39"
L0f3n,Swedish,0,0,0,2,0,0,0,"2024-08-06 17:13:50"
"Christer Fletcher (chrfle)",Swedish,0,0,0,2,0,0,0,"2024-08-15 04:15:49"
"Moaid alzawy (dodoalzawy200)",Arabic,0,0,0,1,0,0,0,"2024-09-18 12:17:31"
"Eduardo Ferreira (eduu)",,0,0,0,0,0,0,0,"2024-10-27 19:09:20"
"عبد الملك بلكم (aboodpvp555)",Arabic,0,0,0,1,0,0,0,"2024-12-12 02:42:14"
4Kio,Russian,0,0,0,1,0,0,0,"2024-12-12 12:31:25"
"رودينه (rwdynh874)",Arabic,0,0,0,1,0,0,0,"2024-12-24 18:31:33"
"zahra ghasemi (z.ghasemizahra)",Persian,0,0,0,1,0,0,0,"2024-12-29 04:36:27"
"Mustafa Işıksız (mustafalordon27)",Turkish,0,0,0,1,0,0,0,"2025-01-15 13:52:32"
"Ahlem Ben (ahlemben1513)",Arabic,0,0,0,1,0,0,0,"2025-02-12 11:09:57"
"Francisco Parra (Frn_7)",Spanish,0,0,0,1,0,0,0,"2025-02-18 22:57:05"
"mizumoto (yuta-mizumoto)",Japanese,0,0,0,2,0,0,0,"2025-03-03 18:35:56"
"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0,"2018-01-20 02:18:32"
"reza golestanzadeh (reza.golestanzadeh)",Persian,0,0,0,1,0,0,0,"2020-10-21 12:07:20"
farbod66,Persian,0,0,0,1,0,0,0,"2018-01-20 11:04:23"
"Muhammet Furkan ALMACI (furkan.almaci)",Turkish,0,0,0,1,0,0,0,"2017-10-29 13:44:56"
1 Name Languages Translated (Words) Target Words Approved (Words) Voted "+" votes received "-" votes received Winning (Words) Joined
2 Alinson Xavier (iSoron) Portuguese, Brazilian; Japanese; Chinese Simplified; Italian; Spanish; Portuguese; French; Hungarian; Chinese Traditional; Turkish; Russian; Arabic; Polish; German; Korean; Bulgarian; Catalan; Greek; Slovenian; Hindi; Serbian (Cyrillic); Ukrainian; Czech; Danish; Dutch; Indonesian; Croatian; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Tamil; Telugu; Hebrew; Esperanto; Afrikaans; Norwegian; Armenian; Slovak; Serbian (Latin); Uyghur Portuguese, Brazilian; Japanese; Spanish; Portuguese; Italian; Chinese Simplified; French; Hungarian; German; Arabic; Hindi; Slovenian; Catalan; Greek; Korean; Bulgarian; Chinese Traditional; Polish; Russian; Serbian (Cyrillic); Turkish; Ukrainian; Czech; Indonesian; Croatian; Danish; Dutch; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Telugu; Tamil; Afrikaans; Esperanto; Hebrew 15497 14808 18825 17227 1308 1282 0 2094 1779 111 80 4315 4274 2016-03-05 18:35:27
3 Slobodan Simić (Слободан Симић) (slsimic) Serbian (Latin); Serbian (Cyrillic) 2072 2054 1852 1831 2139 2114 12 30 33 0 2015 1991 2021-02-03 14:26:07
4 dukelc Oglaigh Rystard (oglaignaheireann) Slovak Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian 1107 1103 1052 1037 0 1327 0 1 0 13 0 6 0 954 2020-08-27 14:02:41 2017-03-31 09:13:19
5 Oglaigh Rystard (oglaignaheireann) David (Cliff122) Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian Swedish 1103 1040 1037 1019 1327 725 1 6 22 0 13 0 954 700 2017-03-31 09:13:19 2020-01-21 13:56:55
6 Avalysion Omer I.S. (omeritzics) Georgian Hebrew 1057 1000 895 900 0 1097 0 14 0 1 0 0 946 2023-06-30 20:05:15 2020-10-11 20:10:51
7 Mathew TK (mathew2006) dukelc Malayalam Slovak 1057 919 1885 880 0 0 0 0 0 2023-12-16 01:57:49 2020-08-27 14:02:41
8 REMOVED_USER Intan Ayunda (Intan_Ayunda) Hebrew Indonesian 1051 800 944 793 1122 962 14 0 1 0 0 954 711 2020-10-11 20:10:51 2020-10-14 07:51:58
David (Cliff122) Swedish 1040 1019 725 6 37 0 700 2020-01-21 13:56:55
Intan Ayunda (Intan_Ayunda) Indonesian 818 811 985 0 0 0 729 2020-10-14 07:51:58
dusanstrgar Slovenian 770 730 0 0 0 0 0 2017-03-31 10:30:28
Mihail Stefanov (MStefanov) Bulgarian 755 794 3 0 2 4 2 2017-03-31 16:09:02
Osoitz Basque 751 683 0 9 0 0 3 2018-01-23 14:07:47
9 KMakoto Chinese Traditional 745 1146 949 0 0 0 745 2019-10-22 04:19:52
10 Tomairuka Evren (evrenkiymaz) Japanese Turkish 709 688 1842 604 1033 0 43 71 12 5 0 1 585 0 2020-12-12 12:14:22 2020-10-04 03:39:16
Evren (evrenkiymaz) Turkish 688 604 0 71 31 22 0 2020-10-04 03:39:16
andaryon Czech 681 606 0 108 21 0 0 2021-11-25 10:20:45
Antti Kallio (antti.kallio) Finnish 668 539 0 5 0 0 0 2021-07-03 05:54:44
11 David Nos (david.nos) Catalan; Spanish 667 731 0 0 1 0 0 2020-01-04 10:15:36
12 androide74 Antti Kallio (antti.kallio) Italian Finnish 662 650 681 525 0 2 0 0 0 0 2020-02-06 15:46:28 2021-07-03 05:54:44
13 Dmitriy Bogdanov (di72nn) androide74 Russian Italian 643 644 589 659 1197 0 0 2 50 0 0 515 0 2017-03-31 10:00:48 2020-02-06 15:46:28
14 reyhoon Tomairuka Persian Japanese 624 633 759 1636 0 909 1 43 3 0 2 0 0 564 2020-10-01 18:17:23 2020-12-12 12:14:22
15 Saeed Esmaili (saaeed.es20) Dmitriy Bogdanov (di72nn) Persian Russian 586 625 795 572 0 1197 5 0 4 36 0 0 515 2020-11-26 15:41:15 2017-03-31 10:00:48
16 fabian.bouchal reyhoon German Persian 548 624 527 759 0 6 1 4 3 5 1 72 0 2020-01-07 06:43:37 2020-10-01 18:17:23
17 Isti (eisti) Osoitz Hungarian Basque 528 610 476 545 0 0 9 1 0 0 0 3 2020-12-03 12:02:51 2018-01-23 14:07:47
18 Aravinth_Earth Saeed Esmaili (saaeed.es20) Tamil Persian 511 568 961 774 0 12 5 0 4 0 0 2024-02-23 12:37:28 2020-11-26 15:41:15
19 boban77 fabian.bouchal Czech German 509 548 461 527 0 2 6 45 0 0 3 0 72 2020-04-30 13:18:24 2020-01-07 06:43:37
20 Martim Parente (martimparente) boban77 Portuguese Czech 505 509 542 461 0 38 2 0 0 0 2020-08-26 10:22:11 2020-04-30 13:18:24
21 Yoav Argov (YoavArgov) Hebrew 501 461 0 0 1 8 91 103 2017-04-28 07:23:01
22 REMOVED_USER Norwegian 501 498 501 0 148 0 501 2017-07-05 19:02:25
23 Martim Parente (Sharlimar) Portuguese 497 534 0 38 0 0 0 2020-08-26 10:22:11
24 chrrris1987 (Chrrris1987) Dutch 467 478 0 23 0 0 0 2020-02-03 05:26:04
黄克 (hk13127) Chinese Simplified 461 765 0 1 0 0 22 2020-01-17 23:16:03
25 Huy Ngo (huyngo) Vietnamese 461 695 0 1 0 0 0 2020-01-26 11:58:36
26 Arkadiusz Bubak (epitek) 黄克 (hk13127) Polish Chinese Simplified 458 461 416 765 52 0 24 1 15 0 4 0 0 24 2020-11-05 05:11:58 2020-01-17 23:16:03
27 Radek Kuklík (kuklik.radek) Arkadiusz Bubak (epitek) Czech Polish 453 458 392 416 0 29 100 24 0 0 3 0 2022-10-08 10:04:24 2020-11-05 05:11:58
28 marco.baturan Esperanto 452 452 0 0 0 0 0 2020-06-23 02:49:46
29 Sief Tarek (sieftarek135) Arabic 447 455 0 0 1 0 4 0 0 2021-02-07 14:35:21
Alparslan Şakçi (sakci) Turkish 436 372 0 118 2 0 0 2022-01-14 12:03:11
JY3 Chinese Simplified 432 741 298 0 2 0 227 2021-03-08 08:53:35
30 Samuel Guay (SamGuay) French 426 486 0 6 0 0 0 2020-06-25 07:14:38
31 Diana Karaseva (Sun_Dianka) Russian 399 373 0 10 1 0 209 2020-01-30 06:40:02
32 Alexander Jansson (dalecarlian) Swedish 396 406 507 0 29 0 6 3 399 2017-06-21 01:37:32
33 luiandresgonzalez Spanish 383 403 0 1 28 0 0 2020-07-11 14:20:44
34 Thamara Andrade (tkcandrade) Portuguese, Brazilian 380 387 0 0 1 0 239 252 2020-01-09 19:35:48
35 Sølv Ræven (soelvraeven) Danish 370 370 0 0 0 0 0 2020-11-28 16:46:18
36 strikeCunny2245 Isti (eisti) Icelandic Hungarian 363 367 368 329 0 0 0 0 0 2023-08-07 08:05:53 2020-12-03 12:02:51
37 Anh Quân (dangquanuet) Vietnamese 362 530 0 42 2 0 0 2017-10-29 12:27:44
Alexander Haronitakis (kanakis) Greek 349 372 0 0 0 0 0 2023-09-13 04:10:43
38 gapszi Hungarian 348 301 0 86 0 0 0 2019-04-08 01:35:54
39 JY3 Chinese Simplified 345 585 278 0 1 0 207 2021-03-08 08:53:35
40 Mahdi Nasiri (mahdi.nasiri) Persian 343 465 0 39 3 1 0 2017-07-14 09:17:25
41 Seoyul Korean 339 825 0 0 27 0 0 2017-06-21 08:11:39
42 Magimai Prakasam (magimai) Tamil 336 831 0 12 2 0 0 0 2018-04-15 21:16:08
43 Star7 (Star7-crowdin) Michael Malak (MichaelKMalak) Chinese Simplified Arabic 330 304 561 271 0 0 0 0 0 2025-02-10 08:41:34 2020-05-26 19:47:58
Susanamesa Spanish 306 342 0 11 0 0 0 2023-01-01 23:56:35
Michael Malak (MichaelKMalak) Arabic 304 271 0 0 4 2 0 2020-05-26 19:47:58
44 Elina Salminen (salminen.elina.m) Finnish 297 227 0 0 0 0 0 2021-01-06 01:28:57
45 Blinkin ayane.m Dutch Japanese 297 292 334 863 0 5 1 1 3 0 0 22 2021-06-14 10:30:05 2019-11-20 03:28:26
46 ayane.m Blinkin Japanese Dutch 292 284 863 318 0 1 8 0 0 23 0 2019-11-20 03:28:26 2021-06-14 10:30:05
47 c.m Marius Teufelweich (teufelweich) Greek German 276 249 293 256 0 606 124 4 0 2 0 0 146 2024-07-13 14:49:43 2021-03-12 04:11:38
Marius Teufelweich (teufelweich) German 267 272 611 4 23 3 146 2021-03-12 04:11:38
Sumin Son (todaypp) Korean 266 221 0 7 0 0 0 2023-06-09 05:28:30
hypnotichemionus Chinese Simplified 249 430 0 0 8 0 19 2020-03-08 01:46:25
Israa Z (sosozozo) Arabic 240 266 0 81 14 0 3 2017-11-27 14:10:50
48 cobalt59 German 237 234 0 1 24 1 132 2017-06-05 05:18:33
49 QWERT (lurenjia01) Chinese Simplified 236 407 0 0 8 0 19 2020-03-08 01:46:25
50 beriain Basque 234 235 0 0 2 0 0 2017-03-31 15:42:28
51 pnhpnh Vietnamese 225 343 0 1 3 0 0 2017-11-27 12:06:07
52 Dika Fitrian Dwi Putra (OsamuDazai) Indonesian 221 215 0 0 0 0 48 2020-07-13 04:40:27
53 easyrepro Telugu 214 297 0 0 4 0 0 0 2020-06-12 12:52:10
54 taras-ko Ukrainian 211 183 0 1 4 0 19 2017-10-26 16:52:22
vinayak sharma (vinayak0504) Hindi 211 456 0 0 0 0 0 2023-05-18 18:31:51
55 sojusnik German 207 200 1 0 30 0 66 2017-04-03 17:11:56
56 Andrij Mizyk (andm) axmed99 Ukrainian 204 203 178 177 0 40 1 0 0 53 2021-04-01 03:56:20
57 Heru Yen (heruyen) Indonesian 201 201 0 0 0 0 25 2020-06-29 18:39:15
58 Vijaykumar Borkar (vjkumar) Hindi 200 364 0 11 0 0 0 2021-08-06 16:12:15
59 _translator Ishmaeel French Turkish 199 193 227 174 0 11 129 0 6 0 0 2021-07-06 07:54:12 2017-10-04 03:54:00
bearsdens Romanian 198 210 0 0 0 0 0 2022-08-28 17:08:33
Ishmaeel Turkish 193 174 0 129 17 6 0 2017-10-04 03:54:00
REMOVED_USER Spanish 192 201 0 2 5 0 0 2021-05-21 17:58:22
bruhwut Vietnamese 189 292 0 1 0 0 0 2021-05-21 07:16:30
60 Aputsiak Niels Janussen (aputtu) Danish 187 200 0 0 0 0 0 2019-08-28 05:47:42
61 _translator French 181 206 0 11 0 0 0 2021-07-06 07:54:12
62 fbruna17 Danish 181 179 0 1 0 0 0 2021-01-28 15:48:47
63 Bryanx Omry Cohen (omrycohen) Dutch Hebrew 179 175 168 156 0 5 1 2 0 0 0 33 2019-11-21 17:08:12 2021-01-18 07:33:23
64 Ivan Vlahov (vlahovivan) Bryanx Croatian Dutch 179 174 176 165 0 0 5 0 0 0 2024-01-25 08:12:11 2019-11-21 17:08:12
Omry Cohen (omrycohen) Hebrew 175 156 0 1 0 0 12 2021-01-18 07:33:23
65 Pierre GALIEGUE (pierre.galiegue) French 171 194 0 24 4 0 0 2020-08-16 11:41:35
66 plitwin bruhwut Polish Vietnamese 168 171 151 268 0 2 1 55 0 0 49 0 2021-01-20 06:18:37 2021-05-21 07:16:30
67 DionysosDV Greek 165 153 0 0 27 0 4 0 0 2021-02-27 19:05:25
68 Gustavo Lima (GustavoLima) Portuguese 158 177 0 1 4 10 0 2020-08-26 10:35:05
69 Alex V. (elvitalex) oscfd Romanian Spanish 154 155 166 0 24 1 0 4 0 0 2022-08-03 17:40:00 2021-05-21 17:58:22
70 Ravi Rami (ramiravi) plitwin Hindi Polish 151 145 248 128 0 0 1 0 16 0 0 26 2021-10-10 09:19:40 2021-01-20 06:18:37
71 Lương Vĩnh Khang (LuongVinhKhang) Vietnamese 144 256 0 0 46 1 0 2017-08-10 10:05:58
72 azzamsa Indonesian 142 136 0 48 0 1 26 2017-06-16 18:29:45
73 yoding (yodingc) Chinese Traditional; Chinese Simplified 141 271 0 10 0 0 0 2021-07-07 01:45:45
74 Neysa Nasywa (neysanasywa) Indonesian 140 141 0 0 0 0 60 2020-11-18 10:32:10
75 mohmans Mohammed Imthath (mimthath4) Arabic Tamil 139 136 141 274 0 12 0 7 11 1 0 0 2020-11-23 02:48:00 2018-02-15 22:41:15
Eilif Adelvice (adelvice) Spanish 139 154 0 96 6 0 0 2021-08-05 07:20:21
Mohammed Imthath (mimthath4) Tamil 136 274 0 0 13 1 0 2018-02-15 22:41:15
carllacan Catalan 134 155 0 2 0 0 0 2021-11-13 13:12:07
76 roptat French 132 154 0 112 89 5 0 2017-04-19 16:54:47
77 Trần Thái (tranhoangthai2001) Vietnamese 127 186 0 8 1 0 0 2018-03-01 10:51:39
78 OP Smosher (teenwolffan44) Serbian (Cyrillic) 124 122 0 0 0 0 18 2020-11-05 09:41:35
Tad Wohlrapp (TadWohlrapp) German 124 122 0 0 2 0 0 2022-06-28 04:55:41
79 4001982248998 Esperanto 122 119 0 0 0 0 0 2017-10-08 04:13:02
80 StoP4Me (Lcqp) Romanian 121 119 0 0 6 3 0 0 2018-05-06 18:51:59
81 alalloush Arabic 118 129 0 2 17 2 6 0 0 2017-03-31 12:37:17
82 Brenda Correa (brenda.14) Eilif Adelvice (adelvice) Spanish 117 116 127 126 0 0 96 0 1 0 0 2022-05-16 02:34:13 2021-08-05 07:20:21
83 Sebastian05067 Spanish 114 133 0 55 32 28 0 0 2017-05-14 00:48:16
84 Tanya (MagicUnderHood) Russian 114 98 0 19 0 0 54 2019-04-21 10:44:03
85 REMOVED_USER Arabic 111 106 0 22 23 21 3 2 0 2018-01-05 07:01:45
86 mohmans Arabic 109 103 0 2 0 0 0 2020-11-23 02:48:00
87 Iabin Arteaga (iabin) Spanish 108 111 0 4 21 0 0 2017-08-26 21:08:54
88 Ivan Krušlin (krux3r) Croatian 108 122 503 0 0 0 108 2017-03-31 09:15:24
89 Iabin Arteaga (iabin) 2kaafone Spanish Finnish 108 105 111 90 0 4 0 21 0 1 0 0 2017-08-26 21:08:54 2019-08-12 06:58:48
REMOVED_USER Finnish 105 90 0 0 0 0 0 2019-08-12 06:58:48
90 Adam Jurkiewicz (hasztagg) Polish 104 105 529 0 0 0 104 2017-03-31 09:50:51
PILHA PARK (pilhaha) Korean 101 88 0 0 0 0 0 2023-06-30 23:51:41
91 just a name bro (justanamebr0) Danish 98 109 0 0 1 0 0 2019-06-19 11:57:55
92 Nam Nguyen (namnl2706) Vietnamese 95 137 0 0 0 0 0 2020-08-18 23:02:33
93 손유정 (yuwon1213) Korean 95 57 0 0 1 0 3 0 0 2021-03-30 05:25:33
94 ranmagen Hebrew 91 78 0 0 0 0 0 2021-02-16 05:44:31
95 LoneWanderer Chinese Traditional 90 137 0 4 0 0 0 2020-09-29 05:24:48
ikkaz Indonesian 89 84 0 5 0 0 4 2019-09-02 19:58:54
96 Vo - (voyl) Chinese Traditional 89 126 0 0 5 0 0 2020-09-02 23:34:42
97 Irene K (Heaun) ikkaz Korean Indonesian 88 89 75 84 0 25 5 2 0 0 0 4 2020-03-16 11:31:12 2019-09-02 19:58:54
98 Irene K (Heaun) Korean 88 75 0 25 0 0 0 2020-03-16 11:31:12
99 Prosta4ok_ua Ukrainian 87 84 0 1 0 0 17 2020-01-23 19:43:41
100 Kumar Anand (kumar0500) Hindi 87 125 0 0 0 0 0 2020-11-07 02:46:09
101 G.kio Ohad Edri (ohadalte) Russian Hebrew 87 85 82 79 0 0 1 0 3 0 18 2023-08-24 19:43:00 2020-07-04 03:42:09
102 Ohad Edri (ohadalte) helectron Hebrew Persian 85 84 79 102 0 0 1 1 0 3 0 13 0 2020-07-04 03:42:09 2021-03-02 04:10:51
103 Radu Cebotari (wildProgrammer) Romanian 84 92 0 1 1 0 0 0 2020-02-05 01:20:00
helectron Persian 84 102 0 1 1 0 0 2021-03-02 04:10:51
Bruces Lee (aplusbdesign) Korean 82 66 0 0 2 0 0 2021-08-23 11:27:18
Tiralka French 79 91 0 92 1 0 0 2018-02-09 18:39:01
Jacob Roller (jdr28070) Korean 79 61 0 0 1 1 0 2020-01-03 11:36:40
104 Sofia Neves (sofiasonev) Portuguese, Brazilian 79 84 0 1 0 0 46 2020-03-12 18:19:46
105 Toni Mustonen (toni.mustonen) Jacob Roller (jdr28070) Finnish Korean 78 79 72 61 0 0 5 0 0 0 2017-09-02 05:34:12 2020-01-03 11:36:40
106 Tiralka French 79 91 0 92 1 0 0 2018-02-09 18:39:01
107 Israa Z (sosozozo) Arabic 79 87 0 43 12 0 3 2017-11-27 14:10:50
108 Toni Mustonen (toni.mustonen) Finnish 78 72 0 0 0 0 0 2017-09-02 05:34:12
109 Fauz Aladeem (topfauz) Arabic 76 77 0 0 0 1 0 2020-02-21 22:46:12
110 Michael (quelbs) German 76 75 0 1 0 0 39 2020-08-18 07:39:26
111 Anna Maria Stålberg (stalberg.annamaria) Oliver Gronowski (OliverGronowski) Swedish German 76 70 77 69 0 111 5 4 0 0 0 2023-01-16 04:08:25 2021-05-14 16:37:10
Radoslaw Biernacki (radoslaw.biernacki) Polish 70 74 0 56 5 0 1 2020-12-15 17:55:31
Oliver Gronowski (OliverGronowski) German 70 69 0 5 3 0 0 2021-05-14 16:37:10
mimizuk Japanese 68 193 0 0 2 1 39 2022-05-18 10:10:38
Ryeore Polish 68 61 0 66 0 0 0 2022-07-27 12:22:33
112 RealDonald Dutch 67 69 0 121 10 0 0 2017-06-23 20:10:12
Dpd Eng (dpdeng) Korean 67 48 0 0 1 0 0 2022-10-15 10:56:44
113 sirekanyan Armenian; Russian 66 65 0 0 0 0 0 2020-04-18 11:32:52
114 Константин К. (kocyak1991) Russian 64 60 0 0 1 2 0 2018-06-10 13:39:37
yukitsubaki Japanese 64 185 0 32 0 0 36 2020-01-01 13:17:44
Suuis Hindi 64 110 0 0 0 0 0 2023-07-02 11:50:22
115 Laura Sophie (laurasophie20) German 62 67 0 4 0 0 0 2018-01-06 14:21:24
116 Alparslan Sakci (sakci) Turkish 61 55 0 11 0 0 0 2021-06-10 11:59:22
117 raden20 Indonesian 61 62 177 0 1 0 64 2017-04-09 22:04:23
y (veggente) Korean 61 56 0 0 0 1 0 2022-06-28 10:41:18
118 Jan Wojtecki (j4nw) Polish 58 46 0 0 0 0 26 2017-11-02 05:42:14
119 Deepak Bharathi (deepakbharathi1994) Tamil 56 107 0 0 13 11 4 0 2017-09-17 08:00:31
120 Peter Williams (williamspete001) Japanese 55 147 0 2 0 0 3 2020-01-01 13:17:44
121 Андрій Козицький (andriikozytskyi1108) Ukrainian 52 52 0 0 1 0 0 2018-10-22 01:45:08
122 Nil riera (nilriera2000) Catalan 52 61 0 1 2 0 0 0 2021-06-22 16:37:44
123 REMOVED_USER Italian 51 52 0 2 0 0 0 2017-08-21 05:15:31
124 govindap Japanese; Hindi 51 114 0 6 3 1 1 0 0 2020-06-02 20:15:52
Neoone (Neooneqq) Romanian 51 54 0 0 0 0 0 2022-05-05 20:42:11
125 Mare Geldenhuys (mare.geldenhuys) Afrikaans 50 57 0 0 0 0 0 2017-10-20 18:00:14
126 Behnood HRazy (behnoodhr) Persian 49 70 0 0 0 0 0 2017-11-25 10:57:21
127 Mahmoud Magdy (M7moudManson) tat bz (Tat_i) Arabic German 49 48 60 56 0 6 55 12 0 6 0 0 27 2021-08-21 09:01:38 2021-03-26 05:12:54
128 J3ll3nl Dutch 48 48 0 0 17 1 3 2017-03-31 11:56:09
tat bz (Tat_i) German 48 56 0 55 0 1 27 2021-03-26 05:12:54
129 Andrew Firnes (Anechan) Russian 47 47 0 3 0 0 29 2019-09-18 09:51:59
130 andowero Czech 47 38 0 0 8 0 0 0 2020-01-20 02:29:01
131 vach Armenian 47 36 0 0 0 0 0 2020-04-18 16:53:12
132 Rahul Shishodia (rahul.shishodia.10) Hindi 46 85 0 6 5 1 0 2018-12-24 22:18:19
133 Coni Ragni (coni2ragnii) Spanish 46 46 0 0 0 0 0 2021-02-28 20:18:37
134 Cp0204 Chinese Simplified 45 72 0 0 0 0 0 2019-08-20 11:04:27
135 cc (cavaz) Italian 44 41 0 0 0 0 0 2017-04-01 04:21:08
136 Andrej Šutovský (16andrej.s) Boban Jagertraum (boban40) Slovak Czech 44 43 41 38 0 0 2 0 1 0 1 0 2022-06-12 18:01:16 2017-03-31 09:39:16
137 Boban Jagertraum (boban40) Kamil Dziadek (prso94) Czech Polish 43 38 39 0 2 0 31 2 1 0 0 2017-03-31 09:39:16 2020-04-06 17:12:06
Kamil Dziadek (prso94) Polish 43 39 0 0 11 0 0 2020-04-06 17:12:06
Balázs Keresztury (belidzs) Hungarian 42 41 501 0 7 0 38 2017-04-06 02:40:24
andreea.muscalagiu Romanian 42 52 0 1 0 0 0 2017-10-22 07:19:49
138 Me Me (gentelwom) Arabic 42 40 0 0 0 0 0 2020-11-08 20:44:01
139 Ali Elsheikh (aelsheikh1987) Arabic 42 41 0 0 0 0 0 2021-06-16 10:17:26
140 Mateusz Duda (MateuszDuda) Balázs Keresztury (belidzs) Polish Hungarian 42 42 41 0 501 0 20 7 0 0 38 2021-08-17 11:27:11 2017-04-06 02:40:24
141 Mr Habti (donhabti) andreea.muscalagiu Arabic Romanian 41 42 40 52 0 0 1 0 0 0 2023-02-20 10:52:50 2017-10-22 07:19:49
142 Mateusz Duda (MateuszDuda) Polish 42 42 0 0 0 0 0 2021-08-17 11:27:11
143 MStefanov Bulgarian 41 55 2 0 2 0 2 2017-03-31 16:09:02
144 Sofia Veijonen (Suklaa) (sofia.veijonen) Finnish 40 33 0 0 0 0 0 2018-03-07 09:24:22
Neeraj Verma (verma.neeraj.in) Hindi 40 65 0 0 1 0 0 2018-07-23 07:16:41
145 Ali Zali (stm19951995) Persian 40 60 0 0 0 0 0 2020-03-23 19:57:26
146 Limin Lu (liminlu) Chinese Simplified 39 79 503 0 0 0 39 2017-03-31 09:49:35
147 Anshoe dusanstrgar Tamil Slovenian 38 39 65 41 0 14 0 3 0 0 0 2018-01-02 11:06:52 2017-03-31 10:30:28
148 Pavel Protasov (pvphome) Anshoe Russian Tamil 38 33 65 0 0 14 0 0 0 2024-02-09 03:40:33 2018-01-02 11:06:52
149 anasshm Arabic 37 36 0 9 0 0 0 2019-01-27 04:07:22
150 hrexen Armenian 37 37 0 0 0 0 0 2020-12-09 02:30:34
151 REMOVED_USER Abdulrahman (D7M) Swedish Arabic 36 33 39 0 5 0 2 0 0 0 2018-09-29 17:47:33 2020-01-29 18:55:30
Abdulrahman (D7M) Arabic 36 39 0 0 4 0 0 2020-01-29 18:55:30
152 Maria Chushnyakova (maria.ch) Russian 36 31 0 3 0 0 0 2021-08-17 03:23:58
153 xphsis REMOVED_USER Basque Swedish 36 31 33 0 0 5 0 1 0 0 2022-01-02 08:16:19 2018-09-29 17:47:33
154 長谷川知里 (chase0213) Japanese 34 138 0 13 0 0 32 24 2018-12-14 10:52:44
milad farahani (miladfarmahini90) Persian 33 44 0 18 1 0 3 2017-08-31 16:09:00
155 Luis E. Perichon (luisperichon) Spanish 33 40 0 104 0 0 0 2017-09-04 13:46:06
156 Piotr Łuczyński (peterluczynski) Polish 33 30 0 6 17 5 0 2 2020-01-29 07:27:40
157 JoeLi milad farahani (miladfarmahini90) Chinese Traditional Persian 31 33 70 44 0 12 18 0 1 0 24 3 2017-06-25 05:32:48 2017-08-31 16:09:00
REMOVED_USER Russian 31 30 0 2 4 0 3 2018-12-03 23:55:47
158 andriikozytskyi2625 Ukrainian 31 23 0 0 0 0 0 2019-07-08 00:16:41
159 Moastafa Arabic 31 25 0 0 0 4 0 0 2020-07-06 11:37:53
160 hamza gamal (hamzagamal4444) Arabic 31 28 0 0 1 0 0 0 2020-08-03 15:23:34
161 REMOVED_USER Russian 31 30 0 2 4 0 3 2018-12-03 23:55:47
162 JoeLi Chinese Traditional 31 70 0 12 0 0 24 2017-06-25 05:32:48
163 yancyn Chinese Simplified 30 40 0 0 0 0 1 2020-05-18 20:06:03
164 Siniša Sabljić (ssabljic) 비니몬youtube (khj01025276475) Croatian Korean 30 29 37 25 0 0 0 0 0 2023-11-13 15:51:00 2020-02-09 20:44:35
165 Ruud Schouten (ruudschouten) Dutch 29 32 0 41 3 0 0 2017-07-22 17:49:17
166 비니몬youtube (khj01025276475) Aaron Dalton (Perlkonig) Korean French 29 26 25 0 0 141 0 1 1 0 0 2020-02-09 20:44:35 2018-01-14 12:58:19
avelneve Indonesian 29 28 0 0 0 0 0 2022-04-13 13:26:10
bzhn Ukrainian 29 26 0 0 4 0 0 2022-06-18 17:09:13
Gergő Mihály (mihalygergo97) Hungarian 28 69 0 0 0 0 0 2024-02-13 08:35:57
167 Niraj Yadav (neverforgetniraj) Hindi 26 48 0 0 0 0 0 2017-04-11 02:26:50
168 Guillaume Collic (gcollic) French 26 28 0 126 11 0 0 2017-05-05 16:13:00
169 Radoslaw Biernacki (radoslaw.biernacki) Polish 26 24 0 8 0 0 1 2020-12-15 17:55:31
170 Jonny I (jonny99dj) Italian 26 26 0 5 0 0 0 2017-10-07 07:35:34
Aaron Dalton (Perlkonig) French 26 25 0 141 1 0 0 2018-01-14 12:58:19
Pan_Filuta Czech 25 21 0 5 11 0 3 2017-04-29 12:55:14
171 Eddie (eddieattaboy) Chinese Traditional 25 34 0 1 0 0 0 2020-11-04 21:48:05
172 REMOVED_USER Pan_Filuta Catalan Czech 24 25 25 21 0 2 5 0 4 0 0 3 2019-06-26 14:59:47 2017-04-29 12:55:14
173 Caner Başaran (basarancaner) eduard83 (barbany.eduard) Turkish Catalan 23 24 21 25 0 0 2 26 0 1 0 0 2017-04-09 06:34:59 2019-06-26 14:59:47
174 Ľuboš Čaky (lubos.caky) Slovak 23 22 0 0 0 0 0 2019-07-02 16:51:44
175 A Aa (ylayzlmimashisafyoutub) Caner Başaran (basarancaner) Arabic Turkish 23 33 21 0 34 0 3 21 2 0 0 2021-09-27 15:34:26 2017-04-09 06:34:59
176 hodanli Turkish 22 26 0 0 1 0 0 2017-11-03 14:33:41
177 REMOVED_USER gnu-ewm Polish 22 23 0 6 9 0 0 0 2021-02-24 03:42:01
178 Neeraj Verma (verma.neeraj.in) Hindi 22 37 0 0 1 0 0 2018-07-23 07:16:41
179 Alcarkse (alexis.brusle) French 21 25 0 7 11 0 0 2017-08-06 09:32:29
Hugo Nogueira (hfrnogueira86) Portuguese 21 22 0 0 0 0 0 2023-01-09 22:51:24
Shashwat (goforgold) Hindi 20 33 0 0 0 0 0 2020-05-17 10:34:42
180 olbotta Italian 20 25 0 2 0 0 0 2021-06-06 04:22:55
181 İsa Eş (IsaEs) Shashwat (goforgold) Turkish Hindi 19 20 17 33 0 0 6 0 2 0 0 2017-06-20 07:30:22 2020-05-17 10:34:42
182 Magdalena Urbańczyk (madziia139) Polish 19 19 0 0 0 0 0 2017-10-21 03:01:04
183 sheeCesu French 19 18 0 48 4 0 0 2017-12-21 17:01:39
사자솥 (toke1597) Korean 19 19 0 0 0 0 0 2020-02-04 13:36:11
184 can13 Turkish 19 14 0 8 0 0 0 2021-01-03 10:39:03
185 KenKailer İsa Eş (IsaEs) Arabic Turkish 19 25 17 0 0 0 6 0 1 0 2022-05-10 06:16:54 2017-06-20 07:30:22
186 사자솥 (toke1597) Korean 19 19 0 0 0 0 0 2020-02-04 13:36:11
187 axikman11111 Uyghur 18 19 0 0 0 0 0 2018-10-13 12:25:31
Sanjay Krishna (sjaykh) Malayalam 18 42 0 0 0 0 0 2024-06-01 08:57:37
Chuang-Chen Chiu (peterChiu9952) Chinese Traditional 18 28 0 0 0 0 0 2024-07-02 09:36:59
AlexanderS German 18 16 0 8 0 0 0 2025-02-02 16:58:09
Ceara Lopez (cealopez) Spanish 17 18 0 0 5 1 0 2017-08-22 22:56:13
Adeline31 French 17 20 0 3 1 0 0 2019-12-06 00:00:11
takoyakibento Korean 17 13 0 3 0 0 0 2020-08-01 08:44:15
188 Hoon Jung (hooni100) Korean 17 10 0 0 0 0 0 2021-01-03 02:26:54
189 Annelotte Ceara Lopez (cealopez) Dutch Spanish 17 20 18 0 0 0 5 0 1 0 2022-11-09 08:33:20 2017-08-22 22:56:13
190 wppoqqqi takoyakibento Korean 17 18 13 0 4 3 0 0 0 2024-11-30 04:22:21 2020-08-01 08:44:15
191 Adeline31 French 17 20 0 3 0 0 0 2019-12-06 00:00:11
192 engineeringforgood Russian 16 15 0 0 0 0 16 2021-01-22 03:32:35
193 bretzel15 German 16 20 0 0 0 0 0 2020-04-06 02:49:14
194 Şamil Ateşoğlu (m.samilatesoglu) Turkish 16 22 0 11 6 3 0 2017-07-05 18:37:08
195 DebatablySane Bulgarian 16 15 0 48 0 0 0 2017-07-10 15:13:18
bretzel15 German 16 20 0 0 1 0 0 2020-04-06 02:49:14
engineeringforgood Russian 16 15 0 0 0 0 16 2021-01-22 03:32:35
M7md Salahaddin (m7mdsalahaddin) Arabic 16 16 0 1 0 0 0 2024-07-17 18:49:07
196 Bhava Tharini (bhavidanush) Tamil 15 37 0 0 0 0 0 2019-10-09 05:43:11
Ch. (sftblw) Korean 15 17 0 1 0 0 0 2023-01-25 19:22:34
iamsurajbobade Hindi 14 30 0 0 0 0 0 2018-05-21 11:23:27
197 Zeynep Esen (nezihaesen50) Turkish 14 13 0 0 0 0 0 2020-01-28 07:05:15
Sanji Vinsmock (mukanzhanbolat4) Russian 14 14 0 0 0 0 0 2020-02-18 12:38:54
Anastasia Borchuk (al2.borchuk) Russian 14 14 0 0 0 0 0 2020-04-14 13:22:49
198 Fikret Bilici (fikretbilici) Turkish 14 13 0 0 0 0 0 2020-06-21 17:16:11
199 EuiHo Hwang (euiho.hwang) Korean 14 16 0 0 1 0 0 0 2020-06-23 02:40:01
200 Zeeshan Rabbani (Zeera) Hindi 14 25 0 0 0 0 0 2020-09-15 11:32:01
201 Faiz Ahamed (faiznewton) Tamil 14 31 0 0 0 0 0 2021-05-06 23:06:46
202 Anastasia Borchuk (al2.borchuk) Russian 14 14 0 0 0 0 0 2020-04-14 13:22:49
203 iamsurajbobade Hindi 14 30 0 0 0 0 0 2018-05-21 11:23:27
204 Sanji Vinsmock (mukanzhanbolat4) Russian 14 14 0 0 0 0 0 2020-02-18 12:38:54
205 Maro Chr (caprisunglasses) Greek 14 17 0 0 0 0 0 2021-08-17 06:53:33
pi hobbes (uwe_silv) Japanese 14 46 0 0 0 0 14 2022-01-15 02:57:14
Mar Tous (mtousfernandez) Catalan 14 18 0 0 0 0 0 2022-08-16 17:55:28
Ferhatt Turkish 14 13 0 3 0 0 0 2022-12-13 12:52:20
alchemiker German 14 13 0 0 0 0 0 2024-09-03 10:16:04
206 Nenad Vukotic (vukotic.nenad) Serbian (Cyrillic) 13 13 0 1 2 6 0 2019-01-31 14:29:15
Dave (xdave) Hungarian 13 11 0 0 0 0 0 2020-03-02 20:56:50
207 Uwe Mönks (schirinowski) German 13 12 0 0 0 0 0 2021-02-18 04:00:41
208 Herbie_23 Dave (xdave) Italian Hungarian 13 15 11 0 0 0 0 0 2022-01-17 17:35:40 2020-03-02 20:56:50
Ana Kelly Vale (anakvale) Portuguese, Brazilian 13 21 0 4 0 0 2 2022-03-30 00:15:37
Minsu (cknblue) Korean 13 10 0 1 0 0 0 2022-05-18 00:26:54
shreyas (techiespace) Hindi 12 20 0 0 0 0 0 2018-06-10 01:14:26
209 soura2 Arabic 12 13 0 0 0 0 0 2020-01-13 19:23:47
210 Ammar Naif (Ammar_Naif) shreyas (techiespace) Arabic Hindi 12 12 20 0 6 0 0 0 0 2022-01-15 05:16:41 2018-06-10 01:14:26
Jo Chuang (josephch405) Chinese Traditional 11 24 0 0 0 0 11 2017-06-16 20:21:06
Vmrc French 11 12 0 2 0 0 0 2020-11-02 05:35:06
211 Sonu Sharma (riteetude) Hindi 11 23 0 0 0 0 0 2021-05-30 19:38:00
212 Lucas Depetris (lucasdepetrisd) Vmrc Spanish; Catalan; Italian; French French 11 12 0 12 2 0 0 0 2023-10-24 21:16:21 2020-11-02 05:35:06
213 Mihael Wagner (miha.wagner) Jo Chuang (josephch405) Slovenian Chinese Traditional 10 11 9 24 0 7 0 0 0 0 11 2017-10-18 18:26:29 2017-06-16 20:21:06
214 sathvic k (sathvictripleseven) Telugu 10 17 0 0 0 0 0 2020-09-11 08:11:32
215 Brian Camacho (bmcamacho) Polish 10 11 0 0 1 0 0 2020-08-03 02:27:28
216 Anonymous edgy nerd (yamentaad) Arabic 10 13 0 1 0 0 0 2018-05-06 09:23:57
217 Edwin van Rooij (edwinvrooij) Dutch 10 13 0 17 0 0 0 2018-11-05 03:59:10
218 Brian Camacho (bmcamacho) Mihael Wagner (miha.wagner) Polish Slovenian 10 11 9 0 0 7 1 0 1 0 0 2020-08-03 02:27:28 2017-10-18 18:26:29
sathvic k (sathvictripleseven) Telugu 10 17 0 0 0 0 0 2020-09-11 08:11:32
219 Ahmed Mosaad (ahmed.mosaad2018) Arabic 10 12 0 6 0 0 0 2021-02-03 18:45:43
Hrant Hakobian (hrastgh1) Armenian 10 9 0 0 0 0 0 2021-08-29 15:22:10
Milan Siebenbürger (lennyd) Czech 10 7 0 1 1 0 0 2022-01-30 07:09:42
Zesar Cebrián (Txorrota) Spanish 10 44 0 0 0 0 0 2022-02-09 01:34:32
Слави Велчев (BRO36S) (gg13656) Bulgarian 10 11 0 9 0 0 0 2025-01-09 08:47:04
Sourire Lucide (sourire_lucide) Russian 9 10 0 0 1 0 0 2018-03-22 01:37:55
220 Suhaili Hassan (kucingsyg96) Indonesian 9 10 0 0 0 0 0 2018-06-10 11:55:09
221 Martin Vostatek (martinvostatek) Czech 9 8 0 32 3 2 0 0 2019-01-21 13:52:36
222 Seweryn Piotrowski (Draxxsx) Polish 9 10 0 0 26 19 0 0 2020-01-02 09:55:48
223 omoise Sourire Lucide (sourire_lucide) French Russian 9 11 10 0 1 0 0 1 0 0 2023-12-26 14:27:17 2018-03-22 01:37:55
224 Rex123 Persian 8 8 0 0 0 0 0 2017-07-01 00:47:42
Jakob Weickmann (jweickm) Japanese 8 21 0 0 0 0 8 2021-10-05 11:10:25
225 Andrey ZaXeLoN (waragaa) Russian 7 7 0 8 1 0 0 2017-09-18 21:37:42
Vladimir Pavlychev (vovs03) Russian 7 9 0 0 0 0 0 2017-12-18 02:46:56
226 Konstantin (KZhidovinov) Russian 7 7 0 0 0 0 0 2020-01-29 13:35:12
pkorove Greek 7 7 0 0 1 0 0 2020-03-07 11:36:12
ftfoi Norwegian 7 6 0 0 0 0 0 2020-04-11 20:42:35
227 Андрій Козицький (andriikozytskyi3807) Ukrainian 7 12 0 2 0 0 0 2020-09-26 20:31:56
228 Felipe Chagas (chagretes) ftfoi Portuguese, Brazilian Norwegian 7 8 6 0 0 3 0 0 5 0 2022-01-10 12:20:25 2020-04-11 20:42:35
229 Tomáš Miklovič (zyppi) Vladimir Pavlychev (KeyJoo) Slovak Russian 7 7 9 0 0 0 0 0 2022-09-11 15:12:06 2017-12-18 02:46:56
230 Sam (SorodonSorodon) pkorove German Greek 6 7 6 7 0 13 0 0 0 0 2017-04-14 11:09:27 2020-03-07 11:36:12
ChloeLiang Japanese 6 22 0 0 1 0 3 2017-08-08 05:02:59
닉닉 (seohu9466) Korean 6 14 0 13 0 0 0 2017-10-09 23:08:15
231 erfan2927 Persian 6 6 0 0 0 0 0 2018-04-09 02:12:44
232 Burak Ceylan (7burakceylan) Turkish 6 6 0 0 0 0 0 2018-05-20 17:24:19
233 Sam (SorodonSorodon) German 6 6 0 13 0 0 0 2017-04-14 11:09:27
234 닉닉 (seohu9466) Korean 6 14 0 13 0 0 0 2017-10-09 23:08:15
235 Sarita Cajas (sarayanacajas) Spanish 6 4 0 0 1 0 0 2021-05-14 14:27:59
236 خالد (mkhrafi1999) ChloeLiang Arabic Japanese 6 3 22 0 6 0 0 1 0 0 3 2023-06-25 00:36:13 2017-08-08 05:02:59
237 Matthias Joly (joly.matt12) Manuel Tassi (Mannivu) French Italian 5 8 6 0 27 0 1 0 0 0 2017-08-28 09:53:59 2021-01-03 11:00:33
238 andriikozytskyi2018 Tomáš Hrabáček (Hrabyyy) Ukrainian Czech 5 5 3 0 0 0 0 0 2017-09-03 05:24:43 2021-05-27 11:58:11
Дмитрий Хапенков (d.khapenkov) Russian 5 5 0 6 4 0 2 2018-01-06 23:00:43
239 Guerra Ivaneth (rossanaiva-04) Spanish 5 7 0 0 0 0 0 2019-02-03 16:48:59
240 Дмитрий Хапенков (d.khapenkov) Russian 5 5 0 6 4 0 2 2018-01-06 23:00:43
241 Matthias Joly (joly.matt12) French 5 8 0 27 1 0 0 2017-08-28 09:53:59
242 Micaela Pighin (micaelapiighin) Spanish 5 6 0 1 0 0 0 2019-10-09 23:32:42
243 Manuel (Mannivu) andriikozytskyi2018 Italian Ukrainian 5 6 5 0 0 0 0 0 2021-01-03 11:00:33 2017-09-03 05:24:43
Tomáš Hrabáček (Hrabyyy) Czech 5 3 0 0 2 0 0 2021-05-27 11:58:11
Vitor Henrique (vitorhcl) Portuguese, Brazilian 5 8 0 1 0 0 0 2022-03-08 20:00:59
SubhamJena Hindi 5 12 0 3 0 0 0 2023-04-19 11:13:19
Lopo Isaac Fernández (rocapata) Spanish 4 3 0 0 0 0 0 2018-09-20 11:46:22
Eli Besirov (elibesirov07) Turkish 4 4 0 0 0 0 0 2019-03-25 07:12:34
bziuum Polish 4 4 0 0 6 0 0 2020-09-01 09:08:01
244 marmo German 4 4 0 0 0 0 0 2021-01-13 01:16:35
245 Neko123 (emandic11) Eli Besirov (elibesirov07) Serbian (Cyrillic) Turkish 4 4 0 57 0 0 0 1 0 2021-04-21 15:33:29 2019-03-25 07:12:34
246 Mo Heydari (Mrheydari) Lopo Isaac Fernández (rocapata) Dutch Spanish 4 4 3 0 0 0 0 0 2023-02-21 04:54:49 2018-09-20 11:46:22
247 Srekaravarshan N K (srekaravarshan) bziuum Tamil Polish 4 4 0 0 0 0 0 2023-04-22 06:08:57 2020-09-01 09:08:01
248 Neko123 (emandic11) Serbian (Cyrillic) 4 4 0 57 0 0 0 2021-04-21 15:33:29
249 Magidxz Arabic 3 3 0 0 0 0 0 2021-01-05 05:02:54
250 mohammadali barati (mabaraty) Persian 3 3 0 0 0 0 0 2021-07-10 05:54:44
251 Sarath S (CyberShark) Tamil 3 7 0 0 0 0 0 2020-08-27 22:43:16
252 Unnie Here (Carb) Hindi 3 8 0 0 0 0 0 2020-03-18 23:34:35
253 REMOVED_USER Portuguese, Brazilian 3 4 0 0 0 0 0 2018-11-18 09:02:37
254 Thoum Ptrgnt (thomas.petrignet) French 3 3 0 2 0 3 0 2017-09-23 19:25:52
255 Oleg Kogut (kogut_oleg) Ukrainian 3 3 0 0 0 0 0 2018-12-28 14:31:02
256 carsten_kafke German 3 3 0 43 0 0 3 2017-10-27 13:27:47
257 Vagner Roberto (vagner.trompete) Portuguese, Brazilian 3 3 0 0 0 0 0 2017-12-30 17:54:26
258 Igor Piskun (i_piskun) Ukrainian 3 3 0 0 0 0 0 2018-01-19 15:20:27
259 Andrea Bianchi (andreawhite1597) Italian 3 1 0 1 0 0 0 2018-01-21 17:45:48
Gabriel Cavalcante (gabrielc.alves14) Portuguese, Brazilian 3 4 0 0 0 0 0 2018-08-06 22:24:54
joabe gabriel (joabegabrielcma1) Portuguese, Brazilian 3 4 0 0 0 0 0 2018-08-21 09:08:59
Martin Zimdahl (zimdahlmartin) Swedish 3 2 0 0 2 0 3 2018-09-15 04:39:22
REMOVED_USER Portuguese, Brazilian 3 4 0 0 0 0 0 2018-11-18 09:02:37
Oleg Kogut (kogut_oleg) Ukrainian 3 3 0 0 0 0 0 2018-12-28 14:31:02
260 Cláudio Bernardo (claudiobernardo.ti) Portuguese, Brazilian 3 4 0 1 0 0 0 2019-01-08 14:41:10
atomjani Hungarian 3 3 0 0 0 0 0 2019-01-19 00:49:25
261 Hiohana Rilary (hiohanarilary) Portuguese, Brazilian 3 4 0 0 0 0 0 2019-07-31 20:42:20
262 joabe gabriel (joabegabrielcma1) Portuguese, Brazilian 3 4 0 0 0 0 0 2018-08-21 09:08:59
263 Péter Bernát (bernatp) Hungarian 3 2 0 0 0 0 0 2019-11-30 15:50:33
264 Unnie Here (Carb) Martin Zimdahl (zimdahlmartin) Hindi Swedish 3 8 2 0 0 0 1 0 0 3 2020-03-18 23:34:35 2018-09-15 04:39:22
265 Sarath S (CyberShark) Gabriel Cavalcante (gabrielc.alves14) Tamil Portuguese, Brazilian 3 7 4 0 0 0 0 0 2020-08-27 22:43:16 2018-08-06 22:24:54
266 Magidxz atomjani Arabic Hungarian 3 3 0 0 0 0 0 2021-01-05 05:02:54 2019-01-19 00:49:25
267 mohammadali barati (mabaraty) أم محمد تقي (souadboudia19) Persian Arabic 3 2 3 2 0 0 0 0 0 2021-07-10 05:54:44 2020-06-13 15:24:17
Tejaswini Boppana (Tejaswini) Telugu 3 1 0 0 0 0 0 2021-08-27 23:48:55
Craig Foobar (craig.foobar) German 3 3 0 25 1 0 0 2022-02-20 16:55:47
Katarin Ukrainian 3 3 0 0 0 0 0 2022-03-17 14:44:59
ayet Arabic 3 3 0 0 0 0 0 2023-08-16 20:18:12
REMOVED_USER Ukrainian 2 2 0 0 0 0 0 2017-06-15 12:24:44
Alex Stein (diefaust1993) Russian 2 2 0 4 4 0 2 2017-07-13 06:56:17
omerfarukbas Turkish 2 3 0 19 2 0 0 2017-08-14 16:10:35
Balthazar Aubard (Balatzar) French 2 5 0 0 1 0 0 2017-09-23 01:42:57
268 FAy FAy (fayfayfay52) Chinese Traditional 2 5 0 0 0 0 0 2017-10-06 08:53:21
Ilyas Fekhar (il47yas) Arabic 2 2 0 0 0 0 0 2018-04-17 22:00:41
amei Portuguese, Brazilian 2 2 0 0 0 0 0 2018-04-19 19:42:28
Jimmy Young (Jimmyyoung) Chinese Traditional 2 4 0 0 0 0 2 2018-04-22 04:00:19
269 chavs1997 Russian 2 2 0 9 0 0 0 2018-05-18 16:58:19
270 Soroor_SI Persian 2 2 0 0 0 0 0 2018-06-10 06:28:27
271 Valerij D (vala.dobler) Ilyas Fekhar (il47yas) German Arabic 2 2 0 0 0 0 0 2018-09-22 09:38:27 2018-04-17 22:00:41
272 hesamiranii (esam.matouri) Persian 2 2 0 0 0 0 0 2018-09-22 16:33:36
273 fatemeh s (fargolseifoori3) Persian 2 2 0 0 0 0 0 2019-01-31 12:06:57
274 amei Portuguese, Brazilian 2 2 0 0 0 0 0 2018-04-19 19:42:28
275 Naveen jai krishna (njsbpolymer1) Tamil 2 5 0 0 0 0 0 2020-01-10 14:19:41
276 Danial Agh (danialagh) Persian 2 3 0 0 0 0 0 2019-03-30 13:24:16
조화정 (yunjoo337) Korean 2 2 0 0 0 0 0 2019-06-16 22:25:31
Ali Zaida (alizaeda92) Arabic 2 2 0 0 0 0 0 2019-12-01 11:47:00
Naveen jai krishna (njsbpolymer1) Tamil 2 5 0 0 1 0 0 2020-01-10 14:19:41
أم محمد تقي (souadboudia19) Arabic 2 2 0 0 0 0 0 2020-06-13 15:24:17
277 Walid Baazia (walidbaazia2005) Arabic 2 1 0 0 0 0 0 2021-01-27 12:47:34
278 Ali Zaida (alizaeda92) Arabic 2 2 0 0 0 0 0 2019-12-01 11:47:00
279 LNDDYL Chinese Traditional 2 4 0 0 0 0 2 2018-04-22 04:00:19
280 Ño Bí Tã (pt614553) Arabic 2 8 0 1 0 0 0 2021-05-22 20:41:01
281 Judith Ayala (Azul1612) Spanish 2 1 0 0 0 1 0 2021-05-18 17:07:19
282 Ño Bí Tã (pt614553) REMOVED_USER Arabic Ukrainian 2 8 2 0 1 0 0 2 0 0 2021-05-22 20:41:01 2017-06-15 12:24:44
283 Héctor Mañas García (hectodium) Valerij D (vala.dobler) Catalan German 2 3 2 0 0 0 0 0 2021-10-02 20:32:09 2018-09-22 09:38:27
284 Sidali Aymen (sidaliaymen950) Alex Stein (diefaust1993) Arabic Russian 2 2 0 0 4 0 4 0 0 2 2022-01-31 18:50:59 2017-07-13 06:56:17
285 Ahmed Bazazo (ahmedbazazo) 조화정 (yunjoo337) Arabic Korean 2 2 0 0 0 0 0 2022-02-19 20:11:09 2019-06-16 22:25:31
286 HypemanKEK (rocasta.dodvi) omerfarukbas Russian Turkish 2 2 3 0 0 19 0 2 0 0 2023-01-13 03:45:06 2017-08-14 16:10:35
287 Gmas (gustmaes1) Balthazar Aubard (Balatzar) Dutch French 2 2 5 0 0 0 1 0 0 2023-01-26 13:52:54 2017-09-23 01:42:57
288 Катерина Ховалкина (katerina959) Luca Gori (grolcu) Russian Italian 2 1 2 0 1 0 0 0 0 2023-05-18 14:50:30 2020-09-26 23:26:15
289 Pratheba Devanathan (devprath05) axd Tamil Spanish 2 1 2 1 0 0 15 1 0 0 0 2023-06-05 12:35:45 2017-09-12 05:48:51
Gordon James Campbell (gordonjamescampbell) Catalan 2 2 0 0 0 0 0 2023-06-23 23:23:46
Suren Airyanam (suren.airyanam) Persian 2 2 0 0 0 0 0 2023-10-21 18:01:41
axq German 2 1 0 1 0 0 0 2024-02-29 17:14:13
Hades Mori (Hades_Mori) Ukrainian 2 2 0 0 0 0 0 2024-07-03 07:14:58
290 iSoron2 Portuguese, Brazilian 1 1 0 0 0 0 0 2017-03-18 17:56:29
291 Anton (tT0NG) REMOVED_USER Chinese Traditional Russian 1 2 0 0 6 0 1 0 1 2017-07-06 14:18:39 2019-12-26 05:37:01
axd Spanish 1 1 0 15 1 0 0 2017-09-12 05:48:51
292 Wibi Cahyo (wbcahyoh) Indonesian 1 3 0 0 0 0 0 2017-12-14 06:35:58
293 Alan Jeon (skyisle) jonesses Korean German 1 2 1 0 8 1 0 0 0 1 2018-01-09 10:46:00 2021-01-01 08:03:18
294 Anton (tT0NG) Chinese Traditional 1 2 0 0 0 0 1 2017-07-06 14:18:39
295 박찌 (perpact20) Korean 1 1 0 0 0 0 0 2018-02-10 10:11:44
296 Patrick Pimenta (trickap1) Alan Jeon (skyisle) Portuguese, Brazilian Korean 1 1 2 0 0 8 0 0 0 2018-12-01 14:31:21 2018-01-09 10:46:00
Kan Black (kanblack.va) Vietnamese 1 2 0 0 0 1 0 2019-01-15 03:50:10
297 Maria Fefelova (mashafefel) Russian 1 1 0 0 0 0 0 2019-05-18 02:03:56
298 Anastasiia Bondarenko (nastasya.bondarenko.97) Russian 1 1 0 0 0 0 0 2019-06-07 17:43:08
299 REMOVED_USER Kan Black (kanblack.va) Russian Vietnamese 1 2 0 6 0 1 0 0 1 1 0 2019-12-26 05:37:01 2019-01-15 03:50:10
300 Luca Gori (grolcu) Patrick Pimenta (trickap1) Italian Portuguese, Brazilian 1 2 1 0 0 0 0 0 2020-09-26 23:26:15 2018-12-01 14:31:21
301 jonesses Dagna Q (dagnaq) German 1 0 1 0 0 1 0 0 0 1 0 2021-01-01 08:03:18 2017-08-06 01:42:52
monir s (ms.alam) Persian 1 1 0 1 0 0 0 2022-05-23 06:34:00
Daniel Luque (LuqueDaniel) Spanish 1 1 0 0 0 0 0 2022-06-30 20:37:07
Liboide Spanish 1 1 0 0 0 0 0 2022-11-03 23:57:45
K RITE (kriteshojha5) Hindi 1 1 0 1 0 0 0 2024-08-14 17:28:55
Angelos (angelos1993) Arabic 1 1 0 0 0 0 0 2024-11-20 07:38:18
Bora Atıcı (Brtc) Turkish 1 2 0 0 0 0 0 2025-03-07 20:33:19
EmanAmini 0 0 0 0 0 0 0 2017-03-31 13:27:43
AnggaRifandi 0 0 0 0 0 0 0 2017-03-31 19:28:35
Lori Amico (lavodkaclyde2323) Italian 0 0 0 1 0 0 0 2017-04-09 10:08:13
Florian Stuhlmann (stuhlmann) German 0 0 0 10 0 0 0 2017-04-15 04:04:00
302 Kamalakannan 0 0 0 0 0 0 0 2017-05-14 11:40:23
303 Éjbãss Übbeî (littlebittlebottle) Norwegian 0 0 0 152 0 0 0 2017-07-05 21:12:02
304 Dagna Q (dagnaq) Равиль Мифтахов (ravilmif47) Russian 0 0 0 0 1 0 0 0 2017-08-06 01:42:52 2019-08-12 21:58:30
305 sanyoniket 0 0 0 0 0 0 0 2019-07-23 12:58:40
306 REMOVED_USER 0 0 0 0 0 0 0 2020-02-01 03:47:48
307 vi ve (VimalV) 0 0 0 0 0 0 0 2021-02-08 02:35:45
308 George Merkulov (george142.emarket) Russian 0 0 0 11 0 0 0 2019-06-09 19:47:02
309 Yasin Okumus (lacivert) Turkish 0 0 0 1 0 0 0 2018-02-07 04:13:51
310 Petros Bleyan (coolbleyan) Russian 0 0 0 14 0 0 0 2017-08-18 18:37:18
311 LeMeD (LeMeS) French 0 0 0 2 0 0 0 2021-02-06 15:35:00
312 ava_rfie Persian 0 0 0 1 0 0 0 2019-06-09 16:19:24
313 Mateusz Teteruk (mttet) Polish 0 0 0 1 0 0 0 2021-01-23 13:09:59
314 EwanB 0 0 0 0 0 0 0 2019-11-19 10:04:38
315 Fazy1380 0 0 0 0 0 0 0 2021-04-10 11:02:53
316 Lori Amico (lavodkaclyde2323) Italian 0 0 0 1 0 0 0 2017-04-09 10:08:13
317 Florian Stuhlmann (stuhlmann) German 0 0 0 10 0 0 0 2017-04-15 04:04:00
318 عبد الناصر سعيد الثبيتي (asaeed) 0 0 0 0 0 0 0 2018-03-13 02:09:35
319 Rivo Zängov (Eraser) 0 0 0 0 0 0 0 2020-10-13 04:38:26
320 Hayder21 0 0 0 0 0 0 0 2019-12-31 10:56:24
321 T-v-Gerwen Dutch 0 0 0 47 0 0 0 2018-03-02 10:26:33
322 Eduard Boboc (edi.boboc33) Romanian 0 0 0 4 0 0 0 2019-12-16 09:08:39
323 Samuel Przeździęk (samek22) Polish 0 0 0 1 0 0 0 2021-08-01 00:49:01
324 Saiprasath B (Saiprasath) 0 0 0 0 0 0 0 2021-07-11 11:10:41
325 shuvo786 0 0 0 0 0 0 0 2019-11-13 00:18:12
326 Edmunds Edmundam (edmundam) 0 0 0 0 0 0 0 2020-06-01 14:18:18
327 Itch 0 0 0 0 0 0 0 2017-10-16 09:18:42
328 Muhammet Furkan ALMACI (furkan.almaci) Manny Farsangy (manifarsangi) Turkish Persian 0 0 0 1 12 0 0 0 2017-10-29 13:44:56 2021-08-10 05:32:28
329 Matus Zdansky (matuszdansky) 0 0 0 0 0 0 0 2019-10-20 13:52:24
330 Thomas Orlita (Thomas995) Czech 0 0 0 1 0 0 0 2017-12-24 04:08:27
331 Irsgram Russian 0 0 0 1 0 0 0 2019-09-30 16:42:20
332 EmanAmini 0 0 0 0 0 0 0 2017-03-31 13:27:43
333 mushin 0 0 0 0 0 0 0 2020-02-02 04:08:05
334 Elmo (oberknecht) 0 0 0 0 0 0 0 2020-04-16 08:45:50
335 AnggaRifandi 0 0 0 0 0 0 0 2017-03-31 19:28:35
336 darkkingredian (rediancool) 0 0 0 0 0 0 0 2021-07-27 16:04:32
337 Sri Harsha Bhogi (sriharshabhogi) 0 0 0 0 0 0 0 2018-09-02 05:31:53
338 Nat Fomicheva (natac) Russian 0 0 0 3 0 0 0 2019-01-25 14:35:02
339 mdrobulis 0 0 0 0 0 0 0 2018-05-24 01:40:42
340 Sarah BCNN (fsarahboucenna) French 0 0 0 16 0 0 0 2018-02-11 11:07:36
341 Arjun K. (arjunkdot) 0 0 0 0 0 0 0 2020-09-20 11:16:18
342 REMOVED_USER Czech 0 0 0 18 0 0 0 2018-03-27 06:19:52
343 martyaberger 0 0 0 0 0 0 0 2019-01-01 18:48:08
344 BongTran Vietnamese 0 0 0 2 0 0 0 2018-04-24 05:16:07
345 Arttu Ylhävuori (arttu.ylhavuori) 0 0 0 0 0 0 0 2019-07-24 15:03:42
346 Никита Карамов (nikita.karamoff) Russian 0 0 0 10 0 0 0 2018-10-29 03:57:21
347 rooban23 0 0 0 0 0 0 0 2020-09-15 11:49:14
348 Eliška Roubalová (roubaeli) Czech 0 0 0 6 0 0 0 2019-12-31 12:47:29
349 valney.faria Portuguese, Brazilian 0 0 0 1 0 0 0 2020-02-02 14:45:02
350 Алтынбек Наурызғали (altinbeknaurizgali) Russian 0 0 0 1 0 0 0 2020-08-12 13:03:49
351 REMOVED_USER 0 0 0 0 0 0 0 2018-10-27 15:34:36
352 REMOVED_USER 0 0 0 0 0 0 0 2018-08-24 00:17:43
353 Elham1361 0 0 0 0 0 0 0 2018-10-27 12:01:06
354 dongchen.yue German 0 0 0 4 0 0 0 2020-09-12 15:05:59
355 Ahnaf Tajwar (atn4404) 0 0 0 0 0 0 0 2018-10-16 11:13:30
356 AsadullahIlyas 0 0 0 0 0 0 0 2019-01-04 06:14:15
357 droidahmed Arabic 0 0 0 7 0 0 0 2018-01-31 02:18:49
358 philfr49 French 0 0 0 2 0 0 0 2018-09-03 14:20:32
359 Ahmed Nazir (ahmednazir333) 0 0 0 0 0 0 0 2018-05-06 12:10:27
360 Balaji Jayaraman (jkbalaji1103) 0 0 0 0 0 0 0 2017-10-30 22:12:27
361 Wellington Ribeiro (wellington.rib) 0 0 0 0 0 0 0 2017-11-16 07:32:25
362 Javid IRAN (twitteriran98) Persian 0 0 0 1 0 0 0 2017-11-25 16:47:25
REMOVED_USER Czech 0 0 0 1 0 0 0 2017-12-24 04:08:27
AhmedDz Arabic 0 0 0 1 0 0 0 2017-12-31 10:12:31
363 박인호 (wphestiraid) Korean 0 0 0 2 0 0 0 2018-01-05 00:33:14
364 Pumpith Ungsupanit (pumpithu) 0 0 0 0 0 0 0 2019-01-19 23:47:57
365 Sandhu564. 0 0 0 0 0 0 0 2020-12-14 01:27:45
366 Quentin Hibon (hiq) 0 0 0 0 0 0 0 2021-02-07 16:39:31
367 AhmedDz Arabic 0 0 0 1 0 0 0 2017-12-31 10:12:31
368 Shuvashish Sahoo (shuvashish76) 0 0 0 0 0 0 0 2020-09-17 09:10:09
369 REMOVED_USER 0 0 0 0 0 0 0 2018-01-05 16:56:12
370 NairaDNV Spanish 0 0 0 9 0 0 0 2018-01-05 19:10:33
371 Raulbertassi 0 0 0 0 0 0 0 2018-01-07 17:23:18
Katherine Alexandra Flórez Ramírez (katherine.florez12) Spanish 0 0 0 46 0 0 0 2018-01-20 02:18:32
farbod66 Persian 0 0 0 1 0 0 0 2018-01-20 11:04:23
droidahmed Arabic 0 0 0 7 0 0 0 2018-01-31 02:18:49
Yasin Okumus (lacivert) Turkish 0 0 0 1 0 0 0 2018-02-07 04:13:51
Sarah BCNN (fsarahboucenna) French 0 0 0 16 0 0 0 2018-02-11 11:07:36
T-v-Gerwen Dutch 0 0 0 47 0 0 0 2018-03-02 10:26:33
عبد الناصر سعيد الثبيتي (asaeed) 0 0 0 0 0 0 0 2018-03-13 02:09:35
REMOVED_USER Czech 0 0 0 18 0 0 0 2018-03-27 06:19:52
BongTran Vietnamese 0 0 0 2 0 0 0 2018-04-24 05:16:07
Ahmed Nazir (ahmednazir333) 0 0 0 0 0 0 0 2018-05-06 12:10:27
mdrobulis 0 0 0 0 0 0 0 2018-05-24 01:40:42
REMOVED_USER 0 0 0 0 0 0 0 2018-08-24 00:17:43
Sri Harsha Bhogi (sriharshabhogi) 0 0 0 0 0 0 0 2018-09-02 05:31:53
philfr49 French 0 0 0 2 0 0 0 2018-09-03 14:20:32
Ahnaf Tajwar (atn4404) 0 0 0 0 0 0 0 2018-10-16 11:13:30
Elham1361 0 0 0 0 0 0 0 2018-10-27 12:01:06
REMOVED_USER 0 0 0 0 0 0 0 2018-10-27 15:34:36
Никита Карамов (nikita.karamoff) Russian 0 0 0 10 0 0 0 2018-10-29 03:57:21
martyaberger 0 0 0 0 0 0 0 2019-01-01 18:48:08
AsadullahIlyas 0 0 0 0 0 0 0 2019-01-04 06:14:15
Pumpith Ungsupanit (pumpithu) 0 0 0 0 0 0 0 2019-01-19 23:47:57
Nat Fomicheva (natac) Russian 0 0 0 3 0 0 0 2019-01-25 14:35:02
ava_rfie Persian 0 0 0 1 0 0 0 2019-06-09 16:19:24
George Merkulov (george142.emarket) Russian 0 0 0 11 0 0 0 2019-06-09 19:47:02
sanyoniket 0 0 0 0 0 0 0 2019-07-23 12:58:40
Arttu Ylhävuori (arttu.ylhavuori) 0 0 0 0 0 0 0 2019-07-24 15:03:42
Равиль Мифтахов (ravilmif47) Russian 0 0 0 1 0 0 0 2019-08-12 21:58:30
Irsgram Russian 0 0 0 1 0 0 0 2019-09-30 16:42:20
Matus Zdansky (matuszdansky) 0 0 0 0 0 0 0 2019-10-20 13:52:24
shuvo786 0 0 0 0 0 0 0 2019-11-13 00:18:12
EwanB 0 0 0 0 0 0 0 2019-11-19 10:04:38
Eduard Boboc (edi.boboc33) Romanian 0 0 0 4 0 0 0 2019-12-16 09:08:39
Hayder21 0 0 0 0 0 0 0 2019-12-31 10:56:24
Eliška Roubalová (roubaeli) Czech 0 0 0 6 0 0 0 2019-12-31 12:47:29
REMOVED_USER 0 0 0 0 0 0 0 2020-02-01 03:47:48
mushin 0 0 0 0 0 0 0 2020-02-02 04:08:05
valney.faria Portuguese, Brazilian 0 0 0 1 0 0 0 2020-02-02 14:45:02
Elmo (oberknecht) 0 0 0 0 0 0 0 2020-04-16 08:45:50
372 Карлен Шаухаев (KarlenShaukhaev) 0 0 0 0 0 0 0 2020-04-27 08:53:49
Edmunds Edmundam (edmundam) 0 0 0 0 0 0 0 2020-06-01 14:18:18
Алтынбек Наурызғали (altinbeknaurizgali) Russian 0 0 0 1 0 0 0 2020-08-12 13:03:49
dongchen.yue German 0 0 0 4 0 0 0 2020-09-12 15:05:59
rooban23 0 0 0 0 0 0 0 2020-09-15 11:49:14
REMOVED_USER 0 0 0 0 0 0 0 2020-09-17 09:10:09
Arjun K. (arjunkdot) 0 0 0 0 0 0 0 2020-09-20 11:16:18
Rivo Zängov (Eraser) 0 0 0 0 0 0 0 2020-10-13 04:38:26
reza golestanzadeh (reza.golestanzadeh) Persian 0 0 0 1 0 0 0 2020-10-21 12:07:20
Sandhu564. 0 0 0 0 0 0 0 2020-12-14 01:27:45
373 dimateos 0 0 0 0 0 0 0 2021-01-10 06:29:52
374 Mateusz Teteruk (mttet) Katherine Alexandra Flórez Ramírez (katherine.florez12) Polish Spanish 0 0 0 1 46 0 0 0 2021-01-23 13:09:59 2018-01-20 02:18:32
375 LeMeD (LeMeS) reza golestanzadeh (reza.golestanzadeh) French Persian 0 0 0 2 1 0 0 0 2021-02-06 15:35:00 2020-10-21 12:07:20
376 Quentin Hibon (hiq) farbod66 Persian 0 0 0 0 1 0 0 0 2021-02-07 16:39:31 2018-01-20 11:04:23
377 vi ve (VimalV) Muhammet Furkan ALMACI (furkan.almaci) Turkish 0 0 0 0 1 0 0 0 2021-02-08 02:35:45 2017-10-29 13:44:56
Fazy1380 0 0 0 0 0 0 0 2021-04-10 11:02:53
Saiprasath B (Saiprasath) 0 0 0 0 0 0 0 2021-07-11 11:10:41
darkkingredian (rediancool) 0 0 0 0 0 0 0 2021-07-27 16:04:32
Samuel Przeździęk (samek22) Polish 0 0 0 1 0 0 0 2021-08-01 00:49:01
Manny Farsangy (manifarsangi) Persian 0 0 0 12 0 0 0 2021-08-10 05:32:28
Masataka Yakura (myakura) Japanese 0 0 0 1 0 0 0 2021-09-03 22:10:36
Said Tahsin Dane (tasomaniac) 0 0 0 0 0 0 0 2021-09-25 05:31:01
akmal shafiq (mohdakmalshafiq) 0 0 0 0 0 0 0 2021-11-01 01:04:50
catemlitten Japanese 0 0 0 1 0 0 0 2021-11-17 15:06:02
HemanthMeda Telugu 0 0 0 4 0 0 0 2021-12-01 14:02:14
Yunsu Kim (yunsukim86) Korean 0 0 0 2 0 0 0 2022-01-14 06:33:43
Sylwuskak (sylwuskak) Polish 0 0 0 1 0 0 0 2022-01-25 04:19:53
Pro AAA (pro1010) Arabic 0 0 0 1 0 0 0 2022-02-14 03:32:44
Baran Özavcı (n2141n) Turkish 0 0 0 1 0 0 0 2022-02-26 04:32:51
deepbird 0 0 0 0 0 0 0 2022-04-11 03:21:05
ashik8113 0 0 0 0 0 0 0 2022-04-13 11:58:26
manu (manuL96) 0 0 0 0 0 0 0 2022-05-06 23:34:55
Agnel (agnelwaghela) 0 0 0 0 0 0 0 2022-06-19 10:32:33
Ruslan Zaynetdinov (theRuslan) Russian 0 0 0 6 0 0 0 2022-07-06 10:48:31
Marcel (flaced) German 0 0 0 1 0 0 0 2022-08-19 15:19:26
pixx1 German 0 0 0 6 0 0 0 2022-08-22 00:38:13
Onder Nuray (ondernuray) 0 0 0 0 0 0 0 2022-08-30 08:16:27
Md Faridul Islam (mdfaridulislam509) 0 0 0 0 0 0 0 2022-09-04 06:25:20
Felone 0 0 0 0 0 0 0 2022-09-10 08:04:02
Sawwwwwplan 0 0 0 0 0 0 0 2022-09-10 11:35:14
Fatima (fatima.a) Arabic 0 0 0 1 0 0 0 2022-09-20 09:48:25
DomiAlt 0 0 0 0 0 0 0 2022-10-02 15:44:26
Erwindly Polish 0 0 0 1 0 0 0 2022-11-01 04:12:58
Deniz Çelik (DenizCelik) 0 0 0 0 0 0 0 2022-11-09 02:13:11
Watashiwanilli 0 0 0 0 0 0 0 2022-11-14 10:12:21
Maxence LIGAN (Daddy_Caramel) 0 0 0 0 0 0 0 2022-12-23 04:43:30
wstroobandt Dutch 0 0 0 1 0 0 0 2023-01-03 17:52:42
ニキホロブ蒼井 (abhigyahazra) 0 0 0 0 0 0 0 2023-01-08 21:37:53
Afrim Kamberi (afrimkamberi) 0 0 0 0 0 0 0 2023-01-17 05:20:06
ViacheslavLabs Ukrainian 0 0 0 5 0 0 0 2023-01-21 15:34:40
Basta 0 0 0 0 0 0 0 2023-03-04 16:13:57
raselh 0 0 0 0 0 0 0 2023-03-15 03:33:21
Adrian Miozga (AdrianMiozga) Polish 0 0 0 13 0 0 0 2023-03-25 17:00:53
Atlas Steel (atlas.steel.erbil) 0 0 0 0 0 0 0 2023-05-16 05:23:32
Sathyakumar Ps (sathyakumar63) 0 0 0 0 0 0 0 2023-05-24 11:44:23
Abdul nafih (nafih_zain_) 0 0 0 0 0 0 0 2023-05-25 06:24:31
Bernhard (bernikr) German 0 0 0 1 0 0 0 2023-06-12 11:18:18
Anna Boda (annaboda08) Hungarian 0 0 0 1 0 0 0 2023-07-03 13:28:12
Rubén CH (chruben45) Spanish 0 0 0 1 0 0 0 2023-07-24 12:39:51
Vinicius (exteraDev) 0 0 0 0 0 0 0 2023-08-08 15:47:45
mugdad alhammad (alhammad5057) 0 0 0 0 0 0 0 2023-08-13 22:36:01
Arthur Waldes (arthurwaldes) 0 0 0 0 0 0 0 2023-08-22 15:38:12
Mahmoud Hatem (mahmoudhatem) Arabic 0 0 0 1 0 0 0 2023-09-12 05:12:34
Jacques Francky Salomon (jacquesfranckysalomon) 0 0 0 0 0 0 0 2023-10-14 20:55:30
Mohammad Hashem (hashemchattogram) 0 0 0 0 0 0 0 2023-10-27 02:15:39
Aylinddd Persian 0 0 0 1 0 0 0 2023-11-07 22:50:37
Dinock German 0 0 0 1 0 0 0 2023-11-10 07:08:23
zelfoxx German 0 0 0 12 0 0 0 2023-11-22 11:11:44
REMOVED_USER 0 0 0 0 0 0 0 2023-11-28 17:42:55
Dennis Li (Dennis_Li) Chinese Simplified 0 0 0 1 0 0 0 2023-12-24 21:12:43
REMOVED_USER Russian 0 0 0 5 0 0 0 2024-01-01 17:15:06
Daniill l (daniill) 0 0 0 0 0 0 0 2024-01-12 02:42:52
NONE NAME (RagnarGraves) Spanish 0 0 0 1 0 0 0 2024-02-18 01:39:39
lu21232512 0 0 0 0 0 0 0 2024-04-15 12:40:05
Oscariño (oscarinhooo) 0 0 0 0 0 0 0 2024-07-07 08:47:25
Vladimir Sveshnikov (proloxy) Russian 0 0 0 6 0 0 0 2024-07-12 03:27:39
L0f3n Swedish 0 0 0 2 0 0 0 2024-08-06 17:13:50
Christer Fletcher (chrfle) Swedish 0 0 0 2 0 0 0 2024-08-15 04:15:49
Moaid alzawy (dodoalzawy200) Arabic 0 0 0 1 0 0 0 2024-09-18 12:17:31
Eduardo Ferreira (eduu) 0 0 0 0 0 0 0 2024-10-27 19:09:20
عبد الملك بلكم (aboodpvp555) Arabic 0 0 0 1 0 0 0 2024-12-12 02:42:14
4Kio Russian 0 0 0 1 0 0 0 2024-12-12 12:31:25
رودينه (rwdynh874) Arabic 0 0 0 1 0 0 0 2024-12-24 18:31:33
zahra ghasemi (z.ghasemizahra) Persian 0 0 0 1 0 0 0 2024-12-29 04:36:27
Mustafa Işıksız (mustafalordon27) Turkish 0 0 0 1 0 0 0 2025-01-15 13:52:32
Ahlem Ben (ahlemben1513) Arabic 0 0 0 1 0 0 0 2025-02-12 11:09:57
Francisco Parra (Frn_7) Spanish 0 0 0 1 0 0 0 2025-02-18 22:57:05
mizumoto (yuta-mizumoto) Japanese 0 0 0 2 0 0 0 2025-03-03 18:35:56

View File

@@ -1,3 +1,5 @@
/*
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
*
@@ -18,38 +20,29 @@
*/
plugins {
alias(libs.plugins.agp)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.ksp)
alias(libs.plugins.ktlint.plugin)
id("com.github.triplet.play") version "3.5.0"
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("org.jetbrains.kotlin.kapt")
id("org.jetbrains.kotlin.android.extensions")
id("org.jlleitschuh.gradle.ktlint")
}
tasks.compileLint {
dependsOn("updateTranslators")
}
/*
Added on top of kotlinOptions to work around this issue:
https://youtrack.jetbrains.com/issue/KTIJ-24311/task-current-target-is-17-and-kaptGenerateStubsProductionDebugKotlin-task-current-target-is-1.8-jvm-target-compatibility-should#focus=Comments-27-6798448.0-0
Updating gradle might fix this, so try again in the future to remove this and run:
./gradlew --rerun-tasks :uhabits-android:kaptGenerateStubsReleaseKotlin
If this doesn't produce any warning, try to remove it.
*/
kotlin {
jvmToolchain(11)
}
android {
namespace = "org.isoron.uhabits"
compileSdk = 36
compileSdkVersion(30)
defaultConfig {
versionCode = 20200
versionName = "2.2.0"
minSdk = 28
targetSdk = 36
applicationId = "org.isoron.uhabits"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
versionCode(20003)
versionName("2.0.3")
minSdkVersion(23)
targetSdkVersion(30)
applicationId("org.isoron.uhabits")
testInstrumentationRunner("androidx.test.runner.AndroidJUnitRunner")
}
signingConfigs {
@@ -64,53 +57,86 @@ android {
}
buildTypes {
release {
isMinifyEnabled = true
getByName("release") {
minifyEnabled(true)
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.txt")
if (signingConfigs.findByName("release") != null) {
signingConfig = signingConfigs.getByName("release")
}
}
debug {
enableUnitTestCoverage = true
getByName("debug") {
isTestCoverageEnabled = true
}
}
lintOptions {
isCheckReleaseBuilds = false
isAbortOnError = false
disable("GoogleAppIndexingWarning")
}
compileOptions {
isCoreLibraryDesugaringEnabled = true
targetCompatibility(JavaVersion.VERSION_11)
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_1_8)
sourceCompatibility(JavaVersion.VERSION_1_8)
}
kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
buildFeatures.viewBinding = true
lint.abortOnError = false
buildFeatures {
viewBinding = true
}
}
dependencies {
compileOnly(libs.jsr250.api)
coreLibraryDesugaring(libs.desugar.jdk.libs)
implementation(libs.appIntro)
implementation(libs.jsr305)
implementation(libs.dagger)
implementation(libs.guava)
implementation(libs.ktor.client.android)
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.jackson)
implementation(libs.ktor.client.json)
implementation(libs.kotlin.stdlib.jdk8)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.appcompat)
implementation(libs.legacy.preference.v14)
implementation(libs.legacy.support.v4)
implementation(libs.material)
implementation(libs.opencsv)
implementation(libs.konfetti.xml)
implementation(project(":uhabits-core"))
ksp(libs.dagger.compiler)
val daggerVersion = "2.38.1"
val kotlinVersion = "1.5.21"
val kxCoroutinesVersion = "1.5.1"
val ktorVersion = "1.6.2"
val espressoVersion = "3.4.0"
androidTestImplementation(libs.bundles.androidTest)
testImplementation(libs.bundles.test)
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
androidTestImplementation("com.google.dagger:dagger:$daggerVersion")
androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.1")
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
androidTestImplementation("androidx.annotation:annotation:1.2.0")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
androidTestImplementation("androidx.test:rules:1.4.0")
androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
compileOnly("javax.annotation:jsr250-api:1.0")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
implementation("com.github.paolorotolo:appintro:4.1.0")
implementation("com.google.code.findbugs:jsr305:3.0.2")
implementation("com.google.dagger:dagger:$daggerVersion")
implementation("com.google.guava:guava:30.1.1-android")
implementation("io.ktor:ktor-client-android:$ktorVersion")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-jackson:$ktorVersion")
implementation("io.ktor:ktor-client-json:$ktorVersion")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kxCoroutinesVersion")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kxCoroutinesVersion")
implementation("androidx.appcompat:appcompat:1.3.1")
implementation("androidx.legacy:legacy-preference-v14:1.0.0")
implementation("androidx.legacy:legacy-support-v4:1.0.0")
implementation("com.google.android.material:material:1.4.0")
implementation("com.google.zxing:core:3.4.1")
implementation("com.opencsv:opencsv:5.5.1")
implementation(project(":uhabits-core"))
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
kaptAndroidTest("com.google.dagger:dagger-compiler:$daggerVersion")
testImplementation("com.google.dagger:dagger:$daggerVersion")
testImplementation("junit:junit:4.13.2")
testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
}
kapt {
correctErrorTypes = true
}
play {
serviceAccountCredentials.set(file("../.secret/gcp-key.json"))
track.set("alpha")
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -39,7 +39,6 @@ open class BaseUserInterfaceTest {
private lateinit var prefs: Preferences
private lateinit var fixtures: HabitFixtures
private lateinit var cache: HabitCardListCache
@Before
@Throws(Exception::class)
fun setUp() {

View File

@@ -153,22 +153,18 @@ open class BaseViewTest : BaseAndroidTest() {
var filename = filename
var dir = getSDCardDir("test-screenshots")
if (dir == null) dir = AndroidDirFinder(targetContext).getFilesDir("test-screenshots")
if (dir == null) {
throw RuntimeException(
"Could not find suitable dir for screenshots"
)
}
if (dir == null) throw RuntimeException(
"Could not find suitable dir for screenshots"
)
filename = filename.replace("\\.png$".toRegex(), "$suffix.png")
val absolutePath = String.format("%s/%s", dir.absolutePath, filename)
val parent = File(absolutePath).parentFile
if (!parent.exists() && !parent.mkdirs()) {
throw RuntimeException(
String.format(
"Could not create dir: %s",
parent.absolutePath
)
if (!parent.exists() && !parent.mkdirs()) throw RuntimeException(
String.format(
"Could not create dir: %s",
parent.absolutePath
)
}
)
val out = FileOutputStream(absolutePath)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
return absolutePath

View File

@@ -19,6 +19,7 @@
package org.isoron.uhabits
import com.nhaarman.mockitokotlin2.mock
import dagger.Component
import dagger.Module
import dagger.Provides
@@ -34,7 +35,6 @@ import org.isoron.uhabits.inject.ActivityScope
import org.isoron.uhabits.inject.HabitModule
import org.isoron.uhabits.inject.HabitsActivityModule
import org.isoron.uhabits.inject.HabitsApplicationComponent
import org.mockito.kotlin.mock
@Module
class TestModule {

View File

@@ -55,7 +55,6 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@LargeTest
class HabitsTest : BaseUserInterfaceTest() {
@Test
@Throws(Exception::class)
fun shouldCreateHabit() {
@@ -181,8 +180,6 @@ class HabitsTest : BaseUserInterfaceTest() {
longPressCheckmarks("Wake up early", count = 2)
clickText("Wake up early")
verifyShowsScreen(SHOW_HABIT)
// TODO: find a better way than sleeping in tests
Thread.sleep(2001L)
verifyDisplaysText("10%")
}
@@ -197,8 +194,6 @@ class HabitsTest : BaseUserInterfaceTest() {
verifyDoesNotDisplayText("Track time")
verifyDisplaysText("Wake up early")
longPressCheckmarks("Wake up early", count = 1)
// TODO: find a better way than sleeping in tests
Thread.sleep(2001L)
verifyDoesNotDisplayText("Wake up early")
clickMenu(TOGGLE_COMPLETED)
verifyDisplaysText("Track time")

View File

@@ -20,7 +20,6 @@
package org.isoron.uhabits.acceptance.steps
import android.os.Build.VERSION.SDK_INT
import android.os.SystemClock.sleep
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiSelector
import org.isoron.uhabits.BaseUserInterfaceTest.Companion.device
@@ -40,7 +39,7 @@ fun exportFullBackup() {
}
fun clearDownloadFolder() {
device.executeShellCommand("rm -rf /sdcard/Download")
device.executeShellCommand("rm -rf /sdcard/Download/")
}
fun clearBackupFolder() {
@@ -87,7 +86,6 @@ fun importBackupFromDownloadFolder() {
device.findObject(UiSelector().textContains("Loop")).click()
} else {
device.click(50, 90) // Click menu button
Thread.sleep(1000)
device.findObject(UiSelector().textContains("Download")).click()
device.findObject(UiSelector().textContains("Loop")).click()
}

View File

@@ -18,8 +18,7 @@
*/
package org.isoron.uhabits.acceptance.steps
import android.os.Build
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION
import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso
@@ -32,11 +31,11 @@ import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until
import junit.framework.Assert.assertTrue
import org.hamcrest.CoreMatchers
import org.isoron.uhabits.BaseUserInterfaceTest
import org.isoron.uhabits.R
import org.isoron.uhabits.activities.habits.list.ListHabitsActivity
import org.junit.Assert.assertTrue
object CommonSteps : BaseUserInterfaceTest() {
fun pressBack() {
@@ -73,7 +72,7 @@ object CommonSteps : BaseUserInterfaceTest() {
}
fun offsetHeaders() {
device.swipe(500, 160, 350, 160, 20)
device.swipe(750, 160, 600, 160, 20)
}
fun scrollToText(text: String?) {
@@ -132,9 +131,9 @@ object CommonSteps : BaseUserInterfaceTest() {
}
@Throws(Exception::class)
fun verifyOpensWebsite(url: String) {
fun verifyOpensWebsite(url: String?) {
var browserPkg = "org.chromium.webview_shell"
if (SDK_INT <= Build.VERSION_CODES.M) {
if (VERSION.SDK_INT <= 23) {
browserPkg = "com.android.browser"
}
assertTrue(device.wait(Until.hasObject(By.pkg(browserPkg)), 5000))
@@ -147,19 +146,15 @@ object CommonSteps : BaseUserInterfaceTest() {
Screen.LIST_HABITS ->
Espresso.onView(ViewMatchers.withClassName(CoreMatchers.endsWith("ListHabitsRootView")))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
Screen.SHOW_HABIT ->
Espresso.onView(ViewMatchers.withId(R.id.subtitleCard))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
Screen.EDIT_HABIT ->
Espresso.onView(ViewMatchers.withId(R.id.questionInput))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
Screen.SELECT_HABIT_TYPE ->
Espresso.onView(ViewMatchers.withText(R.string.yes_or_no_example))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
else -> throw IllegalStateException()
}
}
@@ -183,22 +178,6 @@ object CommonSteps : BaseUserInterfaceTest() {
EditHabitSteps.clickSave()
}
fun changeFrequencyToDaily(habitName: String) {
clickText(habitName)
Espresso.onView(ViewMatchers.withId(R.id.action_edit_habit)).perform(ViewActions.click())
EditHabitSteps.pickDailyFrequency()
EditHabitSteps.clickSave()
pressBack()
}
fun changeFrequencyToMonthly(habitName: String) {
clickText(habitName)
Espresso.onView(ViewMatchers.withId(R.id.action_edit_habit)).perform(ViewActions.click())
EditHabitSteps.pickMonthFrequency()
EditHabitSteps.clickSave()
pressBack()
}
enum class Screen {
LIST_HABITS, SHOW_HABIT, EDIT_HABIT, SELECT_HABIT_TYPE
}

View File

@@ -36,24 +36,6 @@ object EditHabitSteps {
Espresso.onView(ViewMatchers.withText("SAVE")).perform(ViewActions.click())
}
fun pickMonthFrequency() {
Espresso.onView(ViewMatchers.withId(R.id.boolean_frequency_picker))
.perform(ViewActions.click())
Espresso.onView(ViewMatchers.withId(R.id.xTimesPerMonthRadioButton))
.perform(ViewActions.click())
Espresso.onView(ViewMatchers.withId(R.id.xTimesPerMonthTextView))
.perform(ViewActions.replaceText("1"))
Espresso.onView(ViewMatchers.withText("SAVE")).perform(ViewActions.click())
}
fun pickDailyFrequency() {
Espresso.onView(ViewMatchers.withId(R.id.boolean_frequency_picker))
.perform(ViewActions.click())
Espresso.onView(ViewMatchers.withId(R.id.everyDayRadioButton))
.perform(ViewActions.click())
Espresso.onView(ViewMatchers.withText("SAVE")).perform(ViewActions.click())
}
fun pickColor(color: Int) {
Espresso.onView(ViewMatchers.withId(R.id.colorButton)).perform(ViewActions.click())
BaseUserInterfaceTest.device.findObject(By.descStartsWith(String.format("Color %d", color)))

View File

@@ -53,7 +53,6 @@ object ListHabitsSteps {
clickViewWithId(R.id.action_filter)
CommonSteps.clickText(R.string.hide_completed)
}
else -> throw RuntimeException()
}
device.waitForIdle()
}
@@ -121,12 +120,6 @@ object ListHabitsSteps {
BaseUserInterfaceTest.device.waitForIdle()
}
fun changeSort(sortText: String) {
clickViewWithId(R.id.action_filter)
Espresso.onView(ViewMatchers.withText("Sort")).perform(ViewActions.click())
Espresso.onView(ViewMatchers.withText(sortText)).perform(ViewActions.click())
}
enum class MenuItem {
ABOUT, HELP, SETTINGS, EDIT, DELETE, ARCHIVE, TOGGLE_ARCHIVED, UNARCHIVE, TOGGLE_COMPLETED, ADD
}

View File

@@ -18,12 +18,12 @@
*/
package org.isoron.uhabits.acceptance.steps
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION
import androidx.test.uiautomator.UiScrollable
import androidx.test.uiautomator.UiSelector
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue
import org.isoron.uhabits.BaseUserInterfaceTest
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
object WidgetSteps {
@Throws(Exception::class)
@@ -50,21 +50,29 @@ object WidgetSteps {
private fun openWidgetScreen() {
val h = BaseUserInterfaceTest.device.displayHeight
val w = BaseUserInterfaceTest.device.displayWidth
val listId = "com.android.launcher3:id/widgets_list_view"
BaseUserInterfaceTest.device.pressHome()
BaseUserInterfaceTest.device.waitForIdle()
BaseUserInterfaceTest.device.drag(w / 2, h / 2, w / 2, h / 2, 8)
var button = BaseUserInterfaceTest.device.findObject(UiSelector().text("WIDGETS"))
if (!button.waitForExists(1000)) {
button = BaseUserInterfaceTest.device.findObject(UiSelector().text("Widgets"))
}
button.click()
if (SDK_INT >= 28) {
if (VERSION.SDK_INT <= 21) {
BaseUserInterfaceTest.device.pressHome()
BaseUserInterfaceTest.device.waitForIdle()
BaseUserInterfaceTest.device.findObject(UiSelector().description("Apps")).click()
BaseUserInterfaceTest.device.findObject(UiSelector().description("Apps")).click()
BaseUserInterfaceTest.device.findObject(UiSelector().description("Widgets")).click()
} else {
val listId = "com.android.launcher3:id/widgets_list_view"
BaseUserInterfaceTest.device.pressHome()
BaseUserInterfaceTest.device.waitForIdle()
BaseUserInterfaceTest.device.drag(w / 2, h / 2, w / 2, h / 2, 8)
var button = BaseUserInterfaceTest.device.findObject(UiSelector().text("WIDGETS"))
if (!button.waitForExists(1000)) {
button = BaseUserInterfaceTest.device.findObject(UiSelector().text("Widgets"))
}
button.click()
if (VERSION.SDK_INT >= 28) {
UiScrollable(UiSelector().resourceId(listId))
.scrollForward()
}
UiScrollable(UiSelector().resourceId(listId))
.scrollForward()
.scrollIntoView(UiSelector().text("Checkmark"))
}
UiScrollable(UiSelector().resourceId(listId))
.scrollIntoView(UiSelector().text("Checkmark"))
}
@Throws(Exception::class)

View File

@@ -18,7 +18,6 @@
*/
package org.isoron.uhabits.activities.common.views
import android.view.MotionEvent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import org.isoron.uhabits.BaseViewTest
@@ -53,8 +52,7 @@ class FrequencyChartTest : BaseViewTest() {
@Test
@Throws(Throwable::class)
fun testRender_withDataOffset() {
val e = MotionEvent.obtain(0, 0, 0, 0f, 0f, 0)
view.onScroll(e, e, -dpToPixels(150), 0f)
view.onScroll(null, null, -dpToPixels(150), 0f)
view.invalidate()
assertRenders(view, BASE_PATH + "renderDataOffset.png")
}

View File

@@ -18,7 +18,6 @@
*/
package org.isoron.uhabits.activities.common.views
import android.view.MotionEvent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import org.isoron.uhabits.BaseViewTest
@@ -45,7 +44,7 @@ class ScoreChartTest : BaseViewTest() {
habit = habit,
firstWeekday = prefs.firstWeekdayInt,
spinnerPosition = 0,
theme = LightTheme()
theme = LightTheme(),
)
view = ScoreChart(targetContext).apply {
setScores(state.scores)
@@ -64,8 +63,7 @@ class ScoreChartTest : BaseViewTest() {
@Test
@Throws(Throwable::class)
fun testRender_withDataOffset() {
val e = MotionEvent.obtain(0, 0, 0, 0f, 0f, 0)
view.onScroll(e, e, -dpToPixels(150), 0f)
view.onScroll(null, null, -dpToPixels(150), 0f)
view.invalidate()
assertRenders(view, BASE_PATH + "renderDataOffset.png")
}

View File

@@ -30,7 +30,6 @@ import org.junit.runner.RunWith
@MediumTest
class StreakChartTest : BaseViewTest() {
private lateinit var view: StreakChart
@Before
override fun setUp() {
super.setUp()

View File

@@ -29,10 +29,6 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@MediumTest
class EmptyListViewTest : BaseViewTest() {
init {
// TODO: fix rendering differences across APIs
similarityCutoff = 0.00035
}
private val path = "habits/list/EmptyListView"
private val view: EmptyListView = EmptyListView(targetContext)

View File

@@ -36,7 +36,6 @@ class EntryButtonViewTest : BaseViewTest() {
lateinit var view: CheckmarkButtonView
var toggled = false
var edited = false
@Before
override fun setUp() {
@@ -44,8 +43,7 @@ class EntryButtonViewTest : BaseViewTest() {
view = component.getEntryButtonViewFactory().create().apply {
value = Entry.NO
color = PaletteUtils.getAndroidTestColor(5)
onToggle = { _, _ -> toggled = true }
onEdit = { edited = true }
onToggle = { toggled = true }
}
measureView(view, dpToPixels(48), dpToPixels(48))
}
@@ -72,28 +70,20 @@ class EntryButtonViewTest : BaseViewTest() {
fun testClick_withShortToggleDisabled() {
prefs.isShortToggleEnabled = false
view.performClick()
assertTrue(!toggled and edited)
assertFalse(toggled)
}
@Test
fun testClick_withShortToggleEnabled() {
prefs.isShortToggleEnabled = true
view.performClick()
assertTrue(toggled and !edited)
assertTrue(toggled)
}
@Test
fun testLongClick_withShortToggleDisabled() {
prefs.isShortToggleEnabled = false
fun testLongClick() {
view.performLongClick()
assertTrue(toggled and !edited)
}
@Test
fun testLongClick_withShortToggleEnabled() {
prefs.isShortToggleEnabled = true
view.performLongClick()
assertTrue(!toggled and edited)
assertTrue(toggled)
}
private fun assertRendersCheckedExplicitly() {

View File

@@ -77,7 +77,7 @@ class EntryPanelViewTest : BaseViewTest() {
@Test
fun testToggle() {
val timestamps = mutableListOf<Timestamp>()
view.onToggle = { t, _, _ -> timestamps.add(t) }
view.onToggle = { t, _ -> timestamps.add(t) }
view.buttons[0].performLongClick()
view.buttons[2].performLongClick()
view.buttons[3].performLongClick()
@@ -88,7 +88,7 @@ class EntryPanelViewTest : BaseViewTest() {
fun testToggle_withOffset() {
val timestamps = mutableListOf<Timestamp>()
view.dataOffset = 3
view.onToggle = { t, _, _ -> timestamps += t }
view.onToggle = { t, _ -> timestamps += t }
view.buttons[0].performLongClick()
view.buttons[2].performLongClick()
view.buttons[3].performLongClick()

View File

@@ -20,15 +20,15 @@ package org.isoron.uhabits.activities.habits.list.views
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
import com.nhaarman.mockitokotlin2.whenever
import org.isoron.uhabits.BaseViewTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
@MediumTest

View File

@@ -20,6 +20,9 @@ package org.isoron.uhabits.activities.habits.list.views
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert.assertThat
import org.isoron.uhabits.BaseViewTest
@@ -27,9 +30,6 @@ import org.isoron.uhabits.core.ui.screens.habits.list.HintList
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
@MediumTest

View File

@@ -24,7 +24,6 @@ import androidx.test.filters.MediumTest
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert.assertThat
import org.isoron.uhabits.BaseViewTest
import org.isoron.uhabits.core.models.NumericalHabitType
import org.isoron.uhabits.utils.PaletteUtils
import org.junit.Before
import org.junit.Test
@@ -43,7 +42,6 @@ class NumberButtonViewTest : BaseViewTest() {
super.setUp()
view = component.getNumberButtonViewFactory().create().apply {
units = "steps"
targetType = NumericalHabitType.AT_LEAST
threshold = 100.0
color = PaletteUtils.getAndroidTestColor(8)
onEdit = { edited = true }
@@ -76,10 +74,10 @@ class NumberButtonViewTest : BaseViewTest() {
}
@Test
fun testRender_atMostAboveThreshold() {
fun testRender_emptyUnits() {
view.value = 500.0
view.targetType = NumericalHabitType.AT_MOST
assertRenders(view, "$PATH/render_at_most_above.png")
view.units = ""
assertRenders(view, "$PATH/render_unitless.png")
}
@Test
@@ -88,13 +86,6 @@ class NumberButtonViewTest : BaseViewTest() {
assertRenders(view, "$PATH/render_below.png")
}
@Test
fun testRender_atMostBetweenThresholds() {
view.value = 110.0
view.targetType = NumericalHabitType.AT_MOST
assertRenders(view, "$PATH/render_at_most_between.png")
}
@Test
fun testRender_zero() {
view.value = 0.0
@@ -102,21 +93,15 @@ class NumberButtonViewTest : BaseViewTest() {
}
@Test
fun testRender_atMostBelowThreshold() {
view.value = 0.0
view.targetType = NumericalHabitType.AT_MOST
assertRenders(view, "$PATH/render_at_most_below.png")
fun testClick_shortToggleDisabled() {
prefs.isShortToggleEnabled = false
view.performClick()
assertFalse(edited)
}
@Test
fun testRender_emptyUnits() {
view.value = 500.0
view.units = ""
assertRenders(view, "$PATH/render_unitless.png")
}
@Test
fun testClick() {
fun testClick_shortToggleEnabled() {
prefs.isShortToggleEnabled = true
view.performClick()
assertTrue(edited)
}

View File

@@ -24,7 +24,6 @@ import androidx.test.filters.MediumTest
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert.assertThat
import org.isoron.uhabits.BaseViewTest
import org.isoron.uhabits.core.models.NumericalHabitType
import org.isoron.uhabits.core.models.Timestamp
import org.isoron.uhabits.utils.PaletteUtils
import org.junit.After
@@ -56,7 +55,6 @@ class NumberPanelViewTest : BaseViewTest() {
buttonCount = 4
color = PaletteUtils.getAndroidTestColor(7)
units = "steps"
targetType = NumericalHabitType.AT_LEAST
threshold = 5000.0
}
view.onAttachedToWindow()
@@ -76,7 +74,7 @@ class NumberPanelViewTest : BaseViewTest() {
@Test
fun testEdit() {
val timestamps = mutableListOf<Timestamp>()
view.onEdit = { t -> timestamps.plusAssign(t) }
view.onEdit = { timestamps.plusAssign(it) }
view.buttons[0].performLongClick()
view.buttons[2].performLongClick()
view.buttons[3].performLongClick()
@@ -87,7 +85,7 @@ class NumberPanelViewTest : BaseViewTest() {
fun testEdit_withOffset() {
val timestamps = mutableListOf<Timestamp>()
view.dataOffset = 3
view.onEdit = { t -> timestamps += t }
view.onEdit = { timestamps += it }
view.buttons[0].performLongClick()
view.buttons[2].performLongClick()
view.buttons[3].performLongClick()

View File

@@ -48,7 +48,7 @@ class FrequencyCardViewTest : BaseViewTest() {
FrequencyCardPresenter.buildState(
habit = habit,
firstWeekday = 0,
theme = LightTheme()
theme = LightTheme(),
)
)
measureView(view, 800f, 600f)

View File

@@ -49,7 +49,7 @@ class HistoryCardViewTest : BaseViewTest() {
HistoryCardPresenter.buildState(
habit = habit,
firstWeekday = SUNDAY,
theme = LightTheme()
theme = LightTheme(),
)
)
measureView(view, 800f, 600f)

View File

@@ -51,7 +51,7 @@ class OverviewCardViewTest : BaseViewTest() {
scoreYearDiff = 0.74f,
totalCount = 44,
color = PaletteColor(7),
theme = LightTheme()
theme = LightTheme(),
)
)
measureView(view, 800f, 300f)

View File

@@ -49,7 +49,7 @@ class ScoreCardViewTest : BaseViewTest() {
habit = habit,
firstWeekday = 0,
spinnerPosition = 0,
theme = LightTheme()
theme = LightTheme(),
)
)
measureView(view, 800f, 600f)

View File

@@ -48,7 +48,7 @@ class StreakCardViewTest : BaseViewTest() {
StreakCardState(
bestStreaks = habit.streaks.getBest(10),
color = habit.color,
theme = LightTheme()
theme = LightTheme(),
)
)
measureView(view, 800f, 600f)

View File

@@ -53,7 +53,9 @@ class SubtitleCardViewTest : BaseViewTest() {
isNumerical = false,
question = "Did you meditate this morning?",
reminder = Reminder(8, 30, EVERY_DAY),
theme = LightTheme()
unit = "",
targetValue = 0.0,
theme = LightTheme(),
)
)
measureView(view, 800f, 200f)

View File

@@ -61,7 +61,7 @@ class PerformanceTest : BaseAndroidTest() {
val habit = fixtures.createEmptyHabit()
for (i in 0..4999) {
val timestamp: Timestamp = Timestamp(i * DAY_LENGTH)
CreateRepetitionCommand(habitList, habit, timestamp, 1, "").run()
CreateRepetitionCommand(habitList, habit, timestamp, 1).run()
}
db.setTransactionSuccessful()
db.endTransaction()

View File

@@ -21,12 +21,9 @@ package org.isoron.uhabits.regression
import androidx.test.filters.LargeTest
import org.isoron.uhabits.BaseUserInterfaceTest
import org.isoron.uhabits.acceptance.steps.CommonSteps
import org.isoron.uhabits.acceptance.steps.CommonSteps.Screen.EDIT_HABIT
import org.isoron.uhabits.acceptance.steps.CommonSteps.Screen.LIST_HABITS
import org.isoron.uhabits.acceptance.steps.CommonSteps.Screen.SELECT_HABIT_TYPE
import org.isoron.uhabits.acceptance.steps.CommonSteps.changeFrequencyToDaily
import org.isoron.uhabits.acceptance.steps.CommonSteps.changeFrequencyToMonthly
import org.isoron.uhabits.acceptance.steps.CommonSteps.clickText
import org.isoron.uhabits.acceptance.steps.CommonSteps.createHabit
import org.isoron.uhabits.acceptance.steps.CommonSteps.launchApp
@@ -40,12 +37,9 @@ import org.isoron.uhabits.acceptance.steps.EditHabitSteps.clickSave
import org.isoron.uhabits.acceptance.steps.EditHabitSteps.typeName
import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.ADD
import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.DELETE
import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.changeSort
import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.clickMenu
import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.longPressCheckmarks
import org.isoron.uhabits.core.models.Entry.Companion.NO
import org.isoron.uhabits.core.models.Entry.Companion.UNKNOWN
import org.isoron.uhabits.core.models.Entry.Companion.YES_AUTO
import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL
import org.junit.Test
@@ -89,37 +83,4 @@ class ListHabitsRegressionTest : BaseUserInterfaceTest() {
offsetHeaders()
verifyDisplaysCheckmarks("Wake up early", listOf(UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN))
}
/**
* https://github.com/iSoron/uhabits/issues/1131
*/
@Test
@Throws(Exception::class)
fun should_refresh_sort_after_habit_edit() {
launchApp()
verifyShowsScreen(LIST_HABITS)
changeSort("By score")
changeSort("By status")
longPressCheckmarks("Meditate", count = 1)
changeFrequencyToMonthly("Read books")
longPressCheckmarks("Read books", count = 2)
longPressCheckmarks("Read books", count = 1)
verifyDisplaysCheckmarks("Meditate", listOf(YES_AUTO, YES_MANUAL, YES_AUTO, YES_MANUAL))
CommonSteps.verifyDisplaysTextInSequence(
"Wake up early",
"Read books",
"Meditate",
"Track time"
)
changeFrequencyToDaily("Meditate")
verifyDisplaysCheckmarks("Meditate", listOf(NO, YES_MANUAL, UNKNOWN, YES_MANUAL))
CommonSteps.verifyDisplaysTextInSequence(
"Wake up early",
"Meditate",
"Read books",
"Track time"
)
}
}

View File

@@ -0,0 +1,154 @@
/*
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.sync
import androidx.test.filters.MediumTest
import com.fasterxml.jackson.databind.ObjectMapper
import io.ktor.client.HttpClient
import io.ktor.client.engine.mock.MockEngine
import io.ktor.client.engine.mock.MockRequestHandleScope
import io.ktor.client.engine.mock.respond
import io.ktor.client.engine.mock.respondError
import io.ktor.client.engine.mock.respondOk
import io.ktor.client.features.json.JsonFeature
import io.ktor.client.request.HttpRequestData
import io.ktor.client.request.HttpResponseData
import io.ktor.http.HttpStatusCode
import io.ktor.http.fullPath
import io.ktor.http.headersOf
import kotlinx.coroutines.runBlocking
import org.isoron.uhabits.BaseAndroidTest
import org.isoron.uhabits.core.sync.AbstractSyncServer
import org.isoron.uhabits.core.sync.GetDataVersionResponse
import org.isoron.uhabits.core.sync.KeyNotFoundException
import org.isoron.uhabits.core.sync.RegisterReponse
import org.isoron.uhabits.core.sync.ServiceUnavailable
import org.isoron.uhabits.core.sync.SyncData
import org.junit.Test
@MediumTest
class RemoteSyncServerTest : BaseAndroidTest() {
private val mapper = ObjectMapper()
val data = SyncData(1, "Hello world")
@Test
fun when_register_succeeds_should_return_key() = runBlocking {
val server = server("/register") {
respondWithJson(RegisterReponse("ABCDEF"))
}
assertEquals("ABCDEF", server.register())
}
@Test(expected = ServiceUnavailable::class)
fun when_register_fails_should_raise_correct_exception() = runBlocking {
val server = server("/register") {
respondError(HttpStatusCode.ServiceUnavailable)
}
server.register()
return@runBlocking
}
@Test
fun when_get_data_version_succeeds_should_return_version() = runBlocking {
server("/db/ABC/version") {
respondWithJson(GetDataVersionResponse(5))
}.apply {
assertEquals(5, getDataVersion("ABC"))
}
return@runBlocking
}
@Test(expected = ServiceUnavailable::class)
fun when_get_data_version_with_server_error_should_raise_exception() = runBlocking {
server("/db/ABC/version") {
respondError(HttpStatusCode.InternalServerError)
}.apply {
getDataVersion("ABC")
}
return@runBlocking
}
@Test(expected = KeyNotFoundException::class)
fun when_get_data_version_with_invalid_key_should_raise_exception() = runBlocking {
server("/db/ABC/version") {
respondError(HttpStatusCode.NotFound)
}.apply {
getDataVersion("ABC")
}
return@runBlocking
}
@Test
fun when_get_data_succeeds_should_return_data() = runBlocking {
server("/db/ABC") {
respondWithJson(data)
}.apply {
assertEquals(data, getData("ABC"))
}
return@runBlocking
}
@Test(expected = KeyNotFoundException::class)
fun when_get_data_with_invalid_key_should_raise_exception() = runBlocking {
server("/db/ABC") {
respondError(HttpStatusCode.NotFound)
}.apply {
getData("ABC")
}
return@runBlocking
}
@Test
fun when_put_succeeds_should_not_raise_exceptions() = runBlocking {
server("/db/ABC") {
respondOk()
}.apply {
put("ABC", data)
}
return@runBlocking
}
private fun server(
expectedPath: String,
action: MockRequestHandleScope.(HttpRequestData) -> HttpResponseData
): AbstractSyncServer {
return RemoteSyncServer(
httpClient = HttpClient(MockEngine) {
install(JsonFeature)
engine {
addHandler { request ->
when (request.url.fullPath) {
expectedPath -> action(request)
else -> error("unexpected call: ${request.url.fullPath}")
}
}
}
},
preferences = prefs
)
}
private fun MockRequestHandleScope.respondWithJson(content: Any) =
respond(
mapper.writeValueAsBytes(content),
headers = headersOf("Content-Type" to listOf("application/json"))
)
}

View File

@@ -24,15 +24,14 @@ import android.widget.FrameLayout
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import org.hamcrest.CoreMatchers
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert.assertThat
import org.isoron.uhabits.BaseViewTest
import org.isoron.uhabits.R
import org.isoron.uhabits.core.models.Entry
import org.isoron.uhabits.core.models.EntryList
import org.isoron.uhabits.core.models.Habit
import org.isoron.uhabits.core.models.Timestamp
import org.isoron.uhabits.core.utils.DateUtils.Companion.getTodayWithOffset
import org.junit.Test
import org.junit.runner.RunWith
@@ -43,12 +42,10 @@ class CheckmarkWidgetTest : BaseViewTest() {
private lateinit var habit: Habit
private lateinit var entries: EntryList
private lateinit var view: FrameLayout
private lateinit var today: Timestamp
private val today = getTodayWithOffset()
override fun setUp() {
super.setUp()
setTheme(R.style.WidgetTheme)
today = getTodayWithOffset()
prefs.widgetOpacity = 255
prefs.isSkipEnabled = true
habit = fixtures.createVeryLongHabit()

View File

@@ -32,10 +32,6 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@MediumTest
class TargetWidgetTest : BaseViewTest() {
init {
// TODO: fix rendering differences across APIs
similarityCutoff = 0.00025
}
private lateinit var habit: Habit
private lateinit var view: FrameLayout
override fun setUp() {

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