diff --git a/.gitignore b/.gitignore index cbf6a5e..9a5c131 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ logs/*.log.txt logs/*.srv.txt logs/*.tck.txt -config/user-config.json +logs/*.captcha.txt +config/user-*.* php_errors.log diff --git a/README.md b/README.md index 547d435..5c9c822 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ # DokuWiki Bot Monitoring Plugin Plugin for live-monitoring your DokuWiki instance for bot activity -IMPORTANT: This is an experimental plugin to investigate bot traffic. This is not a "install and forget" software, but rather requires that you actively look at and manage the log files. +IMPORTANT: This is an experimental plugin to investigate bot traffic. This is not a "install and forget" software, but rather requires that you actively look at and manage data for this to be useful. -This plugin creates various log files in its own "logs" directory. These files can get quite large, and you should check them actively. +In addition to collecting a lot fo information about bot activity on your server, it now also has a simple Captcha function that you can use to block off bots from downloading your precious content. It is however advisable to only activate this after you already have a better understanding of your own site's traffic patterns (both by bots and by humans) to avoid over-blocking legitimate users. -Also, these files can get quite large and fill up your server. Make sure to manually delete older files from time to time! - -For more information, please see the DokuWiki Plugin page at: https://www.dokuwiki.org/plugin:botmon +For more information, please see the DokuWiki Plugin page at: https://www.dokuwiki.org/plugin:botmon and the documentation found at: https://leib.be/sascha/projects/dokuwiki/botmon/index diff --git a/action.php b/action.php index 0655bd1..c38ea2f 100644 --- a/action.php +++ b/action.php @@ -13,6 +13,26 @@ use dokuwiki\Logger; class action_plugin_botmon extends DokuWiki_Action_Plugin { + public function __construct() { + + // determine if a captcha should be loaded: + $this->showCaptcha = 'Z'; // Captcha unknown + + $useCaptcha = $this->getConf('useCaptcha'); // should we show a captcha? + + if ($useCaptcha !== 'disabled') { + if ($_SERVER['REQUEST_METHOD'] == 'HEAD') { + $this->showCaptcha = 'H'; // Method is HEAD, no need for captcha + } elseif ($this->captchaWhitelisted()) { + $this->showCaptcha = 'W'; // IP is whitelisted, no captcha + } elseif ($this->hasCaptchaCookie()) { + $this->showCaptcha = 'N'; // No, user already has a cookie, don't show the captcha + } else { + $this->showCaptcha = 'Y'; // Yes, show the captcha + } + } + } + /** * Registers a callback functions * @@ -23,13 +43,23 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { global $ACT; + // populate the session id and type: + $this->setSessionInfo(); + // insert header data into the page: - if ($ACT == 'show') { + if ($ACT == 'show' || $ACT == 'edit' || $ACT == 'media') { $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'insertHeader'); + + // Override the page rendering, if a captcha needs to be displayed: + $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'insertCaptchaCode'); + } else if ($ACT == 'admin' && isset($_REQUEST['page']) && $_REQUEST['page'] == 'botmon') { $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'insertAdminHeader'); - } - + } + + // also show a captcha before the image preview + $controller->register_hook('TPL_IMG_DISPLAY', 'BEFORE', $this, 'showImageCaptcha'); + // write to the log after the page content was displayed: $controller->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', $this, 'writeServerLog'); @@ -38,7 +68,7 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { /* session information */ private $sessionId = null; private $sessionType = ''; - private $ipAddress = null; + private $showCaptcha = 'X'; /** * Inserts tracking code to the page header @@ -51,17 +81,9 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { global $INFO; - // populate the session id and type: - $this->getSessionInfo(); - - // is there a user logged in? - $username = ( !empty($INFO['userinfo']) && !empty($INFO['userinfo']['name']) ? $INFO['userinfo']['name'] : ''); // build the tracker code: - $code = "document._botmon = {'t0': Date.now(), 'session': '" . json_encode($this->sessionId) . "'};" . NL; - if ($username) { - $code .= DOKU_TAB . DOKU_TAB . 'document._botmon.user = "' . $username . '";'. NL; - } + $code = $this->getBMHeader(); // add the deferred script loader:: $code .= DOKU_TAB . DOKU_TAB . "addEventListener('DOMContentLoaded', function(){" . NL; @@ -70,10 +92,25 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { $code .= DOKU_TAB . DOKU_TAB . DOKU_TAB . "e.src='".DOKU_BASE."lib/plugins/botmon/client.js';" . NL; $code .= DOKU_TAB . DOKU_TAB . DOKU_TAB . "document.getElementsByTagName('head')[0].appendChild(e);" . NL; $code .= DOKU_TAB . DOKU_TAB . "});"; - $event->data['script'][] = ['_data' => $code]; } + /* create the BM object code for insertion into a script element: */ + private function getBMHeader() { + + // build the tracker code: + $code = DOKU_TAB . DOKU_TAB . "document._botmon = {t0: Date.now(), session: " . json_encode($this->sessionId) . ", seed: " . json_encode($this->getConf('captchaSeed')) . ", ip: " . json_encode($_SERVER['REMOTE_ADDR']) . "};" . NL; + + // is there a user logged in? + $username = ( !empty($INFO['userinfo']) && !empty($INFO['userinfo']['name']) ? $INFO['userinfo']['name'] : ''); + if ($username) { + $code .= DOKU_TAB . DOKU_TAB . 'document._botmon.user = "' . $username . '";'. NL; + } + + return $code; + + } + /** * Inserts tracking code to the page header * (only called on 'show' actions) @@ -87,7 +124,6 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { $event->data['script'][] = ['src' => DOKU_BASE.'lib/plugins/botmon/admin.js', 'defer' => 'defer', '_data' => '']; } - /** * Writes data to the server log. * @@ -107,7 +143,7 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { // create the log array: $logArr = Array( - $_SERVER['REMOTE_ADDR'], /*$this->ipAddress, // remote IP */ + $_SERVER['REMOTE_ADDR'], /* remote IP */ $pageId, /* page ID */ $this->sessionId, /* Session ID */ $this->sessionType, /* session ID type */ @@ -116,7 +152,9 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { $_SERVER['HTTP_REFERER'] ?? '', /* HTTP Referrer */ substr($conf['lang'],0,2), /* page language */ implode(',', array_unique(array_map( function($it) { return substr(trim($it),0,2); }, explode(',',trim($_SERVER['HTTP_ACCEPT_LANGUAGE'], " \t;,*"))))), /* accepted client languages */ - $this->getCountryCode() /* GeoIP country code */ + $this->getCountryCode(), /* GeoIP country code */ + $this->showCaptcha, /* show captcha? */ + $_SERVER['REQUEST_METHOD'] ?? '' /* request method */ ); //* create the log line */ @@ -140,7 +178,7 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { private function getCountryCode() { - $country = ( $this->ipAddress == 'localhost' ? 'local' : 'ZZ' ); // default if no geoip is available! + $country = ( $_SERVER['REMOTE_ADDR'] == '127.0.0.1' ? 'local' : 'ZZ' ); // default if no geoip is available! $lib = $this->getConf('geoiplib'); /* which library to use? (can only be phpgeoip or disabled) */ @@ -158,10 +196,7 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { return $country; } - private function getSessionInfo() { - - $this->ipAddress = $_SERVER['REMOTE_ADDR'] ?? null; - if ($this->ipAddress == '127.0.0.1' || $this->ipAddress == '::1') $this->ipAddress = 'localhost'; + private function setSessionInfo() { // what is the session identifier? if (isset($_SESSION)) { @@ -178,13 +213,373 @@ class action_plugin_botmon extends DokuWiki_Action_Plugin { $this->sessionId = session_id(); $this->sessionType = 'php'; } - if (!$this->sessionId && $this->ipAddress) { /* no PHP session ID, try IP address */ - $this->sessionId = $this->ipAddress; + if (!$this->sessionId) { /* no PHP session ID, try IP address */ + $this->sessionId = $_SERVER['REMOTE_ADDR']; $this->sessionType = 'ip'; } - if (!$this->sessionId) { /* if everything else fails, just us a random ID */ - $this->sessionId = rand(1000000, 9999999); - $this->sessionType = 'rand'; + + if (!$this->sessionId) { /* if all fails, use random data */ + $this->sessionId = rand(100000000, 999999999); + $this->sessionType = 'rnd'; + } + + } + + public function insertCaptchaCode(Event $event) { + + $useCaptcha = $this->getConf('useCaptcha'); // which background to show? + + // only if we previously determined that we need a captcha: + if ($this->showCaptcha == 'Y') { + + echo '

'; tpl_pagetitle(); echo "

\n"; // always show the original page title + $event->preventDefault(); // don't show normal content + switch ($useCaptcha) { + case 'loremipsum': + $this->insertLoremIpsum(); // show dada filler instead of text + break; + case 'dada': + $this->insertDadaFiller(); // show dada filler instead of text + break; + } + + // insert the captcha loader code: + echo '' . NL; + + // insert a warning message for users without JavaScript: + echo '

' . $this->getLang('bm_noJsWarning') . '

' . NL; + } } + + public function showImageCaptcha(Event $event, $param) { + + $useCaptcha = $this->getConf('useCaptcha'); + + echo ''; + + $cCode = '-'; + if ($useCaptcha !== 'disabled') { + if ($this->captchaWhitelisted()) { + $cCode = 'W'; // whitelisted + } + elseif ($this->hasCaptchaCookie()) { + $cCode = 'N'; // user already has a cookie + } + else { + $cCode = 'Y'; // show the captcha + + echo ''; // placeholder image + $event->preventDefault(); // don't show normal content + + // TODO Insert dummy image + $this->insertCaptchaLoader(); // and load the captcha + } + }; + + $this->showCaptcha = $cCode; // store the captcha code for the logfile + } + + /** + * Checks if the user has a valid captcha cookie. + * + * @return boolean + * @access private + * + **/ + private function hasCaptchaCookie() { + + $cookieVal = isset($_COOKIE['DWConfirm']) ? $_COOKIE['DWConfirm'] : null; + + $today = substr((new DateTime())->format('c'), 0, 10); + + $raw = $this->getConf('captchaSeed') . ';' . $_SERVER['SERVER_NAME'] . ';' . $_SERVER['REMOTE_ADDR'] . ';' . $today; + $expected = hash('sha256', $raw); + + // for debugging: write captcha data to the log: + $this->writeCaptchaLog($_SERVER['REMOTE_ADDR'], $cookieVal, $_SERVER['SERVER_NAME'], $expected); + + return $cookieVal == $expected; + } + + /** + * Writes data to the captcha log. + * + * @return void + */ + private function writeCaptchaLog($remote_addr, $cookieVal, $serverName, $expected) { + + global $INFO; + + $logArr = Array( + $remote_addr, /* remote IP */ + $cookieVal, /* cookie value */ + $this->getConf('captchaSeed'), /* seed */ + $serverName, /* server name */ + $expected, /* expected cookie value */ + ($cookieVal == $expected ? 'MATCH' : 'WRONG'), /* cookie matches expected value? */ + $_SERVER['REQUEST_URI'] /* request URI */ + ); + + //* create the log line */ + $filename = __DIR__ .'/logs/' . gmdate('Y-m-d') . '.captcha.txt'; /* use GMT date for filename */ + $logline = gmdate('Y-m-d H:i:s'); /* use GMT time for log entries */ + foreach ($logArr as $tab) { + $logline .= "\t" . $tab; + }; + + /* write the log line to the file */ + $logfile = fopen($filename, 'a'); + if (!$logfile) die(); + if (fwrite($logfile, $logline . "\n") === false) { + fclose($logfile); + die(); + } + + // in case of errors, write the cookie data to the log: + if (!$cookieVal) { + $logline = print_r($_COOKIE, true); + if (fwrite($logfile, $logline . "\n") === false) { + fclose($logfile); + die(); + } + } + + /* Done. close the file. */ + fclose($logfile); + } + + + // check if the visitor's IP is on a whitelist: + private function captchaWhitelisted() { + + // normalise IP address: + $ip = inet_pton($_SERVER['REMOTE_ADDR']); + + // find which file to open: + $prefixes = ['user', 'default']; + foreach ($prefixes as $pre) { + $filename = __DIR__ .'/config/' . $pre . '-whitelist.txt'; + if (file_exists($filename)) { + break; + } + } + + if (file_exists($filename)) { + $lines = file($filename, FILE_SKIP_EMPTY_LINES); + foreach ($lines as $line) { + if (trim($line) !== '' && !str_starts_with($line, '#')) { + $col = explode("\t", $line); + if (count($col) >= 2) { + $from = inet_pton($col[0]); + $to = inet_pton($col[1]); + + if ($ip >= $from && $ip <= $to) { + return true; /* IP whitelisted */ + } + } + } + } + } + return false; /* IP not found in whitelist */ + } + + // inserts a blank box to ensure there is enough space for the captcha: + private function insertLoremIpsum() { + + echo '
' . NL; + echo '

' . NL . 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'. NL . '

' . NL; + echo '

' . NL . 'At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.'. NL . '

' . NL; + echo '
' . NL; + + } + + /* Generates a few paragraphs of Dada text to show instead of the article content */ + private function insertDadaFiller() { + + global $conf; + global $TOC; + global $ID; + + // list of languages to search for the wordlist + $langs = array_unique([$conf['lang'], 'la']); + + // find path to the first available wordlist: + foreach ($langs as $lang) { + $filename = __DIR__ .'/lang/' . $lang . '/wordlist.txt'; /* language-specific wordlist */ + if (file_exists($filename)) { + break; + } + } + + // load the wordlist file: + if (file_exists($filename)) { + $words = array(); + $totalWeight = 0; + $lines = file($filename, FILE_SKIP_EMPTY_LINES); + foreach ($lines as $line) { + $arr = explode("\t", $line); + $arr[1] = ( count($arr) > 1 ? (int) trim($arr[1]) : 1 ); + $totalWeight += (int) $arr[1]; + array_push($words, $arr); + } + } else { + echo ''; + return; + } + + // If a TOC exists, use it for the headlines: + if(is_array($TOC)) { + $toc = $TOC; + } else { + $meta = p_get_metadata($ID, '', METADATA_RENDER_USING_CACHE); + //$tocok = (isset($meta['internal']['toc']) ? $meta['internal']['toc'] : $tocok = true); + $toc = isset($meta['description']['tableofcontents']) ? $meta['description']['tableofcontents'] : null; + } + if (!$toc) { // no TOC, generate my own: + $hlCount = mt_rand(0, (int) $conf['tocminheads']); + $toc = array(); + for ($i=0; $i<$hlCount; $i++) { + array_push($toc, $this->dadaMakeHeadline($words, $totalWeight)); // $toc + } + } + + // if H1 heading is not in the TOC, add a chappeau section: + $chapeauCount = mt_rand(1, 3); + if ((int) $conf['toptoclevel'] > 1) { + echo "
\n"; + for ($i=0; $i<$chapeauCount; $i++) { + echo $this->dadaMakeParagraph($words, $totalWeight); + } + echo "
\n"; + } + + // text sections for each sub-headline: + foreach ($toc as $hl) { + echo $this->dadaMakeSection($words, $totalWeight, $hl); + } + } + + private function dadaMakeSection($words, $totalWeight, $hl) { + + global $conf; + + // how many paragraphs? + $paragraphCount = mt_rand(1, 4); + + // section level + $topTocLevel = (int) $conf['toptoclevel']; + $secLevel = $hl['level'] + 1;; + + // return value: + $sec = ""; + + // make a headline: + if ($topTocLevel > 1 || $secLevel > 1) { + $sec .= "{$hl['title']}\n"; + } + + // add the paragraphs: + $sec .= "
\n"; + for ($i=0; $i<$paragraphCount; $i++) { + $sec .= $this->dadaMakeParagraph($words, $totalWeight); + } + $sec .= "
\n"; + + return $sec; + } + + private function dadaMakeHeadline($words, $totalWeight) { + + // how many words to generate? + $wordCount = mt_rand(2, 5); + + // function returns an array: + $r = Array(); + + // generate the headline: + $hlArr = array(); + for ($i=0; $i<$wordCount; $i++) { + array_push($hlArr, $this->dadaSelectRandomWord($words, $totalWeight)); + } + + $r['title'] = ucfirst(implode(' ', $hlArr)); + + $r['hid'] = preg_replace('/[^\w\d\-]+/i', '_', strtolower($r['title'])); + $r['type'] = 'ul'; // always ul! + $r['level'] = 1; // always level 1 for now + + return $r; + } + + private function dadaMakeParagraph($words, $totalWeight) { + + // how many words to generate? + $sentenceCount = mt_rand(2, 5); + + $paragraph = array(); + for ($i=0; $i<$sentenceCount; $i++) { + array_push($paragraph, $this->dadaMakeSentence($words, $totalWeight)); + } + + return "

\n" . implode(' ', $paragraph) . "\n

\n"; + + } + + private function dadaMakeSentence($words, $totalWeight) { + + // how many words to generate? + $wordCount = mt_rand(4, 20); + + // generate the sentence: + $sentence = array(); + for ($i=0; $i<$wordCount; $i++) { + array_push($sentence, $this->dadaSelectRandomWord($words, $totalWeight)); + } + + return ucfirst(implode(' ', $sentence)) . '.'; + + } + + private function dadaSelectRandomWord($list, $totalWeight) { + + // get a random selection: + $rand = mt_rand(0, $totalWeight); + + // match the selection to the weighted list: + $cumulativeWeight = 0; + for ($i=0; $i= $rand) { + return $list[$i][0]; + } + } + return '***'; + } + } \ No newline at end of file diff --git a/admin.css b/admin.css index 734ee97..7420fcc 100644 --- a/admin.css +++ b/admin.css @@ -7,24 +7,29 @@ /* icon items */ .has_icon { display: inline-flex; + align-items: center; + width: auto; + white-space: nowrap; } .icon_only { display: inline-grid; grid-template-columns: 20px max-content; - overflow: hidden; - width: 20px; + width: 20px; max-width: 20px; } .has_icon, .icon_only { & { align-items: center; - column-gap: .25em; + overflow: hidden; + column-gap: .2em; + min-width: 20px; } &::before { content: ''; display: inline-block; - width: 20px; height: 20px; + width: 20px; min-width: 20px; max-width: 20px; + height: 20px; background: transparent none center no-repeat; background-position: 0 0; background-size: 20px; @@ -106,8 +111,22 @@ &.cl_ecosia::before { background-position-y: -340px } &.cl_webkit::before { background-position-y: -360px } &.cl_operaold::before { background-position-y: -380px } + &.cl_wget::before { background-position-y: -400px } + &.cl_python::before { background-position-y: -420px } + &.cl_privacybrowser::before { background-position-y: -440px } &.cl_other::before { background-image: url('img/more.svg') } + /* Captcha statuses */ + &.captcha::before { background-image: url('img/captcha.png') } + &.cap_Y::before { background-position-y: -20px } + &.cap_N::before, &.cap_YN::before, &.cap_YYN::before { background-position-y: -40px } + &.cap_W::before { background-position-y: -60px } + &.cap_H::before { background-position-y: -80px } + &.cap_X::before, &.cap_undefined::before { background-position-y: -100px } + &.cap_YH::before, &.cap_YYH::before { background-position-y: -120px } + &.cap_YNH::before { background-position-y: -140px } + &.cap_YY::before { background-position-y: -160px } + /* Country flags */ /* Note: flag images and CSS adapted from: https://github.com/lafeber/world-flags-sprite/ */ &.country::before { @@ -357,6 +376,7 @@ &.typ_php::before { background-position-y: -40px } &.typ_ip::before { background-position-y: -60px } &.typ_usr::before { background-position-y: -80px } + &.typ_rnd::before { background-position-y: -100px } /* External link icons */ &.extlink::before { background-image: url('img/links.png') } @@ -401,14 +421,15 @@ .page_icon::before { content: ''; display: inline-block; - width: 20px; height: 20px; + width: 20px; min-width: 20px; max-width: 20px; + height: 20px; background: transparent url('img/page.svg') center no-repeat; background-position: 0 0; background-size: 20px; } /* grid layout for the overview: */ - .botmon_bots_grid, .botmon_webmetrics_grid, .botmon_traffic_grid { + .botmon_bots_grid, .botmon_webmetrics_grid, .botmon_traffic_grid, .botmon_captcha_grid { & { display: grid; grid-gap: 0 .33em; @@ -417,7 +438,8 @@ dd { display: flex; justify-content: space-between; - align-items: baseline; + align-items: center; + column-gap: .5em; } } } @@ -448,7 +470,23 @@ } } .botmon_traffic_grid { - grid-template-columns: 2fr 1fr; + & { + grid-template-columns: 2fr 1fr; + } + #botmon__today__wm_pages, #botmon__today__wm_referers { + & { + max-width: 100%; + overflow: hidden; + } + dd a { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + .botmon_captcha_grid { + grid-template-columns: 1fr 1fr 1fr; } /* The tabs bar */ @@ -527,14 +565,15 @@ color: #333; cursor: pointer; } - &::marker, &::before { + &::marker { content: none; display: none; } &::before { content: ''; display: inline-block; - width: 1.25em; height: 1.25em; + width: 1.25em; min-width: 1.25em; max-width: 1.25em; + height: 1.25em; background: transparent url('img/chevron.svg') center no-repeat; background-size: 1.25em; transform: rotate(-90deg); @@ -600,8 +639,10 @@ border-radius: .5em; } details ul > li > details > summary { - display: flex; - justify-content: space-between; + display: grid; + grid-template-columns: 1.25em minmax(calc(100px + 4em), auto) max-content; + justify-items: stretch; + justify-content: stretch; align-items: center; column-gap: .5em; font-weight: normal; @@ -610,6 +651,7 @@ background-color: #F0F0F0; border-bottom: #CCC solid 1px; border-radius: .7em; + overflow: auto; } details ul > li > details > summary.noServer { opacity: 67%; @@ -620,7 +662,10 @@ column-gap: .25em; } details ul > li > details > summary > span:first-child { - flex-grow: 1; + justify-content: flex-start; + } + details ul > li > details > summary > span:last-child { + justify-content: flex-end; } details ul > li > details > summary > span > span[title] { cursor: help; @@ -630,8 +675,9 @@ & { display: grid; grid-template-columns: min-content auto; + gap: .25em .5em; border-left: transparent none 0; - margin: 0 .5rem .25rem 0; + margin: .5rem .5rem .25rem 0; } dt { grid-column: 1; @@ -642,8 +688,6 @@ background-color: transparent; } dd.pages { - & { - } ul { li { & { @@ -656,17 +700,9 @@ &:nth-child(odd) { background-color: #DFDFDF; } - div.row { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: baseline; - white-space: nowrap; - line-height: 1.35em; - } - span { - display: inline-block; - } + /*&.detailled { + outline: red dotted 1pt; + }*/ } } a[hreflang] { @@ -685,6 +721,23 @@ padding: 0 1pt; margin-left: .2em; } + div.row { + & { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: baseline; + white-space: nowrap; + line-height: 1.35em; + } + & > div { + display: inline-flex; + column-gap: .4em; + } + } + span { + display: inline-block; + } span.first-seen { min-width: 4.2em; text-align: right; @@ -693,20 +746,26 @@ font-size: smaller; } span.bounce { - width: 1.25em; height: 1.25em; + width: 1em; height: 1em; overflow: hidden; } span.bounce::before { display: inline-block; content: ''; - width: 1.25em; height: 1em; + width: 1em; height: 1em; background: transparent url('img/bounce.svg') center no-repeat; background-size: .95em; } - span.referer { + span.referer, span.views, span.ip-address, span.user-agent { font-size: smaller; + } + span.referer, span.ip-address, span.user-agent { margin-left: .67rem; } + span.user-agent { + line-break: anywhere; + text-wrap-mode: wrap; + } } } @@ -730,21 +789,29 @@ background-image: url('img/info.svg') } - /* pageviews */ - span.pageviews { + /* pages seen */ + span.pageseen/*, span.pageviews */{ border: #999 solid 1px; padding: 0 2px; font-size: smaller; border-radius: .5em; margin-right: .25em; + min-width: fit-content; } - span.pageviews::before { + span.pageseen::before { content : ''; display: inline-block; - width: 1.25em; height: 1.25em; + width: 1.25em; min-width: 1.25em; max-width: 1.25em; height: 1.25em; background: transparent url('img/page.svg') center no-repeat; background-size: 1.25em; } + /*span.pageviews::before { + content : ''; + display: inline-block; + width: 1.25em; height: 1.25em; + background: transparent url('img/views.svg') center no-repeat; + background-size: 1.25em; + }*/ } /* item footer */ @@ -890,7 +957,7 @@ border-top-color: #CCC; } } - span.pageviews { + span.pageseen, span.pageviews { border-color: #555; } @@ -929,6 +996,23 @@ } } /* layout overrides for narrow screens: */ +@media (max-width: 1024px) { + #botmon__admin #botmon__latest { + .botmon_traffic_grid { + & { + grid-template-columns: 1fr !important; + } + dt { + margin: .5em 0; + } + dl { + border-left: transparent none 0; + padding-left: 0; + } + } + } +} + @media (max-width: 800px) { #botmon__admin #botmon__latest #botmon__today__visitorlists { dl.visitor_details { @@ -952,7 +1036,7 @@ @media (max-width: 670px) { #botmon__admin #botmon__latest { - .botmon_bots_grid, .botmon_webmetrics_grid, .botmon_traffic_grid { + .botmon_bots_grid, .botmon_webmetrics_grid, .botmon_captcha_grid { & { grid-template-columns: 1fr !important; } @@ -966,3 +1050,9 @@ } } } + +@media (max-width: 440px) { + #botmon__admin #botmon__latest #botmon__today__content details > div { padding: .25em; } + #botmon__admin #botmon__latest #botmon__today__visitorlists details ul > li { margin-left: 0; } + #botmon__admin #botmon__latest #botmon__today__visitorlists details ul > li > details > summary { column-gap: .1em; } +} \ No newline at end of file diff --git a/admin.js b/admin.js index 49765e5..122175d 100644 --- a/admin.js +++ b/admin.js @@ -42,7 +42,7 @@ const BotMon = { // get yesterday's date: let d = new Date(); - d.setDate(d.getDate() - 1); + if (BMSettings.showday == 'yesterday') d.setDate(d.getDate() - 1); this._datestr = d.toISOString().slice(0, 10); // init the sub-objects: @@ -105,7 +105,7 @@ const BotMon = { r.textContent = text.toString(); } } catch(e) { - console.error(e); + console.error('Botmon:', e); } return r; }, @@ -161,6 +161,7 @@ const BotMon = { var bg = b; var sm = a; + if (a == 0 || b == 0) return '—'; if (a > b) { var bg = a; var sm = b; @@ -182,10 +183,10 @@ const BotMon = { } }; -/* everything specific to the "Latest" tab is self-contained in the "live" object: */ +/* everything specific to the 'Latest' tab is self-contained in the 'live' object: */ BotMon.live = { init: function() { - console.info('BotMon.live.init()'); + //console.info('BotMon.live.init()'); // set the title: const tDiff = 'UTC ' + (BotMon._timeDiff != '' ? ` (offset: ${BotMon._timeDiff}` : '' ) + ')'; @@ -291,7 +292,8 @@ BotMon.live = { // shortcut to make code more readable: const model = BotMon.live.data.model; - const timeout = 60 * 60 * 1000; // session timeout: One hour + // combine Bot networks to one visitor? + const combineNets = (BMSettings.hasOwnProperty('combineNets') ? BMSettings['combineNets'] : true);; if (visitor._type == BM_USERTYPE.KNOWN_BOT) { // known bots match by their bot ID: @@ -303,13 +305,31 @@ BotMon.live = { return v; } } + + } else if (combineNets && visitor.hasOwnProperty('_ipRange')) { // combine with other visits from the same range + + let nonRangeVisitor = null; + + for (let i=0; i 0 ? 'X' : '') + (this.Y > 0 ? (this.Y > 1 ? 'YY' : 'Y') : '') + (this.N > 0 ? 'N' : '') + (this.W > 0 ? 'W' : '') + (this.H > 0 ? 'H' : ''); } + } // captcha counter + }}; model._visitors.push(visitor); - } else { // update existing - if (visitor._firstSeen > nv.ts) { - visitor._firstSeen = nv.ts; - } + }; + + // update first and last seen: + if (visitor._firstSeen > nv.ts) { + visitor._firstSeen = nv.ts; + } + if (visitor._lastSeen < nv.ts) { + visitor._lastSeen = nv.ts; } - // find browser + // update total loads and views (not the same!): + visitor._loadCount += 1; + visitor._viewCount += (nv.captcha == 'Y' ? 0 : 1); + + // ...because also a captcha is a "load", but not a "view". + // let's count the captcha statuses as well: + if (nv.captcha) visitor._captcha[nv.captcha] += 1; // is this visit already registered? let prereg = model._getPageView(visitor, nv); @@ -401,13 +444,16 @@ BotMon.live = { // add new page view: prereg = model._makePageView(nv, type); visitor._pageViews.push(prereg); - } else { - // update last seen date - prereg._lastSeen = nv.ts; - // increase view count: - prereg._viewCount += 1; - prereg._tickCount += 1; } + prereg._loadCount += 1; + prereg._viewCount += (nv.captcha == 'Y' ? 0 : 1); + + // update last seen date + prereg._lastSeen = nv.ts; + + // increase view count: + prereg._loadCount += (visitor.captcha == 'Y' ? 0 : 1); + //prereg._tickCount += 1; // update referrer state: visitor._hasReferrer = visitor._hasReferrer || @@ -458,7 +504,11 @@ BotMon.live = { prereg = model._makePageView(dat, type); visitor._pageViews.push(prereg); } + // update the page view: prereg._tickCount += 1; + if (dat.captcha) { + prereg._captcha += dat.captcha; + } }, // updating visit data from the ticker log: @@ -473,8 +523,8 @@ BotMon.live = { // find the visit info: let visitor = model.findVisitor(dat, type); if (!visitor) { - console.info(`No visitor with ID “${dat.id}” found, registering as a new one.`); - visitor = model.registerVisit(dat, type); + console.info(`Botmon: No visitor with ID “${dat.id}” found, registering as a new one.`); + visitor = model.registerVisit(dat, type, true); } if (visitor) { // update visitor: @@ -484,7 +534,7 @@ BotMon.live = { // get the page view info: let pv = model._getPageView(visitor, dat); if (!pv) { - console.info(`No page view for visit ID “${dat.id}”, page “${dat.pg}”, registering a new one.`); + console.info(`Botmon: No page view for visit ID “${dat.id}”, page “${dat.pg}”, registering a new one.`); pv = model._makePageView(dat, type); visitor._pageViews.push(pv); } @@ -499,15 +549,14 @@ BotMon.live = { // helper function to create a new "page view" item: _makePageView: function(data, type) { - // console.info('_makePageView', data); + //console.info('_makePageView', data); // try to parse the referrer: let rUrl = null; try { rUrl = ( data.ref && data.ref !== '' ? new URL(data.ref) : null ); } catch (e) { - console.warn(`Invalid referer: “${data.ref}”.`); - console.info(data); + console.info(`Botmon: Ignoring invalid referer: “${data.ref}”.`); } return { @@ -520,9 +569,27 @@ BotMon.live = { _lastSeen: data.ts, _seenBy: [type], _jsClient: ( type !== BM_LOGTYPE.SERVER), - _viewCount: 1, - _tickCount: 0 + _agent: data.agent, + _viewCount: 0, + _loadCount: 0, + _tickCount: 0, + _captcha: data.captcha ? data.captcha : 'X' }; + }, + + // helper function to make a human-readable title from the Captcha statuses: + _makeCaptchaTitle: function(cObj) { + const cStr = cObj._str(); + switch (cStr) { + case 'Y': return "Blocked."; + case 'YY': return "Blocked multiple times."; + case 'YN': return "Solved"; + case 'YYN': return "Solved after multiple attempts"; + case 'W': return "Whitelisted"; + case 'H': return "HEAD request, no captcha"; + case 'YH': case 'YYH': return "Block & HEAD mixed"; + default: return "Undefined: " + cStr; + } } }, @@ -538,14 +605,37 @@ BotMon.live = { // data storage: data: { - totalVisits: 0, - totalPageViews: 0, - humanPageViews: 0, - bots: { - known: 0, + visits: { + bots: 0, suspected: 0, - human: 0, - users: 0 + humans: 0, + users: 0, + total: 0 + }, + views: { + bots: 0, + suspected: 0, + humans: 0, + users: 0, + total: 0 + }, + loads: { + bots: 0, + suspected: 0, + humans: 0, + users: 0, + total: 0 + }, + captcha: { + bots_blocked: 0, + bots_passed: 0, + bots_whitelisted: 0, + humans_blocked: 0, + humans_passed: 0, + humans_whitelisted: 0, + sus_blocked: 0, + sus_passed: 0, + sus_whitelisted: 0 } }, @@ -563,6 +653,7 @@ BotMon.live = { // shortcut to make code more readable: const model = BotMon.live.data.model; + const data = BotMon.live.data.analytics.data; const me = BotMon.live.data.analytics; BotMon.live.gui.status.showBusy("Analysing data …"); @@ -570,21 +661,39 @@ BotMon.live = { // loop over all visitors: model._visitors.forEach( (v) => { - // count visits and page views: - this.data.totalVisits += 1; - this.data.totalPageViews += v._pageViews.length; - + const captchaStr = v._captcha._str().replaceAll(/[^YNW]/g, ''); + + // count total visits and page views: + data.visits.total += 1; + data.loads.total += v._loadCount; + data.views.total += v._viewCount; + // check for typical bot aspects: let botScore = 0; if (v._type == BM_USERTYPE.KNOWN_BOT) { // known bots - this.data.bots.known += v._pageViews.length; this.groups.knownBots.push(v); + if (v._seenBy.indexOf(BM_LOGTYPE.SERVER) > -1) { // not for ghost items! + data.visits.bots += 1; + data.views.bots += v._viewCount; + + // captcha counter + if (captchaStr.indexOf('YN') > -1) { + data.captcha.bots_passed += 1; + } else if (captchaStr.indexOf('Y') > -1) { + data.captcha.bots_blocked += 1; + } + if (captchaStr.indexOf('W') > -1) { + data.captcha.bots_whitelisted += 1; + } + } + } else if (v._type == BM_USERTYPE.KNOWN_USER) { // known users */ - this.data.bots.users += v._pageViews.length; + data.visits.users += 1; + data.views.users += v._viewCount; this.groups.users.push(v); } else { @@ -595,30 +704,68 @@ BotMon.live = { v._botVal = e.val; if (e.isBot) { // likely bots + v._type = BM_USERTYPE.LIKELY_BOT; - this.data.bots.suspected += v._pageViews.length; this.groups.suspectedBots.push(v); + + if (v._seenBy.indexOf(BM_LOGTYPE.SERVER) > -1) { // not for ghost items! + + data.visits.suspected += 1; + data.views.suspected += v._viewCount; + + // captcha counter + if (captchaStr.indexOf('YN') > -1) { + data.captcha.sus_passed += 1; + } else if (captchaStr.indexOf('Y') > -1) { + data.captcha.sus_blocked += 1; + } + if (captchaStr.indexOf('W') > -1) { + data.captcha.sus_whitelisted += 1; + } + } + } else { // probably humans + v._type = BM_USERTYPE.PROBABLY_HUMAN; - this.data.bots.human += v._pageViews.length; this.groups.humans.push(v); + + if (v._seenBy.indexOf(BM_LOGTYPE.SERVER) > -1) { // not for ghost items! + data.visits.humans += 1; + data.views.humans += v._viewCount; + + // captcha counter + if (captchaStr.indexOf('YN') > -1) { + data.captcha.humans_passed += 1; + } else if (captchaStr.indexOf('Y') > -1) { + data.captcha.humans_blocked += 1; + } + if (captchaStr.indexOf('W') > -1) { + data.captcha.humans_whitelisted += 1; + } + } } } // perform actions depending on the visitor type: if (v._type == BM_USERTYPE.KNOWN_BOT ) { /* known bots only */ + // no specific actions here. + } else if (v._type == BM_USERTYPE.LIKELY_BOT) { /* probable bots only */ // add bot views to IP range information: - me.addToIpRanges(v); + if (v.ip) { + me.addToIpRanges(v); + } else { + console.log(v); + } - } else { /* humans only */ + } else { /* registered users and probable humans */ // add browser and platform statistics: me.addBrowserPlatform(v); - // add + // add to referrer and pages lists: v._pageViews.forEach( pv => { me.addToRefererList(pv._ref); me.addToPagesList(pv.pg); @@ -640,7 +787,7 @@ BotMon.live = { //console.log(BotMon.live.data.analytics.groups.knownBots); let botsList = BotMon.live.data.analytics.groups.knownBots.toSorted( (a, b) => { - return b._pageViews.length - a._pageViews.length; + return b._viewCount - a._viewCount; }); const other = { @@ -659,12 +806,12 @@ BotMon.live = { rList.push({ id: it._bot.id, name: (it._bot.n ? it._bot.n : it._bot.id), - count: it._pageViews.length + count: it._viewCount }); } else { other.count += it._pageViews.length; }; - total += it._pageViews.length; + total += it._viewCount; } }; @@ -885,7 +1032,7 @@ BotMon.live = { arr = me._countries.bot; break; default: - console.warn(`Unknown user type ${type} in function addToCountries.`); + console.warn(`Botmon: Unknown user type ${type} in function addToCountries.`); } if (arr) { @@ -925,7 +1072,7 @@ BotMon.live = { arr = me._countries.bot; break; default: - console.warn(`Unknown user type ${type} in function getCountryList.`); + console.warn(`Botmon: Unknown user type ${type} in function getCountryList.`); return; } @@ -997,7 +1144,7 @@ BotMon.live = { const list = me.groups[type]; list.forEach(it => { - bounces += (it._pageViews.length <= 1 ? 1 : 0); + bounces += (it._viewCount <= 1 ? 1 : 0); }); return bounces; @@ -1032,20 +1179,19 @@ BotMon.live = { } else { // no known IP range, let's collect necessary information: - // collect basic IP address info: if (ipType == BM_IPVERSION.IPv6) { ipSeg = ipAddr.split(':'); const prefix = v.ip.split(':').slice(0, kIP6Segments).join(':'); rawIP = ipSeg.slice(0, kIP6Segments).join(':'); ipGroup = 'ip6-' + rawIP.replaceAll(':', '-'); - ipName = prefix + '::' + '/' + (16 * kIP6Segments); + ipName = prefix + '::'; // + '/' + (16 * kIP6Segments); } else { ipSeg = ipAddr.split('.'); const prefix = v.ip.split('.').slice(0, kIP4Segments).join('.'); rawIP = ipSeg.slice(0, kIP4Segments).join('.') ; ipGroup = 'ip4-' + rawIP.replaceAll('.', '-'); - ipName = prefix + '.x.x.x'.substring(0, 1+(4-kIP4Segments)*2) + '/' + (8 * kIP4Segments); + ipName = prefix + '.x.x.x'.substring(0, 1+(4-kIP4Segments)*2); // + '/' + (8 * kIP4Segments); } } @@ -1085,7 +1231,7 @@ BotMon.live = { } // add to counter: - ipRec.count += v._pageViews.length; + ipRec.count += v._viewCount; }, @@ -1513,19 +1659,20 @@ BotMon.live = { const pId = ( visitor._platform ? visitor._platform.id : ''); - if (visitor._platform.id == null) console.log(visitor._platform); + //if (visitor._platform.id == null) console.log(visitor._platform); return platforms.includes(pId); }, // are there at lest num pages loaded? smallPageCount: function(visitor, num) { - return (visitor._pageViews.length <= Number(num)); + return (visitor._viewCount <= Number(num)); }, // There was no entry in a specific log file for this visitor: // note that this will also trigger the "noJavaScript" rule: noRecord: function(visitor, type) { + if (!visitor._seenBy.includes('srv')) return false; // only if 'srv' is also specified! return !visitor._seenBy.includes(type); }, @@ -1571,14 +1718,17 @@ BotMon.live = { fromKnownBotIP: function(visitor) { //console.info('fromKnownBotIP()', visitor.ip); - const ipInfo = BotMon.live.data.ipRanges.match(visitor.ip); + return visitor.hasOwnProperty('_ipRange'); + }, - if (ipInfo) { - visitor._ipInKnownBotRange = true; - visitor._ipRange = ipInfo; + // is the IP address from a specifin known ISP network + fromISPRange: function(visitor, ...isps) { + if (visitor.hasOwnProperty('_ipRange')) { + if (isps.indexOf(visitor._ipRange.g) > -1) { + return true; + } } - - return (ipInfo !== null); + return false; }, // is the page language mentioned in the client's accepted languages? @@ -1613,7 +1763,7 @@ BotMon.live = { // At least x page views were recorded, but they come within less than y seconds loadSpeed: function(visitor, minItems, maxTime) { - if (visitor._pageViews.length >= minItems) { + if (visitor._viewCount >= minItems) { //console.log('loadSpeed', visitor._pageViews.length, minItems, maxTime); const pvArr = visitor._pageViews.map(pv => pv._lastSeen).sort(); @@ -1623,8 +1773,6 @@ BotMon.live = { totalTime += (pvArr[i] - pvArr[i-1]); } - //console.log(' ', totalTime , Math.round(totalTime / (pvArr.length * 1000)), (( totalTime / pvArr.length ) <= maxTime * 1000), visitor.ip); - return (( totalTime / pvArr.length ) <= maxTime * 1000); } }, @@ -1647,6 +1795,16 @@ BotMon.live = { return (countries.indexOf(visitor.geo) < 0); } return false; + }, + + // Check if visitor never went beyond a captcha + blockedByCaptcha: function(visitor) { + return (visitor._captcha.Y > 0 && visitor._captcha.N === 0); + }, + + // Check if visitor came from a whitelisted IP-address + whitelistedByCaptcha: function(visitor) { + return (visitor._captcha.W > 0); } } }, @@ -1704,7 +1862,7 @@ BotMon.live = { switch (type) { case "srv": typeName = "Server"; - columns = ['ts','ip','pg','id','typ','usr','agent','ref','lang','accept','geo']; + columns = ['ts','ip','pg','id','typ','usr','agent','ref','lang','accept','geo','captcha','method']; break; case "log": typeName = "Page load"; @@ -1715,7 +1873,7 @@ BotMon.live = { columns = ['ts','ip','pg','id','agent']; break; default: - console.warn(`Unknown log type ${type}.`); + console.warn(`Botmon: Unknown log type ${type} in function “loadLogFile” (1).`); return; } @@ -1742,8 +1900,12 @@ BotMon.live = { } logtxt.split('\n').forEach((line) => { - if (line.trim() === '') return; // skip empty lines + + const line2 = line.replaceAll(new RegExp('[\x00-\x1F]','g'), "\u{FFFD}").trim(); + if (line2 === '') return; // skip empty lines + const cols = line.split('\t'); + if (cols.length == 1) return // assign the columns to an object: const data = {}; @@ -1767,7 +1929,7 @@ BotMon.live = { BotMon.live.data.model.updateTicks(data); break; default: - console.warn(`Unknown log type ${type}.`); + console.warn(`Botmon: Unknown log type ${type} in function “loadLogFile” (2).`); return; } }); @@ -1867,18 +2029,19 @@ BotMon.live = { */ make: function() { - const data = BotMon.live.data.analytics.data; - const maxItemsPerList = 5; // how many list items to show? + const useCaptcha = BMSettings.useCaptcha || false; const kNoData = '–'; // shown when data is missing + const kSeparator = ' / '; - // shortcut for neater code: + // shortcuts for neater code: const makeElement = BotMon.t._makeElement; + const data = BotMon.live.data.analytics.data; const botsVsHumans = document.getElementById('botmon__today__botsvshumans'); if (botsVsHumans) { - botsVsHumans.appendChild(makeElement('dt', {}, "Page views")); + botsVsHumans.appendChild(makeElement('dt', {}, "Bot statistics")); for (let i = 0; i <= 5; i++) { const dd = makeElement('dd'); @@ -1886,31 +2049,31 @@ BotMon.live = { let value = ''; switch(i) { case 0: - title = "Known bots:"; - value = data.bots.known || kNoData; + title = "Known bots visits:"; + value = data.visits.bots || kNoData; break; case 1: - title = "Suspected bots:"; - value = data.bots.suspected || kNoData; + title = "Suspected bots visits:"; + value = data.visits.suspected || kNoData; break; case 2: - title = "Probably humans:"; - value = data.bots.human || kNoData; + title = "Bots-humans ratio visits:"; + value = BotMon.t._getRatio(data.visits.suspected + data.visits.bots, data.visits.users + data.visits.humans, 100); break; case 3: - title = "Registered users:"; - value = data.bots.users || kNoData; + title = "Known bots views:"; + value = data.views.bots || kNoData; break; case 4: - title = "Total:"; - value = data.totalPageViews || kNoData; + title = "Suspected bots views:"; + value = data.views.suspected || kNoData; break; case 5: - title = "Bots-humans ratio:"; - value = BotMon.t._getRatio(data.bots.suspected + data.bots.known, data.bots.users + data.bots.human, 100); + title = "Bots-humans ratio views:"; + value = BotMon.t._getRatio(data.views.suspected + data.views.bots, data.views.users + data.views.humans, 100); break; default: - console.warn(`Unknown list type ${i}.`); + console.warn(`Botmon: Unknown list type ${i} in function “overview.make” (1).`); } dd.appendChild(makeElement('span', {}, title)); dd.appendChild(makeElement('strong', {}, value)); @@ -1927,7 +2090,7 @@ BotMon.live = { botList.forEach( (botInfo) => { const bli = makeElement('dd'); bli.appendChild(makeElement('span', {'class': 'has_icon bot bot_' + botInfo.id }, botInfo.name)); - bli.appendChild(makeElement('span', {'class': 'count' }, botInfo.count)); + bli.appendChild(makeElement('span', {'class': 'count' }, botInfo.count || kNoData)); botElement.append(bli) }); } @@ -1938,11 +2101,10 @@ BotMon.live = { botIps.appendChild(makeElement('dt', {}, "Top bot Networks")); const ispList = BotMon.live.data.analytics.getTopBotISPs(5); - //console.log(ispList); ispList.forEach( (netInfo) => { const li = makeElement('dd'); li.appendChild(makeElement('span', {'class': 'has_icon ipaddr ip' + netInfo.typ }, netInfo.name)); - li.appendChild(makeElement('span', {'class': 'count' }, netInfo.count)); + li.appendChild(makeElement('span', {'class': 'count' }, netInfo.count || kNoData)); botIps.append(li) }); } @@ -1955,7 +2117,7 @@ BotMon.live = { countryList.forEach( (cInfo) => { const cLi = makeElement('dd'); cLi.appendChild(makeElement('span', {'class': 'has_icon country ctry_' + cInfo.id.toLowerCase() }, cInfo.name)); - cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count)); + cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count || kNoData)); botCountries.appendChild(cLi); }); } @@ -1964,37 +2126,41 @@ BotMon.live = { const wmoverview = document.getElementById('botmon__today__wm_overview'); if (wmoverview) { - const humanVisits = BotMon.live.data.analytics.groups.users.length + BotMon.live.data.analytics.groups.humans.length; + const humanVisits = data.visits.users + data.visits.humans; const bounceRate = Math.round(100 * (BotMon.live.data.analytics.getBounceCount('users') + BotMon.live.data.analytics.getBounceCount('humans')) / humanVisits); wmoverview.appendChild(makeElement('dt', {}, "Humans’ metrics")); - for (let i = 0; i <= 4; i++) { + for (let i = 0; i <= 5; i++) { const dd = makeElement('dd'); let title = ''; let value = ''; switch(i) { case 0: - title = "Registered users’ page views:"; - value = data.bots.users || kNoData; + title = "Registered users visits:"; + value = data.visits.users || kNoData; break; case 1: - title = "“Probably humans” page views:"; - value = data.bots.human || kNoData; + title = "Registered users views:"; + value = data.views.users || kNoData; break; case 2: - title = "Total human page views:"; - value = (data.bots.users + data.bots.human) || kNoData; + title = "Probably humans visits:"; + value = data.visits.humans || kNoData; break; case 3: - title = "Total human visits:"; - value = humanVisits || kNoData; + title = "Probably humans views:"; + value = data.views.humans || kNoData; break; case 4: + title = "Total human visits / views"; + value = (data.visits.users + data.visits.humans || kNoData) + kSeparator + ((data.views.users + data.views.humans) || kNoData); + break; + case 5: title = "Humans’ bounce rate:"; value = bounceRate + '%'; break; default: - console.warn(`Unknown list type ${i}.`); + console.warn(`Botmon: Unknown list type ${i} in function “overview.make” (2).`); } dd.appendChild(makeElement('span', {}, title)); dd.appendChild(makeElement('strong', {}, value)); @@ -2050,7 +2216,7 @@ BotMon.live = { usrCtryList.forEach( (cInfo) => { const cLi = makeElement('dd'); cLi.appendChild(makeElement('span', {'class': 'has_icon country ctry_' + cInfo.id.toLowerCase() }, cInfo.name)); - cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count)); + cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count || kNoData)); usrCountries.appendChild(cLi); }); } @@ -2074,7 +2240,7 @@ BotMon.live = { pgDd.appendChild(makeElement('span', { 'class': 'count', 'title': pgInfo.count + " page views" - }, pgInfo.count)); + }, pgInfo.count || kNoData)); wmpages.appendChild(pgDd); }); } @@ -2099,6 +2265,131 @@ BotMon.live = { }); } } + + // Update Captcha statistics: + const captchaStatsBlock = document.getElementById('botmon__today__captcha'); + if (captchaStatsBlock) { + + // first column: + const captchaHumans = document.getElementById('botmon__today__cp_humans'); + if (captchaHumans) { + captchaHumans.appendChild(makeElement('dt', {}, "Probably humans:")); + + for (let i = 0; i <= 4; i++) { + const dd = makeElement('dd'); + let title = ''; + let value = ''; + switch(i) { + case 0: + title = "Solved:"; + value = data.captcha.humans_passed; + break; + case 1: + title = "Blocked:"; + value = data.captcha.humans_blocked; + break; + case 2: + title = "Whitelisted:"; + value = data.captcha.humans_whitelisted; + break; + case 3: + title = "Total visits:"; + value = data.visits.humans; + break; + case 4: + title = "Pct. blocked:"; + value = (data.captcha.humans_blocked / data.visits.humans * 100).toFixed(0) + '%'; + break; + default: + console.warn(`Botmon: Unknown list type ${i} in function “overview.make” (3).`); + } + dd.appendChild(makeElement('span', {}, title)); + dd.appendChild(makeElement('strong', {}, value || kNoData)); + captchaHumans.appendChild(dd); + } + + } + + // second column: + const captchaSus = document.getElementById('botmon__today__cp_sus'); + if (captchaSus) { + captchaSus.appendChild(makeElement('dt', {}, "Suspected bots:")); + + for (let i = 0; i <= 4; i++) { + const dd = makeElement('dd'); + let title = ''; + let value = ''; + switch(i) { + case 0: + title = "Solved:"; + value = data.captcha.sus_passed; + break; + case 1: + title = "Blocked:"; + value = data.captcha.sus_blocked; + break; + case 2: + title = "Whitelisted:"; + value = data.captcha.sus_whitelisted; + break; + case 3: + title = "Total visits:"; + value = data.visits.suspected; + break; + case 4: + title = "Pct. blocked:"; + value = (data.captcha.sus_blocked / data.visits.suspected * 100).toFixed(0) + '%'; + break; + default: + console.warn(`Botmon: Unknown list type ${i} in function “BotMon.live.gui.overview.make” (4).`); + } + dd.appendChild(makeElement('span', {}, title)); + dd.appendChild(makeElement('strong', {}, value || kNoData)); + captchaSus.appendChild(dd); + } + + } + + // Third column: + const captchaBots = document.getElementById('botmon__today__cp_bots'); + if (captchaBots) { + captchaBots.appendChild(makeElement('dt', {}, "Known bots:")); + + for (let i = 0; i <= 4; i++) { + const dd = makeElement('dd'); + let title = ''; + let value = ''; + switch(i) { + case 0: + title = "Solved:"; + value = data.captcha.bots_passed; + break; + case 1: + title = "Blocked:"; + value = data.captcha.bots_blocked; + break; + case 2: + title = "Whitelisted:"; + value = data.captcha.bots_whitelisted; + break; + case 3: + title = "Total visits:"; + value = data.visits.bots; + break; + case 4: + title = "Pct. blocked:"; + value = (data.captcha.bots_blocked / data.visits.bots * 100).toFixed(0) + '%'; + break; + default: + console.warn(`Botmon: Unknown list type ${i} in function “BotMon.live.gui.overview.make” (5).`); + } + dd.appendChild(makeElement('span', {}, title)); + dd.appendChild(makeElement('strong', {}, value || kNoData)); + captchaBots.appendChild(dd); + } + + } + } } }, @@ -2118,7 +2409,7 @@ BotMon.live = { }, setError: function(txt) { - console.error(txt); + console.error('Botmon:', txt); BotMon.live.gui.status._errorCount += 1; const el = document.getElementById('botmon__today__status'); if (el) { @@ -2183,7 +2474,7 @@ BotMon.live = { infolink = 'https://leib.be/sascha/projects/dokuwiki/botmon/info/known_bots'; break; default: - console.warn('Unknown list number.'); + console.warn(`Botmon: Unknown list number. ${i} in function “lists.init”.`); } const details = makeElement('details', { @@ -2236,9 +2527,11 @@ BotMon.live = { }, _makeVisitorItem: function(data, type) { + //console.info('BotMon.live.gui.lists._makeVisitorItem()', data, type); - // shortcut for neater code: + // shortcuts for neater code: const make = BotMon.t._makeElement; + const model = BotMon.live.data.model; let ipType = ( data.ip.indexOf(':') >= 0 ? '6' : '4' ); if (data.ip == '127.0.0.1' || data.ip == '::1' ) ipType = '0'; @@ -2248,6 +2541,10 @@ BotMon.live = { const sumClass = ( !data._seenBy || data._seenBy.indexOf(BM_LOGTYPE.SERVER) < 0 ? 'noServer' : 'hasServer'); + // combine with other networks? + const combineNets = (BMSettings.hasOwnProperty('combineNets') ? BMSettings['combineNets'] : true) + && data.hasOwnProperty('_ipRange'); + const li = make('li'); // root list item const details = make('details'); const summary = make('summary', { @@ -2257,18 +2554,6 @@ BotMon.live = { const span1 = make('span'); /* left-hand group */ - if (data._type !== BM_USERTYPE.KNOWN_BOT) { /* No platform/client for bots */ - span1.appendChild(make('span', { /* Platform */ - 'class': 'icon_only platform pf_' + (data._platform ? data._platform.id : 'unknown'), - 'title': "Platform: " + platformName - }, platformName)); - - span1.appendChild(make('span', { /* Client */ - 'class': 'icon_only client client cl_' + (data._client ? data._client.id : 'unknown'), - 'title': "Client: " + clientName - }, clientName)); - } - // identifier: if (data._type == BM_USERTYPE.KNOWN_BOT) { /* Bot only */ @@ -2287,32 +2572,28 @@ BotMon.live = { } else { /* others */ - - /*span1.appendChild(make('span', { // IP-Address - 'class': 'has_icon ipaddr ip' + ipType, - 'title': "IP-Address: " + data.ip - }, data.ip));*/ + if (combineNets) { - span1.appendChild(make('span', { /* Internal ID */ - 'class': 'has_icon session typ_' + data.typ, - 'title': "ID: " + data.id - }, data.id)); + const ispName = BotMon.live.data.ipRanges.getOwner( data._ipRange.g ) || data._ipRange.g; + + span1.appendChild(make('span', { // IP-Address + 'class': 'has_icon ipaddr ipnet', + 'title': "IP-Range: " + data._ipRange.g + }, ispName)); + + } else { + + span1.appendChild(make('span', { // IP-Address + 'class': 'has_icon ipaddr ip' + ipType, + 'title': "IP-Address: " + data.ip + }, data.ip)); + } } - // seen by icon: - span1.appendChild(make('span', { - 'class': 'icon_only seenby sb_' + data._seenBy.join(''), - 'title': "Seen by: " + data._seenBy.join('+') - }, data._seenBy.join(', '))); - - // country flag: - if (data.geo && data.geo !== 'ZZ') { - span1.appendChild(make('span', { - 'class': 'icon_only country ctry_' + data.geo.toLowerCase(), - 'data-ctry': data.geo, - 'title': "Country: " + ( data._country || "Unknown") - }, ( data._country || "Unknown") )); - } + span1.appendChild(make('span', { /* page views */ + 'class': 'has_icon pageseen', + 'title': data._pageViews.length + " page load(s)" + }, data._pageViews.length)); // referer icons: if ((data._type == BM_USERTYPE.PROBABLY_HUMAN || data._type == BM_USERTYPE.LIKELY_BOT) && data.ref) { @@ -2326,15 +2607,29 @@ BotMon.live = { summary.appendChild(span1); const span2 = make('span'); /* right-hand group */ - span2.appendChild(make('span', { /* first-seen */ - 'class': 'has_iconfirst-seen', - 'title': "First seen: " + data._firstSeen.toLocaleString() + " UTC" - }, BotMon.t._formatTime(data._firstSeen))); + // country flag (not for combined networks): + if (!combineNets && data.geo && data.geo !== 'ZZ') { + span2.appendChild(make('span', { + 'class': 'icon_only country ctry_' + data.geo.toLowerCase(), + 'data-ctry': data.geo, + 'title': "Country: " + ( data._country || "Unknown") + }, ( data._country || "Unknown") )); + } - span2.appendChild(make('span', { /* page views */ - 'class': 'has_icon pageviews', - 'title': data._pageViews.length + " page view(s)" - }, data._pageViews.length)); + span2.appendChild(make('span', { // seen-by icon: + 'class': 'icon_only seenby sb_' + data._seenBy.join(''), + 'title': "Seen by: " + data._seenBy.join('+') + }, data._seenBy.join(', '))); + + // captcha status: + const cCode = ( data._captcha ? data._captcha._str() : ''); + if (cCode !== '') { + const cTitle = model._makeCaptchaTitle(data._captcha) + span2.appendChild(make('span', { // captcha status + 'class': 'icon_only captcha cap_' + cCode, + 'title': "Captcha-status: " + cTitle + }, cTitle)); + } summary.appendChild(span2); @@ -2347,13 +2642,15 @@ BotMon.live = { _makeVisitorDetails: function(data, type) { - // shortcut for neater code: + // shortcuts for neater code: const make = BotMon.t._makeElement; + const model = BotMon.live.data.model; let ipType = ( data.ip.indexOf(':') >= 0 ? '6' : '4' ); if (data.ip == '127.0.0.1' || data.ip == '::1' ) ipType = '0'; const platformName = (data._platform ? data._platform.n : 'Unknown'); const clientName = (data._client ? data._client.n: 'Unknown'); + const combinedItem = type == 'knownBots' || data.hasOwnProperty('_ipRange'); const dl = make('dl', {'class': 'visitor_details'}); @@ -2373,7 +2670,10 @@ BotMon.live = { } - } else { /* not for bots */ + dl.appendChild(make('dt', {}, "User-Agent:")); + dl.appendChild(make('dd', {'class': 'agent'}, data.agent)); + + } else if (!combinedItem) { /* not for bots or combined items */ dl.appendChild(make('dt', {}, "Client:")); /* client */ dl.appendChild(make('dd', {'class': 'has_icon client cl_' + (data._client ? data._client.id : 'unknown')}, @@ -2383,26 +2683,41 @@ BotMon.live = { dl.appendChild(make('dd', {'class': 'has_icon platform pf_' + (data._platform ? data._platform.id : 'unknown')}, platformName + ( data._platform.v > 0 ? ' (' + data._platform.v + ')' : '' ) )); - /*dl.appendChild(make('dt', {}, "ID:")); - dl.appendChild(make('dd', {'class': 'has_icon ip' + data.typ}, data.id));*/ - } + dl.appendChild(make('dt', {}, "IP-Address:")); + const ipItem = make('dd', {'class': 'has_icon ipaddr ip' + ipType}); + ipItem.appendChild(make('span', {'class': 'address'} , data.ip)); + ipItem.appendChild(make('a', { + 'class': 'icon_only extlink ipinfo', + 'href': `https://ipinfo.io/${encodeURIComponent(data.ip)}`, + 'target': 'ipinfo', + 'title': "View this address on IPInfo.io" + } , "DNS Info")); + ipItem.appendChild(make('a', { + 'class': 'icon_only extlink abuseipdb', + 'href': `https://www.abuseipdb.com/check/${encodeURIComponent(data.ip)}`, + 'target': 'abuseipdb', + 'title': "Check this address on AbuseIPDB.com" + } , "Check on AbuseIPDB")); + dl.appendChild(ipItem); - dl.appendChild(make('dt', {}, "IP-Address:")); - const ipItem = make('dd', {'class': 'has_icon ipaddr ip' + ipType}); - ipItem.appendChild(make('span', {'class': 'address'} , data.ip)); - ipItem.appendChild(make('a', { - 'class': 'icon_only extlink ipinfo', - 'href': `https://ipinfo.io/${encodeURIComponent(data.ip)}`, - 'target': 'ipinfo', - 'title': "View this address on IPInfo.io" - } , "DNS Info")); - ipItem.appendChild(make('a', { - 'class': 'icon_only extlink abuseipdb', - 'href': `https://www.abuseipdb.com/check/${encodeURIComponent(data.ip)}`, - 'target': 'abuseipdb', - 'title': "Check this address on AbuseIPDB.com" - } , "Check on AbuseIPDB")); - dl.appendChild(ipItem); + dl.appendChild(make('dt', {}, "User-Agent:")); + dl.appendChild(make('dd', {'class': 'agent'}, data.agent)); + + dl.appendChild(make('dt', {}, "Languages:")); + dl.appendChild(make('dd', {'class': 'langs'}, ` [${data.accept}]`)); + + dl.appendChild(make('dt', {}, "Session ID:")); + dl.appendChild(make('dd', {'class': 'has_icon session typ_' + data.typ}, data.id)); + + if (data.geo && data.geo !=='') { + dl.appendChild(make('dt', {}, "Location:")); + dl.appendChild(make('dd', { + 'class': 'has_icon country ctry_' + data.geo.toLowerCase(), + 'data-ctry': data.geo, + 'title': "Country: " + data._country + }, data._country + ' (' + data.geo + ')')); + } + } if (Math.abs(data._lastSeen - data._firstSeen) < 100) { dl.appendChild(make('dt', {}, "Seen:")); @@ -2414,10 +2729,15 @@ BotMon.live = { dl.appendChild(make('dd', {'class': 'lastSeen'}, data._lastSeen.toLocaleString())); } - dl.appendChild(make('dt', {}, "User-Agent:")); - dl.appendChild(make('dd', {'class': 'agent'}, data.agent)); + dl.appendChild(make('dt', {}, "Actions:")); - if (data.ref && data.ref !== '') { + dl.appendChild(make('dd', {'class': 'views'}, + "Page loads: " + data._loadCount.toString() + + ( data._captcha['Y'] > 0 ? ", captchas: " + data._captcha['Y'].toString() : '') + + ", views: " + data._viewCount.toString() + )); + + if (!combinedItem && data.ref && data.ref !== '') { dl.appendChild(make('dt', {}, "Referrer:")); const refInfo = BotMon.live.data.analytics.getRefererInfo(data.ref); @@ -2430,21 +2750,13 @@ BotMon.live = { }, data.ref)); } - dl.appendChild(make('dt', {}, "Languages:")); - dl.appendChild(make('dd', {'class': 'langs'}, ` [${data.accept}]`)); - - if (data.geo && data.geo !=='') { - dl.appendChild(make('dt', {}, "Location:")); + if (data.captcha && data.captcha !=='') { + dl.appendChild(make('dt', {}, "Captcha-status:")); dl.appendChild(make('dd', { - 'class': 'has_icon country ctry_' + data.geo.toLowerCase(), - 'data-ctry': data.geo, - 'title': "Country: " + data._country - }, data._country + ' (' + data.geo + ')')); + 'class': 'captcha' + }, model._makeCaptchaTitle(data._captcha))); } - dl.appendChild(make('dt', {}, "Session ID:")); - dl.appendChild(make('dd', {'class': 'has_icon session typ_' + data.typ}, data.id)); - dl.appendChild(make('dt', {}, "Seen by:")); dl.appendChild(make('dd', {'class': 'has_icon seenby sb_' + data._seenBy.join('')}, data._seenBy.join(', ') )); @@ -2455,7 +2767,7 @@ BotMon.live = { /* list all page views */ data._pageViews.sort( (a, b) => a._firstSeen - b._firstSeen ); data._pageViews.forEach( (page) => { - pageList.appendChild(BotMon.live.gui.lists._makePageViewItem(page)); + pageList.appendChild(BotMon.live.gui.lists._makePageViewItem(page, combinedItem, type)); }); pagesDd.appendChild(pageList); dl.appendChild(pagesDd); @@ -2463,7 +2775,7 @@ BotMon.live = { /* bot evaluation rating */ if (data._type !== BM_USERTYPE.KNOWN_BOT && data._type !== BM_USERTYPE.KNOWN_USER) { dl.appendChild(make('dt', undefined, "Bot rating:")); - dl.appendChild(make('dd', {'class': 'bot-rating'}, ( data._botVal ? data._botVal : '–' ) + ' (of ' + BotMon.live.data.rules._threshold + ')')); + dl.appendChild(make('dd', {'class': 'bot-rating'}, ( data._botVal ? data._botVal : '0' ) + ' (of ' + BotMon.live.data.rules._threshold + ')')); /* add bot evaluation details: */ if (data._eval) { @@ -2505,12 +2817,13 @@ BotMon.live = { dl.appendChild(evalDd); } } + // return the element to add to the UI: return dl; }, // make a page view item: - _makePageViewItem: function(page) { + _makePageViewItem: function(page, moreInfo, type) { //console.log("makePageViewItem:",page); // shortcut for neater code: @@ -2518,6 +2831,7 @@ BotMon.live = { // the actual list item: const pgLi = make('li'); + if (moreInfo) pgLi.classList.add('detailled'); const row1 = make('div', {'class': 'row'}); @@ -2528,12 +2842,18 @@ BotMon.live = { 'title': "PageID: " + page.pg }, page.pg)); /* DW Page ID */ - // get the time difference: - row1.appendChild(make('span', { - 'class': 'first-seen', - 'title': "First visited: " + page._firstSeen.toLocaleString() + " UTC" - }, BotMon.t._formatTime(page._firstSeen))); - + const rightGroup = row1.appendChild(make('div')); // right-hand group + + rightGroup.appendChild(make('span', { + 'class': 'first-seen', + 'title': "First visited: " + page._firstSeen.toLocaleString() + " UTC" + }, BotMon.t._formatTime(page._firstSeen))); + + + rightGroup.appendChild(make('span', { // captcha status + 'class': 'icon_only captcha cap_' + page._captcha, + }, page._captcha)); + pgLi.appendChild(row1); /* LINE 2 */ @@ -2543,31 +2863,74 @@ BotMon.live = { // page referrer: if (page._ref) { row2.appendChild(make('span', { - 'class': 'referer', - 'title': "Referrer: " + page._ref.href - }, page._ref.hostname)); + 'class': 'referer' + }, "Referrer: " + page._ref.hostname)); } else { row2.appendChild(make('span', { 'class': 'referer' }, "No referer")); } - // visit duration: - let visitTimeStr = "Bounce"; - const visitDuration = page._lastSeen.getTime() - page._firstSeen.getTime(); - if (visitDuration > 0) { - visitTimeStr = Math.floor(visitDuration / 1000) + "s"; - } - const tDiff = BotMon.t._formatTimeDiff(page._firstSeen, page._lastSeen); - if (tDiff) { - row2.appendChild(make('span', {'class': 'visit-length', 'title': 'Last seen: ' + page._lastSeen.toLocaleString()}, tDiff)); - } else { - row2.appendChild(make('span', { - 'class': 'bounce', - 'title': "Visitor bounced"}, "Bounce")); + const rightGroup2 = row2.appendChild(make('div')); // right-hand group + + // visit duration: + let visitTimeStr = "Bounce"; + const visitDuration = page._lastSeen.getTime() - page._firstSeen.getTime(); + if (visitDuration > 0) { + visitTimeStr = Math.floor(visitDuration / 1000) + "s"; + } + var tDiff = BotMon.t._formatTimeDiff(page._firstSeen, page._lastSeen); + if (tDiff) { + tDiff += " (" + page._tickCount.toString() + " ticks)"; + rightGroup2.appendChild(make('span', { + 'class': 'visit-length', + 'title': "Last seen: " + page._lastSeen.toLocaleString()}, + tDiff)); + } else { + rightGroup2.appendChild(make('span', { + 'class': 'bounce', + 'title': "Visitor bounced (no ticks)"}, + "Bounce")); + } + + pgLi.appendChild(row2); + + if (moreInfo) { /* LINE 3 */ + + const row3 = make('div', {'class': 'row'}); + + const leftGroup3 = row3.appendChild(make('div')); // left-hand group + + leftGroup3.appendChild(make('span', { + 'class': 'ip-address' + }, "IP: " + page.ip)); + + const rightGroup3 = row3.appendChild(make('div')); // right-hand group + + rightGroup3.appendChild(make('span', { + 'class': 'views' + }, page._loadCount.toString() + " loads, " + page._viewCount.toString() + " views")); + + + pgLi.appendChild(row3); + + /* LINE 4 */ + + if (type !== 'knownBots' && page._agent) { + const row4 = make('div', {'class': 'row'}); + row4.appendChild(make('span', { + 'class': 'user-agent' + }, "User-agent: " + page._agent)); + pgLi.appendChild(row4); } - pgLi.appendChild(row2); + /* LINE X (DEBUG ONLY!) + + const rowx = make('div', {'class': 'row'}); + rowx.appendChild(make('pre', {'style': 'white-space: normal;width:calc(100% - 24rem)'}, JSON.stringify(page))); + + pgLi.appendChild(rowx); */ + } return pgLi; } diff --git a/admin.php b/admin.php index a9ca24b..8fa5893 100644 --- a/admin.php +++ b/admin.php @@ -34,6 +34,7 @@ class admin_plugin_botmon extends AdminPlugin { // display GeoIP data? $geoIPconf = $this->getConf('geoiplib'); + $useCaptchaConf = ($this->getConf('useCaptcha') !== 'disabled'); $hasOldLogFiles = $this->hasOldLogFiles(); @@ -43,7 +44,7 @@ class admin_plugin_botmon extends AdminPlugin { $pluginPath = $conf['basedir'] . 'lib/plugins/' . $this->getPluginName(); /* Plugin Headline */ - echo '
+ echo NL . '

Bot Monitoring Plugin

+

Latest data

Loading …
- Overview + Bots overview
@@ -79,8 +87,18 @@ class admin_plugin_botmon extends AdminPlugin {
-
-
+
' . NL; + if ($useCaptchaConf) { + echo '
+ Captcha statistics +
+
+
+
+
+
' . NL; + } + echo '
Visitor logs
@@ -92,7 +110,7 @@ class admin_plugin_botmon extends AdminPlugin {
'; + echo DOKU_TAB . DOKU_TAB . '' . NL . DOKU_TAB . '' . NL; + echo '
'; } diff --git a/captcha.js b/captcha.js new file mode 100644 index 0000000..8a059e2 --- /dev/null +++ b/captcha.js @@ -0,0 +1,237 @@ +"use strict"; +/* DokuWiki BotMon Captcha JavaScript */ +/* 23.10.2025 - 0.1.2 - pre-release */ +/* Author: Sascha Leib */ + +const $BMCaptcha = { + + init: function() { + + // hide the NoJS warning: + document.getElementById('BM__NoJSWarning').close(); + + // install the captcha: + document.getElementsByTagName('body')[0].classList.add('botmon_captcha'); + $BMCaptcha._cbDly = 1.5; + $BMCaptcha.install() + }, + + install: function() { + + // localisation helper function: + let _loc = function(id, alt) { + if ($BMLocales && $BMLocales[id]) return $BMLocales[id]; + return alt; + } + + // find the parent element: + let bm_parent = document.getElementsByTagName('body')[0]; + + // create the dialog: + const dlg = document.createElement('dialog'); + dlg.setAttribute('closedby', 'none'); + dlg.setAttribute('open', 'open'); + dlg.setAttribute('role', 'alertdialog'); + dlg.setAttribute('aria-labelledby', 'botmon_captcha_title'); + dlg.classList.add('checking'); + dlg.id = 'botmon_captcha_box'; + dlg.innerHTML = '

' + _loc('dlgTitle', 'Title') + '

' + _loc('dlgSubtitle', 'Subtitle') + '

'; + + // Checkbox: + const lbl = document.createElement('label'); + lbl.setAttribute('aria-live', 'assertive'); + lbl.innerHTML = '' + _loc('dlgConfirm', "Confirm.") + '' + + '' + _loc('dlgChecking', "Checking") + '' + + '' + _loc('dlgLoading', "Loading") + '' + + '' + _loc('dlgError', "Error") + ''; + const cb = document.createElement('input'); + cb.setAttribute('type', 'checkbox'); + cb.setAttribute('disabled', 'disabled'); + cb.addEventListener('click', $BMCaptcha._cbCallback); + lbl.prepend(cb); + + dlg.appendChild(lbl); + + bm_parent.appendChild(dlg); + + // call the delayed callback in a couple of seconds: + $BMCaptcha._st = performance.now(); + setTimeout($BMCaptcha._delayedCallback, $BMCaptcha._cbDly * 1000); + }, + + /* creates a digest hash */ + digest: { + + /* simple SHA hash function - adapted from https://geraintluff.github.io/sha256/ */ + hash: function(ascii) { + + // shortcut: + const sha256 = $BMCaptcha.digest.hash; + + // helper function + const rightRotate = function(v, a) { + return (v>>>a) | (v<<(32 - a)); + }; + + var mathPow = Math.pow; + var maxWord = mathPow(2, 32); + var lengthProperty = 'length' + var i, j; + var result = '' + + var words = []; + var asciiBitLength = ascii[lengthProperty]*8; + + //* caching results is optional - remove/add slash from front of this line to toggle + // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes + // (we actually calculate the first 64, but extra values are just ignored) + var hash = sha256.h = sha256.h || []; + // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes + var k = sha256.k = sha256.k || []; + var primeCounter = k[lengthProperty]; + /*/ + var hash = [], k = []; + var primeCounter = 0; + //*/ + + var isComposite = {}; + for (var candidate = 2; primeCounter < 64; candidate++) { + if (!isComposite[candidate]) { + for (i = 0; i < 313; i += candidate) { + isComposite[i] = candidate; + } + hash[primeCounter] = (mathPow(candidate, .5)*maxWord)|0; + k[primeCounter++] = (mathPow(candidate, 1/3)*maxWord)|0; + } + } + + ascii += '\x80' // Append Ƈ' bit (plus zero padding) + while (ascii[lengthProperty]%64 - 56) ascii += '\x00' // More zero padding + for (i = 0; i < ascii[lengthProperty]; i++) { + j = ascii.charCodeAt(i); + if (j>>8) return; // ASCII check: only accept characters in range 0-255 + words[i>>2] |= j << ((3 - i)%4)*8; + } + words[words[lengthProperty]] = ((asciiBitLength/maxWord)|0); + words[words[lengthProperty]] = (asciiBitLength) + + // process each chunk + for (j = 0; j < words[lengthProperty];) { + var w = words.slice(j, j += 16); // The message is expanded into 64 words as part of the iteration + var oldHash = hash; + // This is now the undefinedworking hash", often labelled as variables a...g + // (we have to truncate as well, otherwise extra entries at the end accumulate + hash = hash.slice(0, 8); + + for (i = 0; i < 64; i++) { + var i2 = i + j; + // Expand the message into 64 words + // Used below if + var w15 = w[i - 15], w2 = w[i - 2]; + + // Iterate + var a = hash[0], e = hash[4]; + var temp1 = hash[7] + + (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) // S1 + + ((e&hash[5])^((~e)&hash[6])) // ch + + k[i] + // Expand the message schedule if needed + + (w[i] = (i < 16) ? w[i] : ( + w[i - 16] + + (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15>>>3)) // s0 + + w[i - 7] + + (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2>>>10)) // s1 + )|0 + ); + // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble + var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) // S0 + + ((a&hash[1])^(a&hash[2])^(hash[1]&hash[2])); // maj + + hash = [(temp1 + temp2)|0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice() + hash[4] = (hash[4] + temp1)|0; + } + + for (i = 0; i < 8; i++) { + hash[i] = (hash[i] + oldHash[i])|0; + } + } + + for (i = 0; i < 8; i++) { + for (j = 3; j + 1; j--) { + var b = (hash[i]>>(j*8))&255; + result += ((b < 16) ? 0 : '') + b.toString(16); + } + } + return result; + } + }, + + _cbCallback: function(e) { + if (e.target.checked) { + //document.getElementById('botmon_captcha_box').close(); + + try { + var $status = 'loading'; + + // generate the hash: + const dat = [ // the data to encode + document._botmon.seed || '', + location.hostname, + document._botmon.ip || '0.0.0.0', + (new Date()).toISOString().substring(0, 10) + ]; + if (performance.now() - $BMCaptcha._st <= 1500) dat.push(performance.now() - $BMCaptcha._st); + + // set the cookie: + document.cookie = "DWConfirm=" + encodeURIComponent($BMCaptcha.digest.hash(dat.join(';'))) + '; path=/; session;'; + // + (document.location.protocol === 'https:' ? ' secure;' : ''); + + } catch (err) { + console.error(err); + $status = 'error'; + } + + // change the interface: + const dlg = document.getElementById('botmon_captcha_box'); + if (dlg) { + dlg.classList.add( $status ); + dlg.classList.remove('ready'); + } + + // reload the page: + if ($status !== 'error')window.location.reload(true); + } + }, + + _delayedCallback: function() { + const dlg = document.getElementById('botmon_captcha_box'); + if (dlg) { + dlg.classList.add('ready'); + dlg.classList.remove('checking'); + + const input = dlg.getElementsByTagName('input')[0]; + if (input) { + input.removeAttribute('disabled'); + input.focus(); + setTimeout($BMCaptcha._autoCheck, 200, input); + } + } + }, + _cbDly: null, + _st: null, + + _autoCheck: function(e) { + + const bypass = ($BMConfig['captchaBypass'] || '').split(','); + var action = false; + + if (bypass.indexOf('langmatch') >= 0) { // Languages matching + const cntLangs = navigator.languages.map(lang => lang.split('-')[0]); + if (cntLangs.indexOf(document.documentElement.lang || 'en') >= 0) action = true; + } + + if (action) e.click(); // action! + } +} +// initialise the captcha module: +$BMCaptcha.init(); \ No newline at end of file diff --git a/conf/default.php b/conf/default.php index 1ba3fbd..9c196dd 100644 --- a/conf/default.php +++ b/conf/default.php @@ -5,4 +5,9 @@ * @author Sascha Leib */ +$conf['showday'] = 'today'; +$conf['combineNets'] = true; $conf['geoiplib'] = 'disabled'; +$conf['useCaptcha'] = 'disabled'; +$conf['captchaSeed'] = 'c53bc5f94929451987efa6c768d8856b'; +$conf['captchaBypass'] = ''; diff --git a/conf/metadata.php b/conf/metadata.php index 409716f..8ae3c4c 100644 --- a/conf/metadata.php +++ b/conf/metadata.php @@ -5,5 +5,21 @@ * @author Sascha Leib */ +// How to show data in the admin interface: +$meta['showday'] = array('multichoice', + '_choices' => array ('yesterday', 'today')); + +$meta['combineNets'] = array('onoff'); + +// Geolocation settings: $meta['geoiplib'] = array('multichoice', '_choices' => array ('disabled', 'phpgeoip')); + +// Captcha settings: +$meta['useCaptcha'] = array('multichoice', + '_choices' => array ('disabled', 'loremipsum', 'dada')); + +$meta['captchaSeed'] = array('string'); + +$meta['captchaBypass'] = array('multicheckbox', + '_choices' => array ('langmatch'), '_other' => 'exists'); diff --git a/config/default-config.json b/config/default-config.json index dbe7b86..0591c77 100644 --- a/config/default-config.json +++ b/config/default-config.json @@ -2,8 +2,8 @@ "threshold": 100, "rules": [ {"func": "fromKnownBotIP", - "id": "botIpRange", "desc": "Common Bot IP range", - "bot": 50 + "id": "knownIpRange", "desc": "From known IP range", + "bot": 40 }, {"func": "matchesClient", "params": ["aol","msie","ffold","chromeold","oldedge","operaold"], "id": "oldClient", "desc": "Obsolete browser version", @@ -41,7 +41,7 @@ "id": "susClient", "desc": "Client identifier that is popular with bot networks", "bot": 10 }, - {"func": "matchesClient", "params": ["undici","gohttp"], + {"func": "matchesClient", "params": ["undici","gohttp","python","wget","curl"], "id": "botClient", "desc": "Client identifier indicates web crawler", "bot": 100 }, @@ -57,9 +57,13 @@ "id": "impPC", "desc": "Impossible combination of platform and client", "bot": 70 }, + {"func": "loadSpeed", "params": [3, 10], + "id": "speedRun", "desc": "Average time between page loads is less than 10 seconds", + "bot": 30 + }, {"func": "loadSpeed", "params": [3, 20], "id": "speedRun", "desc": "Average time between page loads is less than 20 seconds", - "bot": 60 + "bot": 30 }, {"func": "noAcceptLang", "id": "noAcc", "desc": "No “Accept-Language” header", @@ -69,9 +73,13 @@ "id": "langMatch", "desc": "Client’s ‘Accept-Language’ header does not match the page language", "bot": 30 }, - {"func": "matchesClient", "params": ["whatsapp","applemsgs","goognblm","tiktok","meta","chatgpt","claude","perplexity"], - "id": "previewClient", "desc": "User-triggered bot load (e.g. preview)", - "bot": -120 + {"func": "blockedByCaptcha", "params": [], + "id": "blockedByCaptcha", "desc": "Visitor did not solve the captcha", + "bot": 50 + }, + {"func": "whitelistedByCaptcha", "params": [], + "id": "whitelistedByCaptcha", "desc": "Visitor uses a whitelisted IP address", + "bot": -30 } ] } \ No newline at end of file diff --git a/config/default-whitelist.txt b/config/default-whitelist.txt new file mode 100644 index 0000000..8d66153 --- /dev/null +++ b/config/default-whitelist.txt @@ -0,0 +1,354 @@ +# Internet Archive Bot Ranges +207.241.224.0 207.241.239.255 20 +207.241.224.0 207.241.224.255 24 +207.241.231.0 207.241.231.255 24 +207.241.234.0 207.241.234.255 24 +207.241.237.0 207.241.237.255 24 +208.70.24.0 208.70.31.255 21 + +# Bing Bot IP ranges - taken from https://www.bing.com/toolbox/bingbot.json +157.55.39.0 157.55.39.255 24 +207.46.13.0 207.46.13.255 24 +40.77.167.0 40.77.167.255 24 +13.66.139.0 13.66.139.255 24 +13.66.144.0 13.66.144.255 24 +52.167.144.0 52.167.144.255 24 +13.67.10.16 13.67.10.31 28 +13.69.66.240 13.69.66.255 28 +13.71.172.224 13.71.172.239 28 +139.217.52.0 139.217.52.15 28 +191.233.204.224 191.233.204.239 28 +20.36.108.32 20.36.108.47 28 +20.43.120.16 20.43.120.31 28 +40.79.131.208 40.79.131.223 28 +40.79.186.176 40.79.186.191 28 +52.231.148.0 52.231.148.15 28 +20.79.107.240 20.79.107.255 28 +51.105.67.0 51.105.67.15 28 +20.125.163.80 20.125.163.95 28 +40.77.188.0 40.77.188.255 22 +65.55.210.0 65.55.210.255 24 +199.30.24.0 199.30.24.255 23 +40.77.202.0 40.77.202.255 24 +40.77.139.0 40.77.139.127 25 +20.74.197.0 20.74.197.15 28 +20.15.133.160 20.15.133.191 27 +40.77.177.0 40.77.177.255 24 +40.77.178.0 40.77.178.255 23 + +# Google Bot IP ranges - taken from: https://developers.google.com/static/search/apis/ipranges/googlebot.json +192.178.4.0 192.178.4.32 27 +192.178.4.128 192.178.4.159 27 +192.178.4.160 192.178.4.191 27 +192.178.4.192 192.178.4.223 27 +192.178.4.32 192.178.4.63 27 +192.178.4.64 192.178.4.95 27 +192.178.4.96 192.178.4.127 27 +192.178.5.0 192.178.5.32 27 +192.178.6.0 192.178.6.32 27 +192.178.6.128 192.178.6.159 27 +192.178.6.160 192.178.6.191 27 +192.178.6.192 192.178.6.223 27 +192.178.6.224 192.178.6.255 27 +192.178.6.32 192.178.6.63 27 +192.178.6.64 192.178.6.95 27 +192.178.6.96 192.178.6.127 27 +192.178.7.0 192.178.7.32 27 +192.178.7.128 192.178.7.159 27 +192.178.7.160 192.178.7.191 27 +192.178.7.192 192.178.7.223 27 +192.178.7.224 192.178.7.255 27 +192.178.7.32 192.178.7.63 27 +192.178.7.64 192.178.7.95 27 +192.178.7.96 192.178.7.127 27 +34.100.182.96 34.100.182.111 28 +34.101.50.144 34.101.50.159 28 +34.118.254.0 34.118.254.15 28 +34.118.66.0 34.118.66.15 28 +34.126.178.96 34.126.178.111 28 +34.146.150.144 34.146.150.159 28 +34.147.110.144 34.147.110.159 28 +34.151.74.144 34.151.74.159 28 +34.152.50.64 34.152.50.79 28 +34.154.114.144 34.154.114.159 28 +34.155.98.32 34.155.98.47 28 +34.165.18.176 34.165.18.191 28 +34.175.160.64 34.175.160.79 28 +34.176.130.16 34.176.130.31 28 +34.22.85.0 34.22.85.32 27 +34.64.82.64 34.64.82.79 28 +34.65.242.112 34.65.242.127 28 +34.80.50.80 34.80.50.95 28 +34.88.194.0 34.88.194.15 28 +34.89.10.80 34.89.10.95 28 +34.89.198.80 34.89.198.95 28 +34.96.162.48 34.96.162.63 28 +35.247.243.240 35.247.243.255 28 +66.249.64.0 66.249.64.32 27 +66.249.64.128 66.249.64.159 27 +66.249.64.160 66.249.64.191 27 +66.249.64.192 66.249.64.223 27 +66.249.64.224 66.249.64.255 27 +66.249.64.32 66.249.64.63 27 +66.249.64.64 66.249.64.95 27 +66.249.64.96 66.249.64.127 27 +66.249.65.0 66.249.65.32 27 +66.249.65.128 66.249.65.159 27 +66.249.65.160 66.249.65.191 27 +66.249.65.192 66.249.65.223 27 +66.249.65.224 66.249.65.255 27 +66.249.65.32 66.249.65.63 27 +66.249.65.64 66.249.65.95 27 +66.249.65.96 66.249.65.127 27 +66.249.66.0 66.249.66.32 27 +66.249.66.128 66.249.66.159 27 +66.249.66.160 66.249.66.191 27 +66.249.66.192 66.249.66.223 27 +66.249.66.224 66.249.66.255 27 +66.249.66.32 66.249.66.63 27 +66.249.66.64 66.249.66.95 27 +66.249.66.96 66.249.66.127 27 +66.249.67.0 66.249.67.32 27 +66.249.67.32 66.249.67.63 27 +66.249.68.0 66.249.68.32 27 +66.249.68.128 66.249.68.159 27 +66.249.68.160 66.249.68.191 27 +66.249.68.192 66.249.68.223 27 +66.249.68.32 66.249.68.63 27 +66.249.68.64 66.249.68.95 27 +66.249.68.96 66.249.68.127 27 +66.249.69.0 66.249.69.32 27 +66.249.69.128 66.249.69.159 27 +66.249.69.160 66.249.69.191 27 +66.249.69.192 66.249.69.223 27 +66.249.69.224 66.249.69.255 27 +66.249.69.32 66.249.69.63 27 +66.249.69.64 66.249.69.95 27 +66.249.69.96 66.249.69.127 27 +66.249.70.0 66.249.70.32 27 +66.249.70.128 66.249.70.159 27 +66.249.70.160 66.249.70.191 27 +66.249.70.192 66.249.70.223 27 +66.249.70.224 66.249.70.255 27 +66.249.70.32 66.249.70.63 27 +66.249.70.64 66.249.70.95 27 +66.249.70.96 66.249.70.127 27 +66.249.71.0 66.249.71.32 27 +66.249.71.128 66.249.71.159 27 +66.249.71.160 66.249.71.191 27 +66.249.71.192 66.249.71.223 27 +66.249.71.224 66.249.71.255 27 +66.249.71.32 66.249.71.63 27 +66.249.71.64 66.249.71.95 27 +66.249.71.96 66.249.71.127 27 +66.249.72.0 66.249.72.32 27 +66.249.72.128 66.249.72.159 27 +66.249.72.160 66.249.72.191 27 +66.249.72.192 66.249.72.223 27 +66.249.72.224 66.249.72.255 27 +66.249.72.32 66.249.72.63 27 +66.249.72.64 66.249.72.95 27 +66.249.73.0 66.249.73.32 27 +66.249.73.128 66.249.73.159 27 +66.249.73.160 66.249.73.191 27 +66.249.73.192 66.249.73.223 27 +66.249.73.224 66.249.73.255 27 +66.249.73.32 66.249.73.63 27 +66.249.73.64 66.249.73.95 27 +66.249.73.96 66.249.73.127 27 +66.249.74.0 66.249.74.32 27 +66.249.74.128 66.249.74.159 27 +66.249.74.160 66.249.74.191 27 +66.249.74.192 66.249.74.223 27 +66.249.74.224 66.249.74.255 27 +66.249.74.32 66.249.74.63 27 +66.249.74.64 66.249.74.95 27 +66.249.74.96 66.249.74.127 27 +66.249.75.0 66.249.75.32 27 +66.249.75.128 66.249.75.159 27 +66.249.75.160 66.249.75.191 27 +66.249.75.192 66.249.75.223 27 +66.249.75.224 66.249.75.255 27 +66.249.75.32 66.249.75.63 27 +66.249.75.64 66.249.75.95 27 +66.249.75.96 66.249.75.127 27 +66.249.76.0 66.249.76.32 27 +66.249.76.128 66.249.76.159 27 +66.249.76.160 66.249.76.191 27 +66.249.76.192 66.249.76.223 27 +66.249.76.224 66.249.76.255 27 +66.249.76.32 66.249.76.63 27 +66.249.76.64 66.249.76.95 27 +66.249.76.96 66.249.76.127 27 +66.249.77.0 66.249.77.32 27 +66.249.77.128 66.249.77.159 27 +66.249.77.160 66.249.77.191 27 +66.249.77.192 66.249.77.223 27 +66.249.77.224 66.249.77.255 27 +66.249.77.32 66.249.77.63 27 +66.249.77.64 66.249.77.95 27 +66.249.77.96 66.249.77.127 27 +66.249.78.0 66.249.78.32 27 +66.249.78.128 66.249.78.159 27 +66.249.78.160 66.249.78.191 27 +66.249.78.32 66.249.78.63 27 +66.249.78.64 66.249.78.95 27 +66.249.78.96 66.249.78.127 27 +66.249.79.0 66.249.79.32 27 +66.249.79.128 66.249.79.159 27 +66.249.79.160 66.249.79.191 27 +66.249.79.192 66.249.79.223 27 +66.249.79.224 66.249.79.255 27 +66.249.79.32 66.249.79.63 27 +66.249.79.64 66.249.79.95 27 +2001:4860:4801:0010:: 2001:4860:4801:0010:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0012:: 2001:4860:4801:0012:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0013:: 2001:4860:4801:0013:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0014:: 2001:4860:4801:0014:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0015:: 2001:4860:4801:0015:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0016:: 2001:4860:4801:0016:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0017:: 2001:4860:4801:0017:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0018:: 2001:4860:4801:0018:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0019:: 2001:4860:4801:0019:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:001a:: 2001:4860:4801:001a:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:001b:: 2001:4860:4801:001b:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:001c:: 2001:4860:4801:001c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:001d:: 2001:4860:4801:001d:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:001e:: 2001:4860:4801:001e:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:001f:: 2001:4860:4801:001f:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0020:: 2001:4860:4801:0020:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0021:: 2001:4860:4801:0021:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0022:: 2001:4860:4801:0022:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0023:: 2001:4860:4801:0023:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0024:: 2001:4860:4801:0024:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0025:: 2001:4860:4801:0025:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0026:: 2001:4860:4801:0026:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0027:: 2001:4860:4801:0027:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0028:: 2001:4860:4801:0028:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0029:: 2001:4860:4801:0029:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0002:: 2001:4860:4801:0002:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:002a:: 2001:4860:4801:002a:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:002b:: 2001:4860:4801:002b:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:002c:: 2001:4860:4801:002c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:002d:: 2001:4860:4801:002d:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:002e:: 2001:4860:4801:002e:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:002f:: 2001:4860:4801:002f:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0030:: 2001:4860:4801:0030:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0031:: 2001:4860:4801:0031:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0032:: 2001:4860:4801:0032:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0033:: 2001:4860:4801:0033:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0034:: 2001:4860:4801:0034:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0035:: 2001:4860:4801:0035:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0036:: 2001:4860:4801:0036:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0037:: 2001:4860:4801:0037:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0038:: 2001:4860:4801:0038:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0039:: 2001:4860:4801:0039:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:003a:: 2001:4860:4801:003a:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:003b:: 2001:4860:4801:003b:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:003c:: 2001:4860:4801:003c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:003d:: 2001:4860:4801:003d:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:003e:: 2001:4860:4801:003e:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:003f:: 2001:4860:4801:003f:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0040:: 2001:4860:4801:0040:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0041:: 2001:4860:4801:0041:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0042:: 2001:4860:4801:0042:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0044:: 2001:4860:4801:0044:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0045:: 2001:4860:4801:0045:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0046:: 2001:4860:4801:0046:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0047:: 2001:4860:4801:0047:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0048:: 2001:4860:4801:0048:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0049:: 2001:4860:4801:0049:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:004a:: 2001:4860:4801:004a:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:004b:: 2001:4860:4801:004b:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:004c:: 2001:4860:4801:004c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:004d:: 2001:4860:4801:004d:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:004e:: 2001:4860:4801:004e:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0050:: 2001:4860:4801:0050:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0051:: 2001:4860:4801:0051:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0052:: 2001:4860:4801:0052:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0053:: 2001:4860:4801:0053:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0054:: 2001:4860:4801:0054:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0055:: 2001:4860:4801:0055:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0056:: 2001:4860:4801:0056:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0057:: 2001:4860:4801:0057:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0058:: 2001:4860:4801:0058:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0060:: 2001:4860:4801:0060:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0061:: 2001:4860:4801:0061:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0062:: 2001:4860:4801:0062:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0063:: 2001:4860:4801:0063:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0064:: 2001:4860:4801:0064:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0065:: 2001:4860:4801:0065:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0066:: 2001:4860:4801:0066:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0067:: 2001:4860:4801:0067:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0068:: 2001:4860:4801:0068:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0069:: 2001:4860:4801:0069:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:006a:: 2001:4860:4801:006a:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:006b:: 2001:4860:4801:006b:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:006c:: 2001:4860:4801:006c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:006d:: 2001:4860:4801:006d:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:006e:: 2001:4860:4801:006e:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:006f:: 2001:4860:4801:006f:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0070:: 2001:4860:4801:0070:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0071:: 2001:4860:4801:0071:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0072:: 2001:4860:4801:0072:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0073:: 2001:4860:4801:0073:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0074:: 2001:4860:4801:0074:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0075:: 2001:4860:4801:0075:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0076:: 2001:4860:4801:0076:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0077:: 2001:4860:4801:0077:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0078:: 2001:4860:4801:0078:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0079:: 2001:4860:4801:0079:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:007a:: 2001:4860:4801:007a:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:007b:: 2001:4860:4801:007b:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:007c:: 2001:4860:4801:007c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:007d:: 2001:4860:4801:007d:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0080:: 2001:4860:4801:0080:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0081:: 2001:4860:4801:0081:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0082:: 2001:4860:4801:0082:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0083:: 2001:4860:4801:0083:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0084:: 2001:4860:4801:0084:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0085:: 2001:4860:4801:0085:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0086:: 2001:4860:4801:0086:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0087:: 2001:4860:4801:0087:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0088:: 2001:4860:4801:0088:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0090:: 2001:4860:4801:0090:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0091:: 2001:4860:4801:0091:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0092:: 2001:4860:4801:0092:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0093:: 2001:4860:4801:0093:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0094:: 2001:4860:4801:0094:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0095:: 2001:4860:4801:0095:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0096:: 2001:4860:4801:0096:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:0097:: 2001:4860:4801:0097:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a0:: 2001:4860:4801:00a0:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a1:: 2001:4860:4801:00a1:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a2:: 2001:4860:4801:00a2:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a3:: 2001:4860:4801:00a3:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a4:: 2001:4860:4801:00a4:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a5:: 2001:4860:4801:00a5:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a6:: 2001:4860:4801:00a6:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a7:: 2001:4860:4801:00a7:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a8:: 2001:4860:4801:00a8:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00a9:: 2001:4860:4801:00a9:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00aa:: 2001:4860:4801:00aa:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00ab:: 2001:4860:4801:00ab:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00ac:: 2001:4860:4801:00ac:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00ad:: 2001:4860:4801:00ad:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00ae:: 2001:4860:4801:00ae:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00b0:: 2001:4860:4801:00b0:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00b1:: 2001:4860:4801:00b1:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00b2:: 2001:4860:4801:00b2:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00b3:: 2001:4860:4801:00b3:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00b4:: 2001:4860:4801:00b4:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:00b5:: 2001:4860:4801:00b5:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:000c:: 2001:4860:4801:000c:FFFF:FFFF:FFFF:FFFF 64 +2001:4860:4801:000f:: 2001:4860:4801:000f:FFFF:FFFF:FFFF:FFFF 64 + +# SeznamBot - IPs from: https://o-seznam.cz/napoveda/vyhledavani/en/seznambot-crawler/ +77.75.76.0 77.75.79.255 22 +2a02:0598:0064:8a00:0000:0000:3100:0000 2a02:0598:0064:8a00:0000:0000:3100:001f 123 +2a02:0598:0128:8a00:0000:0000:0b00:0000 2a02:0598:0128:8a00:0000:0000:0b00:001f 123 +2a02:0598:0096:8a00:0000:0000:1200:0120 2a02:0598:0096:8a00:0000:0000:1200:013f 123 + +# localhosts +127.0.0.1 127.255.255.255 8 +::1 ::1 128 \ No newline at end of file diff --git a/config/known-bots.json b/config/known-bots.json index 0688a75..a733339 100644 --- a/config/known-bots.json +++ b/config/known-bots.json @@ -7,7 +7,7 @@ {"id": "googlebot", "n": "GoogleBot", "r": ["Googlebot"], - "rx": ["Googlebot\\/(\\d+\\.\\d+)", "Googlebot-Image\\/(\\d+\\.\\d+)"], + "rx": ["Googlebot\\/(\\d+\\.\\d+)", "Googlebot-Image\\/(\\d+\\.\\d+)","\\sGoogleOther(\\-\\w+)?[\\)\\/]"], "url": "http://www.google.com/bot.html" }, {"id": "googleads", @@ -22,12 +22,6 @@ "rx": ["APIs-Google"], "url": "https://developers.google.com/search/docs/crawling-indexing/google-special-case-crawlers" }, - {"id": "googleother", - "n": "GoogleOther", - "r": ["GoogleOther"], - "rx": ["\\sGoogleOther(\\-\\w+)?[\\)\\/]"], - "url": "https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers#googleother" - }, {"id": "googinspct", "n": "Google-InspectionTool", "r": ["Google-InspectionTool"], @@ -118,16 +112,16 @@ "rx": ["Perplexity\\-User\\/(\\d+\\.\\d+);"], "url": "https://perplexity.ai/perplexitybot" }, - {"id": "metabots", - "n": "Meta/Facebook", - "r": ["meta-webindexer","meta-externalads","meta-externalagent"], - "rx": ["facebook[cw]\\w+\\/(\\d+\\.\\d+)", "meta-externala\\w+\\/(\\d+\\.\\d+)"], - "url": "https://developers.facebook.com/docs/sharing/webmasters/crawler" - }, {"id": "metauser", "n": "Meta/Facebook User", "r": ["facebookexternalhit","facebookcatalog"], - "rx": ["facebookexternalhit\\/(\\d+\\.?\\d*)", "meta-externalfetcher\\/(\\d\\.\\d)", "facebookcatalog\\/(\\d+\\.?\\d*)"], + "rx": ["facebookexternalhit\\/(\\d+\\.?\\d*)", "facebookcatalog\\/(\\d\\.?\\d*)"], + "url": "https://developers.facebook.com/docs/sharing/webmasters/crawler" + }, + {"id": "metabots", + "n": "Meta/Facebook", + "r": ["meta-webindexer","meta-externalads","meta-externalagent", "meta-webindexer"], + "rx": ["facebook[cw]\\w+\\/(\\d+\\.?\\d*)", "meta\\-[cw]\\w+\\/(\\d+\\.?\\d*)", "meta-externalads\\/(\\d+\\.?\\d*)", "meta-externalagent\\/(\\d+\\.?\\d*)"], "url": "https://developers.facebook.com/docs/sharing/webmasters/crawler" }, {"id": "qwant", diff --git a/config/known-clients.json b/config/known-clients.json index d0141ee..a3ac86c 100644 --- a/config/known-clients.json +++ b/config/known-clients.json @@ -87,12 +87,24 @@ "id": "undici", "rx": ["undici"] }, - {"n": "GoHTTP-based crawler", + {"n": "GoHTTP-based bot", "id": "gohttp", "rx": ["Go\\-http\\-client\\/(\\d+)", "quic\\-go\\-HTTP\\/(\\d+)"] }, + {"n": "Python URLlib-based crawler", + "id": "python", + "rx": ["Python\\-?\\w*\\/(\\d+\\.?\\d*)"] + }, {"n": "AppleWebKit", "id": "webkit", "rx": [ "AppleWebKit\\/(\\d*)\\." ] + }, + {"n": "wget", + "id": "wget", + "rx": [ "Wget\\/(\\d+\\.?\\d*\\.?\\d*)" ] + }, + {"n": "PrivacyBrowser", + "id": "privacybrowser", + "rx": [ "PrivacyBrowser\\/(\\d+\\.?\\d*)" ] } ] \ No newline at end of file diff --git a/config/known-ipranges.json b/config/known-ipranges.json index 466dddd..11b1989 100644 --- a/config/known-ipranges.json +++ b/config/known-ipranges.json @@ -1,23 +1,25 @@ { "groups": [ - {"id": "alibaba", "name": "Alibaba"}, - {"id": "amazon", "name": "Amazon DS"}, - {"id": "brasilnet", "name": "BrasilNet"}, - {"id": "charter", "name": "Charter Inc."}, - {"id": "chinanet", "name": "Chinanet"}, - {"id": "cnisp", "name": "China ISP"}, + {"id": "alibaba", "name": "Alibaba Network"}, + {"id": "amazon", "name": "Amazon Data Centres"}, + {"id": "bezeq", "name": "Bezeq Int."}, + {"id": "charter", "name": "Charter Inc. Range"}, + {"id": "chinanet", "name": "ChinaNet"}, + {"id": "cnisp", "name": "China ISP Range"}, {"id": "cnmob", "name": "China Mobile"}, - {"id": "google", "name": "Google LLC"}, + {"id": "domtehniki", "name": "Dom Tehniki / WS Telecom"}, + {"id": "google", "name": "Google LLC Network"}, {"id": "hetzner", "name": "Hetzner US"}, - {"id": "huawei", "name": "Huawei"}, - {"id": "misc_sa", "name": "Misc. SA ISPs"}, - {"id": "tencent", "name": "Tencent"}, + {"id": "huawei", "name": "Huawei Network"}, + {"id": "netcup", "name": "netcup GmbH"}, + {"id": "tencent", "name": "Tencent Network"}, {"id": "unicom", "name": "China Unicom"}, {"id": "vnpt", "name": "Vietnam Telecom"}, - {"id": "vdsina", "name": "VDSina NL"}, - {"id": "zenlayer", "name": "Zenlayer"} + {"id": "vdsina", "name": "VDSina Network"}, + {"id": "zenlayer", "name": "Zenlayer Network"} ], "ranges": [ + {"from": "1.92.0.0", "to": "1.95.255.254", "m": 14, "g": "huawei"}, {"from": "3.0.0.0", "to": "3.255.255.254", "m": 8, "g": "amazon"}, {"from": "5.161.0.0", "to": "5.161.255.255", "m": 16, "g": "hetzner"}, {"from": "8.128.0.0", "to": "8.191.255.254", "m": 10, "g": "alibaba"}, @@ -32,6 +34,7 @@ {"from": "39.64.0.0", "to": "39.95.255.254", "g": "cnmob"}, {"from": "43.132.0.0", "to": "43.132.255.254", "m": 16, "g": "tencent"}, {"from": "43.133.0.0", "to": "43.133.255.254", "m": 16, "g": "tencent"}, + {"from": "43.173.128.0", "to": "43.191.255.255", "m": 10, "g": "tencent"}, {"from": "44.192.0.0", "to": "44.255.255.254", "m": 16, "g": "tencent"}, {"from": "45.0.0.0", "to": "45.255.255.254", "m": 10, "g": "amazon"}, {"from": "46.250.160.0", "to": "46.250.191.254", "m": 19, "g": "huawei"}, @@ -44,7 +47,7 @@ {"from": "52.96.0.0", "to": "52.127.255.254", "m": 11, "g": "microsoft"}, {"from": "54.0.0.0", "to": "54.255.255.254", "m": 8, "g": "amazon"}, {"from": "66.249.64.0", "to": "66.249.95.254", "m": 19, "g": "google"}, - {"from": "84.37.35.0", "to": "84.37.255.254", "g": "gtt"}, + {"from": "82.80.0.0", "to": "82.81.255.255", "m": 15, "g": "bezeq"}, {"from": "94.74.64.0", "to": "94.74.127.254", "m": 18, "g": "huawei"}, {"from": "91.84.96.0", "to": "91.84.127.254", "m": 19, "g": "vdsina"}, {"from": "101.0.0.0", "to": "101.255.255.254", "m": 8,"g": "chinanet"}, @@ -53,41 +56,29 @@ {"from": "111.119.192.0", "to": "111.119.255.254", "m": 18, "g": "huawei"}, {"from": "113.160.0.0", "to": "113.191.255.254", "m": 11, "g": "vnpt"}, {"from": "114.208.0.0", "to": "114.223.255.254", "m": 12, "g": "unicom"}, + {"from": "114.119.0.0", "to": "114.119.255.254", "m": 11, "g": "huawei"}, {"from": "114.224.0.0", "to": "114.255.255.254", "m": 11, "g": "unicom"}, {"from": "119.8.0.0", "to": "119.8.255.254", "m": 16, "g": "huawei"}, + {"from": "119.12.160.0", "to": "119.12.175.255", "m": 20, "g": "huawei"}, {"from": "119.13.0.0", "to": "119.13.255.254", "m": 16, "g": "huawei"}, {"from": "121.91.168.0", "to": "121.91.175.254", "m": 21, "g": "huawei"}, {"from": "122.8.0.0", "to": "122.8.255.254", "g": "cnisp"}, {"from": "122.9.0.0", "to": "122.9.255.254", "m": 16, "g": "huawei"}, {"from": "123.16.0.0", "to": "123.31.255.254", "m": 12, "g": "vnpt"}, {"from": "124.243.128.0", "to": "124.243.191.254", "m": 18, "g": "huawei"}, - {"from": "138.59.0.0", "to": "138.59.225.254", "m": 16, "g": "misc_sa"}, - {"from": "138.121.0.0", "to": "138.121.225.254", "m": 16, "g": "misc_sa"}, + {"from": "136.107.0.0", "to": "136.125.255.254", "m": "+", "g": "google"}, {"from": "142.147.128.0", "to": "1142.147.255.254", "m": 17, "g": "w2obj"}, {"from": "146.174.128.0", "to": "146.174.191.254", "m": 18, "g": "huawei"}, + {"from": "149.126.192.0", "to": "149.126.223.255", "m": 19, "g": "domtehniki"}, + {"from": "149.232.128.0", "to": "149.232.159.254", "m": 19, "g": "huawei"}, {"from": "150.40.128.0", "to": "150.40.255.254", "m": 17, "g": "huawei"}, {"from": "159.138.0.0", "to": "159.138.225.254", "m": 16, "g": "huawei"}, {"from": "162.128.0.0", "to": "162.128.255.254", "m": 16, "g": "zenlayer"}, {"from": "166.108.192.0", "to": "166.108.255.254", "m": 18, "g": "huawei"}, - {"from": "168.232.192.0", "to": "168.232.255.254", "m": 16, "g": "misc_sa"}, - {"from": "170.0.0.0", "to": "170.3.255.254", "m": 14, "g": "misc_sa"}, - {"from": "170.80.0.0", "to": "170.83.255.254", "m": 14, "g": "misc_sa"}, - {"from": "170.254.0.0", "to": "170.254.255.254", "m": 16, "g": "misc_sa"}, {"from": "171.224.0.0", "to": "171.239.255.254", "m": 12, "g": "viettel"}, - {"from": "177.0.0.0", "to": "177.255.255.254", "m": 8, "g": "brasilnet"}, {"from": "178.156.128.0", "to": "178.156.255.254", "m": 17, "g": "hetzner"}, - {"from": "179.0.0.0", "to": "179.255.255.254", "m": 8, "g": "brasilnet"}, - {"from": "181.0.0.0", "to": "181.255.255.254", "m": 8, "g": "misc_sa"}, {"from": "183.87.32.0", "to": "183.87.63.254", "m": 19, "g": "huawei"}, - {"from": "186.0.0.0", "to": "186.255.255.254", "m": 8, "g": "misc_sa"}, - {"from": "187.0.0.0", "to": "187.255.255.254", "m": 8, "g": "misc_sa"}, - {"from": "188.0.0.0", "to": "188.255.255.254", "m": 8, "g": "misc_sa"}, - {"from": "189.0.0.0", "to": "189.255.255.254", "m": 8, "g": "misc_sa"}, - {"from": "190.0.0.0", "to": "190.255.255.254", "m": 8, "g": "misc_sa"}, - {"from": "191.0.0.0", "to": "191.255.255.254", "m": 8, "g": "misc_sa"}, {"from": "192.124.170.0", "to": "192.124.182.254", "g": "relcom"}, - {"from": "200.0.0.0", "to": "200.255.255.254", "m": 8, "g": "misc_sa"}, - {"from": "201.0.0.0", "to": "201.255.255.254", "m": 8, "g": "misc_sa"}, {"from": "212.95.128.0", "to": "212.95.159.254", "m": 19, "g": "asiacell"}, {"from": "222.252.0.0", "to": "222.252.255.254", "m": 14, "g": "vnpt"}, {"from": "2001:4860::::::", "to": "2001:4860:ffff:ffff:ffff:ffff:ffff:ffff", "m": 32, "g": "google"}, @@ -97,7 +88,6 @@ {"from": "2603:6010::::::", "to": "2603:6010:ffff:ffff:ffff:ffff:ffff:ffff", "m": 32, "g": "charter"}, {"from": "2603:8000::::::", "to": "2603:80ff:ffff:ffff:ffff:ffff:ffff:ffff", "m": 24, "g": "charter"}, {"from": "2607:a400::::::", "to": "2607:a400:ffff:ffff:ffff:ffff:ffff:ffff", "m": 32, "g": "zenlayer"}, - {"from": "2804:::::::", "to": "2804:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "m": 16, "g": "misc_sa"}, {"from": "2a0a:4cc0::::::", "to": "2a0a:4cc0:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "g": "netcup"} ] } \ No newline at end of file diff --git a/img/addr.png b/img/addr.png index 417982d..6ced149 100644 Binary files a/img/addr.png and b/img/addr.png differ diff --git a/img/busy-light.svg b/img/busy-light.svg new file mode 100644 index 0000000..ce57394 --- /dev/null +++ b/img/busy-light.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/img/captcha.png b/img/captcha.png new file mode 100644 index 0000000..fd841fc Binary files /dev/null and b/img/captcha.png differ diff --git a/img/clients.png b/img/clients.png index 6e59da9..c514bcb 100644 Binary files a/img/clients.png and b/img/clients.png differ diff --git a/img/idtyp.png b/img/idtyp.png index a1083f5..a315d24 100644 Binary files a/img/idtyp.png and b/img/idtyp.png differ diff --git a/img/stages.png b/img/stages.png index 0ac0c9e..4d2621f 100644 Binary files a/img/stages.png and b/img/stages.png differ diff --git a/img/views.svg b/img/views.svg new file mode 100644 index 0000000..37010ca --- /dev/null +++ b/img/views.svg @@ -0,0 +1 @@ +eye-outline \ No newline at end of file diff --git a/lang/de/lang.php b/lang/de/lang.php new file mode 100644 index 0000000..f84a16e --- /dev/null +++ b/lang/de/lang.php @@ -0,0 +1,15 @@ + + */ + +// Captcha dialog locale strings: +$lang['bm_dlgTitle'] = 'Benutzerüberprüfung'; +$lang['bm_dlgSubtitle'] = 'Bitte bestätige, dass du kein Bot bist:'; +$lang['bm_dlgConfirm'] = 'Klicke, um zu bestätigen.'; +$lang['bm_dlgChecking'] = 'Wird überprüft …'; +$lang['bm_dlgLoading'] = 'Seite wird geladen …'; +$lang['bm_dlgError'] = 'Es ist ein Fehler aufgetreten.'; +$lang['bm_noJsWarning'] = 'Bitte aktivieren Sie JavaScript, um diese Seite anzuzeigen.'; diff --git a/lang/de/wordlist.txt b/lang/de/wordlist.txt new file mode 100644 index 0000000..f1a1c0f --- /dev/null +++ b/lang/de/wordlist.txt @@ -0,0 +1,2734 @@ +ich 930 +sie 567 +das 516 +ist 509 +du 507 +nicht 444 +die 410 +es 377 +und 368 +der 286 +was 280 +wir 280 +zu 234 +ein 218 +er 215 +in 205 +mir 166 +mit 163 +ja 152 +den 152 +wie 152 +mich 145 +auf 143 +eine 136 +so 135 +aber 134 +hier 128 +dass 127 +hat 123 +sind 118 +dich 117 +von 117 +haben 116 +für 116 +wenn 115 +war 112 +ihr 107 +an 102 +habe 96 +bin 95 +nur 93 +da 93 +Nein 93 +noch 93 +dir 93 +hast 87 +einen 85 +uns 85 +sich 84 +dem 76 +kann 75 +auch 73 +gut 72 +schon 72 +sein 71 +jetzt 71 +aus 71 +ihn 70 +als 70 +dann 70 +mal 69 +bist 68 +um 67 +meine 67 +wird 65 +im 64 +doch 62 +mein 62 +alles 59 +keine 57 +oder 54 +weiß 54 +man 52 +nach 52 +werden 50 +nichts 49 +wo 49 +will 46 +also 46 +mehr 46 +etwas 46 +immer 44 +muss 43 +warum 43 +bei 43 +hab 42 +bitte 41 +wieder 41 +ihnen 42 +los 40 +machen 39 +diese 39 +vor 39 +können 38 +alle 37 +sagen 37 +zum 37 +gehen 37 +sehr 37 +denn 36 +geht 35 +sehen 35 +tun 35 +Mann 35 +euch 34 +wer 34 +ihm 34 +einem 34 +wirklich 34 +werde 34 +einer 33 +deine 33 +danke 33 +über 32 +ihre 32 +Komm 31 +vielleicht 31 +einfach 30 +soll 30 +müssen 30 +weg 29 +nie 29 +wissen 29 +gibt 29 +kein 29 +hey 28 +des 28 +tut 28 +Leben 28 +willst 27 +okay 27 +viel 27 +würde 27 +weil 27 +Zeit 27 +dein 27 +am 26 +hatte 26 +dieser 25 +nun 25 +kommt 25 +ok 25 +kannst 25 +kommen 25 +zurück 24 +heute 24 +damit 24 +ganz 24 +gesagt 23 +macht 23 +wurde 23 +weißt 23 +Leid 23 +bis 23 +wollen 23 +wäre 22 +wollte 22 +sicher 22 +Frau 22 +lch 21 +meinen 21 +Berlin 21 +lassen 21 +Leute 20 +genau 20 +seine 20 +zur 19 +zwei 19 +hätte 19 +Lass 19 +hallo 19 +könnte 18 +waren 18 +klar 18 +ab 17 +gerade 17 +glaube 17 +sollte 17 +Vater 17 +gesehen 17 +durch 16 +Morgen 16 +dieses 16 +raus 16 +Tag 16 +Geld 16 +gemacht 16 +schön 16 +liebe 16 +keinen 16 +reden 16 +sagte 16 +diesen 16 +wohl 16 +jemand 16 +unsere 16 +ob 15 +wirst 15 +mach 15 +paar 15 +hör 15 +besser 15 +passiert 15 +anderen 15 +dachte 15 +daß 15 +selbst 15 +Mutter 14 +wieso 14 +ohne 14 +möchte 14 +gehört 14 +her 14 +musst 14 +sag 14 +meiner 14 +richtig 14 +Ordnung 14 +lange 14 +helfen 13 +dort 13 +geben 13 +sieht 13 +Geh 13 +sei 13 +diesem 13 +finden 13 +meinem 13 +gar 13 +sagt 13 +weiter 13 +gleich 13 +gute 13 +vom 13 +warte 12 +deinen 12 +ins 12 +denke 12 +Nacht 12 +natürlich 12 +davon 12 +hören 12 +Welt 12 +Mädchen 12 +seit 12 +hin 12 +viele 12 +sollten 12 +dafür 12 +machst 12 +sollen 12 +zusammen 12 +schnell 12 +wegen 11 +Menschen 11 +Hause 11 +bleiben 11 +essen 11 +unser 11 +ganze 11 +habt 11 +Freund 11 +Angst 11 +tot 11 +andere 11 +unter 11 +drei 11 +ihren 11 +bringen 10 +rein 10 +Haus 10 +nehmen 10 +geht’s 10 +eines 10 +seid 10 +genug 10 +brauchen 10 +getan 10 +dabei 10 +verdammt 10 +stimmt 10 +Moment 10 +Kinder 10 +Arbeit 10 +erst 10 +guten 10 +Problem 10 +gegen 10 +Herr 10 +glauben 9 +sofort 9 +darf 9 +Abend 9 +hatten 9 +fertig 9 +niemand 9 +warten 9 +sonst 9 +Halt 9 +jeder 9 +steht 9 +’ne 9 +einmal 9 +Scheiße 9 +bevor 9 +eigentlich 9 +Junge 9 +fragen 9 +brauche 9 +Jahre 9 +Bruder 9 +beim 9 +Sache 9 +heißt 9 +Sohn 9 +siehst 9 +warst 8 +halten 8 +mag 8 +sprechen 8 +gib 8 +konnte 8 +daran 8 +sterben 8 +darüber 8 +Wann 8 +Kopf 8 +Hilfe 8 +deiner 8 +Familie 8 +deinem 8 +Baby 8 +kennen 8 +gefunden 8 +sieh 8 +kam 8 +vergessen 8 +könnten 8 +dazu 8 +egal 8 +später 8 +allein 8 +Jahren 8 +Kind 8 +seinen 8 +töten 8 +Minuten 8 +beide 8 +Stadt 8 +denken 8 +toll 8 +gern 8 +verstehe 8 +würden 8 +ihrer 8 +Dank 7 +jeden 7 +Ende 7 +Dinge 7 +Namen 7 +wahr 7 +lieber 7 +letzte 7 +runter 7 +all 7 +bekommen 7 +Männer 7 +kleine 7 +eins 7 +gab 7 +wusste 7 +sehe 7 +Augen 7 +Freunde 7 +darauf 7 +Jungs 7 +Glück 7 +meinst 7 +Auto 7 +sage 7 +bald 7 +gehe 7 +komme 7 +mache 7 +fahren 7 +Uhr 7 +Teufel 7 +Art 7 +bereit 7 +hört 7 +einzige 7 +eure 7 +Fall 7 +Film 7 +echt 7 +bisschen 7 +weit 7 +vielen 7 +ihrem 7 +vorbei 6 +drin 6 +hinter 6 +stehen 6 +Name 6 +ganzen 6 +treffen 6 +sogar 6 +denkst 6 +Musik 6 +verstanden 6 +Tür 6 +etwa 6 +solltest 6 +verrückt 6 +spielen 6 +nimm 6 +fast 6 +ruhig 6 +arbeiten 6 +dran 6 +Sorgen 6 +hätten 6 +lang 6 +deshalb 6 +ziemlich 6 +Kerl 6 +darum 6 +Job 6 +verloren 6 +wurden 6 +kenne 6 +Ahnung 6 +seiner 6 +Grund 6 +überhaupt 6 +finde 6 +neue 6 +jemanden 6 +je 6 +Hand 6 +woher 6 +Frauen 6 +Idee 6 +draußen 6 +Land 6 +Typ 6 +spät 6 +gekommen 6 +Schwester 6 +Wasser 6 +niemals 6 +Spiel 6 +Geschichte 6 +seinem 6 +kommst 6 +liegt 6 +keiner 6 +recht 6 +Recht 6 +sah 6 +Seite 6 +wenig 6 +verstehen 6 +endlich 6 +kurz 6 +welche 6 +bestimmt 6 +versuchen 6 +erste 6 +Ruhe 5 +nett 5 +versucht 5 +Tochter 5 +hoch 5 +bringt 5 +ging 5 +Jahr 5 +braucht 5 +würdest 5 +dies 5 +lasst 5 +Alter 5 +große 5 +anders 5 +Polizei 5 +Stunden 5 +musste 5 +während 5 +gewesen 5 +zeigen 5 +gerne 5 +suchen 5 +erzählt 5 +beste 5 +Tod 5 +Ort 5 +bleibt 5 +Chance 5 +bedeutet 5 +sagst 5 +letzten 5 +holen 5 +fünf 5 +Krieg 5 +ersten 5 +Sachen 5 +gefallen 5 +Wahrheit 5 +glaubst 5 +zwischen 5 +denen 5 +Spaß 5 +gehst 5 +oben 5 +kleinen 5 +Mama 5 +Yeah 5 +schwer 5 +Schule 5 +eben 5 +Wagen 5 +Gesicht 5 +manchmal 5 +guter 5 +irgendwas 5 +gefällt 5 +Schuld 5 +weiss 5 +Woche 5 +Entschuldigung 5 +schlecht 5 +vier 5 +getötet 5 +hoffe 5 +erzählen 5 +hättest 5 +Zimmer 5 +unserer 5 +Tage 5 +Teil 5 +einige 5 +verlassen 5 +gestern 5 +wollten 5 +lässt 5 +Wort 5 +Schatz 5 +allen 5 +Entschuldigen 5 +ernst 5 +scheint 5 +kleiner 5 +bleib 5 +kriegen 5 +irgendwie 5 +läuft 5 +Freundin 5 +Mensch 4 +beiden 4 +Ding 4 +muß 4 +fest 4 +Herz 4 +Waffe 4 +Dollar 4 +Sorge 4 +tust 4 +nehme 4 +oft 4 +drauf 4 +anderes 4 +unten 4 +tu 4 +stellen 4 +wichtig 4 +brauchst 4 +falls 4 +falsch 4 +wen 4 +gedacht 4 +Nummer 4 +wohin 4 +Hände 4 +Blut 4 +bloß 4 +kennst 4 +Bett 4 +zuerst 4 +Bring 4 +Eltern 4 +Plan 4 +alte 4 +euer 4 +neuen 4 +rede 4 +retten 4 +trinken 4 +wären 4 +Fehler 4 +ehrlich 4 +gibt’s 4 +gegeben 4 +besten 4 +glücklich 4 +alt 4 +seht 4 +Platz 4 +wartet 4 +wahrscheinlich 4 +unseren 4 +alten 4 +schlafen 4 +nächsten 4 +nächste 4 +frei 4 +Pass 4 +früher 4 +bereits 4 +alleine 4 +sondern 4 +Jungen 4 +langsam 4 +möglich 4 +lernen 4 +Papa 4 +hierher 4 +wollt 4 +Schiff 4 +kaum 4 +jede 4 +Menge 4 +trotzdem 4 +Typen 4 +Klasse 4 +willkommen 4 +Stunde 4 +Szene 4 +Hölle 4 +außer 4 +geworden 4 +Telefon 4 +denkt 4 +überall 4 +Feuer 4 +setzen 4 +frage 4 +Frage 3 +Ruf 3 +könntest 3 +Probleme 3 +Stelle 3 +laufen 3 +klingt 3 +nennen 3 +zwar 3 +erinnern 3 +Folge 3 +eigenen 3 +Körper 3 +gebe 3 +hattest 3 +Kumpel 3 +Hund 3 +nochmal 3 +hab’s 3 +aufhören 3 +früh 3 +tat 3 +meines 3 +zehn 3 +direkt 3 +Wiedersehen 3 +Luft 3 +neues 3 +könnt 3 +sechs 3 +verstehst 3 +dürfen 3 +Meister 3 +Erde 3 +wolltest 3 +Zukunft 3 +funktioniert 3 +voll 3 +reicht 3 +kleines 3 +wem 3 +großen 3 +gutes 3 +Büro 3 +richtige 3 +Waffen 3 +danach 3 +Wahl 3 +verlieren 3 +versuche 3 +Wochen 3 +kämpfen 3 +cool 3 +Stück 3 +allem 3 +lieben 3 +hol 3 +getroffen 3 +damals 3 +ziehen 3 +geschafft 3 +tue 3 +tja 3 +Entschuldige 3 +verschwinden 3 +Boss 3 +nachdem 3 +vergiss 3 +passieren 3 +Licht 3 +lustig 3 +gebracht 3 +stark 3 +Gefühl 3 +völlig 3 +Schlüssel 3 +großartig 3 +drüben 3 +halte 3 +irgendwo 3 +Buch 3 +Leuten 3 +suche 3 +jedes 3 +spielt 3 +genauso 3 +krank 3 +gegangen 3 +fand 3 +wovon 3 +unglaublich 3 +fühle 3 +leider 3 +Himmel 3 +böse 3 +froh 3 +leicht 3 +sobald 3 +vertrauen 3 +Krankenhaus 3 +genommen 3 +Arzt 3 +unserem 3 +Idiot 3 +solche 3 +großer 3 +groß 3 +Rest 3 +Scheiß 3 +Tagen 3 +Doktor 3 +wert 3 +spricht 3 +hält 3 +Team 3 +rufen 3 +heiraten 3 +Stimme 3 +deswegen 3 +Mist 3 +Straße 3 +König 3 +redest 3 +solange 3 +lebt 3 +erklären 3 +Millionen 3 +Onkel 3 +besonders 3 +glaub 3 +wisst 3 +sitzen 3 +folgen 3 +weniger 3 +Kaffee 3 +tragen 3 +Zeug 3 +Michael 3 +kaufen 3 +Liste 3 +ändern 3 +super 3 +Kampf 3 +fliegen 3 +findet 3 +hasse 3 +Person 3 +Mund 3 +vorsichtig 3 +hab’ 3 +Präsident 3 +umbringen 3 +Boden 3 +machte 3 +mögen 3 +stolz 3 +Party 3 +gefragt 3 +hörst 3 +schicken 3 +kümmern 3 +Frank 3 +kennt 3 +verletzt 3 +Nachricht 3 +schneller 3 +hart 3 +lasse 3 +total 3 +Gefängnis 3 +Sicherheit 3 +möchten 3 +schreiben 3 +wenigstens 3 +interessiert 3 +sagten 3 +weisst 3 +Augenblick 3 +angerufen 3 +unmöglich 3 +verdammte 3 +Bild 3 +komisch 3 +Sinn 3 +vorstellen 3 +Traum 3 +länger 3 +möchtest 3 +anrufen 3 +eher 3 +schöne 3 +sollst 3 +gestorben 3 +Tages 3 +war’s 3 +Kraft 3 +gesprochen 3 +denk 3 +heraus 3 +schau 3 +Schau 3 +wärst 2 +außerdem 2 +heißen 2 +Liebling 2 +passt 2 +Setz 2 +tatsächlich 2 +lesen 2 +obwohl 2 +glaubt 2 +erwartet 2 +meisten 2 +bringe 2 +still 2 +umgebracht 2 +plötzlich 2 +General 2 +Bewegung 2 +führen 2 +höre 2 +Geschäft 2 +Versuch 2 +werdet 2 +tolle 2 +konnten 2 +anfangen 2 +hinten 2 +perfekt 2 +fällt 2 +erinnerst 2 +Sekunden 2 +gerettet 2 +jemals 2 +Meinung 2 +stand 2 +geschehen 2 +Antwort 2 +schlimm 2 +gewinnen 2 +Gedanken 2 +erinnere 2 +Herren 2 +vorher 2 +Auge 2 +Anfang 2 +Lebens 2 +Monate 2 +benutzen 2 +fühlen 2 +Ärger 2 +arbeite 2 +acht 2 +Rolle 2 +gefährlich 2 +gelernt 2 +fallen 2 +werd 2 +Nähe 2 +geschickt 2 +Hilf 2 +liebt 2 +absolut 2 +Tisch 2 +Raum 2 +Zeig 2 +Ziel 2 +jedem 2 +versprochen 2 +Wohnung 2 +erfahren 2 +zieh 2 +dumm 2 +schauen 2 +laß 2 +herum 2 +Klappe 2 +Laden 2 +magst 2 +aufs 2 +arbeitet 2 +zahlen 2 +sie’s 2 +Worte 2 +Flugzeug 2 +bezahlen 2 +Firma 2 +Regeln 2 +laut 2 +sowas 2 +findest 2 +starb 2 +Schluss 2 +Fenster 2 +liegen 2 +welcher 2 +wär’s 2 +niemanden 2 +Verzeihung 2 +benutzt 2 +Finger 2 +schätze 2 +lachen 2 +rüber 2 +Witz 2 +Kontrolle 2 +nimmt 2 +fangen 2 +Herzen 2 +gewonnen 2 +Bier 2 +Arm 2 +kamen 2 +gleiche 2 +bitten 2 +fort 2 +fahr 2 +Informationen 2 +steh 2 +neu 2 +hörte 2 +rum 2 +Lage 2 +bekommt 2 +sowieso 2 +dagegen 2 +nötig 2 +Richtung 2 +aussehen 2 +Minute 2 +wach 2 +sieben 2 +behalten 2 +links 2 +selber 2 +drehen 2 +verkaufen 2 +jedenfalls 2 +geschrieben 2 +Entscheidung 2 +unterwegs 2 +Insel 2 +Hotel 2 +voller 2 +Monat 2 +verschwinde 2 +erzähl 2 +rufe 2 +Lauf 2 +wunderbar 2 +gearbeitet 2 +verdient 2 +legen 2 +wünschte 2 +Seele 2 +wofür 2 +Gefahr 2 +Geist 2 +gelesen 2 +bezahlt 2 +Schicksal 2 +Monaten 2 +Weile 2 +Agent 2 +mussten 2 +verheiratet 2 +Arme 2 +Ehe 2 +jemandem 2 +Beispiel 2 +welches 2 +wozu 2 +kalt 2 +sitzt 2 +Anruf 2 +Sekunde 2 +nächstes 2 +hole 2 +Bauer 2 +bisher 2 +Karte 2 +aller 2 +du’s 2 +Befehl 2 +sucht 2 +darfst 2 +tanzen 2 +bekannt 2 +Opfer 2 +Leg 2 +steckt 2 +seien 2 +unbedingt 2 +Zug 2 +witzig 2 +Amerika 2 +führt 2 +Kamera 2 +stell 2 +schlagen 2 +kriegt 2 +irgendetwas 2 +nennt 2 +bin’s 2 +Gefühle 2 +ständig 2 +verändert 2 +diesmal 2 +heiß 2 +Partner 2 +Mörder 2 +Computer 2 +dahin 2 +ansehen 2 +klein 2 +zerstört 2 +nämlich 2 +öffnen 2 +schlimmer 2 +Unfall 2 +müsste 2 +Nase 2 +Vorsicht 2 +schießen 2 +Geburtstag 2 +beschützen 2 +müde 2 +Beziehung 2 +gestohlen 2 +Geheimnis 2 +stirbt 2 +zieht 2 +süß 2 +Geschenk 2 +offen 2 +Punkt 2 +Dame 2 +hilft 2 +bewegen 2 +sauer 2 +Tasche 2 +Schritt 2 +übrigens 2 +meinte 2 +müsst 2 +schönen 2 +erwischt 2 +gehabt 2 +Bart 2 +erreichen 2 +wär 2 +irgendwann 2 +Gebäude 2 +Schlag 2 +Hoffentlich 2 +lügen 2 +interessant 2 +liebst 2 +erledigt 2 +Armee 2 +näher 2 +nahm 2 +weitere 2 +Chef 2 +Rücken 2 +Preis 2 +Wunder 2 +Bescheid 2 +Verbindung 2 +Boot 2 +holt 2 +normal 2 +Situation 2 +erledigen 2 +mußt 2 +Ehre 2 +darin 2 +fürs 2 +Planeten 2 +ungefähr 2 +ich’s 2 +kriegst 2 +Haut 2 +Ben 2 +Prinzessin 2 +Drogen 2 +euren 2 +Mord 2 +Reise 2 +seltsam 2 +schwöre 2 +Schlampe 2 +Zeiten 2 +verliebt 2 +Position 2 +redet 2 +Toten 2 +Möglichkeit 2 +töte 2 +stimmt’s 2 +Sonne 2 +Willen 2 +Haltet 2 +letzter 2 +Kontakt 2 +Damen 2 +Zuhause 2 +Antworten 2 +zumindest 2 +gekauft 2 +Schwert 2 +Hunger 2 +Frieden 2 +hau 2 +Blick 2 +persönlich 2 +Nachrichten 2 +Maul 2 +verraten 2 +Hoffnung 2 +Frag 2 +geboren 2 +Untertitel 2 +kaputt 2 +eigene 2 +Soldaten 2 +ans 2 +übrig 2 +hältst 2 +aufhalten 2 +Zeichen 2 +schade 2 +dauert 2 +Band 2 +Schwein 2 +versteckt 2 +Haare 2 +wütend 2 +Hochzeit 2 +fühlt 2 +schrecklich 2 +Energie 2 +Leiche 2 +sauber 2 +traurig 2 +reich 2 +offensichtlich 2 +Bord 2 +gesucht 2 +beschäftigt 2 +erwarten 2 +manche 2 +verschwunden 2 +Professor 2 +Brief 2 +geredet 2 +zeigt 2 +ihres 2 +hübsch 2 +Show 2 +Ross 2 +sagtest 2 +verkauft 2 +namens 2 +Fernsehen 2 +versteht 2 +Schaut 2 +fährt 2 +heiße 2 +ließ 2 +nervös 2 +soweit 2 +fehlt 2 +gegessen 2 +setzt 2 +Vergangenheit 2 +deines 2 +Freut 2 +miteinander 2 +Handy 2 +neben 2 +anderer 2 +tief 2 +ran 2 +schaffen 2 +wette 1 +Wette 1 +Schaffen 1 +Aufgabe 1 +Entweder 1 +Foto 1 +richtigen 1 +Nehmt 1 +Tee 1 +verdammten 1 +Fuß 1 +schließlich 1 +brauch 1 +geschlafen 1 +letztes 1 +Beine 1 +irgendwelche 1 +Kindern 1 +ewig 1 +schlechte 1 +Unsinn 1 +Bombe 1 +Guck 1 +bekam 1 +Herrn 1 +gelassen 1 +angefangen 1 +Tante 1 +Hals 1 +Bank 1 +vorne 1 +stellt 1 +Weise 1 +Paris 1 +passen 1 +verantwortlich 1 +schwierig 1 +bleibe 1 +seh 1 +Operation 1 +rechts 1 +Anwalt 1 +verspreche 1 +bleibst 1 +Glückwunsch 1 +entscheiden 1 +allerdings 1 +entfernt 1 +brachte 1 +zerstören 1 +aussieht 1 +gespielt 1 +Lied 1 +schönes 1 +Lust 1 +Vaters 1 +Bilder 1 +kriege 1 +Feind 1 +Händen 1 +jung 1 +süße 1 +worauf 1 +Ball 1 +stecken 1 +geholfen 1 +gehören 1 +gleichen 1 +genannt 1 +heim 1 +nahe 1 +Aufnahme 1 +Achtung 1 +erster 1 +Mission 1 +bekomme 1 +Schmerz 1 +Fleisch 1 +Jawohl 1 +fantastisch 1 +Weihnachten 1 +Rennen 1 +Schwierigkeiten 1 +Park 1 +meint 1 +wussten 1 +Gesellschaft 1 +gebeten 1 +erhalten 1 +bedeuten 1 +verstecken 1 +Respekt 1 +dasselbe 1 +entschieden 1 +Gehirn 1 +dachten 1 +Witze 1 +Rat 1 +Volk 1 +beeil 1 +lebe 1 +Präsidenten 1 +dauern 1 +Monster 1 +Schuhe 1 +Übersetzt 1 +Beweise 1 +Hälfte 1 +Kirche 1 +Hintern 1 +Spur 1 +Lehrer 1 +Gold 1 +lieb 1 +neun 1 +Güte 1 +fahre 1 +geliebt 1 +geschlagen 1 +Loch 1 +normalerweise 1 +ganzes 1 +beweisen 1 +Colonel 1 +wunderschön 1 +gegenüber 1 +Bus 1 +großes 1 +Verstand 1 +spiele 1 +trägt 1 +gewartet 1 +herausfinden 1 +vermutlich 1 +niemandem 1 +Gegend 1 +bewegt 1 +Kate 1 +Fotos 1 +Angriff 1 +Grad 1 +nah 1 +Versprechen 1 +Schlaf 1 +Wind 1 +beginnt 1 +fürchte 1 +lag 1 +Messer 1 +überrascht 1 +Worüber 1 +Richard 1 +gefangen 1 +Bein 1 +Eier 1 +singen 1 +Dorf 1 +Überraschung 1 +besorgen 1 +Glas 1 +Besonderes 1 +besuchen 1 +geändert 1 +beginnen 1 +echte 1 +Pferd 1 +Held 1 +tötet 1 +Taxi 1 +Freunden 1 +mitnehmen 1 +Gruppe 1 +besorgt 1 +System 1 +fang 1 +ruft 1 +nimmst 1 +falschen 1 +leisten 1 +Adresse 1 +schwanger 1 +gemeinsam 1 +Stimmen 1 +entkommen 1 +übel 1 +Küche 1 +vermisst 1 +Besuch 1 +Flug 1 +hängt 1 +werfen 1 +falsche 1 +Ring 1 +Gebt 1 +überleben 1 +Lächeln 1 +Gesetz 1 +Tor 1 +Maschine 1 +Patienten 1 +Wald 1 +gehts 1 +Dach 1 +Schauspieler 1 +kannte 1 +Übersetzung 1 +drinnen 1 +wir’s 1 +Armen 1 +schwarzen 1 +blöd 1 +Blumen 1 +Freiheit 1 +Ecke 1 +seines 1 +Steig 1 +Knast 1 +Karten 1 +helfe 1 +Wein 1 +Vergnügen 1 +Unterschied 1 +gibst 1 +Verbrechen 1 +gesund 1 +sag’s 1 +zweite 1 +erkennen 1 +eurer 1 +welchen 1 +Meter 1 +Schüler 1 +weder 1 +Bar 1 +davor 1 +Mut 1 +wohnen 1 +statt 1 +Auftrag 1 +Pause 1 +wünsche 1 +Wand 1 +Männern 1 +schreit 1 +kostet 1 +spreche 1 +Erfolg 1 +einverstanden 1 +Wieviel 1 +Eis 1 +entlang 1 +erschossen 1 +teilen 1 +’nem 1 +Abendessen 1 +herein 1 +Mistkerl 1 +übernehmen 1 +danken 1 +gebaut 1 +Tritt 1 +beenden 1 +schützen 1 +weißen 1 +Verzeihen 1 +gefahren 1 +Polizist 1 +Bericht 1 +wüsste 1 +trifft 1 +Hut 1 +Meer 1 +lief 1 +zuvor 1 +schwarze 1 +wusstest 1 +Doug 1 +verdammter 1 +Zeitung 1 +bauen 1 +schuldig 1 +Freude 1 +zufrieden 1 +Drink 1 +versuchte 1 +gemeint 1 +indem 1 +sprach 1 +fühlst 1 +deren 1 +furchtbar 1 +Gericht 1 +hielt 1 +kapiert 1 +Kugel 1 +Quatsch 1 +Ohren 1 +verpasst 1 +fanden 1 +neuer 1 +Rose 1 +Drehbuch 1 +Haufen 1 +Schätzchen 1 +Haar 1 +Ehemann 1 +fassen 1 +stehe 1 +fragte 1 +funktionieren 1 +verhaftet 1 +drüber 1 +Sergeant 1 +feiern 1 +Major 1 +Verantwortung 1 +Bücher 1 +ähnlich 1 +kümmere 1 +unterhalten 1 +kümmert 1 +Stein 1 +Vorwärts 1 +gewusst 1 +schöner 1 +aufpassen 1 +Katze 1 +Brüder 1 +geschieht 1 +mitgebracht 1 +unseres 1 +dessen 1 +mitten 1 +erinnert 1 +Neuigkeiten 1 +vorhin 1 +Wahnsinn 1 +irgendjemand 1 +Angebot 1 +dadurch 1 +Kleid 1 +zufällig 1 +erklärt 1 +Schaden 1 +Restaurant 1 +Brücke 1 +melden 1 +Serie 1 +Erinnerungen 1 +gestellt 1 +besteht 1 +daher 1 +Schmerzen 1 +verdienen 1 +Fisch 1 +Gelegenheit 1 +hängen 1 +bekommst 1 +konntest 1 +Idioten 1 +gingen 1 +größte 1 +Virus 1 +betrunken 1 +geplant 1 +Strand 1 +fängt 1 +bringst 1 +keinem 1 +netter 1 +Thema 1 +rauchen 1 +machten 1 +Figur 1 +weiße 1 +brechen 1 +angetan 1 +lacht 1 +Druck 1 +worum 1 +mitkommen 1 +taten 1 +Fluss 1 +Mark 1 +verschwindet 1 +Mach’s 1 +traf 1 +wirkt 1 +kosten 1 +gelaufen 1 +Gewalt 1 +Daten 1 +Großvater 1 +Hunde 1 +Falle 1 +nachgedacht 1 +wahre 1 +eigenes 1 +Entschuldigt 1 +Gang 1 +erreicht 1 +sahen 1 +einzigen 1 +schlechter 1 +solchen 1 +ermordet 1 +längst 1 +Tiere 1 +Autos 1 +fiel 1 +wohnt 1 +Hose 1 +leiden 1 +freue 1 +seitdem 1 +sprichst 1 +Baum 1 +gebrochen 1 +gehalten 1 +Reihe 1 +Träume 1 +gezeigt 1 +halb 1 +Medizin 1 +hieß 1 +Meilen 1 +Bastard 1 +Befehle 1 +Wunsch 1 +rief 1 +Frühstück 1 +schaffst 1 +rot 1 +beruhigen 1 +hat’s 1 +aufgeben 1 +Gespräch 1 +Erfahrung 1 +Terroristen 1 +verbringen 1 +Besseres 1 +brauchte 1 +schätzen 1 +Bad 1 +Tote 1 +Anna 1 +Vogel 1 +Roger 1 +Wochenende 1 +vollkommen 1 +zweiten 1 +schläft 1 +verfolgen 1 +bemerkt 1 +Marge 1 +Signal 1 +Wichser 1 +Filme 1 +lächerlich 1 +Pistole 1 +schließen 1 +geschlossen 1 +Detective 1 +fragt 1 +Beweis 1 +President 1 +weinen 1 +wichtiger 1 +Verhalten 1 +Zeitpunkt 1 +Pläne 1 +Club 1 +schlägt 1 +küssen 1 +Scherz 1 +behandelt 1 +halbe 1 +fair 1 +Farbe 1 +weiteren 1 +entdeckt 1 +Natur 1 +Sara 1 +abgesehen 1 +Seiten 1 +bessere 1 +Kuchen 1 +langweilig 1 +selben 1 +Bürgermeister 1 +treten 1 +lautet 1 +größer 1 +Rechte 1 +Knie 1 +stehlen 1 +Regen 1 +hingehen 1 +gefeuert 1 +Koffer 1 +Geschäfte 1 +verfolgt 1 +umsonst 1 +dorthin 1 +Million 1 +bißchen 1 +daraus 1 +hinaus 1 +Lösung 1 +leer 1 +geblieben 1 +Krankheit 1 +hasst 1 +Kräfte 1 +rauf 1 +Sieg 1 +passierte 1 +Füße 1 +Zufall 1 +geschossen 1 +offenbar 1 +dankbar 1 +einiges 1 +heisst 1 +See 1 +Erklärung 1 +Flughafen 1 +mochte 1 +Englisch 1 +Flasche 1 +gebrauchen 1 +Soldat 1 +sterbe 1 +wurdest 1 +getrunken 1 +Kurs 1 +Womit 1 +isst 1 +ernsthaft 1 +fühlte 1 +fliegt 1 +Gewissen 1 +reichen 1 +derjenige 1 +Erinnerung 1 +einigen 1 +Geschichten 1 +nachts 1 +prima 1 +Schande 1 +Story 1 +Toilette 1 +fern 1 +peinlich 1 +wenn’s 1 +Dreck 1 +welchem 1 +Doc 1 +schafft 1 +Mädels 1 +anscheinend 1 +Lüge 1 +solltet 1 +bösen 1 +verhindern 1 +erwähnt 1 +verflucht 1 +langer 1 +Pete 1 +Tatsache 1 +Code 1 +eingeladen 1 +erlaubt 1 +angegriffen 1 +Anzug 1 +Pflicht 1 +Einsatz 1 +Direktor 1 +Königin 1 +Zweifel 1 +gewinnt 1 +deutsche 1 +erschießen 1 +Schloss 1 +dreht 1 +Fähigkeiten 1 +Trottel 1 +versteh 1 +klug 1 +Form 1 +zulassen 1 +Runde 1 +hassen 1 +lösen 1 +scharf 1 +verlangt 1 +Karriere 1 +Richter 1 +Tier 1 +wünschen 1 +Stock 1 +vorbereitet 1 +Interesse 1 +Panik 1 +Sprache 1 +vertraut 1 +freuen 1 +kontrollieren 1 +stören 1 +überprüfen 1 +Zustand 1 +gilt 1 +Risiko 1 +Schuss 1 +Mannes 1 +überlebt 1 +Opa 1 +Such 1 +zurückkommen 1 +erzählte 1 +gelogen 1 +Knochen 1 +Kunden 1 +gekriegt 1 +nachdenken 1 +Wesen 1 +Braut 1 +Oma 1 +wahnsinnig 1 +Polizisten 1 +Streit 1 +stehst 1 +hinterlassen 1 +dick 1 +jagen 1 +toller 1 +nutzen 1 +enden 1 +Blödsinn 1 +woran 1 +gebraucht 1 +Rache 1 +Sommer 1 +irre 1 +Urlaub 1 +Kino 1 +Radio 1 +merken 1 +abholen 1 +zeige 1 +kann’s 1 +Keller 1 +stoppen 1 +Labor 1 +Stopp 1 +schwach 1 +verliert 1 +geschah 1 +schreien 1 +Milch 1 +geklaut 1 +hinein 1 +Punkte 1 +Kerle 1 +Publikum 1 +schlage 1 +Gebiet 1 +scheinen 1 +echten 1 +schaffe 1 +Staaten 1 +einfacher 1 +entführt 1 +fragst 1 +Dienst 1 +überlegen 1 +vermisse 1 +wart 1 +weshalb 1 +beendet 1 +kompliziert 1 +warm 1 +Anführer 1 +Feinde 1 +Vertrag 1 +außerhalb 1 +geglaubt 1 +einsam 1 +reparieren 1 +soviel 1 +Washington 1 +ausgehen 1 +bat 1 +Gäste 1 +geheiratet 1 +Programm 1 +stärker 1 +überzeugt 1 +Akte 1 +Trick 1 +verschiedene 1 +Großmutter 1 +Lager 1 +fing 1 +knapp 1 +hoffen 1 +Berg 1 +Ehren 1 +erwachsen 1 +handelt 1 +Fahrer 1 +Fernseher 1 +gäbe 1 +Götter 1 +lebst 1 +gezogen 1 +Schutz 1 +trotz 1 +Zugang 1 +geb 1 +Song 1 +annehmen 1 +Geheimnisse 1 +Verräter 1 +blind 1 +Riesen 1 +schickt 1 +gesamte 1 +behandeln 1 +Kiste 1 +verändern 1 +zählt 1 +Grenze 1 +Bauch 1 +schick 1 +Nachmittag 1 +riecht 1 +schrieb 1 +vergeben 1 +Video 1 +Vorstellung 1 +erstes 1 +landen 1 +Sendung 1 +echter 1 +Fahrt 1 +woanders 1 +Affen 1 +getrennt 1 +komplett 1 +liebte 1 +dringend 1 +gedreht 1 +Prinz 1 +Sprich 1 +Gas 1 +nackt 1 +schlechten 1 +verbunden 1 +Deckung 1 +Gras 1 +schicke 1 +Beeilung 1 +suchst 1 +verletzen 1 +desto 1 +trage 1 +aufgenommen 1 +fliehen 1 +Gewehr 1 +springen 1 +Zunge 1 +merkwürdig 1 +weiterhin 1 +Star 1 +Stuhl 1 +irgend 1 +Tode 1 +Mühe 1 +teuer 1 +ändert 1 +Episode 1 +erzähle 1 +nirgendwo 1 +Zähne 1 +Schnitt 1 +mindestens 1 +Aufmerksamkeit 1 +Helden 1 +satt 1 +blöde 1 +Freundschaft 1 +freundlich 1 +treffe 1 +folgt 1 +Leitung 1 +gesetzt 1 +Norden 1 +Szenen 1 +Roboter 1 +verursacht 1 +Rechnung 1 +Hexe 1 +trauen 1 +Bedeutung 1 +Dieb 1 +junger 1 +nehm 1 +Ohr 1 +Dingen 1 +klappt 1 +Schlange 1 +arbeitest 1 +Grab 1 +morgens 1 +Pilot 1 +bewusst 1 +extra 1 +Heilige 1 +endet 1 +halben 1 +verlässt 1 +Absicht 1 +Ideen 1 +Mond 1 +Selbstmord 1 +Einheit 1 +Projekt 1 +Walter 1 +gehofft 1 +Pferde 1 +umgehen 1 +Aufnahmen 1 +Explosion 1 +Kämpfe 1 +Leichen 1 +Schatten 1 +Geister 1 +Kleider 1 +schweigen 1 +Türen 1 +wählen 1 +erzählst 1 +Garten 1 +schief 1 +zweimal 1 +begann 1 +Schönheit 1 +Bestes 1 +existiert 1 +Bühne 1 +langen 1 +mitgenommen 1 +Nachbarn 1 +Ton 1 +Brust 1 +gemein 1 +handeln 1 +schien 1 +unternehmen 1 +aufgehört 1 +bester 1 +reinkommen 1 +befindet 1 +Hubschrauber 1 +weitermachen 1 +einander 1 +Genie 1 +Wirklichkeit 1 +spielst 1 +Verbrecher 1 +aufgeregt 1 +gegenseitig 1 +Größe 1 +Ärzte 1 +Erlaubnis 1 +Hemd 1 +Killer 1 +Unterstützung 1 +fuhr 1 +größten 1 +Kapitän 1 +schreibt 1 +entlassen 1 +fährst 1 +nachher 1 +beobachtet 1 +entwickelt 1 +Freitag 1 +Nerven 1 +Stop 1 +Text 1 +Tränen 1 +Mitte 1 +Nee 1 +Gegner 1 +geraten 1 +Gast 1 +herauszufinden 1 +blieb 1 +Karma 1 +Strom 1 +besprechen 1 +Kunst 1 +müssten 1 +Schnauze 1 +Alkohol 1 +Jacke 1 +Träumen 1 +Prozent 1 +kenn 1 +Papier 1 +Stich 1 +Zelle 1 +angeht 1 +Geduld 1 +verboten 1 +menschliche 1 +Theater 1 +Agenten 1 +gerufen 1 +schlau 1 +Emily 1 +Herzlichen 1 +Staffel 1 +verpassen 1 +bricht 1 +ertragen 1 +Menschheit 1 +wußte 1 +Hoheit 1 +verwirrt 1 +Abteilung 1 +beeilen 1 +abgeschlossen 1 +abhauen 1 +Chaos 1 +nette 1 +ums 1 +Botschaft 1 +innerhalb 1 +Pfund 1 +dunkel 1 +Regisseur 1 +antun 1 +Senator 1 +Straßen 1 +gewählt 1 +Klo 1 +ziehe 1 +Termin 1 +unschuldig 1 +enttäuscht 1 +Wolf 1 +vertraue 1 +erkannt 1 +liest 1 +schwimmen 1 +stellte 1 +Wachen 1 +ergibt 1 +erlebt 1 +älter 1 +Familien 1 +Gründe 1 +spielte 1 +Wüste 1 +trägst 1 +Alarm 1 +bieten 1 +Flucht 1 +Flotte 1 +konzentrieren 1 +riskieren 1 +schmeckt 1 +befreien 1 +selten 1 +Spiegel 1 +übergeben 1 +lebendig 1 +starten 1 +vermissen 1 +vernichten 1 +angekommen 1 +betrifft 1 +spüren 1 +wahren 1 +durcheinander 1 +Priester 1 +richtiger 1 +Schlacht 1 +begleiten 1 +Gerechtigkeit 1 +Krebs 1 +singt 1 +Truppen 1 +Information 1 +angesehen 1 +Bomben 1 +Bulle 1 +Kuh 1 +Satz 1 +tötete 1 +überzeugen 1 +akzeptieren 1 +arbeitete 1 +Dreh 1 +Kugeln 1 +Lügner 1 +zählen 1 +hungrig 1 +trennen 1 +Zeugen 1 +ebenfalls 1 +mehrere 1 +stört 1 +beinahe 1 +steigen 1 +Stoff 1 +vorn 1 +Films 1 +Müll 1 +stammt 1 +Talent 1 +umzubringen 1 +Fähigkeit 1 +lauter 1 +Spannende 1 +Strafe 1 +Leiter 1 +locker 1 +Westen 1 +angenommen 1 +dahinter 1 +Jonathan 1 +aufnehmen 1 +beruhige 1 +Feld 1 +verlor 1 +zuhören 1 +Kollegen 1 +schwarz 1 +verhaften 1 +voraus 1 +gleichzeitig 1 +versuchst 1 +Universum 1 +begegnet 1 +draussen 1 +saß 1 +geholt 1 +gucken 1 +Brille 1 +Marian 1 +Notfall 1 +wohne 1 +Pizza 1 +Spuren 1 +brennt 1 +Dämon 1 +leichter 1 +Mitglied 1 +Quelle 1 +begraben 1 +Details 1 +erwarte 1 +fehlen 1 +herausgefunden 1 +geöffnet 1 +Brandenburg 1 +verbracht 1 +Klinik 1 +steigt 1 +auseinander 1 +kochen 1 +Sack 1 +Kohle 1 +Nathan 1 +Rock 1 +soll’s 1 +angreifen 1 +Beerdigung 1 +Bravo 1 +ebenso 1 +Presse 1 +Sonntag 1 +bestellt 1 +Japan 1 +legt 1 +Untersuchung 1 +dicht 1 +Süden 1 +gefolgt 1 +besiegen 1 +dürfte 1 +Eindruck 1 +eurem 1 +leise 1 +Manager 1 +ruiniert 1 +Stärke 1 +Treppe 1 +TV 1 +deutlich 1 +Gift 1 +Militär 1 +trinke 1 +Bye 1 +klingelt 1 +Dinger 1 +Schädel 1 +wichtige 1 +dienen 1 +Hintergrund 1 +Vorschlag 1 +rechtzeitig 1 +Montag 1 +drehten 1 +Brot 1 +Dunkelheit 1 +rausfinden 1 +untersuchen 1 +wartest 1 +Führer 1 +Kommando 1 +wundervoll 1 +vorgestellt 1 +Maschinen 1 +nahmen 1 +nenne 1 +erfüllt 1 +Geschmack 1 +Inspektor 1 +Wetter 1 +Mittagessen 1 +Post 1 +gezwungen 1 +harte 1 +Schlafzimmer 1 +überlegt 1 +beobachten 1 +dauernd 1 +Landes 1 +sitze 1 +gelegt 1 +Schweine 1 +tollen 1 +überprüft 1 +China 1 +ergeben 1 +kämpft 1 +Personen 1 +wechseln 1 +zurückkehren 1 +frisch 1 +gelebt 1 +hergekommen 1 +perfekte 1 +Ritter 1 +Schiffe 1 +Wache 1 +Zahl 1 +Admiral 1 +Lippen 1 +roten 1 +Samstag 1 +Klamotten 1 +öfter 1 +schnappen 1 +wirken 1 +erlauben 1 +Geiseln 1 +Kleidung 1 +Pech 1 +Realität 1 +Tim 1 +Bereich 1 +haben’s 1 +Russen 1 +anhalten 1 +aufstehen 1 +dumme 1 +Figuren 1 +geführt 1 +Staat 1 +Beruf 1 +Patient 1 +Schnee 1 +streiten 1 +zog 1 +Tests 1 +irgendeine 1 +aufgegeben 1 +interessieren 1 +Regel 1 +zuviel 1 +atmen 1 +Gegenteil 1 +Heimat 1 +neulich 1 +schlug 1 +beschlossen 1 +Entscheidungen 1 +erleben 1 +fähig 1 +lebte 1 +Vampir 1 +drücken 1 +geworfen 1 +Mitleid 1 +Prozess 1 +jedoch 1 +ließen 1 +befinden 1 +Gerät 1 +Osten 1 +eifersüchtig 1 +esse 1 +Unterhaltung 1 +Wege 1 +genießen 1 +lebend 1 +Tanz 1 +beeindruckt 1 +rote 1 +Cousin 1 +Geräusch 1 +Hosen 1 +Stil 1 +verlangen 1 +wehtun 1 +wird’s 1 +Station 1 +zusehen 1 +schreibe 1 +anderem 1 +betrogen 1 +aufregend 1 +Beweg 1 +erfolgreich 1 +nannte 1 +Reaktion 1 +glaubte 1 +feuern 1 +heilen 1 +Linie 1 +setze 1 +Teams 1 +Tempel 1 +Geburt 1 +Liebes 1 +erfunden 1 +Schulden 1 +unterschreiben 1 +dritte 1 +Internet 1 +Planet 1 +Sterne 1 +dieselbe 1 +Möglichkeiten 1 +Anweisungen 1 +Cent 1 +Gedanke 1 +Häuser 1 +Locke 1 +Trink 1 +Crew 1 +ist’s 1 +raten 1 +Schulter 1 +Theorie 1 +Fass 1 +Himmels 1 +jederzeit 1 +Politik 1 +Einstellung 1 +Magen 1 +Schrank 1 +gemerkt 1 +Griff 1 +rauskommen 1 +Vögel 1 +Zigaretten 1 +Knopf 1 +Artikel 1 +Ratte 1 +Tunnel 1 +einziges 1 +aufgefallen 1 +behauptet 1 +Frankreich 1 +gaben 1 +gewisse 1 +nieder 1 +Schwestern 1 +Verstärkung 1 +warnen 1 +Babys 1 +erstmal 1 +gewarnt 1 +Versteck 1 +einziger 1 +verschiedenen 1 +altes 1 +Krankenwagen 1 +Mittag 1 +begonnen 1 +besseren 1 +beten 1 +Drama 1 +Fische 1 +Motor 1 +Sturm 1 +trug 1 +West 1 +meins 1 +rechten 1 +Teile 1 +Titel 1 +treibt 1 +besucht 1 +Decke 1 +geträumt 1 +loswerden 1 +sieht’s 1 +unterstützen 1 +vieles 1 +Grunde 1 +dritten 1 +gefühlt 1 +Chancen 1 +empfangen 1 +Schild 1 +Stücke 1 +fange 1 +Zylonen 1 +anfassen 1 +Aussage 1 +bestätigt 1 +erfreut 1 +Holz 1 +packen 1 +reisen 1 +vernünftig 1 +greifen 1 +Leck 1 +Studio 1 +Angelegenheit 1 +Helft 1 +richten 1 +Scheck 1 +Stimmung 1 +Zweck 1 +erschreckt 1 +angezogen 1 +führte 1 +probieren 1 +verteidigen 1 +Vertrau 1 +Zucker 1 +Zuschauer 1 +gelandet 1 +hiermit 1 +Sender 1 +Besitz 1 +spüre 1 +verarschen 1 +Wut 1 +geheim 1 +Kaiser 1 +anbieten 1 +Bürger 1 +fühl 1 +normale 1 +Einheiten 1 +praktisch 1 +verdammtes 1 +beigebracht 1 +geküsst 1 +Kindheit 1 +Mantel 1 +Sequenz 1 +Spieler 1 +wiederhole 1 +Fälle 1 +Käse 1 +Scheißkerl 1 +Verabredung 1 +Gedächtnis 1 +schneiden 1 +Ei 1 +Freundinnen 1 +herkommen 1 +lügt 1 +beantworten 1 +Dämonen 1 +gemeldet 1 +informiert 1 +real 1 +erschaffen 1 +gesteckt 1 +hauen 1 +Stern 1 +Suppe 1 +Zigarette 1 +bewahren 1 +schlechtes 1 +anziehen 1 +Hass 1 +Fabrik 1 +Hinweis 1 +hinterher 1 +Todd 1 +unheimlich 1 +Höhle 1 +Kameras 1 +Krieger 1 +Schreibtisch 1 +schuldest 1 +definitiv 1 +entfernen 1 +geschenkt 1 +Verlust 1 +wiederholen 1 +daneben 1 +Sand 1 +sprachen 1 +steckst 1 +gekämpft 1 +Künstler 1 +Uniform 1 +zurecht 1 +besitzt 1 +Drachen 1 +Schritte 1 +Spitze 1 +überlassen 1 +Anrufe 1 +Fluch 1 +schulde 1 +schwere 1 +würd 1 +erfüllen 1 +solch 1 +trinkt 1 +Bedrohung 1 +lügst 1 +durchgemacht 1 +schlafe 1 +habs 1 +lernt 1 +sollt 1 +Unrecht 1 +Feigling 1 +wachsen 1 +wild 1 +anstatt 1 +Kreis 1 +Mittel 1 +Winter 1 +Stress 1 +Ursache 1 +zahlt 1 +Amsterdam 1 +reingelegt 1 +versagt 1 +Akten 1 +gewöhnt 1 +bestraft 1 +Champagner 1 +Hauptmann 1 +spazieren 1 +starke 1 +Geruch 1 +Mitternacht 1 +tolles 1 +wenige 1 +hübsche 1 +Paradies 1 +Abenteuer 1 +ausruhen 1 +schießt 1 +Umgebung 1 +begeistert 1 +behaupten 1 +Papiere 1 +Schokolade 1 +eingesperrt 1 +zwingen 1 +Abmachung 1 +melde 1 +musstest 1 +Anteil 1 +Media 1 +Spass 1 +verliere 1 +Wissenschaft 1 +zahle 1 +brauchten 1 +stinkt 1 +treiben 1 +welch 1 +Warte 1 diff --git a/lang/en/lang.php b/lang/en/lang.php new file mode 100644 index 0000000..d455fde --- /dev/null +++ b/lang/en/lang.php @@ -0,0 +1,15 @@ + + */ + +// Captcha dialog locale strings: +$lang['bm_dlgTitle'] = 'User Check'; +$lang['bm_dlgSubtitle'] = 'Please confirm you are not a bot:'; +$lang['bm_dlgConfirm'] = 'Click to confirm.'; +$lang['bm_dlgChecking'] = 'Checking …'; +$lang['bm_dlgLoading'] = 'Loading page …'; +$lang['bm_dlgError'] = 'An error occured.'; +$lang['bm_noJsWarning'] = 'This page requires JavaScript to be enabled.'; diff --git a/lang/en/settings.php b/lang/en/settings.php index 388f996..67a8835 100644 --- a/lang/en/settings.php +++ b/lang/en/settings.php @@ -5,6 +5,22 @@ * @author Sascha Leib */ +$lang['showday'] = 'Which data to show in the “Latest” tab:'; + $lang['showday_o_yesterday'] = 'Last full day (yesterday)'; + $lang['showday_o_today'] = 'Ongoing logs (today)'; + +$lang['combineNets'] = 'Combine visits from known IP-ranges into one entry:'; + $lang['geoiplib'] = 'Add GeoIP Information
(requires PHP module to be installed)'; - $lang['geoiplib_o_disabled'] = 'Disabled'; - $lang['geoiplib_o_phpgeoip'] = 'Use GeoIP Module'; \ No newline at end of file + $lang['geoiplib_o_disabled'] = 'Disabled'; + $lang['geoiplib_o_phpgeoip'] = 'Use GeoIP Module'; + +$lang['useCaptcha'] = 'Enable Captcha
(Experimental, read the manual first!)'; + $lang['useCaptcha_o_disabled'] = 'Disabled'; + $lang['useCaptcha_o_loremipsum'] = 'Captcha with Lorem ipsum text'; + $lang['useCaptcha_o_dada'] = 'Captcha with Dada placeholder text'; + +$lang['captchaSeed'] = 'Captcha Seed
(Enter a random string, e.g. from here)'; + +$lang['captchaBypass'] = 'Automatically solve the Captcha, if …
(Note: this probably does not make much sense for English wikis!)'; + $lang['captchaBypass_langmatch'] = 'Client and page languages match '; diff --git a/lang/en/wordlist.txt b/lang/en/wordlist.txt new file mode 100644 index 0000000..dfc4bfc --- /dev/null +++ b/lang/en/wordlist.txt @@ -0,0 +1,3050 @@ +Word Count +the 2814 +of 1698 +and 1497 +to 1298 +in 871 +I 588 +that 554 +was 504 +his 440 +he 420 +it 403 +with 386 +is 378 +for 355 +as 352 +had 307 +you 302 +not 287 +be 283 +her 260 +on 256 +at 255 +by 253 +which 229 +have 217 +or 211 +from 205 +this 201 +him 199 +but 195 +all 185 +she 171 +they 167 +were 166 +my 164 +are 161 +me 151 +one 142 +their 141 +so 140 +an 132 +said 132 +them 125 +we 125 +who 124 +would 120 +been 118 +will 116 +no 112 +when 99 +there 98 +if 98 +more 95 +out 94 +up 90 +into 85 +do 84 +any 83 +your 83 +what 80 +has 80 +man 79 +could 79 +other 77 +than 75 +our 75 +some 74 +very 73 +time 72 +upon 71 +about 71 +may 70 +its 69 +only 66 +now 66 +like 64 +little 64 +then 63 +can 61 +should 60 +made 59 +did 59 +us 59 +such 57 +a 57 +great 56 +before 56 +must 55 +two 55 +these 55 +see 54 +know 54 +over 53 +much 51 +down 49 +after 49 +first 49 +Mr 49 +good 48 +men 46 +own 46 +never 45 +most 44 +old 44 +shall 44 +day 44 +where 44 +those 44 +came 44 +come 44 +himself 43 +way 43 +work 41 +life 41 +without 41 +go 41 +make 40 +well 40 +through 40 +being 40 +long 40 +say 39 +might 39 +how 39 +am 38 +too 38 +even 38 +def 37 +again 37 +many 37 +back 37 +here 36 +think 36 +every 35 +people 35 +went 35 +same 34 +last 34 +thought 34 +away 34 +under 34 +take 33 +found 33 +hand 32 +eyes 32 +still 32 +place 31 +while 31 +just 31 +also 30 +young 30 +yet 29 +though 29 +against 28 +things 28 +get 28 +ever 28 +give 28 +god 28 +years 27 +off 27 +face 27 +nothing 27 +right 27 +once 27 +another 27 +left 27 +part 26 +saw 26 +house 26 +world 26 +head 26 +three 25 +took 25 +new 25 +love 25 +always 25 +Mrs 25 +put 25 +night 24 +each 24 +king 24 +between 24 +tell 24 +mind 24 +heart 23 +few 23 +because 23 +thing 23 +whom 23 +far 23 +seemed 22 +looked 22 +called 22 +whole 22 +de 22 +set 22 +both 22 +got 22 +find 22 +done 22 +heard 21 +look 21 +name 21 +days 21 +told 21 +let 21 +lord 21 +country 21 +asked 21 +going 21 +seen 21 +better 21 +having 21 +home 21 +knew 21 +side 20 +something 20 +moment 20 +father 19 +among 19 +course 19 +hands 19 +woman 19 +enough 19 +words 19 +mother 19 +soon 19 +full 19 +end 18 +gave 18 +room 18 +almost 18 +small 18 +thou 18 +cannot 18 +water 18 +want 18 +however 18 +light 18 +quite 18 +brought 17 +nor 17 +word 17 +whose 17 +given 17 +door 17 +best 17 +turned 17 +taken 17 +does 17 +use 17 +morning 17 +myself 16 +felt 16 +until 16 +since 16 +power 16 +themselves 16 +used 16 +rather 16 +began 16 +present 16 +voice 16 +others 16 +white 16 +works 16 +less 16 +money 16 +next 16 +poor 16 +death 15 +stood 15 +form 15 +within 15 +together 15 +till 15 +thy 15 +large 15 +matter 15 +kind 15 +often 15 +certain 15 +herself 15 +year 15 +friend 15 +half 15 +order 15 +round 15 +TRUE 15 +anything 14 +keep 14 +sent 14 +wife 14 +means 14 +believe 14 +passed 14 +feet 14 +near 14 +public 14 +state 14 +son 14 +hundred 14 +children 14 +thus 14 +hope 14 +alone 14 +above 14 +case 14 +dear 14 +thee 13 +says 13 +person 13 +high 13 +read 13 +city 13 +already 13 +received 13 +fact 13 +gone 13 +girl 13 +known 13 +hear 13 +times 13 +least 13 +perhaps 13 +sure 13 +indeed 13 +english 13 +open 13 +body 13 +itself 13 +along 13 +land 12 +return 12 +leave 12 +air 12 +nature 12 +answered 12 +either 12 +law 12 +help 12 +lay 12 +point 12 +child 12 +letter 12 +four 12 +wish 12 +fire 12 +cried 12 +women 12 +speak 12 +number 12 +therefore 12 +hour 12 +friends 12 +held 12 +free 12 +war 12 +during 12 +several 12 +business 12 +whether 12 +er 12 +manner 12 +second 12 +reason 11 +replied 11 +united 11 +call 11 +general 11 +why 11 +behind 11 +became 11 +john 11 +become 11 +dead 11 +earth 11 +boy 11 +lost 11 +forth 11 +thousand 11 +looking 11 +I’ll 11 +family 11 +soul 11 +feel 11 +coming 11 +England 11 +spirit 11 +question 11 +care 11 +truth 11 +ground 11 +really 11 +rest 11 +mean 11 +different 11 +making 11 +possible 10 +fell 10 +towards 10 +human 10 +kept 10 +short 10 +town 10 +following 10 +need 10 +cause 10 +met 10 +evening 10 +returned 10 +five 10 +strong 10 +able 10 +french 10 +live 10 +lady 10 +subject 10 +sn 10 +answer 10 +sea 10 +fear 10 +understand 10 +hard 10 +terms 10 +doubt 10 +around 10 +ask 10 +arms 10 +turn 10 +sense 10 +seems 10 +black 10 +bring 10 +followed 10 +beautiful 10 +close 9 +dark 9 +hold 9 +character 9 +sort 9 +sight 9 +ten 9 +show 9 +party 9 +fine 9 +ye 9 +ready 9 +story 9 +common 9 +book 9 +electronic 9 +talk 9 +account 9 +mark 9 +interest 9 +written 9 +can’t 9 +bed 9 +necessary 9 +age 9 +else 9 +force 9 +idea 9 +longer 9 +art 9 +spoke 9 +across 9 +brother 9 +early 9 +ought 9 +sometimes 9 +line 9 +saying 9 +table 9 +appeared 8 +river 8 +continued 8 +eye 8 +ety 8 +sun 8 +information 8 +later 8 +everything 8 +reached 8 +suddenly 8 +past 8 +hours 8 +strange 8 +deep 8 +change 8 +miles 8 +feeling 8 +act 8 +meet 8 +paid 8 +further 8 +purpose 8 +happy 8 +added 8 +seem 8 +taking 8 +blood 8 +rose 8 +south 8 +beyond 8 +cold 8 +neither 8 +forward 8 +view 8 +I’ve 8 +position 8 +sound 8 +none 8 +entered 8 +clear 8 +road 8 +late 8 +stand 8 +suppose 8 +daughter 8 +real 8 +nearly 8 +mine 8 +laws 8 +knowledge 8 +comes 8 +toward 8 +bad 8 +cut 8 +copy 8 +husband 8 +six 8 +France 8 +living 8 +peace 8 +didn’t 7 +low 7 +north 7 +remember 7 +effect 7 +natural 7 +pretty 7 +fall 7 +fair 7 +service 7 +below 7 +except 7 +American 7 +hair 7 +London 7 +laid 7 +pass 7 +led 7 +copyright 7 +doing 7 +army 7 +run 7 +horse 7 +future 7 +opened 7 +pleasure 7 +history 7 +west 7 +pay 7 +red 7 +an’ 7 +hath 7 +note 7 +although 7 +wanted 7 +gold 7 +makes 7 +desire 7 +play 7 +master 7 +office 7 +tried 7 +front 7 +big 7 +lived 7 +certainly 7 +wind 7 +receive 7 +attention 7 +government 7 +unto 7 +church 7 +strength 7 +length 7 +company 7 +placed 7 +paper 7 +letters 7 +probably 7 +glad 7 +important 7 +especially 7 +greater 7 +yourself 7 +fellow 7 +bear 7 +opinion 7 +window 7 +ran 7 +faith 7 +ago 7 +agreement 7 +charge 6 +beauty 6 +lips 6 +remained 6 +arm 6 +latter 6 +duty 6 +send 6 +distance 6 +silence 6 +foot 6 +wild 6 +object 6 +die 6 +save 6 +gentleman 6 +trees 6 +green 6 +trouble 6 +smile 6 +books 6 +wrong 6 +various 6 +sleep 6 +persons 6 +blockquote 6 +happened 6 +particular 6 +drew 6 +minutes 6 +hardly 6 +walked 6 +chief 6 +chance 6 +according 6 +beginning 6 +action 6 +deal 6 +loved 6 +visit 6 +thinking 6 +follow 6 +standing 6 +knows 6 +try 6 +presence 6 +heavy 6 +sweet 6 +plain 6 +donations 6 +immediately 6 +wrote 6 +mouth 6 +rich 6 +thoughts 6 +months 6 +won’t 6 +afraid 6 +Paris 6 +single 6 +joy 6 +enemy 6 +broken 6 +unless 6 +states 6 +ship 6 +condition 6 +carry 6 +exclaimed 6 +including 6 +filled 6 +seeing 6 +influence 6 +write 6 +boys 6 +appear 6 +outside 6 +secret 6 +parts 6 +please 6 +appearance 6 +evil 6 +march 6 +whatever 6 +slowly 6 +tears 6 +horses 6 +places 6 +caught 6 +stay 5 +instead 5 +struck 5 +blue 5 +York 5 +impossible 5 +period 5 +sister 5 +battle 5 +school 5 +raised 5 +occasion 5 +married 5 +man’s 5 +former 5 +food 5 +youth 5 +learned 5 +merely 5 +reach 5 +system 5 +twenty 5 +dinner 5 +quiet 5 +easily 5 +moved 5 +afterwards 5 +giving 5 +walk 5 +stopped 5 +laughed 5 +language 5 +expression 5 +week 5 +hall 5 +danger 5 +property 5 +wonder 5 +usual 5 +figure 5 +born 5 +court 5 +generally 5 +grew 5 +showed 5 +getting 5 +ancient 5 +respect 5 +third 5 +worth 5 +simple 5 +tree 5 +leaving 5 +remain 5 +society 5 +fight 5 +wall 5 +result 5 +heaven 5 +started 5 +command 5 +tone 5 +regard 5 +expected 5 +mere 5 +month 5 +beside 5 +silent 5 +perfect 5 +experience 5 +street 5 +writing 5 +goes 5 +circumstances 5 +entirely 5 +fresh 5 +duke 5 +covered 5 +bound 5 +east 5 +wood 5 +stone 5 +quickly 5 +notice 5 +bright 5 +boat 5 +noble 5 +meant 5 +somewhat 5 +sudden 5 +value 5 +c. 5 +direction 5 +chair 5 +due 5 +support 5 +tom 5 +date 5 +waiting 5 +village 5 +lives 5 +reading 5 +agree 5 +lines 5 +considered 5 +field 5 +observed 5 +scarcely 5 +wished 5 +wait 5 +greatest 5 +permission 5 +success 5 +piece 5 +British 5 +ex 5 +formed 5 +speaking 5 +trying 5 +conversation 5 +proper 5 +hill 5 +music 5 +opportunity 5 +that’s 5 +German 5 +afternoon 5 +cry 5 +cost 5 +allowed 5 +girls 5 +considerable 5 +broke 5 +honour 5 +seven 5 +private 5 +sit 5 +news 5 +top 5 +scene 5 +discovered 5 +marriage 5 +step 5 +garden 5 +race 5 +begin 5 +per 5 +individual 5 +sitting 5 +learn 5 +political 5 +difficult 5 +bit 5 +speech 5 +lie 4 +cast 4 +eat 4 +authority 4 +etc. 4 +floor 4 +ill 4 +ways 4 +officers 4 +offered 4 +original 4 +happiness 4 +flowers 4 +produced 4 +summer 4 +provide 4 +study 4 +religion 4 +picture 4 +walls 4 +personal 4 +America 4 +watch 4 +pleased 4 +leaves 4 +declared 4 +hot 4 +understood 4 +effort 4 +prepared 4 +escape 4 +attempt 4 +supposed 4 +killed 4 +fast 4 +author 4 +Indian 4 +brown 4 +determined 4 +pain 4 +spring 4 +takes 4 +drawn 4 +soldiers 4 +houses 4 +beneath 4 +talking 4 +turning 4 +century 4 +steps 4 +intended 4 +soft 4 +straight 4 +matters 4 +likely 4 +corner 4 +trademark 4 +justice 4 +simply 4 +produce 4 +trust 4 +appears 4 +Rome 4 +laugh 4 +forget 4 +Europe 4 +passage 4 +eight 4 +closed 4 +ourselves 4 +gives 4 +dress 4 +passing 4 +terrible 4 +required 4 +medium 4 +efforts 4 +sake 4 +breath 4 +wise 4 +ladies 4 +possession 4 +pleasant 4 +perfectly 4 +o’ 4 +memory 4 +usually 4 +grave 4 +fixed 4 +modern 4 +spot 4 +troops 4 +rise 4 +break 4 +fifty 4 +island 4 +meeting 4 +camp 4 +nation 4 +existence 4 +reply 4 +I’d 4 +copies 4 +sky 4 +touch 4 +equal 4 +fortune 4 +v. 4 +shore 4 +domain 4 +named 4 +situation 4 +looks 4 +promise 4 +orders 4 +degree 4 +middle 4 +winter 4 +plan 4 +spent 4 +allow 4 +pale 4 +conduct 4 +running 4 +religious 4 +surprise 4 +minute 4 +roman 4 +cases 4 +shot 4 +lead 4 +move 4 +names 4 +stop 4 +higher 4 +et 4 +father’s 4 +threw 4 +worse 4 +built 4 +spoken 4 +glass 4 +board 4 +vain 4 +affairs 4 +instance 4 +safe 4 +loss 4 +doctor 4 +offer 4 +class 4 +complete 4 +access 4 +lower 4 +wouldn’t 4 +repeated 4 +forms 4 +darkness 4 +military 4 +warm 4 +drink 4 +passion 4 +ones 4 +physical 4 +example 4 +ears 4 +questions 4 +start 4 +lying 4 +smiled 4 +keeping 4 +spite 4 +shown 4 +directly 4 +james 4 +hart 4 +serious 4 +hat 4 +dog 4 +silver 4 +sufficient 4 +main 4 +mentioned 4 +servant 4 +pride 4 +crowd 4 +train 4 +wonderful 4 +moral 4 +instant 4 +associated 4 +path 4 +greek 4 +meaning 4 +fit 4 +ordered 4 +lot 4 +he’s 4 +proved 4 +obliged 4 +enter 4 +rule 4 +sword 4 +attack 4 +seat 4 +game 4 +health 4 +paragraph 4 +statement 4 +social 4 +refund 4 +sorry 4 +courage 4 +members 4 +grace 4 +official 4 +dream 4 +worthy 4 +rock 4 +jack 4 +provided 4 +special 4 +shook 4 +request 4 +mighty 4 +glance 4 +heads 4 +movement 4 +fee 4 +share 4 +expect 4 +couldn’t 4 +dollars 4 +spread 4 +opposite 4 +glory 4 +twelve 4 +space 4 +engaged 4 +peter 4 +wine 4 +ordinary 4 +mountains 4 +taste 4 +iron 4 +isn’t 4 +distribute 4 +trade 4 +consider 4 +greatly 4 +accepted 4 +forced 4 +advantage 4 +ideas 4 +decided 4 +using 4 +officer 4 +rate 4 +clothes 4 +sign 4 +feelings 4 +native 4 +promised 4 +judge 4 +difference 4 +working 4 +anxious 4 +marry 4 +captain 4 +finished 4 +extent 4 +watched 4 +curious 4 +foreign 4 +besides 4 +method 4 +excellent 4 +confidence 4 +marked 4 +’em 4 +jesus 4 +exactly 4 +importance 4 +finally 4 +bill 3 +vast 3 +prove 3 +fancy 3 +quick 3 +yes 3 +sought 3 +prevent 3 +neck 3 +hearts 3 +liberty 3 +interesting 3 +sides 3 +legal 3 +gentlemen 3 +dry 3 +serve 3 +aside 3 +pure 3 +concerning 3 +forgotten 3 +lose 3 +powers 3 +possessed 3 +thrown 3 +evidence 3 +distant 3 +progress 3 +similar 3 +narrow 3 +altogether 3 +building 3 +page 3 +particularly 3 +knowing 3 +weeks 3 +settled 3 +holding 3 +mountain 3 +search 3 +sad 3 +sin 3 +lies 3 +proud 3 +pieces 3 +clearly 3 +price 3 +ships 3 +thirty 3 +sick 3 +honest 3 +shut 3 +talked 3 +bank 3 +fate 3 +dropped 3 +judgment 3 +conditions 3 +king’s 3 +accept 3 +hills 3 +removed 3 +forest 3 +measure 3 +species 3 +seek 3 +highest 3 +otherwise 3 +stream 3 +honor 3 +carefully 3 +obtained 3 +ear 3 +bread 3 +bottom 3 +additional 3 +presented 3 +aid 3 +fingers 3 +remembered 3 +choose 3 +agreed 3 +animal 3 +events 3 +there’s 3 +fully 3 +delight 3 +rights 3 +amount 3 +obtain 3 +tax 3 +servants 3 +sons 3 +cross 3 +shoulders 3 +thick 3 +points 3 +stranger 3 +woods 3 +facts 3 +dare 3 +grow 3 +creature 3 +hung 3 +rain 3 +FALSE 3 +tall 3 +gate 3 +nations 3 +created 3 +refused 3 +quietly 3 +surface 3 +freely 3 +holy 3 +streets 3 +blow 3 +july 3 +regarded 3 +fashion 3 +report 3 +coast 3 +daily 3 +file 3 +shoulder 3 +surprised 3 +faces 3 +succeeded 3 +birds 3 +distribution 3 +royal 3 +song 3 +wealth 3 +comfort 3 +failed 3 +freedom 3 +peculiar 3 +anyone 3 +advance 3 +gentle 3 +surely 3 +animals 3 +waited 3 +secure 3 +desired 3 +grass 3 +touched 3 +occupied 3 +draw 3 +stage 3 +portion 3 +expressed 3 +opening 3 +june 3 +spirits 3 +fish 3 +tongue 3 +capital 3 +angry 3 +growing 3 +served 3 +carriage 3 +weather 3 +breast 3 +presently 3 +snow 3 +papers 3 +necessity 3 +practice 3 +claim 3 +hast 3 +education 3 +sharp 3 +prince 3 +permitted 3 +group 3 +enemies 3 +robert 3 +played 3 +throughout 3 +pity 3 +expense 3 +yours 3 +million 3 +add 3 +pray 3 +taught 3 +explained 3 +tired 3 +leading 3 +kill 3 +shadow 3 +companion 3 +weight 3 +mass 3 +established 3 +suffered 3 +gray 3 +brave 3 +thin 3 +satisfied 3 +check 3 +virtue 3 +golden 3 +numerous 3 +frequently 3 +famous 3 +telling 3 +powerful 3 +alive 3 +waters 3 +national 3 +weak 3 +divine 3 +material 3 +principal 3 +gathered 3 +suggested 3 +frank 3 +valley 3 +guess 3 +finding 3 +yellow 3 +heat 3 +remains 3 +bent 3 +seized 3 +guard 3 +equally 3 +naturally 3 +box 3 +remarkable 3 +gods 3 +moon 3 +slight 3 +style 3 +pointed 3 +saved 3 +windows 3 +crossed 3 +louis 3 +pounds 3 +ain’t 3 +evidently 3 +principle 3 +immediate 3 +willing 3 +consequence 3 +richard 3 +principles 3 +characters 3 +paul 3 +season 3 +remarked 3 +science 3 +tender 3 +worked 3 +grown 3 +whispered 3 +interested 3 +quarter 3 +midst 3 +liked 3 +advanced 3 +apparently 3 +bore 3 +pwh 3 +active 3 +noticed 3 +aware 3 +thomas 3 +uncle 3 +list 3 +dangerous 3 +august 3 +calm 3 +genius 3 +sacred 3 +kingdom 3 +entire 3 +popular 3 +unknown 3 +nice 3 +habit 3 +spanish 3 +familiar 3 +reader 3 +published 3 +direct 3 +handsome 3 +you’ll 3 +joined 3 +actually 3 +kings 3 +posted 3 +approach 3 +Washington 3 +hearing 3 +needed 3 +increased 3 +walking 3 +twice 3 +throw 3 +intellectual 3 +appointed 3 +wisdom 3 +ceased 3 +truly 3 +numbers 3 +demanded 3 +priest 3 +wounded 3 +sorrow 3 +drive 3 +fault 3 +listened 3 +palace 3 +affair 3 +contact 3 +distinguished 3 +station 3 +beat 3 +distributed 3 +listen 3 +Italy 3 +fool 3 +becomes 3 +watching 3 +hurt 3 +wants 3 +express 3 +occurred 3 +favour 3 +height 3 +size 3 +edge 3 +subjects 3 +task 3 +follows 3 +interests 3 +nine 3 +sympathy 3 +burst 3 +putting 3 +dressed 3 +lifted 3 +hopes 3 +suffer 3 +noise 3 +smiling 3 +rode 3 +tells 3 +minds 3 +farther 3 +literature 3 +vessel 3 +affection 3 +suffering 3 +proceeded 3 +flesh 3 +advice 3 +grand 3 +carrying 3 +legs 3 +Spain 3 +post 3 +collection 3 +empty 3 +rank 3 +storm 3 +god’s 3 +imagine 3 +wore 3 +duties 3 +admitted 3 +countries 3 +pocket 3 +arrival 3 +imagination 3 +driven 3 +loud 3 +sentence 3 +lovely 3 +extraordinary 3 +November 3 +December 3 +happen 3 +absence 3 +breakfast 3 +population 3 +thank 3 +rules 3 +inhabitants 3 +series 3 +laughing 3 +address 3 +relief 3 +bird 3 +owner 3 +impression 3 +satisfaction 3 +coat 3 +prepare 3 +relations 3 +shape 3 +birth 3 +rapidly 3 +smoke 3 +January 3 +mother’s 3 +machine 3 +content 3 +consideration 3 +accompanied 3 +regular 3 +moving 3 +stands 3 +wholly 3 +teeth 3 +busy 3 +treated 3 +burning 3 +shame 3 +quality 3 +bay 3 +discover 3 +inside 3 +brain 3 +soil 3 +completely 3 +message 3 +ring 3 +resolved 3 +calling 3 +phrase 3 +acts 3 +mention 3 +square 3 +pair 3 +won 3 +title 3 +understanding 3 +Sunday 3 +fruit 3 +mad 3 +forces 3 +included 3 +tea 3 +rocks 3 +nearer 3 +slaves 3 +falling 3 +absolutely 3 +slow 3 +bearing 3 +mercy 3 +larger 3 +explain 3 +contain 3 +grief 3 +soldier 3 +wasn’t 3 +countenance 3 +previous 3 +explanation 3 +welcome 3 +proposed 3 +prayer 3 +stars 3 +Germany 3 +belief 3 +informed 3 +moments 3 +poetry 3 +constant 3 +buy 3 +final 3 +faithful 3 +ride 3 +policy 3 +supper 3 +drawing 3 +excitement 3 +dying 3 +demand 3 +fighting 3 +fields 3 +drove 3 +upper 3 +sum 3 +motion 2 +assistance 2 +forty 2 +April 2 +stones 2 +fees 2 +kindly 2 +dignity 2 +catch 2 +October 2 +seated 2 +knees 2 +amongst 2 +current 2 +sending 2 +parties 2 +objects 2 +gained 2 +bitter 2 +possibly 2 +slave 2 +separate 2 +loose 2 +text 2 +receiving 2 +worst 2 +sold 2 +don 2 +credit 2 +chosen 2 +hoped 2 +printed 2 +terror 2 +features 2 +fond 2 +control 2 +capable 2 +fifteen 2 +doesn’t 2 +firm 2 +superior 2 +cruel 2 +spiritual 2 +splendid 2 +proof 2 +pressed 2 +sooner 2 +join 2 +process 2 +crime 2 +dust 2 +instantly 2 +lands 2 +relation 2 +doors 2 +concerned 2 +deeply 2 +practical 2 +colour 2 +sing 2 +destroy 2 +anger 2 +distributing 2 +results 2 +increase 2 +reasons 2 +nose 2 +friendly 2 +entrance 2 +rooms 2 +admit 2 +supply 2 +clean 2 +useful 2 +yesterday 2 +delicate 2 +fail 2 +continue 2 +remove 2 +addressed 2 +choice 2 +huge 2 +needs 2 +wear 2 +blind 2 +unable 2 +cover 2 +double 2 +victory 2 +dozen 2 +constantly 2 +level 2 +India 2 +release 2 +rough 2 +ended 2 +shows 2 +fly 2 +praise 2 +devil 2 +ahead 2 +smith 2 +connected 2 +degrees 2 +gain 2 +addition 2 +committed 2 +chamber 2 +notes 2 +Italian 2 +gradually 2 +acquaintance 2 +bought 2 +souls 2 +mission 2 +sacrifice 2 +cities 2 +mistake 2 +exercise 2 +conscience 2 +based 2 +car 2 +buried 2 +theory 2 +commanded 2 +nobody 2 +minister 2 +closely 2 +energy 2 +dick 2 +bare 2 +fought 2 +partly 2 +mistress 2 +hate 2 +arose 2 +playing 2 +color 2 +lake 2 +safety 2 +provisions 2 +description 2 +asleep 2 +centre 2 +faint 2 +thinks 2 +parents 2 +escaped 2 +careful 2 +enjoy 2 +drop 2 +brilliant 2 +brief 2 +bringing 2 +worship 2 +goods 2 +tale 2 +skin 2 +roof 2 +grey 2 +highly 2 +crown 2 +castle 2 +excited 2 +throne 2 +stated 2 +despair 2 +ease 2 +attached 2 +total 2 +kindness 2 +mile 2 +citizens 2 +circle 2 +dull 2 +extreme 2 +clouds 2 +figures 2 +intention 2 +prison 2 +term 2 +assured 2 +hidden 2 +thoroughly 2 +cup 2 +member 2 +civil 2 +apply 2 +labor 2 +everywhere 2 +intelligence 2 +strike 2 +fairly 2 +comply 2 +fellows 2 +haven’t 2 +event 2 +gently 2 +connection 2 +protection 2 +conscious 2 +edition 2 +directed 2 +pulled 2 +flight 2 +evident 2 +surrounded 2 +wishes 2 +yards 2 +voices 2 +weary 2 +couple 2 +variety 2 +whilst 2 +volume 2 +details 2 +older 2 +requirements 2 +custom 2 +apart 2 +bow 2 +awful 2 +everybody 2 +labour 2 +asking 2 +lover 2 +showing 2 +introduced 2 +suit 2 +becoming 2 +composed 2 +plans 2 +rendered 2 +pictures 2 +lest 2 +volunteers 2 +singing 2 +eager 2 +precious 2 +paused 2 +require 2 +meat 2 +whenever 2 +milk 2 +dogs 2 +successful 2 +plants 2 +vision 2 +rare 2 +granted 2 +raise 2 +Egypt 2 +manners 2 +cousin 2 +you’ve 2 +development 2 +obs 2 +cool 2 +trial 2 +learning 2 +approached 2 +bridge 2 +abroad 2 +devoted 2 +paying 2 +literary 2 +writer 2 +fn 2 +Israel 2 +disappeared 2 +interrupted 2 +stock 2 +readers 2 +dreadful 2 +female 2 +protect 2 +accustomed 2 +Virginia 2 +type 2 +recognized 2 +salt 2 +destroyed 2 +signs 2 +innocent 2 +temper 2 +plenty 2 +pope 2 +avoid 2 +hurried 2 +represented 2 +favor 2 +mental 2 +attitude 2 +returning 2 +admiration 2 +brothers 2 +anxiety 2 +queen 2 +teach 2 +count 2 +curiosity 2 +solemn 2 +causes 2 +vessels 2 +compelled 2 +dance 2 +hotel 2 +wicked 2 +fled 2 +kissed 2 +guns 2 +fill 2 +visible 2 +younger 2 +guide 2 +earnest 2 +actual 2 +companions 2 +prisoner 2 +miserable 2 +lad 2 +harm 2 +views 2 +Irish 2 +utterly 2 +ends 2 +shop 2 +stairs 2 +pardon 2 +beg 2 +seldom 2 +kinds 2 +record 2 +fat 2 +sand 2 +violent 2 +branches 2 +inquired 2 +September 2 +worn 2 +Ireland 2 +flat 2 +departure 2 +delivered 2 +gift 2 +ruin 2 +skill 2 +cattle 2 +equipment 2 +temple 2 +calls 2 +earlier 2 +license 2 +visited 2 +en 2 +consent 2 +sufficiently 2 +natives 2 +wound 2 +laughter 2 +contained 2 +perceived 2 +scattered 2 +whence 2 +rushed 2 +chiefly 2 +bold 2 +anywhere 2 +witness 2 +foolish 2 +helped 2 +kitchen 2 +sell 2 +anybody 2 +self 2 +extremely 2 +treatment 2 +throat 2 +dreams 2 +patient 2 +speed 2 +growth 2 +quantity 2 +Latin 2 +immense 2 +conclusion 2 +computer 2 +affected 2 +severe 2 +excuse 2 +triumph 2 +origin 2 +slept 2 +eternal 2 +thine 2 +audience 2 +pages 2 +sounds 2 +swift 2 +limited 2 +wings 2 +stepped 2 +services 2 +library 2 +remaining 2 +containing 2 +base 2 +confusion 2 +win 2 +maid 2 +charming 2 +editions 2 +attended 2 +softly 2 +reality 2 +performed 2 +glorious 2 +likewise 2 +site 2 +sail 2 +frightened 2 +acquainted 2 +unhappy 2 +feared 2 +article 2 +prisoners 2 +store 2 +adopted 2 +shalt 2 +remark 2 +cook 2 +thousands 2 +pause 2 +inclined 2 +convinced 2 +band 2 +valuable 2 +hence 2 +desert 2 +effects 2 +kiss 2 +plant 2 +ice 2 +ball 2 +stick 2 +absolute 2 +readily 2 +behold 2 +fierce 2 +argument 2 +observe 2 +blessed 2 +bosom 2 +rage 2 +striking 2 +discovery 2 +creatures 2 +shouted 2 +guilty 2 +related 2 +setting 2 +forgot 2 +punishment 2 +gun 2 +slightly 2 +articles 2 +police 2 +mysterious 2 +extended 2 +confess 2 +shade 2 +murder 2 +emotion 2 +destruction 2 +wondered 2 +increasing 2 +hide 2 +expedition 2 +horror 2 +local 2 +expenses 2 +ignorant 2 +doctrine 2 +generous 2 +range 2 +host 2 +wet 2 +cloud 2 +mystery 2 +waste 2 +changes 2 +possess 2 +consciousness 2 +February 2 +trembling 2 +disease 2 +formerly 2 +spend 2 +production 2 +source 2 +mankind 2 +universal 2 +deck 2 +sees 2 +habits 2 +estate 2 +aunt 2 +reign 2 +humble 2 +compliance 2 +delay 2 +shining 2 +reported 2 +hers 2 +unfortunate 2 +midnight 2 +listening 2 +flower 2 +hero 2 +accomplished 2 +doth 2 +classes 2 +thanks 2 +banks 2 +philosophy 2 +belong 2 +finger 2 +comfortable 2 +market 2 +cap 2 +waves 2 +woman’s 2 +glanced 2 +troubled 2 +difficulties 2 +picked 2 +European 2 +purposes 2 +somewhere 2 +delighted 2 +pushed 2 +press 2 +household 2 +fleet 2 +baby 2 +region 2 +lately 2 +uttered 2 +exact 2 +image 2 +ages 2 +murmured 2 +melancholy 2 +suspicion 2 +bowed 2 +refuse 2 +staff 2 +liability 2 +we’ll 2 +enjoyed 2 +stretched 2 +gaze 2 +belonged 2 +ashamed 2 +reward 2 +meal 2 +blame 2 +nodded 2 +status 2 +opinions 2 +indicate 2 +poem 2 +savage 2 +arise 2 +voyage 2 +misery 2 +guests 2 +painted 2 +attend 2 +afford 2 +donate 2 +job 2 +proceed 2 +loves 2 +forehead 2 +regret 2 +plainly 2 +risk 2 +ad 2 +lighted 2 +angel 2 +rapid 2 +distinct 2 +doubtless 2 +properly 2 +wit 2 +fame 2 +singular 2 +error 2 +utmost 2 +methods 2 +reputation 2 +appeal 2 +she’s 2 +strongly 2 +lack 2 +breaking 2 +dawn 2 +violence 2 +fatal 2 +render 2 +career 2 +design 2 +displayed 2 +gets 2 +commercial 2 +forgive 2 +lights 2 +agreeable 2 +suggestion 2 +utter 2 +sheep 2 +resolution 2 +spare 2 +patience 2 +domestic 2 +concluded 2 +’tis 2 +farm 2 +reference 2 +Chinese 2 +exist 2 +corn 2 +approaching 2 +alike 2 +mounted 2 +issue 2 +key 2 +providing 2 +majority 2 +measures 2 +towns 2 +flame 2 +Boston 2 +dared 2 +ignorance 2 +reduced 2 +occasionally 2 +weakness 2 +furnished 2 +china 2 +priests 2 +flying 2 +cloth 2 +gazed 2 +profit 2 +fourth 2 +bell 2 +hitherto 2 +benefit 2 +movements 2 +eagerly 2 +acted 2 +urged 2 +ascii 2 +disposed 2 +electronically 2 +atmosphere 2 +chapter 2 +begged 2 +hole 2 +invited 2 +borne 2 +departed 2 +catholic 2 +files 2 +reasonable 2 +sugar 2 +replacement 2 +sigh 2 +humanity 2 +thrust 2 +frame 2 +opposition 2 +disk 2 +haste 2 +lonely 2 +artist 2 +knight 2 +quarters 2 +charm 2 +substance 2 +rolled 2 +email 2 +flung 2 +celebrated 2 +division 2 +slavery 2 +verse 2 +decision 2 +probable 2 +painful 2 +governor 2 +forever 2 +turns 2 +branch 2 +ocean 2 +rear 2 +leader 2 +delightful 2 +stared 2 +boats 2 +keen 2 +disposition 2 +senses 2 +occasions 2 +readable 2 +beloved 2 +inches 2 +bones 2 +enthusiasm 2 +materials 2 +luck 2 +derived 2 +managed 2 +community 2 +apparent 2 +preserved 2 +magnificent 2 +hurry 2 +scheme 2 +oil 2 +thence 2 +reaching 2 +dim 2 +wretched 2 +hanging 2 +pipe 2 +useless 2 +nevertheless 2 +print 2 +smooth 2 +solid 2 +pursued 2 +necessarily 2 +build 2 +attempted 2 +centuries 2 +eggs 2 +equivalent 2 +hastily 2 +burned 2 +you’d 2 +recent 2 +oh 2 +travel 2 +cries 2 +noon 2 +crying 2 +generations 2 +located 2 +cabin 2 +announcement 2 +Britain 2 +compared 2 +handed 2 +cease 2 +smaller 2 +circumstance 2 +tent 2 +frequent 2 +alarm 2 +nervous 2 +beast 2 +what’s 2 +aloud 2 +independent 2 +gates 2 +distinction 2 +essential 2 +observation 2 +stronger 2 +recovered 2 +belonging 2 +loving 2 +masters 2 +writers 2 +cf. 2 +permanent 2 +mortal 2 +stern 2 +gratitude 2 +preserve 2 +burden 2 +aspect 2 +millions 2 +merry 2 +knife 2 +dread 2 +clever 2 +applicable 2 +district 2 +shadows 2 +silk 2 +failure 2 +links 2 +cent 2 +sentiment 2 +amid 2 +profits 2 +agent 2 +finds 2 +Russia 2 +bade 2 +Russian 2 +desperate 2 +union 2 +imagined 2 +contempt 2 +raising 2 +lords 2 +hell 2 +separated 2 +grant 2 +seriously 2 +tribes 2 +hit 2 +enormous 2 +defective 2 +conviction 2 +secured 2 +mixed 2 +insisted 2 +wooden 2 +prefer 2 +prayers 2 +fever 2 +selected 2 +daughters 2 +treat 2 +warning 2 +flew 2 +speaks 2 +developed 2 +impulse 2 +slipped 2 +ours 2 +mistaken 2 +damages 2 +ambition 2 +resumed 2 +yield 2 +ideal 2 +schools 2 +confirmed 2 +descended 2 +rush 2 +falls 2 +deny 2 +calculated 2 +correct 2 +perform 2 +hadn’t 2 +somehow 2 +accordingly 2 +stayed 2 +acquired 2 +counsel 2 +distress 2 +sins 2 +notion 2 +discussion 2 +constitution 2 +hundreds 2 +instrument 2 +firmly 2 +actions 2 +steady 2 +remarks 2 +empire 2 +elements 2 +idle 2 +pen 2 +entering 2 +online 2 +Africa 2 +permit 2 +th’ 2 +tide 2 +vol 2 +leaned 2 +college 2 +maintain 2 +sovereign 2 +tail 2 +generation 2 +crowded 2 +fears 2 +nights 2 +limitation 2 +tied 2 +horrible 2 +cat 2 +displaying 2 +port 2 +male 2 +experienced 2 +opposed 2 +treaty 2 +contents 2 +rested 2 +mode 2 +poured 2 +les 2 +occur 2 +seeking 2 +practically 2 +abandoned 2 +reports 2 +eleven 2 +sank 2 +begins 2 +founded 2 +brings 2 +trace 2 +instinct 2 +collected 2 +Scotland 2 +characteristic 2 +chose 2 +cheerful 2 +tribe 2 +costs 2 +threatened 2 +arrangement 2 +western 2 +sang 2 +beings 2 +pressure 2 +politics 2 +sorts 1 +shelter 1 +rude 1 +scientific 1 +revealed 1 +winds 1 +riding 1 +scenes 1 +shake 1 +industry 1 +claims 1 +pp. 1 +merit 1 +profession 1 +lamp 1 +interview 1 +territory 1 +sleeping 1 +sex 1 +coffee 1 +devotion 1 +thereof 1 +creation 1 +trail 1 +Romans 1 +supported 1 +requires 1 +fathers 1 +prospect 1 +obey 1 +shone 1 +operation 1 +northern 1 +nurse 1 +profound 1 +hungry 1 +sisters 1 +assure 1 +exceedingly 1 +match 1 +wrath 1 +continually 1 +rest. 1 +gifts 1 +folly 1 +chain 1 +uniform 1 +debt 1 +teaching 1 +venture 1 +execution 1 +shoes 1 +mood 1 +crew 1 +perceive 1 +accounts 1 +eating 1 +multitude 1 +declare 1 +yard 1 +astonishment 1 +version 1 +vague 1 +odd 1 +grateful 1 +nearest 1 +infinite 1 +elsewhere 1 +copying 1 +apartment 1 +activity 1 +wives 1 +parted 1 +security 1 +cared 1 +sensible 1 +owing 1 +Saturday 1 +cottage 1 +Jews 1 +leaning 1 +capacity 1 +joe 1 +settle 1 +referred 1 +holder 1 +involved 1 +sunshine 1 +Dutch 1 +council 1 +princes 1 +ate 1 +examination 1 +steel 1 +strangers 1 +beheld 1 +test 1 +noted 1 +slightest 1 +widow 1 +charity 1 +realized 1 +element 1 +shed 1 +errors 1 +communication 1 +reflection 1 +attacked 1 +organization 1 +maintained 1 +restored 1 +folks 1 +concealed 1 +accordance 1 +heavens 1 +star 1 +examined 1 +deeds 1 +wordforms 1 +somebody 1 +incident 1 +oath 1 +guest 1 +bar 1 +row 1 +poverty 1 +bottle 1 +prevented 1 +bless 1 +stir 1 +intense 1 +completed 1 +quarrel 1 +touching 1 +inner 1 +available 1 +fix 1 +resistance 1 +unusual 1 +deed 1 +derive 1 +hollow 1 +suspected 1 +contains 1 +sighed 1 +province 1 +deserted 1 +establishment 1 +vote 1 +muttered 1 +thither 1 +oxford 1 +cavalry 1 +lofty 1 +endure 1 +succeed 1 +leg 1 +bid 1 +hated 1 +civilization 1 +u.s. 1 +acting 1 +landed 1 +passions 1 +interior 1 +scarce 1 +lightly 1 +disturbed 1 +rev 1 +supreme 1 +hang 1 +notwithstanding 1 +shock 1 +exception 1 +offering 1 +display 1 +strain 1 +drank 1 +confined 1 +exhausted 1 +poets 1 +sounded 1 +aim 1 +critical 1 +directions 1 +negro 1 +fearful 1 +standard 1 +studied 1 +bag 1 +buildings 1 +consequences 1 +commenced 1 +deeper 1 +repeat 1 +driving 1 +beasts 1 +track 1 +rid 1 +holds 1 +residence 1 +steadily 1 +intimate 1 +drinking 1 +swear 1 +treasure 1 +fun 1 +throwing 1 +apt 1 +enterprise 1 +queer 1 +seed 1 +tower 1 +runs 1 +defend 1 +favourite 1 +desires 1 +heavily 1 +assembled 1 +existed 1 +depends 1 +poems 1 +hesitated 1 +stuff 1 +section 1 +settlement 1 +staring 1 +sole 1 +roads 1 +plate 1 +Mexico 1 +overcome 1 +pains 1 +performing 1 +dwell 1 +grounds 1 +taxes 1 +marble 1 +recently 1 +tones 1 +ability 1 +awake 1 +wave 1 +shaking 1 +folk 1 +possibility 1 +butter 1 +fury 1 +marched 1 +writes 1 +issued 1 +sailed 1 +instructions 1 +hatred 1 +pursuit 1 +pull 1 +furniture 1 +additions 1 +hid 1 +rope 1 +vi 1 +adventure 1 +royalty 1 +vanished 1 +arts 1 +elder 1 +signal 1 +wanting 1 +supplied 1 +feast 1 +safely 1 +burn 1 +describe 1 +references 1 +lesson 1 +annual 1 +card 1 +passes 1 +application 1 +intelligent 1 +county 1 +beaten 1 +presents 1 +format 1 +flow 1 +sixty 1 +scale 1 +damage 1 +marks 1 +obtaining 1 +moreover 1 +commerce 1 +startled 1 +southern 1 +consequently 1 +outer 1 +belongs 1 +ben 1 +wrought 1 +average 1 +naked 1 +conducted 1 +rivers 1 +songs 1 +obvious 1 +foundation 1 +concern 1 +ceremony 1 +magic 1 +campaign 1 +hunting 1 +liberal 1 +whisper 1 +largely 1 +commonly 1 +torn 1 +exists 1 +contributions 1 +hunt 1 +teacher 1 +lawyer 1 +operations 1 +detail 1 +shortly 1 +wondering 1 +leaders 1 +blessing 1 +princess 1 +he’d 1 +altar 1 +tenderness 1 +tiny 1 +web 1 +cardinal 1 +sharply 1 +regiment 1 +chest 1 +distinctly 1 +purple 1 +creating 1 +gather 1 +depth 1 +indignation 1 +performance 1 +election 1 +prosperity 1 +gloomy 1 +conception 1 +clerk 1 +decide 1 +drunk 1 +victim 1 +reflected 1 +pour 1 +preceding 1 +individuals 1 +gazing 1 +absurd 1 +lift 1 +gesture 1 +armies 1 +limbs 1 +manage 1 +brethren 1 +plays 1 +hastened 1 +dragged 1 +motive 1 +whatsoever 1 +pointing 1 +verses 1 +pronounced 1 +exchange 1 +definite 1 +emperor 1 +tendency 1 +remote 1 +finish 1 +flag 1 +boots 1 +enabled 1 +administration 1 +denied 1 +churches 1 +rarely 1 +earnestly 1 +considering 1 +previously 1 +ugly 1 +bears 1 +signed 1 +genuine 1 +harmless 1 +mingled 1 +obedience 1 +walks 1 +training 1 +badly 1 +feed 1 +central 1 +contrast 1 +relieved 1 +romance 1 +Mississippi 1 +structure 1 +payment 1 +pace 1 +passages 1 +succession 1 +persuaded 1 +sources 1 +inquiry 1 +inspired 1 +angels 1 +roll 1 +wilt 1 +inch 1 +troubles 1 +perfection 1 +wherever 1 +owe 1 +handle 1 +advantages 1 +trip 1 +shoot 1 +fortunate 1 +newspaper 1 +employment 1 +fitted 1 +refuge 1 +misfortune 1 +providence 1 +owns 1 +cutting 1 +beard 1 +stirred 1 +tear 1 +resist 1 +depths 1 +maiden 1 +determine 1 +commission 1 +merchant 1 +whereas 1 +crossing 1 +independence 1 +lively 1 +breeze 1 +provinces 1 +virtues 1 +conceived 1 +relative 1 +solitary 1 +smell 1 +wandering 1 +thereby 1 +eighteen 1 +locked 1 +provision 1 +courts 1 +eaten 1 +historical 1 +regarding 1 +preferred 1 +pick 1 +ruined 1 +wherein 1 +vanity 1 +condemned 1 +deliver 1 +unexpected 1 +desk 1 +gross 1 +lane 1 +happens 1 +represent 1 +root 1 +Holland 1 +mud 1 +respectable 1 +cleared 1 +feels 1 +fruits 1 \ No newline at end of file diff --git a/lang/fr/lang.php b/lang/fr/lang.php new file mode 100644 index 0000000..b8af382 --- /dev/null +++ b/lang/fr/lang.php @@ -0,0 +1,9 @@ + + */ + +// Captcha dialog locale strings: +$lang['bm_noJsWarning'] = 'Veuillez activer JavaScript pour afficher cette page.'; diff --git a/lang/fr/wordlist.txt b/lang/fr/wordlist.txt new file mode 100644 index 0000000..58f8e33 --- /dev/null +++ b/lang/fr/wordlist.txt @@ -0,0 +1,3333 @@ +de 1725 +la 1030 +et 814 +le 769 +à 722 +les 630 +en 488 +des 481 +un 465 +il 459 +que 386 +une 381 +est 373 +du 337 +dans 317 +qui 286 +pour 262 +pas 258 +je 242 +elle 220 +ne 219 +au 212 +ce 210 +se 204 +par 195 +a 193 +sur 187 +plus 171 +son 168 +mais 137 +avec 133 +vous 129 +on 125 +était 120 +lui 120 +nous 118 +ou 117 +sa 117 +comme 109 +avait 105 +ses 100 +tout 96 +cette 94 +si 88 +sont 86 +même 85 +être 83 +me 81 +y 80 +bien 79 +ils 78 +aux 78 +d’un 69 +tu 68 +leur 66 +fait 65 +d’une 63 +ces 61 +sans 61 +ai 59 +deux 58 +peut 55 +faire 54 +où 53 +aussi 53 +mon 52 +ont 47 +été 47 +entre 45 +dit 45 +moi 44 +autre 43 +non 41 +tous 41 +temps 40 +encore 39 +très 39 +après 38 +alors 38 +autres 38 +là 37 +ma 36 +dont 36 +quand 36 +peu 36 +sous 34 +ça 33 +vie 33 +avoir 32 +leurs 32 +ainsi 32 +fois 32 +avant 31 +cela 31 +rien 30 +vers 30 +homme 29 +toujours 29 +puis 29 +suis 29 +dire 28 +donc 28 +toute 28 +moins 27 +monde 26 +jamais 26 +quelques 26 +notre 26 +voir 25 +étaient 25 +elles 24 +depuis 24 +mes 24 +votre 24 +contre 23 +soit 23 +grand 23 +jusqu’ 22 +yeux 22 +celui 22 +toutes 22 +cet 22 +car 22 +chez 21 +tête 21 +cas 21 +te 21 +jour 20 +trois 20 +ans 20 +faut 20 +ici 20 +chose 20 +point 20 +trop 19 +celle 19 +déjà 19 +fut 19 +femme 19 +petit 19 +ni 18 +va 18 +père 18 +moment 18 +droit 18 +main 18 +avaient 18 +devant 18 +place 18 +état 17 +pays 17 +quelque 17 +comment 17 +travail 17 +personne 17 +nos 17 +chaque 17 +ceux 16 +pendant 16 +doit 16 +eux 16 +partie 16 +grande 16 +corps 16 +bon 16 +mère 16 +sens 16 +part 16 +porte 16 +aurait 16 +histoire 16 +premier 16 +parce 16 +avais 16 +France 16 +hommes 16 +première 16 +pourquoi 15 +beaucoup 15 +dieu 15 +effet 15 +toi 15 +tant 15 +souvent 15 +années 15 +ci 15 +l’on 14 +nouveau 14 +jours 14 +jeune 14 +oui 14 +quoi 14 +l’autre 14 +pouvoir 14 +question 14 +plusieurs 14 +ton 14 +prendre 14 +mort 14 +côté 14 +mal 14 +fin 14 +d’autres 14 +enfants 14 +maison 14 +serait 14 +seul 13 +nom 13 +lieu 13 +politique 13 +voix 13 +compte 13 +également 13 +selon 13 +enfin 13 +ville 13 +seulement 13 +cœur 13 +mieux 13 +air 13 +eu 13 +sais 13 +exemple 13 +avons 13 +regard 13 +enfant 12 +d’être 12 +petite 12 +reste 12 +savoir 12 +sera 12 +raison 12 +fit 12 +lorsque 12 +maintenant 12 +avez 12 +coup 12 +dès 12 +eau 12 +ailleurs 12 +façon 12 +près 12 +terre 12 +esprit 12 +nouvelle 12 +pouvait 11 +nuit 11 +besoin 11 +ensemble 11 +l’homme 11 +partir 11 +art 11 +certains 11 +forme 11 +seule 11 +pu 11 +famille 11 +autant 11 +fille 11 +saint 11 +hui 11 +bras 11 +heures 11 +loin 11 +aujourd’ 11 +cours 11 +étais 11 +surtout 11 +vu 11 +guerre 11 +société 11 +bonne 11 +face 11 +peuvent 11 +idée 11 +manière 11 +vue 11 +choses 11 +quatre 11 +aller 11 +doute 10 +assez 10 +mois 10 +personnes 10 +amour 10 +siècle 10 +français 10 +femmes 10 +mettre 10 +nombre 10 +juste 10 +parler 10 +fils 10 +possible 10 +autour 10 +tard 10 +gens 10 +lors 10 +aucun 10 +passé 10 +mains 10 +veux 10 +vraiment 10 +nature 10 +heure 10 +demande 10 +loi 10 +laquelle 10 +pris 10 +rapport 10 +pourtant 10 +général 9 +chambre 9 +suite 9 +visage 9 +lorsqu’ 9 +presque 9 +aucune 9 +es 9 +situation 9 +vos 9 +soir 9 +cependant 9 +parfois 9 +l’un 9 +afin 9 +trouve 9 +fort 9 +ordre 9 +dernier 9 +plutôt 9 +long 9 +faisait 9 +passer 9 +quel 9 +donner 9 +peine 9 +cause 9 +œuvre 9 +roi 9 +or 9 +force 9 +dessus 9 +sujet 8 +propre 8 +agit 8 +tour 8 +pierre 8 +derrière 8 +bas 8 +mise 8 +vrai 8 +sûr 8 +abord 8 +mots 8 +sommes 8 +rue 8 +mot 8 +année 8 +haut 8 +article 8 +système 8 +pourrait 8 +trouver 8 +semble 8 +ensuite 8 +ayant 8 +action 8 +service 8 +longtemps 8 +cinq 8 +groupe 8 +livre 8 +mis 8 +prix 8 +grands 8 +plan 8 +tel 8 +milieu 8 +mesure 8 +mêmes 8 +permet 8 +objet 8 +étant 7 +êtes 7 +notamment 7 +travers 7 +telle 7 +instant 7 +niveau 7 +devait 7 +monsieur 7 +ta 7 +début 7 +développement 7 +sorte 7 +grâce 7 +quelle 7 +l’État 7 +veut 7 +dix 7 +retour 7 +font 7 +vais 7 +donne 7 +simple 7 +fond 7 +demanda 7 +présent 7 +peux 7 +d’abord 7 +l’air 7 +sourire 7 +bout 7 +chacun 7 +malgré 7 +tandis 7 +rendre 7 +époque 7 +peur 7 +parents 7 +table 7 +public 7 +passe 7 +belle 7 +chapitre 7 +recherche 7 +entreprise 7 +parmi 7 +vite 7 +rôle 7 +matin 7 +dis 7 +vient 7 +dernière 7 +allait 7 +centre 7 +l’histoire 7 +donné 7 +comprendre 7 +espace 7 +voilà 7 +présence 7 +répondit 7 +conseil 7 +réalité 7 +choix 7 +valeur 7 +jeunes 7 +moyen 7 +type 7 +sait 7 +lequel 7 +ait 7 +fonction 7 +eut 7 +crois 7 +celles 7 +chef 7 +laisser 7 +intérieur 6 +lit 6 +mouvement 6 +certaines 6 +âge 6 +dû 6 +d’ailleurs 6 +sang 6 +d’avoir 6 +route 6 +lumière 6 +petits 6 +états 6 +projet 6 +figure 6 +cour 6 +attention 6 +salle 6 +beau 6 +aide 6 +nouvelles 6 +image 6 +envie 6 +quelqu’ 6 +argent 6 +l’avait 6 +texte 6 +bois 6 +chemin 6 +problème 6 +titre 6 +vivre 6 +cadre 6 +langue 6 +intérêt 6 +droits 6 +conditions 6 +silence 6 +école 6 +entrée 6 +feu 6 +terme 6 +voulait 6 +questions 6 +conscience 6 +direction 6 +vieux 6 +marché 6 +œil 6 +sociale 6 +prise 6 +pensée 6 +frère 6 +liberté 6 +nord 6 +genre 6 +lettre 6 +l’eau 6 +vingt 6 +française 6 +venir 6 +pièce 6 +vérité 6 +accord 6 +ami 6 +membres 6 +ciel 6 +ouvert 6 +maître 6 +nombreux 6 +compris 6 +plaisir 6 +politiques 6 +origine 6 +pense 6 +soleil 6 +train 6 +pied 6 +soi 6 +aime 6 +écrit 6 +amis 6 +minutes 6 +expérience 6 +sud 6 +église 6 +principe 6 +existence 6 +activité 6 +quant 5 +existe 5 +sol 5 +particulier 5 +auteur 5 +bouche 5 +président 5 +voiture 5 +l’a 5 +gouvernement 5 +penser 5 +réponse 5 +propos 5 +matière 5 +pratique 5 +certain 5 +âme 5 +base 5 +risque 5 +affaires 5 +affaire 5 +savait 5 +l’esprit 5 +grandes 5 +gauche 5 +fais 5 +qualité 5 +prend 5 +cheveux 5 +processus 5 +seconde 5 +d’autre 5 +simplement 5 +parle 5 +noir 5 +contraire 5 +venait 5 +relation 5 +scène 5 +social 5 +peuple 5 +mars 5 +garde 5 +expression 5 +juin 5 +économique 5 +différents 5 +sein 5 +semblait 5 +produits 5 +parti 5 +pieds 5 +mai 5 +mer 5 +doivent 5 +difficile 5 +santé 5 +services 5 +nécessaire 5 +l’idée 5 +plein 5 +arrive 5 +fallait 5 +organisation 5 +bureau 5 +éléments 5 +Europe 5 +culture 5 +laisse 5 +puisque 5 +prit 5 +droite 5 +entendu 5 +demander 5 +tes 5 +analyse 5 +sécurité 5 +journée 5 +plupart 5 +faisant 5 +différentes 5 +caractère 5 +voit 5 +aurais 5 +important 5 +six 5 +désormais 5 +discours 5 +formation 5 +dos 5 +sortir 5 +passage 5 +rouge 5 +relations 5 +entendre 5 +période 5 +parole 5 +chercher 5 +vois 5 +présente 5 +produit 5 +croire 5 +note 5 +l’une 5 +contrôle 5 +rester 5 +impression 5 +endroit 5 +but 5 +décision 5 +ligne 5 +jeu 5 +connaissance 5 +départ 5 +rire 5 +an 5 +ah 5 +durant 5 +deuxième 5 +signe 5 +position 5 +auprès 5 +lèvres 5 +hors 5 +blanc 5 +production 5 +oh 5 +madame 5 +l’enfant 5 +ancien 5 +toutefois 5 +aura 5 +vit 5 +mille 5 +données 5 +volonté 5 +occasion 4 +midi 4 +véritable 4 +devient 4 +faites 4 +libre 4 +confiance 4 +justice 4 +région 4 +appelle 4 +domaine 4 +mémoire 4 +bord 4 +d’elle 4 +désir 4 +premiers 4 +étude 4 +études 4 +gros 4 +cuisine 4 +acte 4 +moyens 4 +juillet 4 +l’article 4 +devenir 4 +armée 4 +l’amour 4 +longue 4 +voyage 4 +village 4 +modèle 4 +certaine 4 +particulièrement 4 +voie 4 +activités 4 +soient 4 +furent 4 +répondre 4 +rapidement 4 +musique 4 +sœur 4 +vis 4 +arrière 4 +cit 4 +importance 4 +charge 4 +disait 4 +met 4 +mari 4 +sentiment 4 +importe 4 +générale 4 +l’intérieur 4 +puisse 4 +vont 4 +tellement 4 +création 4 +entreprises 4 +montre 4 +formes 4 +peau 4 +termes 4 +code 4 +perdu 4 +idées 4 +davantage 4 +dois 4 +police 4 +mode 4 +nouveaux 4 +nationale 4 +information 4 +soudain 4 +dehors 4 +demi 4 +outre 4 +aussitôt 4 +propres 4 +l’ordre 4 +champ 4 +travaux 4 +impossible 4 +population 4 +hôtel 4 +bientôt 4 +filles 4 +double 4 +mit 4 +nombreuses 4 +livres 4 +carte 4 +mariage 4 +connaître 4 +énergie 4 +absence 4 +informations 4 +troisième 4 +arrivée 4 +page 4 +république 4 +rencontre 4 +d’en 4 +appel 4 +semaine 4 +gestion 4 +trouvé 4 +l’ensemble 4 +tableau 4 +visite 4 +retrouver 4 +environ 4 +voulu 4 +attendre 4 +lettres 4 +juge 4 +courant 4 +publique 4 +l’ai 4 +décembre 4 +janvier 4 +règles 4 +moindre 4 +delà 4 +paix 4 +régime 4 +points 4 +problèmes 4 +accès 4 +l’Église 4 +tenir 4 +tôt 4 +unique 4 +petites 4 +doigts 4 +aider 4 +bonheur 4 +seront 4 +éviter 4 +ouvrage 4 +classe 4 +suivant 4 +septembre 4 +anglais 4 +source 4 +ministre 4 +lieux 4 +approche 4 +l’heure 4 +forces 4 +large 4 +l’objet 4 +foi 4 +manque 4 +eh 4 +l’école 4 +avril 4 +octobre 4 +bruit 4 +forte 4 +café 4 +faits 4 +haute 4 +Afrique 4 +parties 4 +pouvez 4 +offre 4 +éducation 4 +demandé 4 +merci 4 +puissance 4 +août 4 +huit 4 +autorité 4 +évolution 4 +date 4 +combien 4 +avis 4 +regarde 4 +journal 4 +allez 4 +second 4 +mission 4 +sauf 4 +entrer 4 +union 4 +emploi 4 +suivre 4 +jouer 4 +cent 4 +humain 4 +chance 4 +usage 4 +contrat 4 +verre 4 +taille 4 +site 4 +sept 4 +connu 4 +voici 4 +allons 4 +trouvait 4 +commun 4 +l’époque 4 +national 4 +construction 4 +derniers 4 +groupes 4 +application 4 +communication 4 +humaine 4 +cité 4 +personnel 3 +unis 3 +finalement 3 +venu 3 +marche 3 +pratiques 3 +regarder 3 +physique 3 +d’eau 3 +protection 3 +partout 3 +douleur 3 +l’espace 3 +garçon 3 +avenir 3 +lire 3 +novembre 3 +effets 3 +pleine 3 +communauté 3 +colère 3 +maman 3 +l’année 3 +économie 3 +voire 3 +propose 3 +certes 3 +vent 3 +épaules 3 +sort 3 +no 3 +pauvre 3 +montrer 3 +exercice 3 +résultats 3 +proche 3 +traitement 3 +île 3 +moitié 3 +vide 3 +joie 3 +perdre 3 +actions 3 +taux 3 +lien 3 +eût 3 +premières 3 +université 3 +téléphone 3 +heureux 3 +crise 3 +succès 3 +geste 3 +valeurs 3 +lendemain 3 +critique 3 +l’impression 3 +environnement 3 +l’art 3 +devoir 3 +objets 3 +tomber 3 +science 3 +adresse 3 +actes 3 +équipe 3 +paroles 3 +égard 3 +assurer 3 +devenu 3 +vol 3 +naissance 3 +commerce 3 +obtenir 3 +lecture 3 +leva 3 +froid 3 +vision 3 +contexte 3 +directement 3 +d’après 3 +vieille 3 +preuve 3 +tient 3 +durée 3 +changement 3 +résultat 3 +administration 3 +calme 3 +coups 3 +commence 3 +raisons 3 +front 3 +arriver 3 +couleur 3 +ressources 3 +seigneur 3 +sociales 3 +d’où 3 +joue 3 +mur 3 +identité 3 +mauvais 3 +condition 3 +capable 3 +théorie 3 +porter 3 +permis 3 +frais 3 +sociétés 3 +jardin 3 +coin 3 +terrain 3 +différence 3 +souvenir 3 +manger 3 +programme 3 +compagnie 3 +maladie 3 +ouest 3 +tenait 3 +arrivé 3 +liste 3 +larmes 3 +l’action 3 +lois 3 +demain 3 +objectif 3 +l’entreprise 3 +responsabilité 3 +rêve 3 +enseignement 3 +fini 3 +contact 3 +constitue 3 +travailler 3 +parfaitement 3 +facile 3 +possibilité 3 +semaines 3 +devrait 3 +février 3 +roman 3 +technique 3 +court 3 +vin 3 +respect 3 +honneur 3 +quartier 3 +révolution 3 +laissé 3 +paraît 3 +fenêtre 3 +langage 3 +territoire 3 +l’image 3 +millions 3 +goût 3 +expliquer 3 +faible 3 +médecin 3 +pose 3 +seuls 3 +regarda 3 +voulez 3 +prince 3 +cher 3 +découvrir 3 +théâtre 3 +textes 3 +changer 3 +religion 3 +trente 3 +images 3 +logique 3 +secret 3 +dernières 3 +habitude 3 +zone 3 +faute 3 +faite 3 +surprise 3 +ombre 3 +violence 3 +rend 3 +élèves 3 +blanche 3 +complètement 3 +l’auteur 3 +solution 3 +concernant 3 +biens 3 +notion 3 +viens 3 +suivi 3 +souffle 3 +européenne 3 +capacité 3 +parlé 3 +meilleur 3 +pensées 3 +déjeuner 3 +néanmoins 3 +revanche 3 +jambes 3 +commune 3 +ceci 3 +poste 3 +écrire 3 +international 3 +pièces 3 +tels 3 +sortie 3 +mesures 3 +ferme 3 +poser 3 +distance 3 +rapports 3 +principes 3 +repas 3 +concerne 3 +reprit 3 +habitants 3 +événements 3 +généralement 3 +structure 3 +uns 3 +dame 3 +historique 3 +univers 3 +servir 3 +mètres 3 +influence 3 +nez 3 +autrement 3 +apprendre 3 +apparaît 3 +revenir 3 +extérieur 3 +papier 3 +armes 3 +permettre 3 +œuvres 3 +l’aide 3 +chambres 3 +poids 3 +créer 3 +commission 3 +établissement 3 +évidemment 3 +série 3 +méthode 3 +philosophie 3 +l’existence 3 +salon 3 +utiliser 3 +d’accord 3 +acteurs 3 +l’occasion 3 +sciences 3 +intention 3 +fil 3 +exactement 3 +sinon 3 +château 3 +anciens 3 +décidé 3 +importante 3 +puisqu’ 3 +fonds 3 +demeure 3 +probablement 3 +voulais 3 +quitter 3 +guère 3 +conduit 3 +techniques 3 +assis 3 +empêcher 3 +explique 3 +restaurant 3 +directeur 3 +presse 3 +beauté 3 +association 3 +immédiatement 3 +ouvrir 3 +animaux 3 +récit 3 +certainement 3 +sociaux 3 +avions 3 +procédure 3 +militaire 3 +intérêts 3 +propriété 3 +cheval 3 +référence 3 +villes 3 +retrouve 3 +reçu 3 +sac 3 +frères 3 +garder 3 +défense 3 +campagne 3 +appris 3 +vas 3 +ancienne 3 +sentait 3 +rendu 3 +lentement 3 +espèce 3 +besoins 3 +mourir 3 +continue 3 +noire 3 +film 3 +étranger 3 +auraient 3 +écriture 3 +côte 3 +pourra 3 +agir 3 +difficultés 3 +individu 3 +réel 3 +siège 3 +empire 3 +arrêt 3 +d’entre 3 +lutte 3 +lesquels 3 +unité 3 +envers 3 +prêt 3 +somme 3 +clair 3 +secteur 3 +fonctions 3 +palais 3 +avance 3 +espoir 3 +dimanche 3 +moderne 3 +cesse 3 +marque 3 +constitution 3 +morale 3 +d’autant 3 +conversation 3 +utilisation 3 +oublier 3 +vouloir 3 +statut 3 +rendez 3 +savez 3 +réseau 3 +accueil 3 +connaît 3 +Allemagne 3 +style 3 +projets 3 +divers 3 +fût 3 +royaume 3 +murs 3 +réflexion 3 +neuf 3 +littérature 3 +ouvre 3 +bleu 3 +diverses 3 +totalement 3 +auteurs 3 +d’eux 3 +samedi 3 +morts 3 +définition 2 +sentir 2 +compter 2 +étrange 2 +arrêter 2 +vivant 2 +l’argent 2 +publics 2 +soin 2 +reprendre 2 +port 2 +signifie 2 +contenu 2 +message 2 +ouverture 2 +enquête 2 +fer 2 +tenu 2 +rapide 2 +restait 2 +règle 2 +représentation 2 +essentiel 2 +chaleur 2 +bonnes 2 +su 2 +voyait 2 +familles 2 +l’entrée 2 +nécessité 2 +absolument 2 +évidence 2 +immense 2 +ventre 2 +soirée 2 +grave 2 +veille 2 +traité 2 +internet 2 +revue 2 +soldats 2 +reconnaître 2 +professeur 2 +comportement 2 +couple 2 +doucement 2 +dites 2 +combat 2 +suffit 2 +cru 2 +cherche 2 +individus 2 +tradition 2 +articles 2 +robe 2 +mouvements 2 +conception 2 +commencé 2 +attitude 2 +foule 2 +capitaine 2 +risques 2 +meilleure 2 +responsable 2 +assemblée 2 +d’aller 2 +conséquences 2 +cou 2 +danger 2 +surface 2 +attendait 2 +auquel 2 +recours 2 +tirer 2 +rejoindre 2 +appeler 2 +précisément 2 +arbres 2 +enfance 2 +maisons 2 +sourit 2 +né 2 +fête 2 +l’origine 2 +vente 2 +l’est 2 +vêtements 2 +docteur 2 +rappelle 2 +côtés 2 +dossier 2 +oreille 2 +savais 2 +telles 2 +atteindre 2 +économiques 2 +hier 2 +vaut 2 +amie 2 +mauvaise 2 +écoute 2 +sentiments 2 +lesquelles 2 +portes 2 +seraient 2 +réussi 2 +étions 2 +reine 2 +faux 2 +saison 2 +fleurs 2 +papa 2 +épaule 2 +don 2 +malade 2 +uniquement 2 +répond 2 +ouvrit 2 +connais 2 +soins 2 +souvenirs 2 +forêt 2 +consiste 2 +permettent 2 +reconnaissance 2 +majorité 2 +membre 2 +disposition 2 +opération 2 +rose 2 +objectifs 2 +humanité 2 +types 2 +moments 2 +croissance 2 +dispositions 2 +numéro 2 +jeunesse 2 +clients 2 +poitrine 2 +pages 2 +erreur 2 +recherches 2 +perte 2 +intervention 2 +bons 2 +pouvons 2 +sainte 2 +entretien 2 +sommeil 2 +comprends 2 +parc 2 +édition 2 +supérieur 2 +effort 2 +hôpital 2 +phrase 2 +debout 2 +dîner 2 +bébé 2 +limites 2 +sentit 2 +pouvaient 2 +noms 2 +élément 2 +faveur 2 +jugement 2 +l’expérience 2 +ouverte 2 +viennent 2 +gorge 2 +musée 2 +aspect 2 +agissait 2 +l’armée 2 +l’être 2 +pire 2 +siècles 2 +internationale 2 +appartement 2 +revient 2 +moyenne 2 +portée 2 +aimait 2 +représente 2 +tombe 2 +chien 2 +découverte 2 +personnage 2 +d’y 2 +arrête 2 +juifs 2 +portait 2 +lignes 2 +naturel 2 +fonctionnement 2 +l’œuvre 2 +basse 2 +appelé 2 +Londres 2 +laissa 2 +compétences 2 +éditions 2 +largement 2 +épouse 2 +hasard 2 +venue 2 +ministère 2 +couleurs 2 +total 2 +démarche 2 +passion 2 +capital 2 +masse 2 +d’œil 2 +payer 2 +seuil 2 +comprend 2 +tourna 2 +pain 2 +documents 2 +passant 2 +vécu 2 +l’âge 2 +faisaient 2 +perspective 2 +hauteur 2 +riche 2 +photo 2 +lundi 2 +odeur 2 +l’expression 2 +fruits 2 +dents 2 +institutions 2 +évaluation 2 +bref 2 +recevoir 2 +protéger 2 +l’absence 2 +passa 2 +dimension 2 +comte 2 +permettant 2 +tiers 2 +sujets 2 +sexe 2 +scientifique 2 +juridique 2 +humains 2 +camp 2 +opinion 2 +convention 2 +principal 2 +sortit 2 +réaliser 2 +duc 2 +notes 2 +courage 2 +comptes 2 +fera 2 +animal 2 +situations 2 +douce 2 +équilibre 2 +entier 2 +pouvoirs 2 +difficulté 2 +portant 2 +dessous 2 +concept 2 +mondiale 2 +l’âme 2 +fou 2 +nécessaires 2 +sources 2 +noirs 2 +circonstances 2 +religieux 2 +comité 2 +spectacle 2 +vitesse 2 +tuer 2 +choisi 2 +pont 2 +prenant 2 +voyant 2 +échange 2 +monter 2 +phénomène 2 +ajouta 2 +tendance 2 +victime 2 +exécution 2 +présenter 2 +sombre 2 +hiver 2 +pression 2 +passait 2 +laissant 2 +patient 2 +privé 2 +beaux 2 +section 2 +traits 2 +résistance 2 +facilement 2 +défaut 2 +suivante 2 +procès 2 +intelligence 2 +bataille 2 +échapper 2 +soutien 2 +commencer 2 +l’instant 2 +disant 2 +légèrement 2 +finit 2 +opérations 2 +Angleterre 2 +vraie 2 +métier 2 +liens 2 +réaction 2 +autorités 2 +faudrait 2 +efforts 2 +jeux 2 +clairement 2 +vint 2 +l’organisation 2 +chair 2 +accepter 2 +pouvais 2 +changé 2 +change 2 +cerveau 2 +auparavant 2 +sert 2 +espère 2 +revenu 2 +l’effet 2 +Italie 2 +choisir 2 +obligation 2 +événement 2 +l’Europe 2 +devenue 2 +belles 2 +donnait 2 +rentrer 2 +progrès 2 +chacune 2 +matériel 2 +plat 2 +prison 2 +bar 2 +formule 2 +connaissait 2 +poche 2 +entièrement 2 +capitale 2 +quinze 2 +profonde 2 +aimé 2 +systèmes 2 +opposition 2 +continuer 2 +banque 2 +pensé 2 +vaste 2 +conséquence 2 +disparu 2 +secondes 2 +l’île 2 +jusque 2 +suffisamment 2 +vert 2 +justement 2 +conduite 2 +stratégie 2 +célèbre 2 +centrale 2 +rythme 2 +personnages 2 +êtres 2 +réserve 2 +ajouter 2 +tribunal 2 +murmura 2 +sérieux 2 +longues 2 +atteint 2 +claire 2 +consommation 2 +parlait 2 +profondément 2 +publiques 2 +l’affaire 2 +décisions 2 +remettre 2 +agréable 2 +profit 2 +convient 2 +gagner 2 +chargé 2 +entière 2 +limite 2 +tiens 2 +imaginer 2 +classique 2 +échelle 2 +précise 2 +possède 2 +arbre 2 +terres 2 +tâche 2 +connaissances 2 +escalier 2 +euros 2 +jeta 2 +détails 2 +profond 2 +complexe 2 +essayer 2 +interne 2 +parfait 2 +ennemi 2 +séjour 2 +sent 2 +genoux 2 +montagne 2 +lune 2 +put 2 +préparer 2 +l’intérêt 2 +tourner 2 +établir 2 +étrangers 2 +professionnelle 2 +quelles 2 +chaud 2 +rues 2 +doux 2 +conflit 2 +interprétation 2 +proches 2 +cinéma 2 +élève 2 +plaît 2 +nul 2 +développer 2 +nouvel 2 +boire 2 +civile 2 +d’argent 2 +attend 2 +examen 2 +plage 2 +oublié 2 +utile 2 +pointe 2 +particulière 2 +signes 2 +exception 2 +prévu 2 +rares 2 +terrasse 2 +empereur 2 +retourner 2 +donnée 2 +ordres 2 +offrir 2 +cri 2 +régulièrement 2 +occuper 2 +boîte 2 +carrière 2 +l’avenir 2 +étape 2 +posa 2 +rappeler 2 +vertu 2 +Amérique 2 +eaux 2 +trouvent 2 +suppose 2 +posé 2 +pauvres 2 +régions 2 +doigt 2 +triste 2 +prête 2 +francs 2 +client 2 +autrefois 2 +outils 2 +populaire 2 +d’or 2 +Chine 2 +phase 2 +situé 2 +construire 2 +conseils 2 +prends 2 +salut 2 +aimer 2 +Espagne 2 +cinquante 2 +ferait 2 +conduire 2 +cents 2 +l’analyse 2 +naturellement 2 +prises 2 +réellement 2 +l’activité 2 +déclaration 2 +suit 2 +héros 2 +l’économie 2 +nation 2 +multiples 2 +extrême 2 +huile 2 +l’université 2 +lever 2 +précis 2 +réunion 2 +collection 2 +ordinaire 2 +élevé 2 +étage 2 +croix 2 +vendredi 2 +cercle 2 +pluie 2 +principale 2 +lança 2 +blancs 2 +voyez 2 +engagement 2 +montant 2 +vacances 2 +naturelle 2 +entend 2 +bibliothèque 2 +volume 2 +hypothèse 2 +d’État 2 +tente 2 +étudiants 2 +américain 2 +langues 2 +exprimer 2 +rencontrer 2 +chefs 2 +créé 2 +quels 2 +émotions 2 +partage 2 +parcours 2 +champs 2 +fortune 2 +idéal 2 +exploitation 2 +surpris 2 +feuilles 2 +titres 2 +proposition 2 +émotion 2 +nations 2 +heureuse 2 +pourraient 2 +victimes 2 +victoire 2 +quantité 2 +écran 2 +souffrance 2 +version 2 +kilomètres 2 +pourrais 2 +d’origine 2 +l’évolution 2 +remarque 2 +caractéristiques 2 +locaux 2 +allemand 2 +produire 2 +observer 2 +traduction 2 +acheter 2 +incapable 2 +attendant 2 +assurance 2 +bateau 2 +faudra 2 +futur 2 +militaires 2 +terrible 2 +apprentissage 2 +l’endroit 2 +essentiellement 2 +oncle 2 +annonce 2 +professionnel 2 +revoir 2 +arrêté 2 +proximité 2 +amoureux 2 +esprits 2 +principaux 2 +relève 2 +prenait 2 +document 2 +facteurs 2 +peuples 2 +méthodes 2 +arme 2 +l’hôtel 2 +regards 2 +oreilles 2 +partis 2 +participation 2 +indépendance 2 +réfléchir 2 +bâtiment 2 +guide 2 +baiser 2 +considérer 2 +exemples 2 +professionnels 2 +l’importance 2 +agents 2 +conclusion 2 +lac 2 +correspond 2 +simples 2 +crime 2 +l’Union 2 +secrétaire 2 +conséquent 2 +neige 2 +devaient 2 +utilisé 2 +lait 2 +photos 2 +fasse 2 +zones 2 +ajoute 2 +attente 2 +dormir 2 +donna 2 +finir 2 +réalisation 2 +pensait 2 +réponses 2 +quarante 2 +chevaux 2 +toucher 2 +totale 2 +vague 2 +sûre 2 +regardait 2 +apporter 2 +tenue 2 +magnifique 2 +lecteur 2 +montré 2 +léger 2 +appareil 2 +l’autorité 2 +troubles 2 +commença 2 +retraite 2 +degré 2 +quotidien 2 +supérieure 2 +tenter 2 +dur 2 +sommet 2 +humaines 2 +civil 2 +découvert 2 +démocratie 2 +plats 2 +rivière 2 +considéré 2 +allemands 2 +populations 2 +douze 2 +fermé 2 +personnelle 2 +fortement 2 +débat 2 +sûrement 2 +chaîne 2 +sensation 2 +aspects 2 +chaise 2 +constituent 2 +veulent 2 +machine 2 +espèces 2 +différent 2 +touche 2 +propriétaire 2 +temple 2 +poète 2 +jeter 2 +donnant 2 +l’ombre 2 +européen 2 +dieux 2 +efficacité 2 +paraissait 2 +patients 2 +crédit 2 +central 2 +chasse 2 +destin 2 +gris 2 +voudrais 2 +introduction 2 +amitié 2 +personnalité 2 +possibles 2 +relative 2 +normal 2 +cartes 2 +brusquement 2 +délai 2 +office 2 +tourne 2 +efficace 2 +histoires 2 +regardant 2 +donnent 2 +chute 2 +détail 2 +laissez 2 +agent 2 +coût 2 +expériences 2 +marchés 2 +énorme 2 +aventure 2 +adulte 2 +dispose 2 +gare 2 +l’œil 2 +local 2 +troupes 2 +trouva 2 +semblent 2 +alla 2 +industrie 2 +inutile 2 +arrêta 2 +structures 2 +resta 2 +mérite 2 +l’étude 2 +réforme 2 +arrivait 2 +coupe 2 +secours 2 +menace 2 +couloir 2 +revenus 2 +privée 2 +religieuse 2 +cris 2 +judiciaire 2 +défendre 2 +institution 2 +d’amour 2 +gloire 2 +écria 2 +garçons 2 +citoyens 2 +écouter 2 +éternel 2 +raconte 2 +quitté 2 +repris 2 +rouges 2 +sauver 2 +lève 2 +l’administration 2 +l’intention 2 +compétence 2 +patron 2 +dialogue 2 +faim 2 +américains 2 +l’égard 2 +attaque 2 +issue 2 +accident 2 +course 2 +arts 2 +partager 2 +l’exercice 2 +discussion 2 +catégorie 2 +concurrence 2 +traduit 2 +lu 2 +assise 2 +contrairement 2 +envoyé 2 +souviens 2 +coucher 2 +morte 2 +effectivement 2 +réelle 2 +l’Assemblée 2 +rupture 2 +ouvrages 2 +heureusement 2 +nourriture 2 +l’extérieur 2 +restent 2 +saisir 2 +littéraire 2 +sois 2 +di 2 +représentant 2 +l’éducation 2 +gaz 2 +réseaux 2 +épreuve 2 +lance 2 +rêves 2 +remarquer 2 +croit 2 +couverture 2 +honte 2 +paysage 2 +marcher 2 +l’environnement 2 +courir 2 +rare 2 +l’Empire 2 +domaines 2 +construit 2 +artiste 2 +pouvant 2 +estime 2 +milliers 2 +établissements 2 +imagination 2 +classes 2 +dynamique 2 +répondu 2 +réduire 2 +retourna 2 +interdit 2 +échec 2 +patrimoine 2 +indique 2 +serais 2 +appartient 2 +avantage 2 +soixante 2 +génération 2 +souci 2 +échanges 2 +archives 2 +présentation 1 +prennent 1 +impact 1 +modèles 1 +plans 1 +diable 1 +bel 1 +crainte 1 +minute 1 +pierres 1 +jolie 1 +aise 1 +malheureusement 1 +os 1 +instruction 1 +vive 1 +salariés 1 +égalité 1 +considère 1 +clé 1 +sable 1 +augmentation 1 +écart 1 +devons 1 +thème 1 +saurait 1 +avocat 1 +principalement 1 +l’enseignement 1 +asseoir 1 +apparition 1 +compréhension 1 +importants 1 +longs 1 +époux 1 +préparation 1 +déclara 1 +sourcils 1 +règne 1 +grosse 1 +trace 1 +puissant 1 +repos 1 +règlement 1 +collective 1 +critères 1 +écoles 1 +fauteuil 1 +prie 1 +nommé 1 +organisations 1 +raconter 1 +observation 1 +espaces 1 +aient 1 +danse 1 +l’acte 1 +club 1 +gestes 1 +rang 1 +maintenir 1 +explication 1 +transport 1 +angoisse 1 +profiter 1 +niveaux 1 +inverse 1 +sensible 1 +repose 1 +occupe 1 +bus 1 +bande 1 +haine 1 +transformation 1 +tué 1 +l’hôpital 1 +impose 1 +tension 1 +dépenses 1 +instants 1 +disent 1 +l’usage 1 +d’ici 1 +intégration 1 +paraître 1 +porté 1 +peinture 1 +humeur 1 +réduit 1 +allaient 1 +mine 1 +pure 1 +retenir 1 +sites 1 +poursuivre 1 +cacher 1 +normes 1 +thé 1 +forcément 1 +dirait 1 +angle 1 +complète 1 +vérifier 1 +Israël 1 +imagine 1 +publié 1 +intéressant 1 +relativement 1 +venus 1 +liés 1 +horizon 1 +nulle 1 +l’attention 1 +conflits 1 +reprises 1 +soumis 1 +thèse 1 +communes 1 +battre 1 +l’humanité 1 +importantes 1 +bête 1 +décide 1 +changements 1 +printemps 1 +appelait 1 +catholique 1 +médecine 1 +manifeste 1 +riches 1 +exposition 1 +charme 1 +catégories 1 +matières 1 +ennemis 1 +Russie 1 +glace 1 +refus 1 +écrivain 1 +envoyer 1 +locale 1 +mardi 1 +télévision 1 +l’ouest 1 +travaille 1 +l’avoir 1 +apparence 1 +scolaire 1 +malheur 1 +allais 1 +chère 1 +l’information 1 +locales 1 +proposer 1 +Noël 1 +rarement 1 +jaune 1 +spécifique 1 +dépend 1 +tranquille 1 +artistes 1 +rencontré 1 +poésie 1 +écrits 1 +traces 1 +définir 1 +oiseaux 1 +fixe 1 +choc 1 +del 1 +américaine 1 +vigueur 1 +différente 1 +véhicule 1 +chinois 1 +parlement 1 +allée 1 +autonomie 1 +décrit 1 +installer 1 +miroir 1 +maîtresse 1 +essence 1 +l’équipe 1 +douceur 1 +maîtres 1 +dépit 1 +déterminer 1 +distinction 1 +vallée 1 +causes 1 +l’arrivée 1 +resté 1 +chemise 1 +ost 1 +attends 1 +inconnu 1 +menu 1 +radio 1 +boutique 1 +l’ont 1 +qualités 1 +mener 1 +sucre 1 +apparemment 1 +quasi 1 +cabinet 1 +tendre 1 +joues 1 +satisfaction 1 +reconnu 1 +montagnes 1 +mélange 1 +travailleurs 1 +responsables 1 +atmosphère 1 +programmes 1 +financière 1 +nécessairement 1 +diversité 1 +éthique 1 +frontière 1 +pensais 1 +tendit 1 +meilleurs 1 +département 1 +obligations 1 +indispensable 1 +retrouvé 1 +désert 1 +saisit 1 +descendre 1 +prière 1 +entendit 1 +constater 1 +extrêmement 1 +assure 1 +avion 1 +convaincre 1 +officier 1 +distinguer 1 +seules 1 +aimerais 1 +chrétiens 1 +comportements 1 +sortes 1 +séance 1 +ambiance 1 +évident 1 +sœurs 1 +officiers 1 +commandant 1 +dangereux 1 +acquis 1 +proposé 1 +génie 1 +quitte 1 +province 1 +viande 1 +tend 1 +apparaître 1 +charges 1 +tort 1 +description 1 +tantôt 1 +disparaître 1 +entends 1 +via 1 +urgence 1 +outil 1 +médecins 1 +liée 1 +sienne 1 +servi 1 +représentations 1 +inquiète 1 +complet 1 +commissaire 1 +prêtre 1 +appui 1 +trait 1 +tenant 1 +maîtrise 1 +actuellement 1 +ouvriers 1 +actuelle 1 +souhaite 1 +l’énergie 1 +identifier 1 +obligé 1 +libération 1 +mystère 1 +plantes 1 +folie 1 +dollars 1 +tante 1 +moral 1 +ange 1 +trouble 1 +perception 1 +sachant 1 +journaux 1 +alcool 1 +mettent 1 +sorti 1 +arabe 1 +surveillance 1 +pardon 1 +européens 1 +commençait 1 +vienne 1 +cellules 1 +mises 1 +abri 1 +d’années 1 +digne 1 +alliance 1 +établi 1 +devint 1 +dure 1 +commande 1 +pur 1 +décret 1 +scientifiques 1 +direct 1 +doctrine 1 +morceau 1 +intérieure 1 +dedans 1 +parfaite 1 +tournant 1 +séparation 1 +associations 1 +inscrit 1 +laissait 1 +étoiles 1 +fleuve 1 +l’univers 1 +initiative 1 +curiosité 1 +pensez 1 +monte 1 +poussa 1 +remise 1 +concours 1 +réduction 1 +serai 1 +culturelle 1 +l’ancien 1 +retard 1 +signification 1 +suisse 1 +essaie 1 +mademoiselle 1 +progressivement 1 +investissement 1 +médias 1 +principales 1 +pareil 1 +russe 1 +coopération 1 +collectif 1 +savent 1 +refuse 1 +sagesse 1 +prenez 1 +bonjour 1 +sel 1 +récemment 1 +royal 1 +films 1 +circulation 1 +promis 1 +capacités 1 +adultes 1 +Canada 1 +poisson 1 +fins 1 +pousse 1 +l’emploi 1 +divine 1 +empêche 1 +l’utilisation 1 +voies 1 +lié 1 +couvert 1 +immeuble 1 +fenêtres 1 +réalisé 1 +accent 1 +liées 1 +commis 1 +quête 1 +fruit 1 +moteur 1 +passée 1 +améliorer 1 +longueur 1 +portrait 1 +ressemble 1 +familiale 1 +bouteille 1 +venaient 1 +demandait 1 +distribution 1 +firent 1 +reprend 1 +organiser 1 +modes 1 +disparition 1 +l’individu 1 +quatrième 1 +implique 1 +pape 1 +conférence 1 +voyons 1 +modalités 1 +parut 1 +continua 1 +der 1 +extraordinaire 1 +essayé 1 +atteinte 1 +revint 1 +située 1 +van 1 +croyait 1 +malheureux 1 +frontières 1 +culturel 1 +tours 1 +connue 1 +placé 1 +spécifiques 1 +révèle 1 +mettant 1 +contient 1 +coupable 1 +bain 1 +cycle 1 +souriant 1 +suivantes 1 +voisins 1 +contrats 1 +essai 1 +traiter 1 +civilisation 1 +différences 1 +françaises 1 +curieux 1 +tourisme 1 +retourne 1 +ordinateur 1 +princesse 1 +maximum 1 +observe 1 +l’établissement 1 +auxquels 1 +cliquez 1 +témoin 1 +tenté 1 +accepté 1 +l’oreille 1 +composé 1 +accompagner 1 +avancer 1 +tire 1 +dispositif 1 +réception 1 +dirigeants 1 +institut 1 +avantages 1 +bains 1 +trou 1 +inspiration 1 +financiers 1 +collègues 1 +agence 1 +horreur 1 +soutenir 1 +communautés 1 +fondée 1 +sacré 1 +arriva 1 +suivants 1 +froide 1 +piste 1 +stade 1 +clinique 1 +solutions 1 +sage 1 +atelier 1 +richesse 1 +respecter 1 +composition 1 +anciennes 1 +terminé 1 +devez 1 +exercer 1 +relever 1 +bilan 1 +transfert 1 +désigne 1 +agriculture 1 +fallu 1 +étendue 1 +maladies 1 +domicile 1 +exprime 1 +allé 1 +former 1 +sport 1 +publication 1 +division 1 +abbé 1 +planète 1 +parvenir 1 +centaines 1 +clés 1 +architecture 1 +participer 1 +nuits 1 +l’Afrique 1 +figures 1 +fidèle 1 +Orient 1 +couche 1 +utilise 1 +résoudre 1 +vif 1 +queue 1 +quelconque 1 +l’arrière 1 +l’étranger 1 +symbolique 1 +calcul 1 +monnaie 1 +feuille 1 +affirme 1 +chrétienne 1 +l’été 1 +duquel 1 +phénomènes 1 +présenté 1 +avenue 1 +chat 1 +rendit 1 +cultures 1 +présents 1 +obscurité 1 +gardes 1 +d’action 1 +réputation 1 +température 1 +légère 1 +joué 1 +enjeux 1 +sauvage 1 +conserver 1 +répliqua 1 +rois 1 +rendait 1 +culte 1 +instrument 1 +prévenir 1 +employés 1 +juger 1 +plateau 1 +voitures 1 +glisser 1 +gérer 1 +imposer 1 +destinée 1 +courte 1 +sec 1 +baisse 1 +visible 1 +prêts 1 +chiens 1 +lancer 1 +historiques 1 +imaginaire 1 +fine 1 +marine 1 +dite 1 +d’intérêt 1 +obtenu 1 +lumières 1 +étapes 1 +océan 1 +soyez 1 +critiques 1 +toile 1 +Bretagne 1 +drôle 1 +comparaison 1 +vierge 1 +résolution 1 +décider 1 +préfère 1 +paiement 1 +flux 1 +secrets 1 +rage 1 +islam 1 +budget 1 +approcha 1 +secoua 1 +épée 1 +enceinte 1 +noter 1 +croyez 1 +installé 1 +l’écriture 1 +solitude 1 +lieutenant 1 +réussite 1 +collège 1 +hélas 1 +l’exemple 1 +fournir 1 +l’escalier 1 +pleurer 1 +découvre 1 +aurez 1 +net 1 +vendre 1 +directe 1 +l’application 1 +entra 1 +autrui 1 +quoique 1 +minimum 1 +intéresse 1 +voisin 1 +motif 1 +soupir 1 +intermédiaire 1 +engager 1 +prochaine 1 +morceaux 1 +sien 1 +l’essentiel 1 +durable 1 +finances 1 +allemande 1 +folle 1 +reçoit 1 +lourd 1 +autorisation 1 +fatigue 1 +l’honneur 1 +instruments 1 +étrangère 1 +toit 1 +précieux 1 +possibilités 1 +cuir 1 +marches 1 +précédent 1 +inquiétude 1 +remarqué 1 +cessé 1 +allant 1 +représentants 1 +appliquer 1 +actuel 1 +devrais 1 +légumes 1 +modernes 1 +îles 1 +numérique 1 +quartiers 1 +possession 1 +tiré 1 +portent 1 +fameux 1 +discuter 1 +origines 1 +procédures 1 +comporte 1 +respiration 1 +maire 1 +financement 1 +témoignage 1 +parlant 1 +villages 1 +ignore 1 +absolue 1 +pêche 1 +montrent 1 +territoires 1 +actif 1 +éclat 1 +généraux 1 +organisme 1 +chiffres 1 +deviennent 1 +étrangères 1 +tâches 1 +tentative 1 +intensité 1 +pâle 1 +distingue 1 +voile 1 +relatives 1 +élections 1 +pitié 1 +mettait 1 +quart 1 +foyer 1 +nationales 1 +l’habitude 1 +venez 1 +attendu 1 +luxe 1 +internationales 1 +pourrez 1 +soupe 1 +mets 1 +physiques 1 +devais 1 +religieuses 1 +l’objectif 1 +mémoires 1 +cria 1 +liquide 1 +décida 1 +tissu 1 +chanson 1 +tristesse 1 +colonel 1 +tableaux 1 +Bruxelles 1 +associés 1 +apporte 1 +fondé 1 +orientation 1 +chevalier 1 +vieil 1 +portable 1 +libres 1 +dut 1 +voulut 1 +nu 1 +décès 1 +conseiller 1 +Algérie 1 +l’influence 1 +compagnons 1 +remis 1 +verbe 1 +diffusion 1 +renseignements 1 +branches 1 +abandonner 1 +fleur 1 +faculté 1 +l’identité 1 +vins 1 +accompagné 1 +centres 1 +accéder 1 +l’unité 1 +royale 1 +l’Allemagne 1 +dimensions 1 +suprême 1 +crée 1 +assistance 1 +exigences 1 +souffrir 1 +chant 1 +transformer 1 +achat 1 +milliards 1 +cellule 1 +enseignants 1 +pousser 1 +voyages 1 +crâne 1 +reprise 1 +d’hommes 1 +solide 1 +tables 1 +facteur 1 +malades 1 +posée 1 +financier 1 +soldat 1 +coûts 1 +allure 1 +vivent 1 +destination 1 +auront 1 +venant 1 +intime 1 +couteau 1 +poussière 1 +intense 1 +aperçut 1 +visiter 1 +bière 1 +climat 1 +romain 1 +définitivement 1 +d’esprit 1 +talent 1 +l’accès 1 +Inde 1 +volontiers 1 +papiers 1 +étudier 1 +semblaient 1 +merde 1 +juges 1 +enfer 1 +entendait 1 +désolé 1 +magasin 1 +erreurs 1 +l’après 1 +manteau 1 +latin 1 +muscles 1 +with 1 +plafond 1 +quelquefois 1 +fuite 1 +bâtiments 1 +jette 1 +excès 1 +unes 1 +constitué 1 +chapeau 1 +accepte 1 +journaliste 1 +placer 1 +marqué 1 +chiffre 1 +certitude 1 +l’aise 1 +comprit 1 +solidarité 1 +disponible 1 +visiblement 1 +passent 1 +profondeur 1 +vagues 1 +herbe 1 +stratégies 1 +difficiles 1 +final 1 +levant 1 +impôt 1 +poissons 1 +hautes 1 +particuliers 1 +associé 1 +station 1 +philosophe 1 +diagnostic 1 +embrasser 1 +contribution 1 +innovation 1 +loup 1 +serra 1 +race 1 +démocratique 1 +capables 1 +compagnon 1 +intellectuelle 1 +propositions 1 +auxquelles 1 +chaussures 1 +savons 1 +magie 1 +guerres 1 +l’ouverture 1 +supporter 1 +semblable 1 +motifs 1 +d’art 1 +phrases 1 +logement 1 +entraîne 1 +trouvaient 1 +transmission 1 +tas 1 +illusion 1 +reconnaît 1 +chemins 1 +croyais 1 +profession 1 +discipline 1 +endroits 1 +admettre 1 +désespoir 1 +récits 1 +garantie 1 +armées 1 +d’affaires 1 +contente 1 +pensa 1 +vain 1 +gars 1 +intervenir 1 +justifier 1 +paradis 1 +symbole 1 +cherchait 1 +affirmer 1 +faiblesse 1 +expliqua 1 +attirer 1 +fumée 1 +décor 1 +pantalon 1 +col 1 +contraintes 1 +excellent 1 +appelée 1 +gratuit 1 +active 1 +l’espoir 1 +messieurs 1 +écho 1 +présentent 1 +prochain 1 +dette 1 +succession 1 +auto 1 +correspondance 1 +performance 1 +crim 1 +contrôler 1 +effectuer 1 +d’entrée 1 +née 1 +cache 1 +universelle 1 +d’information 1 +dommage 1 +préféré 1 +perdue 1 +promesse 1 +enthousiasme 1 +camarades 1 +concentration 1 +têtes 1 +salaire 1 +hauts 1 +détermination 1 +totalité 1 +souris 1 +résidence 1 +débats 1 +résulte 1 +employé 1 +traditionnelle 1 +esthétique 1 +menton 1 +chercheurs 1 +remplir 1 +restauration 1 +accueillir 1 +silhouette 1 +absolu 1 +d’ordre 1 +chrétien 1 +jus 1 +visites 1 +remonter 1 +générations 1 +propriétés 1 +trajet 1 +crème 1 +hein 1 +chocolat 1 +grec 1 +sélection 1 +vice 1 +jeudi 1 +évoque 1 +décrire 1 +l’écart 1 +terreur 1 +considérée 1 +lycée 1 +dessin 1 +nettement 1 +dignité 1 +correspondant 1 +renvoie 1 +retirer 1 +interroger 1 +truc 1 +l’ouvrage 1 +pause 1 +manières 1 +Asie 1 +l’Etat 1 +vivement 1 +ressemblait 1 +affection 1 +constituer 1 +approcher 1 +dizaine 1 +chaude 1 +occupé 1 +réflexions 1 +adaptation 1 +potentiel 1 +meurtre 1 +vise 1 +poursuit 1 +mœurs 1 +lueur 1 +héritage 1 +navire 1 +utilisée 1 +pauvreté 1 +tapis 1 +poursuivit 1 +âmes 1 +utilisés 1 +promotion 1 +noble 1 +jurisprudence 1 +accomplir 1 +évêque 1 +congrès 1 +creux 1 +musulmans 1 +préciser 1 +hâte 1 +confusion 1 +témoins 1 +trésor 1 +manifestations 1 +l’avons 1 +rejoint 1 +existait 1 +gouverneur 1 +canapé 1 +amant 1 +l’opinion 1 +l’épaule 1 +l’avais 1 +d’énergie 1 +l’écran 1 +l’empereur 1 +l’échelle 1 +l’opération 1 +l’avant 1 +l’ennemi 1 +l’exécution 1 +l’industrie 1 +d’habitude 1 +l’odeur 1 +l’obligation 1 +l’avaient 1 +d’enfants 1 +l’ancienne 1 +l’abri 1 +l’obscurité 1 +l’approche 1 +l’appartement 1 +l’horizon 1 +d’obtenir 1 +l’enquête 1 +l’inverse 1 +d’entrer 1 +l’appareil 1 +l’intervention 1 +l’équilibre 1 +l’abbé 1 +d’éviter 1 +d’informations 1 +d’histoire 1 +l’association 1 +l’intelligence 1 +l’arrêt 1 +l’hiver 1 +l’exception 1 +l’animal 1 +l’aspect 1 +l’hypothèse 1 +l’accord 1 +l’atmosphère 1 +d’études 1 +l’opposition 1 +l’appel 1 +l’envie 1 +l’indépendance 1 +d’accueil 1 +l’as 1 +d’entreprise 1 +d’honneur 1 +l’évaluation 1 +l’aube 1 +l’épreuve 1 +d’air 1 +l’adresse 1 +l’apparition 1 +l’égalité 1 +l’aurait 1 +l’examen 1 +l’efficacité 1 +d’appel 1 +d’agir 1 +d’elles 1 +l’Angleterre 1 +l’attitude 1 +l’accueil 1 +d’apprendre 1 +d’activité 1 +l’enfance 1 +l’aider 1 +l’événement 1 +l’offre 1 +d’accès 1 +l’interprétation 1 +l’effort 1 +l’Italie 1 +d’écrire 1 +l’exploitation 1 +l’artiste 1 +l’agriculture 1 +l’entretien 1 +l’institution 1 +l’impact 1 +l’arbre 1 +l’an 1 +l’espèce 1 +l’océan 1 +d’homme 1 +l’huile 1 +l’accent 1 +d’importance 1 +d’entendre 1 +l’alcool 1 +d’arriver 1 +l’Amérique 1 +l’engagement 1 +l’angle 1 +l’avez 1 +l’initiative 1 +d’armes 1 +l’évidence 1 +d’utiliser 1 +l’or 1 +d’emploi 1 +l’imagination 1 +l’échec 1 +l’Éternel 1 +l’apprentissage 1 +l’aéroport 1 +l’issue 1 +l’émotion 1 +l’agent 1 +l’écrivain 1 +d’Europe 1 +l’islam 1 +d’application 1 +l’ambiance 1 +l’intégration 1 +d’aide 1 +l’Espagne 1 +d’Israël 1 +l’herbe 1 +d’avance 1 +l’étage 1 +l’avantage 1 +l’essence 1 +l’employeur 1 +d’assurer 1 +l’angoisse 1 +l’élaboration 1 +d’ouvrir 1 +d’établir 1 +l’unique 1 +d’expression 1 +d’analyse 1 +l’immeuble 1 +l’émergence 1 +l’Académie 1 +d’emblée 1 \ No newline at end of file diff --git a/lang/la/wordlist.txt b/lang/la/wordlist.txt new file mode 100644 index 0000000..453cfa6 --- /dev/null +++ b/lang/la/wordlist.txt @@ -0,0 +1,1577 @@ +et 197 +in 142 +est 100 +non 91 +ut 72 +cum 62 +si 61 +ad 59 +quod 54 +qui 47 +sed 42 +quae 38 +ex 37 +quam 35 +esse 33 +de 31 +aut 31 +a 30 +hoc 27 +nec 26 +sunt 23 +etiam 23 +se 23 +quid 22 +enim 22 +ab 21 +per 21 +sit 21 +atque 20 +id 19 +autem 19 +quo 18 +uel 18 +me 18 +ne 17 +te 17 +ac 17 +nam 17 +tamen 16 +eius 15 +haec 15 +mihi 15 +ita 15 +iam 15 +neque 14 +quidem 13 +eo 13 +quoque 13 +ea 12 +pro 12 +tibi 12 +quia 12 +ego 12 +nihil 11 +eum 11 +modo 11 +nunc 11 +sic 10 +libro 10 +an 10 +quem 10 +quibus 10 +inter 10 +qua 10 +esset 10 +causa 10 +erat 10 +nisi 9 +hic 9 +potest 9 +uero 9 +tum 9 +quis 9 +ipse 9 +fuit 9 +tu 9 +ille 9 +ante 9 +sine 9 +res 9 +his 8 +omnia 8 +idem 8 +ubi 8 +sibi 8 +illa 7 +post 7 +rem 7 +ei 7 +tam 7 +apud 7 +tantum 7 +magis 7 +at 6 +erit 6 +deinde 6 +quos 6 +cui 6 +omnes 6 +is 6 +re 6 +contra 6 +nos 6 +cuius 6 +omnibus 6 +minus 6 +quasi 6 +ergo 5 +eam 5 +igitur 5 +rei 5 +sub 5 +posse 5 +dum 5 +eorum 5 +sua 5 +inquit 5 +itaque 5 +sint 5 +primum 5 +ipsa 5 +habet 5 +illud 5 +suo 5 +item 5 +eos 5 +illi 5 +siue 5 +satis 5 +nobis 5 +parte 5 +hanc 5 +ait 5 +rerum 5 +semper 5 +propter 5 +tempore 5 +loco 4 +possit 4 +unde 4 +rebus 4 +fuerit 4 +inde 4 +omnis 4 +omnium 4 +quoniam 4 +fieri 4 +eadem 4 +nomine 4 +alia 4 +maxime 4 +hunc 4 +alii 4 +hac 4 +pater 4 +quas 4 +facere 4 +saepe 4 +uerum 4 +aliquid 4 +suis 4 +bene 4 +ipsum 4 +die 4 +mea 4 +multa 4 +nomen 4 +solum 4 +uidetur 4 +illum 4 +unum 4 +fuisse 4 +nulla 4 +natura 4 +primo 4 +simul 4 +ob 4 +una 4 +dies 4 +postea 4 +quidam 3 +factum 3 +habere 3 +senatus 3 +tempus 3 +iis 3 +uos 3 +tunc 3 +dixit 3 +licet 3 +tua 3 +iure 3 +quantum 3 +dicere 3 +uti 3 +bellum 3 +dicitur 3 +partem 3 +genus 3 +numquam 3 +ideo 3 +locum 3 +ibi 3 +pars 3 +aliud 3 +eodem 3 +quorum 3 +huius 3 +erant 3 +aduersus 3 +filius 3 +sum 3 +nemo 3 +suum 3 +debet 3 +animo 3 +hominum 3 +supra 3 +opus 3 +sui 3 +causam 3 +dicit 3 +hinc 3 +quin 3 +uis 3 +magna 3 +fecit 3 +sicut 3 +plus 3 +illo 3 +ius 3 +o 3 +edictum 3 +heres 3 +arma 3 +ista 3 +illis 3 +ipsi 3 +fit 3 +suam 3 +huic 3 +uerba 3 +essent 3 +homines 3 +duo 3 +facit 3 +facta 3 +usque 3 +manus 3 +cur 3 +quamuis 3 +quaedam 3 +potius 3 +ipso 3 +omni 3 +dedit 3 +usus 3 +animi 3 +uenit 3 +diem 3 +populi 3 +urbem 3 +castra 3 +romani 2 +genere 2 +manu 2 +haud 2 +prima 2 +bello 2 +uno 2 +summa 2 +forte 2 +ui 2 +aliis 2 +ratio 2 +prius 2 +ratione 2 +posset 2 +adhuc 2 +certe 2 +tamquam 2 +publicae 2 +terra 2 +filium 2 +nostra 2 +publica 2 +bona 2 +circa 2 +es 2 +meo 2 +aqua 2 +caput 2 +uerbis 2 +lege 2 +super 2 +denique 2 +fortuna 2 +illam 2 +uelut 2 +quamquam 2 +possunt 2 +sane 2 +secundum 2 +oportet 2 +filio 2 +hominem 2 +praeter 2 +patris 2 +uobis 2 +recte 2 +modum 2 +armis 2 +belli 2 +suae 2 +pecuniam 2 +tot 2 +uita 2 +necesse 2 +meum 2 +habent 2 +corpus 2 +aliter 2 +caesar 2 +suos 2 +multis 2 +utrum 2 +diu 2 +uitae 2 +dare 2 +hostium 2 +paulus 2 +mortem 2 +praeterea 2 +uix 2 +animum 2 +postquam 2 +alio 2 +omne 2 +statim 2 +totum 2 +milia 2 +dictum 2 +uideri 2 +adeo 2 +intra 2 +fere 2 +uim 2 +tanta 2 +alter 2 +mox 2 +alterum 2 +partes 2 +umquam 2 +patrem 2 +facile 2 +multo 2 +iudicium 2 +iudices 2 +domum 2 +ulpianus 2 +scilicet 2 +tota 2 +magno 2 +locis 2 +quando 2 +cura 2 +locus 2 +tertio 2 +fidem 2 +cetera 2 +secundo 2 +quare 2 +corpore 2 +urbe 2 +eas 2 +iudicio 2 +bonorum 2 +signa 2 +deos 2 +uiri 2 +consul 2 +homo 2 +unus 2 +sententia 2 +legatum 2 +potuit 2 +decem 2 +numero 2 +quicquam 2 +populo 2 +fore 2 +nostri 2 +quisque 2 +melius 2 +dici 2 +namque 2 +gratia 2 +tuo 2 +prope 2 +corporis 2 +uocant 2 +habeat 2 +ceteris 2 +nullum 2 +sese 2 +altera 2 +omnem 2 +puto 2 +cicero 2 +hi 2 +multum 2 +mare 2 +rex 2 +exercitus 2 +aliqua 2 +actio 2 +uir 2 +quattuor 2 +pecunia 2 +male 2 +dicunt 2 +annos 2 +illius 2 +nullo 2 +fuerat 2 +seruus 2 +potestate 2 +respondit 2 +solet 2 +diximus 2 +dicta 2 +iter 2 +hereditatem 2 +alias 2 +decimo 2 +iuris 2 +anno 2 +uirum 2 +nostris 2 +uitam 2 +rationem 2 +hos 2 +dari 2 +iussit 2 +ipsis 2 +paulo 2 +ulla 2 +debere 2 +milites 2 +habuit 2 +ceterum 2 +nondum 1 +romae 1 +procul 1 +ipsius 1 +castris 1 +agere 1 +huc 1 +quidquid 1 +quinque 1 +rursus 1 +alios 1 +tandem 1 +senatu 1 +militum 1 +uino 1 +ora 1 +actionem 1 +consilium 1 +bonis 1 +omnino 1 +legem 1 +longe 1 +generis 1 +praetor 1 +genera 1 +interim 1 +primus 1 +deorum 1 +tuis 1 +publicam 1 +consilio 1 +dicam 1 +uideatur 1 +heredem 1 +donec 1 +maior 1 +sanguine 1 +ore 1 +duobus 1 +sabinum 1 +alius 1 +eis 1 +amplius 1 +exercitum 1 +fructus 1 +temporis 1 +oculos 1 +tuum 1 +urbis 1 +quemadmodum 1 +data 1 +meis 1 +mi 1 +toto 1 +quippe 1 +dixi 1 +testamento 1 +fuisset 1 +meus 1 +oculis 1 +parum 1 +caesaris 1 +corpora 1 +domus 1 +possessionem 1 +etsi 1 +dicimus 1 +hostes 1 +bonum 1 +litteris 1 +imperium 1 +mei 1 +romam 1 +aliquando 1 +fama 1 +nocte 1 +regem 1 +patre 1 +utique 1 +interdum 1 +plures 1 +animus 1 +meam 1 +quaeque 1 +multi 1 +uera 1 +paene 1 +constat 1 +ii 1 +earum 1 +meae 1 +pedes 1 +poterit 1 +consules 1 +liber 1 +ire 1 +mortis 1 +dicendum 1 +terram 1 +quinto 1 +caelo 1 +hominis 1 +tres 1 +populus 1 +cn 1 +extra 1 +fuerunt 1 +mater 1 +ferre 1 +tanto 1 +hostem 1 +diebus 1 +eiusdem 1 +seu 1 +litteras 1 +metu 1 +quotiens 1 +more 1 +morte 1 +sola 1 +uirtute 1 +condicione 1 +fiat 1 +senatum 1 +bella 1 +mari 1 +malo 1 +iste 1 +illos 1 +scire 1 +sententiam 1 +usum 1 +tempora 1 +tui 1 +sumus 1 +animos 1 +lex 1 +tribus 1 +iterum 1 +exercitu 1 +uiro 1 +medio 1 +di 1 +tuae 1 +partibus 1 +malum 1 +terrae 1 +uirtus 1 +iubet 1 +manibus 1 +annis 1 +opera 1 +uxorem 1 +centum 1 +graeci 1 +deus 1 +patres 1 +duas 1 +dicuntur 1 +fide 1 +quarto 1 +magnum 1 +nil 1 +pertinet 1 +has 1 +nomina 1 +tuam 1 +idque 1 +num 1 +sex 1 +solis 1 +quibusdam 1 +domino 1 +naturae 1 +romanis 1 +uideo 1 +semel 1 +alium 1 +placet 1 +regis 1 +quisquam 1 +mala 1 +deum 1 +capite 1 +uires 1 +datur 1 +ultra 1 +suas 1 +aquae 1 +libertatem 1 +uolo 1 +usu 1 +nostrum 1 +dico 1 +alterius 1 +immo 1 +plerumque 1 +unam 1 +longa 1 +populum 1 +aliquis 1 +ira 1 +noua 1 +domi 1 +plura 1 +uia 1 +possum 1 +futurum 1 +leges 1 +iouis 1 +scribit 1 +facto 1 +filia 1 +coepit 1 +plane 1 +ferro 1 +secum 1 +caelum 1 +nostro 1 +utrumque 1 +dominus 1 +solus 1 +erunt 1 +datum 1 +mulier 1 +iulianus 1 +hostis 1 +duos 1 +seruum 1 +illic 1 +legati 1 +unius 1 +protinus 1 +quanto 1 +digestorum 1 +patri 1 +possint 1 +imperio 1 +debeat 1 +bis 1 +scio 1 +aeque 1 +romano 1 +haberet 1 +solent 1 +uelit 1 +uoce 1 +faciunt 1 +mecum 1 +spem 1 +accepit 1 +dolo 1 +quaeritur 1 +oportere 1 +sin 1 +undique 1 +diceret 1 +oppidum 1 +modi 1 +romanus 1 +nescio 1 +oratio 1 +quondam 1 +factus 1 +pretium 1 +hodie 1 +ueluti 1 +plurimum 1 +natus 1 +horum 1 +equidem 1 +gloria 1 +poena 1 +sequitur 1 +interest 1 +sexto 1 +uoluntate 1 +fecerit 1 +fuerint 1 +nullam 1 +periculum 1 +putant 1 +ciuitatis 1 +naturam 1 +equites 1 +ipsam 1 +casus 1 +significat 1 +annum 1 +caeli 1 +pluribus 1 +tecum 1 +spes 1 +fides 1 +similis 1 +domo 1 +pariter 1 +turba 1 +loci 1 +casu 1 +scripsit 1 +gratiam 1 +uelim 1 +uideretur 1 +uiginti 1 +aquam 1 +uellet 1 +uersus 1 +fundum 1 +media 1 +periculo 1 +hominibus 1 +uoluit 1 +poterat 1 +talis 1 +amor 1 +sacra 1 +causis 1 +prouincia 1 +mali 1 +mille 1 +ostendit 1 +uidentur 1 +sis 1 +primis 1 +puer 1 +fata 1 +magni 1 +olim 1 +praestare 1 +septimo 1 +subito 1 +facilius 1 +ipsos 1 +fecisse 1 +italia 1 +filii 1 +salutem 1 +demum 1 +fortasse 1 +qualis 1 +putat 1 +singulis 1 +loca 1 +ciuitate 1 +profecto 1 +aliquo 1 +credo 1 +petit 1 +tulit 1 +auctoritate 1 +boni 1 +partim 1 +scriptum 1 +minime 1 +plebis 1 +pomponius 1 +cuncta 1 +liberos 1 +reliqua 1 +uidit 1 +fortunae 1 +uolunt 1 +ordine 1 +causas 1 +quodam 1 +summo 1 +maxima 1 +arte 1 +multos 1 +causae 1 +suorum 1 +uult 1 +inquam 1 +conuenit 1 +seruo 1 +memoria 1 +saepius 1 +petere 1 +tela 1 +uenire 1 +antea 1 +finem 1 +membra 1 +rege 1 +opere 1 +pectore 1 +frater 1 +nulli 1 +potestatem 1 +etiamsi 1 +malis 1 +miles 1 +ueteres 1 +amore 1 +fiunt 1 +nimis 1 +legiones 1 +temporibus 1 +ecce 1 +placuit 1 +serui 1 +dicat 1 +spe 1 +actione 1 +liberis 1 +hostibus 1 +oratione 1 +potes 1 +praecipue 1 +uiribus 1 +accipere 1 +crimen 1 +iuppiter 1 +uiris 1 +officio 1 +studio 1 +uxor 1 +dat 1 +iuxta 1 +ingens 1 +agros 1 +sensus 1 +paucis 1 +uere 1 +prior 1 +refert 1 +signum 1 +uinum 1 +partis 1 +possent 1 +eandem 1 +habebat 1 +iamque 1 +par 1 +sidera 1 +ignis 1 +uerborum 1 +beneficium 1 +neminem 1 +quarum 1 +uidere 1 +consulem 1 +romanos 1 +eundem 1 +patriae 1 +totam 1 +uerbum 1 +foro 1 +iniuria 1 +maiores 1 +romanum 1 +auctor 1 +moenia 1 +ciuium 1 +familias 1 +testamentum 1 +heredes 1 +aetas 1 +manum 1 +terras 1 +altero 1 +legibus 1 +legis 1 +certum 1 +forma 1 +uitia 1 +totius 1 +dein 1 +summam 1 +noster 1 +profectus 1 +nihilo 1 +antequam 1 +quicquid 1 +uiam 1 +uocatur 1 +iii 1 +utraque 1 +uitium 1 +domini 1 +medium 1 +dolor 1 +filiam 1 +nimium 1 +facies 1 +nostrae 1 +ni 1 +persona 1 +dextra 1 +octauo 1 +posuit 1 +italiam 1 +proelio 1 +aciem 1 +mora 1 +uiros 1 +homini 1 +operis 1 +repente 1 +auro 1 +ultro 1 +titio 1 +etenim 1 +frustra 1 +culpa 1 +liceat 1 +mente 1 +fuga 1 +maiore 1 +possumus 1 +equitum 1 +motus 1 +imperator 1 +operam 1 +summum 1 +uelle 1 +agi 1 +dolore 1 +quaesitum 1 +exemplum 1 +faciat 1 +minor 1 +uale 1 +melle 1 +peruenit 1 +teneri 1 +matrem 1 +solo 1 +caesarem 1 +terris 1 +quanta 1 +sponte 1 +tertia 1 +soli 1 +aceto 1 +species 1 +acie 1 +circum 1 +consulibus 1 +nominis 1 +iura 1 +uidebatur 1 +praesertim 1 +fructum 1 +mors 1 +hercle 1 +isdem 1 +anni 1 +condicio 1 +pecuniae 1 +dicendi 1 +naues 1 +pertinere 1 +uiuere 1 +dolorem 1 +uox 1 +faciam 1 +actum 1 +misit 1 +orbem 1 +metus 1 +palam 1 +urbes 1 +opes 1 +ordinem 1 +quomodo 1 +agro 1 +habeo 1 +aliquem 1 +homine 1 +grauis 1 +matris 1 +nono 1 +pedibus 1 +quot 1 +septem 1 +noui 1 +foret 1 +mori 1 +mores 1 +quaero 1 +ciuitas 1 +militibus 1 +patria 1 +reus 1 +capitis 1 +merito 1 +uisum 1 +aetate 1 +iniuriam 1 +quaestionum 1 +speciem 1 +tuus 1 +simile 1 +uerbo 1 +intus 1 +oleo 1 +quom 1 +ferunt 1 +regnum 1 +numerum 1 +uidi 1 +animis 1 +magistratus 1 +certa 1 +mentem 1 +tertium 1 +aliam 1 +debent 1 +ingenio 1 +aurum 1 +orationis 1 +alibi 1 +nota 1 +pacem 1 +honorem 1 +sole 1 +flumen 1 +communi 1 +uictoria 1 +aetatis 1 +uides 1 +nuper 1 +dis 1 +fratrem 1 +maius 1 +uirtutem 1 +consulto 1 +terrarum 1 +duae 1 +hae 1 +liberum 1 +porro 1 +ter 1 +cumque 1 +deo 1 +fidei 1 +acies 1 +copia 1 +mundi 1 +eaque 1 +maiorem 1 +magnis 1 +alienum 1 +appellant 1 +nascitur 1 +officium 1 +pati 1 +agrum 1 +puta 1 +ideoque 1 +imperii 1 +uestra 1 +duces 1 +prouinciam 1 +uictor 1 +uirtutis 1 +dominum 1 +nauibus 1 +reliquit 1 +uelis 1 +diligenter 1 +liberi 1 +moribus 1 +quadam 1 +cuique 1 +agit 1 +esto 1 +honore 1 +plerique 1 +proinde 1 +possis 1 +agri 1 +cato 1 +cuiusque 1 +legatos 1 +poenam 1 +singulos 1 +consule 1 +nox 1 +apparet 1 +tuos 1 +tenet 1 +iiii 1 +pompeius 1 +tellus 1 +fortunam 1 +praesidio 1 +scipio 1 +postremo 1 +uicensimo 1 +ciuitatem 1 +faceret 1 +interea 1 +kal 1 +tabulas 1 +ordo 1 +pectora 1 +exemplo 1 +prodest 1 +facti 1 +habes 1 +similiter 1 +idcirco 1 +iuuenis 1 +os 1 +maris 1 +pondere 1 +tanti 1 +aliquam 1 +utroque 1 +legatus 1 +longius 1 +magnam 1 +occidit 1 +ullo 1 +arbitror 1 +auxilium 1 +gentis 1 +mirum 1 +roma 1 +optime 1 +titius 1 +nostros 1 +gentes 1 +lingua 1 +marcellus 1 +responsorum 1 +dubium 1 +publico 1 +sequi 1 +pari 1 +tria 1 +uocem 1 +utriusque 1 +ciuis 1 +ceteri 1 +alteri 1 +regna 1 +cursu 1 +fieret 1 +uultus 1 +posita 1 +duabus 1 +pace 1 +patriam 1 +litora 1 +dixisse 1 +loqui 1 +prouinciae 1 +tuas 1 +carmina 1 +isti 1 +dederit 1 +romanorum 1 +copiis 1 +luce 1 +regi 1 +dotem 1 +uisa 1 +initio 1 +intellegi 1 +herede 1 +romana 1 +saxa 1 +scripta 1 +aeris 1 +age 1 +labeo 1 +publice 1 +nullus 1 +proxima 1 +aliae 1 +legata 1 +munus 1 +noctem 1 +pretio 1 +familiae 1 +duce 1 +fertur 1 +isto 1 +proprie 1 +sermone 1 +καὶ 1 +mens 1 +libertas 1 +quemquam 1 +reges 1 +semen 1 +sim 1 +terga 1 +amici 1 +putas 1 +sol 1 +decus 1 +habeant 1 +ingenti 1 +appellatur 1 +gentium 1 +hereditas 1 +uini 1 +uterque 1 +dixerit 1 +negat 1 +quisquis 1 +ferrum 1 +legatis 1 +melior 1 +poenas 1 +spatium 1 +bono 1 +scelus 1 +singula 1 +litterae 1 +negotium 1 +filiae 1 +gaius 1 +mentis 1 +uni 1 +latus 1 +alteram 1 +argentum 1 +dignum 1 +facinus 1 +lumina 1 +materia 1 +nefas 1 +aere 1 +ueneris 1 +uidet 1 +quaeso 1 +parua 1 +uehementer 1 +princeps 1 +agitur 1 +artis 1 +dic 1 +libris 1 +copias 1 +specie 1 +fratres 1 +priusquam 1 +singulari 1 +quosdam 1 +seruos 1 +communis 1 +diutius 1 +fideicommissum 1 +ignem 1 +magnitudine 1 +senex 1 +graecis 1 +nouum 1 +oris 1 +quanti 1 +honores 1 +triginta 1 +uenisse 1 +dei 1 +tale 1 +spiritus 1 +principes 1 +tecta 1 +umbra 1 +certo 1 +istum 1 +orbis 1 +pugna 1 +passus 1 +ualet 1 +dumtaxat 1 +istis 1 +natum 1 +uirgo 1 +fratris 1 +uidemus 1 +insula 1 +italiae 1 +iussu 1 +optimum 1 +hoste 1 +plena 1 +tutor 1 +nonne 1 +alieno 1 +templum 1 +alto 1 +pondo 1 +acta 1 +aliena 1 +ceteros 1 +labore 1 +aiunt 1 +fas 1 +furti 1 +temere 1 +longo 1 +aures 1 +cito 1 +ducere 1 +ualde 1 +beneficio 1 +potestas 1 +aliquod 1 +ciues 1 +nostram 1 +potuisse 1 +reddere 1 +spatio 1 +meos 1 +proelium 1 +utinam 1 +auctores 1 +aequo 1 +finis 1 +illorum 1 +paulum 1 +secunda 1 +legato 1 +peculio 1 +praeda 1 +talia 1 +uoluntatem 1 +forum 1 +praesens 1 +uictus 1 +utile 1 +breui 1 +hispania 1 +relicta 1 +fugit 1 +litore 1 +libertate 1 +proelia 1 +postero 1 +uestigia 1 +caede 1 +ingenium 1 +futura 1 +maioribus 1 +maximum 1 +aliquot 1 +familia 1 +ignes 1 +magnus 1 +tali 1 +simili 1 +curam 1 +dato 1 +digna 1 +munera 1 +tribuni 1 +damnum 1 +pacto 1 +sicilia 1 +uota 1 +agmen 1 +capta 1 +dixerunt 1 +feci 1 +istius 1 +pacis 1 +temporum 1 +diuus 1 +pugnae 1 +restituere 1 +sanguinem 1 +signis 1 +consilia 1 +aeneas 1 +diues 1 +hereditatis 1 +modis 1 +passim 1 +habebit 1 +ubique 1 +proprium 1 +amicis 1 +inuidia 1 +missus 1 +admodum 1 +agmine 1 +dux 1 +folia 1 +istuc 1 +clam 1 +dicendo 1 +gloriam 1 +labor 1 +ducem 1 +uitio 1 +uiuo 1 +condicionem 1 +diuersa 1 +eoque 1 +infelix 1 +maximus 1 +miser 1 +sal 1 +scribere 1 +fugam 1 +maritus 1 +nauis 1 +referre 1 +iudex 1 +africa 1 +ferme 1 +uocat 1 +priore 1 +itinere 1 +libertatis 1 +tenetur 1 +uirorum 1 +extemplo 1 +fundo 1 +pectus 1 +positum 1 +sanguis 1 +felix 1 +impetu 1 +caesare 1 +memoriam 1 +orationem 1 +ultima 1 +artus 1 +pedum 1 +adulescens 1 +bonus 1 +capere 1 +ciuitates 1 +oleum 1 +orbe 1 +penitus 1 +templa 1 +quaecumque 1 +sicuti 1 +mane 1 +necessaria 1 +oppido 1 +uarro 1 +actiones 1 +uideamus 1 +audire 1 +dubio 1 +uenus 1 +colore 1 +fecerunt 1 +ossa 1 +perinde 1 +commune 1 +milibus 1 +alta 1 +cotidie 1 +iussus 1 +praetore 1 +socios 1 +agris 1 +clamore 1 +contentus 1 +equos 1 +heredi 1 +pueri 1 +redit 1 +iudicem 1 +praesidium 1 +utrimque 1 +datus 1 +uenisset 1 +amicos 1 +principem 1 +rogo 1 +sanguinis 1 +ullum 1 +fines 1 +istud 1 +publicum 1 +uulnera 1 +aetatem 1 +modus 1 +sociis 1 +tradunt 1 +egit 1 +nata 1 +opinor 1 +tantam 1 +uultu 1 +uetus 1 +attico 1 +equis 1 +noctis 1 +fortis 1 +fuere 1 +fundi 1 +istam 1 +uisus 1 +ager 1 +amicum 1 +flumina 1 +hereditate 1 +antonius 1 +heredibus 1 +sacris 1 +equo 1 +morbo 1 +lacrimis 1 +potui 1 +praetorem 1 +tergo 1 +incipit 1 +matre 1 +publicis 1 +euenit 1 +crimine 1 +foliis 1 +neue 1 +paulatim 1 +undis 1 +essem 1 +marito 1 +pompei 1 +totidem 1 +utque 1 +asia 1 +patitur 1 +pauca 1 diff --git a/plugin.info.txt b/plugin.info.txt index e441852..47c4633 100644 --- a/plugin.info.txt +++ b/plugin.info.txt @@ -1,7 +1,7 @@ base botmon author Sascha Leib email ad@hominem.com -date 2025-10-20 +date 2025-12-06 name Bot Monitoring -desc A tool for monitoring and analysing bot traffic to your wiki (under development) +desc A tool for monitoring and blocking bot traffic to your wiki (under development) url https://www.dokuwiki.org/plugin:botmon diff --git a/style.less b/style.less index 5484c2f..9314c05 100644 --- a/style.less +++ b/style.less @@ -1 +1,164 @@ -/* This file is no longer in use */ \ No newline at end of file +body.botmon_captcha { + main { + h1 { + color: transparent !important; + text-shadow: 0 0 .25em rgba(0,.0,0,.8); + } + p, dt, dd, h2, h3, h4, h5, h6, a:link, a:visited { + color: transparent !important; + text-shadow: 0 0 .35em rgba(0,0,0,.5); + user-select: none; + } + svg { + width: auto; height: auto; + -webkit-filter: blur(8px); /* For Safari */ + filter: blur(8px); + } + + } + #botmon_captcha_box { + & { + position: fixed; + width: 400px; + height: 220px; + top: ~"calc(50vh - 110px)"; + left: ~"calc(50vw - 200px)"; + background: #1C1B22 none; + border: #7C7B82 solid 1pt; + border-radius: 12px; + margin: 0; padding: 18px; + font-family: system-ui, sans-serif; + box-shadow: .25rem .25rem .5rem rgba(0,0,0,.5); + box-sizing: border-box; + z-index: 10001; + } + & * { + color: #EDEDF5; + margin: 0; + } + h2 { + font-size: 24px; + line-height: 32px; + padding: 0 0 12px 0; + } + p { + font-size: 16px; + line-height: 20px; + padding: 6px 0; + } + label { + & { + display: grid; + grid-template-columns: 32px auto; + column-gap: 8px; + align-items: center; + padding: 24px; + margin: 16px 0 0 0; + background-color: #32313A; + border: #7C7B82 solid 1px; + border-radius: 3px; + font-size: 16px; + } + span.busy { + display: inline-block; + width: 24px; height: 24px; + background: transparent url('img/busy-light.svg') center no-repeat; + background-size: 24px; + } + span.error, span.erricon { + color: #f96c6c; + } + } + input[type="checkbox"] { + width: 24px; height: 24px; + border: 2px solid #00CADB; + border-radius: 4px; + appearance: none; + } + input[type="checkbox"]:focus { + outline: none; + box-shadow: 0 0 6px rgba(0, 202, 219, .8); + } + + input[type="checkbox"]:disabled { + display: none; + } + &.checking { + input[type="checkbox"], span.confirm, span.loading, span.erricon, span.error { display: none;} + span.busy, span.checking { display: initial; } + label, input[type="checkbox"] { cursor: wait; } + } + &.ready { + input[type="checkbox"], span.confirm { display: initial;} + span.busy, span.checking, span.loading, span.erricon, span.error { display: none; } + label, input[type="checkbox"] { cursor: pointer; } + } + &.loading { + span.busy, span.loading { display: initial; } + input[type="checkbox"], span.confirm, span.checking, span.erricon, span.error { display: none;} + label { cursor: wait; } + } + &.error { + span.erricon, span.error { display: initial; } + input[type="checkbox"], span.confirm, span.checking, span.busy, span.loading { display: none;} + label { cursor: initial; } + } + } +} + +@keyframes delayed-fade-in { + 0% { opacity: 0; } + 50% { opacity: 0; } + 100% { opacity: 1; } +} + +// no js warning +#BM__NoJSWarning { + position: fixed; + bottom: calc(50vh - 2.5rem); + width: 100%; max-width: fit-content; + margin: 0 auto; + padding: .25rem 1rem; + border-radius: .5rem; + border: red solid 2pt; + box-shadow: rgba(128, 0, 0, 0.5) .25rem .25rem .5rem; + animation: delayed-fade-in 4s forwards; +} + +// captcha on smaller screens: +@media (max-width: 480px) { + body.botmon_captcha #botmon_captcha_box { + width: 100vw; + height: auto; + left: 0; top: 80px; + border-radius: 2px; + } +} + +/* dark mode overrides */ +@media (prefers-color-scheme: dark) { + body.darkmode.botmon_captcha { + main { + h1 { + text-shadow: 0 0 .25em rgba(170,170,170,.75); + } + p, h2, h3, h4, h5, h6 { + text-shadow: 0 0 .35em rgba(170,170,170,.75); + } + } + #botmon_captcha_box { + & { + background-color: #FFF; + border-color: #9F9EA1; + box-shadow: .25rem .25rem .5rem rgba(0,0,0,.25); + } + & * { + color: #15141A; + } + label { + background-color: #EEE; + border-color: #9F9EA1; + } + } + } +} \ No newline at end of file