From 538012a10748f0db7db43ab36bb1aa096bc0cc6b Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sat, 8 Aug 2015 17:40:28 +0200 Subject: [PATCH 01/22] Update version --- iwla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iwla.py b/iwla.py index 7e23d3d..150f699 100755 --- a/iwla.py +++ b/iwla.py @@ -131,7 +131,7 @@ class IWLA(object): ANALYSIS_CLASS = 'HTTP' API_VERSION = 1 - IWLA_VERSION = '0.2-dev' + IWLA_VERSION = '0.3-dev' def __init__(self, logLevel): self.meta_infos = {} From 914232483fe95327f363bdb4d3791ef78e70310d Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Fri, 14 Aug 2015 07:49:53 +0200 Subject: [PATCH 02/22] Add SVG as multimedia files --- default_conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default_conf.py b/default_conf.py index dcc8190..c8eb791 100644 --- a/default_conf.py +++ b/default_conf.py @@ -41,7 +41,7 @@ viewed_http_codes = [200, 304] count_hit_only_visitors = True # Multimedia extensions (not accounted as downloaded files) -multimedia_files = ['png', 'jpg', 'jpeg', 'gif', 'ico', +multimedia_files = ['png', 'jpg', 'jpeg', 'gif', 'ico', 'svg', 'css', 'js'] # Default resources path (will be symlinked in DISPLAY_OUTPUT) From 0bc832f87caf3654f4102a7e737a9a9964ab2df8 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Fri, 14 Aug 2015 07:50:32 +0200 Subject: [PATCH 03/22] Add DuckDuckGo as search engine --- awstats_data.py | 16 ++++++++-------- tools/own_search_engines.pm | 8 ++++++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/awstats_data.py b/awstats_data.py index 33157e1..1c42eb9 100644 --- a/awstats_data.py +++ b/awstats_data.py @@ -4,23 +4,23 @@ robots = ['appie', 'architext', 'bingpreview', 'bjaaland', 'contentmatch', 'ferr search_engines = ['google\.[\w.]+/products', 'base\.google\.', 'froogle\.google\.', 'groups\.google\.', 'images\.google\.', 'google\.', 'googlee\.', 'googlecom\.com', 'goggle\.co\.hu', '216\.239\.(35|37|39|51)\.100', '216\.239\.(35|37|39|51)\.101', '216\.239\.5[0-9]\.104', '64\.233\.1[0-9]{2}\.104', '66\.102\.[1-9]\.104', '66\.249\.93\.104', '72\.14\.2[0-9]{2}\.104', 'msn\.', 'live\.com', 'bing\.', 'voila\.', 'mindset\.research\.yahoo', 'yahoo\.', '(66\.218\.71\.225|216\.109\.117\.135|216\.109\.125\.130|66\.218\.69\.11)', 'search\.aol\.co', 'tiscali\.', 'lycos\.', 'alexa\.com', 'alltheweb\.com', 'altavista\.', 'a9\.com', 'dmoz\.org', 'netscape\.', 'search\.terra\.', 'www\.search\.com', 'search\.sli\.sympatico\.ca', 'excite\.'] -search_engines_2 = ['4\-counter\.com', 'att\.net', 'bungeebonesdotcom', 'northernlight\.', 'hotbot\.', 'kvasir\.', 'webcrawler\.', 'metacrawler\.', 'go2net\.com', '(^|\.)go\.com', 'euroseek\.', 'looksmart\.', 'spray\.', 'nbci\.com\/search', 'de\.ask.\com', 'es\.ask.\com', 'fr\.ask.\com', 'it\.ask.\com', 'nl\.ask.\com', 'uk\.ask.\com', '(^|\.)ask\.com', 'atomz\.', 'overture\.com', 'teoma\.', 'findarticles\.com', 'infospace\.com', 'mamma\.', 'dejanews\.', 'dogpile\.com', 'wisenut\.com', 'ixquick\.com', 'search\.earthlink\.net', 'i-une\.com', 'blingo\.com', 'centraldatabase\.org', 'clusty\.com', 'mysearch\.', 'vivisimo\.com', 'kartoo\.com', 'icerocket\.com', 'sphere\.com', 'ledix\.net', 'start\.shaw\.ca', 'searchalot\.com', 'copernic\.com', 'avantfind\.com', 'steadysearch\.com', 'steady-search\.com', 'claro-search\.com', 'www1\.search-results\.com', 'www\.holasearch\.com', 'search\.conduit\.com', 'static\.flipora\.com', '(?:www[12]?|mixidj)\.delta-search\.com', 'start\.iminent\.com', 'www\.searchmobileonline\.com', 'int\.search-results\.com', 'chello\.at', 'chello\.be', 'chello\.cz', 'chello\.fr', 'chello\.hu', 'chello\.nl', 'chello\.no', 'chello\.pl', 'chello\.se', 'chello\.sk', 'chello', 'mirago\.be', 'mirago\.ch', 'mirago\.de', 'mirago\.dk', 'es\.mirago\.com', 'mirago\.fr', 'mirago\.it', 'mirago\.nl', 'no\.mirago\.com', 'mirago\.se', 'mirago\.co\.uk', 'mirago', 'answerbus\.com', 'icq\.com\/search', 'nusearch\.com', 'goodsearch\.com', 'scroogle\.org', 'questionanswering\.com', 'mywebsearch\.com', 'as\.starware\.com', 'del\.icio\.us', 'digg\.com', 'stumbleupon\.com', 'swik\.net', 'segnalo\.alice\.it', 'ineffabile\.it', 'anzwers\.com\.au', 'engine\.exe', 'miner\.bol\.com\.br', '\.baidu\.com', '\.vnet\.cn', '\.soso\.com', '\.sogou\.com', '\.3721\.com', 'iask\.com', '\.accoona\.com', '\.163\.com', '\.zhongsou\.com', 'atlas\.cz', 'seznam\.cz', 'quick\.cz', 'centrum\.cz', 'jyxo\.(cz|com)', 'najdi\.to', 'redbox\.cz', 'isearch\.avg\.com', 'opasia\.dk', 'danielsen\.com', 'sol\.dk', 'jubii\.dk', 'find\.dk', 'edderkoppen\.dk', 'netstjernen\.dk', 'orbis\.dk', 'tyfon\.dk', '1klik\.dk', 'ofir\.dk', 'ilse\.', 'vindex\.', '(^|\.)ask\.co\.uk', 'bbc\.co\.uk/cgi-bin/search', 'ifind\.freeserve', 'looksmart\.co\.uk', 'splut\.', 'spotjockey\.', 'ukdirectory\.', 'ukindex\.co\.uk', 'ukplus\.', 'searchy\.co\.uk', 'search\.fbdownloader\.com', 'search\.babylon\.com', 'haku\.www\.fi', 'recherche\.aol\.fr', 'ctrouve\.', 'francite\.', '\.lbb\.org', 'rechercher\.libertysurf\.fr', 'search[\w\-]+\.free\.fr', 'recherche\.club-internet\.fr', 'toile\.com', 'biglotron\.com', 'mozbot\.fr', 'sucheaol\.aol\.de', 'o2suche\.aol\.de', 'fireball\.de', 'infoseek\.de', 'suche\d?\.web\.de', '[a-z]serv\.rrzn\.uni-hannover\.de', 'suchen\.abacho\.de', '(brisbane|suche)\.t-online\.de', 'allesklar\.de', 'meinestadt\.de', '212\.227\.33\.241', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)', 'wwweasel\.de', 'netluchs\.de', 'schoenerbrausen\.de', 'suche\.gmx\.net', 'ecosia\.org', 'de\.aolsearch\.com', 'suche\.aol\.de', 'www\.startxxl\.com', 'www\.benefind\.de', 'heureka\.hu', 'vizsla\.origo\.hu', 'lapkereso\.hu', 'goliat\.hu', 'index\.hu', 'wahoo\.hu', 'webmania\.hu', 'search\.internetto\.hu', 'tango\.hu', 'keresolap\.hu', 'polymeta\.hu', 'sify\.com', 'virgilio\.it', 'arianna\.libero\.it', 'supereva\.com', 'kataweb\.it', 'search\.alice\.it\.master', 'search\.alice\.it', 'gotuneed\.com', 'godado', 'jumpy\.it', 'shinyseek\.it', 'teecno\.it', 'search\.genieo\.com', 'ask\.jp', 'sagool\.jp', 'sok\.start\.no', 'eniro\.no', 'szukaj\.wp\.pl', 'szukaj\.onet\.pl', 'dodaj\.pl', 'gazeta\.pl', 'gery\.pl', 'hoga\.pl', 'netsprint\.pl', 'interia\.pl', 'katalog\.onet\.pl', 'o2\.pl', 'polska\.pl', 'szukacz\.pl', 'wow\.pl', 'ya(ndex)?\.ru', 'aport\.ru', 'rambler\.ru', 'turtle\.ru', 'metabot\.ru', 'evreka\.passagen\.se', 'eniro\.se', 'zoznam\.sk', 'sapo\.pt', 'search\.ch', 'search\.bluewin\.ch', 'pogodak\.', 'jwss\.cc', 'lemoteur\.orange\.fr', 'windowssearch\.com', 'qwant\.com', 'wow\.com', 'searches\.omiga-plus\.com', 'buenosearch\.com', 'searches\.vi-view\.com'] +search_engines_2 = ['4\-counter\.com', 'att\.net', 'bungeebonesdotcom', 'northernlight\.', 'hotbot\.', 'kvasir\.', 'webcrawler\.', 'metacrawler\.', 'go2net\.com', '(^|\.)go\.com', 'euroseek\.', 'looksmart\.', 'spray\.', 'nbci\.com\/search', 'de\.ask.\com', 'es\.ask.\com', 'fr\.ask.\com', 'it\.ask.\com', 'nl\.ask.\com', 'uk\.ask.\com', '(^|\.)ask\.com', 'atomz\.', 'overture\.com', 'teoma\.', 'findarticles\.com', 'infospace\.com', 'mamma\.', 'dejanews\.', 'dogpile\.com', 'wisenut\.com', 'ixquick\.com', 'search\.earthlink\.net', 'i-une\.com', 'blingo\.com', 'centraldatabase\.org', 'clusty\.com', 'mysearch\.', 'vivisimo\.com', 'kartoo\.com', 'icerocket\.com', 'sphere\.com', 'ledix\.net', 'start\.shaw\.ca', 'searchalot\.com', 'copernic\.com', 'avantfind\.com', 'steadysearch\.com', 'steady-search\.com', 'claro-search\.com', 'www1\.search-results\.com', 'www\.holasearch\.com', 'search\.conduit\.com', 'static\.flipora\.com', '(?:www[12]?|mixidj)\.delta-search\.com', 'start\.iminent\.com', 'www\.searchmobileonline\.com', 'int\.search-results\.com', 'chello\.at', 'chello\.be', 'chello\.cz', 'chello\.fr', 'chello\.hu', 'chello\.nl', 'chello\.no', 'chello\.pl', 'chello\.se', 'chello\.sk', 'chello', 'mirago\.be', 'mirago\.ch', 'mirago\.de', 'mirago\.dk', 'es\.mirago\.com', 'mirago\.fr', 'mirago\.it', 'mirago\.nl', 'no\.mirago\.com', 'mirago\.se', 'mirago\.co\.uk', 'mirago', 'answerbus\.com', 'icq\.com\/search', 'nusearch\.com', 'goodsearch\.com', 'scroogle\.org', 'questionanswering\.com', 'mywebsearch\.com', 'as\.starware\.com', 'del\.icio\.us', 'digg\.com', 'stumbleupon\.com', 'swik\.net', 'segnalo\.alice\.it', 'ineffabile\.it', 'anzwers\.com\.au', 'engine\.exe', 'miner\.bol\.com\.br', '\.baidu\.com', '\.vnet\.cn', '\.soso\.com', '\.sogou\.com', '\.3721\.com', 'iask\.com', '\.accoona\.com', '\.163\.com', '\.zhongsou\.com', 'atlas\.cz', 'seznam\.cz', 'quick\.cz', 'centrum\.cz', 'jyxo\.(cz|com)', 'najdi\.to', 'redbox\.cz', 'isearch\.avg\.com', 'opasia\.dk', 'danielsen\.com', 'sol\.dk', 'jubii\.dk', 'find\.dk', 'edderkoppen\.dk', 'netstjernen\.dk', 'orbis\.dk', 'tyfon\.dk', '1klik\.dk', 'ofir\.dk', 'ilse\.', 'vindex\.', '(^|\.)ask\.co\.uk', 'bbc\.co\.uk/cgi-bin/search', 'ifind\.freeserve', 'looksmart\.co\.uk', 'splut\.', 'spotjockey\.', 'ukdirectory\.', 'ukindex\.co\.uk', 'ukplus\.', 'searchy\.co\.uk', 'search\.fbdownloader\.com', 'search\.babylon\.com', 'haku\.www\.fi', 'recherche\.aol\.fr', 'ctrouve\.', 'francite\.', '\.lbb\.org', 'rechercher\.libertysurf\.fr', 'search[\w\-]+\.free\.fr', 'recherche\.club-internet\.fr', 'toile\.com', 'biglotron\.com', 'mozbot\.fr', 'sucheaol\.aol\.de', 'o2suche\.aol\.de', 'fireball\.de', 'infoseek\.de', 'suche\d?\.web\.de', '[a-z]serv\.rrzn\.uni-hannover\.de', 'suchen\.abacho\.de', '(brisbane|suche)\.t-online\.de', 'allesklar\.de', 'meinestadt\.de', '212\.227\.33\.241', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)', 'wwweasel\.de', 'netluchs\.de', 'schoenerbrausen\.de', 'suche\.gmx\.net', 'ecosia\.org', 'de\.aolsearch\.com', 'suche\.aol\.de', 'www\.startxxl\.com', 'www\.benefind\.de', 'heureka\.hu', 'vizsla\.origo\.hu', 'lapkereso\.hu', 'goliat\.hu', 'index\.hu', 'wahoo\.hu', 'webmania\.hu', 'search\.internetto\.hu', 'tango\.hu', 'keresolap\.hu', 'polymeta\.hu', 'sify\.com', 'virgilio\.it', 'arianna\.libero\.it', 'supereva\.com', 'kataweb\.it', 'search\.alice\.it\.master', 'search\.alice\.it', 'gotuneed\.com', 'godado', 'jumpy\.it', 'shinyseek\.it', 'teecno\.it', 'search\.genieo\.com', 'ask\.jp', 'sagool\.jp', 'sok\.start\.no', 'eniro\.no', 'szukaj\.wp\.pl', 'szukaj\.onet\.pl', 'dodaj\.pl', 'gazeta\.pl', 'gery\.pl', 'hoga\.pl', 'netsprint\.pl', 'interia\.pl', 'katalog\.onet\.pl', 'o2\.pl', 'polska\.pl', 'szukacz\.pl', 'wow\.pl', 'ya(ndex)?\.ru', 'aport\.ru', 'rambler\.ru', 'turtle\.ru', 'metabot\.ru', 'evreka\.passagen\.se', 'eniro\.se', 'zoznam\.sk', 'sapo\.pt', 'search\.ch', 'search\.bluewin\.ch', 'pogodak\.', 'jwss\.cc', 'lemoteur\.orange\.fr', 'windowssearch\.com', 'qwant\.com', 'wow\.com', 'duckduckgo\.com', 'searches\.omiga-plus\.com', 'buenosearch\.com', 'searches\.vi-view\.com'] -not_search_engines_keys = {'tiscali\.' : 'mail\.tiscali\.', 'altavista\.' : 'babelfish\.altavista\.', 'yahoo\.' : '(?:picks|mail)\.yahoo\.|yahoo\.[^/]+/picks', 'google\.' : 'translate\.google\.', 'msn\.' : 'hotmail\.msn\.', 'yandex\.' : 'direct\.yandex\.'} +not_search_engines_keys = {'yahoo\.' : '(?:picks|mail)\.yahoo\.|yahoo\.[^/]+/picks', 'msn\.' : 'hotmail\.msn\.', 'google\.' : 'translate\.google\.', 'tiscali\.' : 'mail\.tiscali\.', 'yandex\.' : 'direct\.yandex\.', 'altavista\.' : 'babelfish\.altavista\.'} -search_engines_hashid = {'recherche\.aol\.fr' : 'aolfr', 'google\.' : 'google', 'engine\.exe' : 'engine', 'netsprint\.pl\/hoga\-search' : 'hogapl', 'search\.fbdownloader\.com' : 'fbdownloader', 'chello\.pl' : 'chellopl', 'suche\.gmx\.net' : 'gmxsuche', '\.baidu\.com' : 'baidu', 'ya(ndex)?\.ru' : 'yandex', 'i-une\.com' : 'iune', 'edderkoppen\.dk' : 'edderkoppen', 'mirago\.dk' : 'miragodk', 'biglotron\.com' : 'biglotron', 'infoseek\.de' : 'infoseek', 'findarticles\.com' : 'findarticles', 'chello\.se' : 'chellose', 'suche\d?\.web\.de' : 'webde', 'goliat\.hu' : 'goliat', 'meinestadt\.de' : 'meinestadt', '\.accoona\.com' : 'accoona', 'nl\.ask.\com' : 'asknl', 'infospace\.com' : 'infospace', 'mysearch\.' : 'mysearch', 'francite\.' : 'francite', 'searchy\.co\.uk' : 'searchy', '(66\.218\.71\.225|216\.109\.117\.135|216\.109\.125\.130|66\.218\.69\.11)' : 'yahoo', 'iask\.com' : 'iask', 'googlee\.' : 'google', 'index\.hu' : 'indexhu', 'clusty\.com' : 'clusty', 'www\.startxxl\.com' : 'startxxl', 'search\.earthlink\.net' : 'earthlink', 'danielsen\.com' : 'danielsen', 'digg\.com' : 'digg', 'uk\.ask.\com' : 'askuk', 'mirago' : 'mirago', 'dodaj\.pl' : 'dodajpl', 'altavista\.' : 'altavista', 'chello\.no' : 'chellono', 'es\.mirago\.com' : 'miragoes', 'teoma\.' : 'teoma', 'isearch\.avg\.com' : 'avgsearch', 'search\..*\.\w+' : 'search', 'schoenerbrausen\.de' : 'schoenerbrausen', 'ineffabile\.it' : 'ineffabile', 'mozbot\.fr' : 'mozbot', 'atlas\.cz' : 'atlas', '1klik\.dk' : '1klik', 'de\.ask.\com' : 'askde', 'o2\.pl' : 'o2pl', '\.sogou\.com' : 'sogou', 'netluchs\.de' : 'netluchs', 'mindset\.research\.yahoo' : 'yahoo_mindset', 'search\.internetto\.hu' : 'internetto', 'search\.bluewin\.ch' : 'bluewin', 'images\.google\.' : 'google_image', 'mirago\.fr' : 'miragofr', 'nusearch\.com' : 'nusearch', 'stumbleupon\.com' : 'stumbleupon', 'o2suche\.aol\.de' : 'o2aolde', 'www\.benefind\.de' : 'benefind', 'search\.babylon\.com' : 'babylon', '(^|\.)ask\.com' : 'ask', 'teecno\.it' : 'teecnoit', 'yahoo\.' : 'yahoo', '\.3721\.com' : '3721', 'steady-search\.com' : 'steadysearch', 'sucheaol\.aol\.de' : 'aolde', '(brisbane|suche)\.t-online\.de' : 't-online', '216\.239\.5[0-9]\.104' : 'google_cache', 'chello\.hu' : 'chellohu', 'jubii\.dk' : 'jubii', 'www\.searchmobileonline\.com' : 'searchmobileonline', 'gotuneed\.com' : 'gotuneed', 'virgilio\.it' : 'virgilio', 'wwweasel\.de' : 'wwweasel', 'ledix\.net' : 'ledix', 'rambler\.ru' : 'rambler', 'arianna\.libero\.it' : 'arianna', 'ecosia\.org' : 'ecosiasearch', 'no\.mirago\.com' : 'miragono', 'as\.starware\.com' : 'comettoolbar', 'centrum\.cz' : 'centrum', 'mirago\.ch' : 'miragoch', 'supereva\.com' : 'supereva', 'groups\.google\.' : 'google_groups', 'spotjockey\.' : 'spotjockey', 'goggle\.co\.hu' : 'google', 'recherche\.club-internet\.fr' : 'clubinternet', 'toile\.com' : 'toile', 'centraldatabase\.org' : 'centraldatabase', 'ctrouve\.' : 'ctrouve', '(?:www[12]?|mixidj)\.delta-search\.com' : 'delta-search', 'search\.terra\.' : 'terra', 'blingo\.com' : 'blingo', 'rechercher\.libertysurf\.fr' : 'libertysurf', 'gery\.pl' : 'gerypl', 'avantfind\.com' : 'avantfind', 'godado' : 'godado', 'anzwers\.com\.au' : 'anzwers', 'scroogle\.org' : 'scroogle', 'eniro\.se' : 'enirose', 'chello\.cz' : 'chellocz', 'mamma\.' : 'mamma', 'sify\.com' : 'sify', '(^|\.)ask\.co\.uk' : 'askuk', 'netstjernen\.dk' : 'netstjernen', 'search\.ch' : 'searchch', 'answerbus\.com' : 'answerbus', 'alltheweb\.com' : 'alltheweb', 'netscape\.' : 'netscape', 'ask\.jp' : 'askjp', 'search\.alice\.it\.master' : 'aliceitmaster', 'chello\.fr' : 'chellofr', 'voila\.' : 'voila', 'del\.icio\.us' : 'delicious', 'mirago\.be' : 'miragobe', '\.zhongsou\.com' : 'zhongsou', 'chello' : 'chellocom', 'haku\.www\.fi' : 'haku', 'seznam\.cz' : 'seznam', 'webcrawler\.' : 'webcrawler', 'hotbot\.' : 'hotbot', 'looksmart\.co\.uk' : 'looksmartuk', 'bing\.' : 'bing', 'orbis\.dk' : 'orbis', 'froogle\.google\.' : 'google_froogle', 'int\.search-results\.com' : 'nortonsavesearch', 'keresolap\.hu' : 'keresolap_hu', '216\.239\.(35|37|39|51)\.100' : 'google_cache', 'jyxo\.(cz|com)' : 'jyxo', 'suche\.aol\.de' : 'aolsuche', 'zoznam\.sk' : 'zoznam', 'mirago\.de' : 'miragode', '\.lbb\.org' : 'lbb', 'search\.genieo\.com' : 'genieo', 'shinyseek\.it' : 'shinyseek\.it', 'www\.holasearch\.com' : 'holasearch', 'excite\.' : 'excite', '216\.239\.(35|37|39|51)\.101' : 'google_cache', 'swik\.net' : 'swik', '66\.249\.93\.104' : 'google_cache', 'miner\.bol\.com\.br' : 'miner', '\.163\.com' : 'netease', '\.vnet\.cn' : 'vnet', 'pogodak\.' : 'pogodak', 'go2net\.com' : 'go2net', 'dogpile\.com' : 'dogpile', 'live\.com' : 'live', 'claro-search\.com' : 'clarosearch', 'nbci\.com\/search' : 'nbci', 'search\.alice\.it' : 'aliceit', 'evreka\.passagen\.se' : 'passagen', 'tiscali\.' : 'tiscali', 'copernic\.com' : 'copernic', 'overture\.com' : 'overture', 'search\.sli\.sympatico\.ca' : 'sympatico', 'fr\.ask.\com' : 'askfr', 'alexa\.com' : 'alexa', 'find\.dk' : 'finddk', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)' : 'metacrawler_de', 'msn\.' : 'msn', 'search\.conduit\.com' : 'conduit', 'sapo\.pt' : 'sapo', 'ukplus\.' : 'ukplus', 'looksmart\.' : 'looksmart', 'sol\.dk' : 'sol', 'kataweb\.it' : 'kataweb', 'interia\.pl' : 'interiapl', 'polymeta\.hu' : 'polymeta_hu', 'chello\.sk' : 'chellosk', 'search[\w\-]+\.free\.fr' : 'free', 'metabot\.ru' : 'metabot', 'netsprint\.pl' : 'netsprintpl', 'lapkereso\.hu' : 'lapkereso', 'wisenut\.com' : 'wisenut', 'tango\.hu' : 'tango_hu', 'mywebsearch\.com' : 'mywebsearch', 'eniro\.no' : 'eniro', 'szukaj\.onet\.pl' : 'onetpl', '\.soso\.com' : 'soso', 'segnalo\.alice\.it' : 'segnalo', 'splut\.' : 'splut', 'fireball\.de' : 'fireball', 'vindex\.' : 'vindex', 'dmoz\.org' : 'dmoz', 'search\.aol\.co' : 'aol', 'goodsearch\.com' : 'goodsearch', '[a-z]serv\.rrzn\.uni-hannover\.de' : 'meta', 'bungeebonesdotcom' : 'bungeebonesdotcom', 'ofir\.dk' : 'ofir', 'ifind\.freeserve' : 'freeserve', 'de\.aolsearch\.com' : 'aolsearch', 'mirago\.se' : 'miragose', 'att\.net' : 'att', 'www\.search\.com' : 'search.com', 'chello\.be' : 'chellobe', 'ixquick\.com' : 'ixquick', 'szukaj\.wp\.pl' : 'wp', 'katalog\.onet\.pl' : 'katalogonetpl', 'vivisimo\.com' : 'vivisimo', 'northernlight\.' : 'northernlight', 'turtle\.ru' : 'turtle', 'wow\.pl' : 'wowpl', '(^|\.)go\.com' : 'go', 'szukacz\.pl' : 'szukaczpl', 'metacrawler\.' : 'metacrawler', 'googlecom\.com' : 'google', 'dejanews\.' : 'dejanews', 'mirago\.it' : 'miragoit', '64\.233\.1[0-9]{2}\.104' : 'google_cache', 'wahoo\.hu' : 'wahoo', 'mirago\.nl' : 'miragonl', 'a9\.com' : 'a9', 'suchen\.abacho\.de' : 'abacho', 'bbc\.co\.uk/cgi-bin/search' : 'bbc', 'questionanswering\.com' : 'questionanswering', 'najdi\.to' : 'najdi', 'jumpy\.it' : 'jumpy\.it', 'aport\.ru' : 'aport', 'vizsla\.origo\.hu' : 'origo', 'spray\.' : 'spray', 'sphere\.com' : 'sphere', 'steadysearch\.com' : 'steadysearch', '66\.102\.[1-9]\.104' : 'google_cache', 'chello\.nl' : 'chellonl', 'atomz\.' : 'atomz', 'google\.[\w.]+/products' : 'google_products', 'redbox\.cz' : 'redbox', 'lycos\.' : 'lycos', 'chello\.at' : 'chelloat', 'quick\.cz' : 'quick', 'kartoo\.com' : 'kartoo', 'icerocket\.com' : 'icerocket', 'mirago\.co\.uk' : 'miragocouk', 'gazeta\.pl' : 'gazetapl', 'start\.shaw\.ca' : 'shawca', 'allesklar\.de' : 'allesklar', 'polska\.pl' : 'polskapl', 'start\.iminent\.com' : 'iminent', 'tyfon\.dk' : 'tyfon', 'heureka\.hu' : 'heureka', 'webmania\.hu' : 'webmania', 'es\.ask.\com' : 'askes', 'opasia\.dk' : 'opasia', 'euroseek\.' : 'euroseek', 'ilse\.' : 'ilse', 'it\.ask.\com' : 'askit', 'base\.google\.' : 'google_base', '4\-counter\.com' : 'google4counter', '212\.227\.33\.241' : 'metaspinner', 'sok\.start\.no' : 'start', 'ukindex\.co\.uk' : 'ukindex', 'static\.flipora\.com' : 'flipora', 'ukdirectory\.' : 'ukdirectory', 'searchalot\.com' : 'searchalot', 'sagool\.jp' : 'sagool', 'www1\.search-results\.com' : 'searchresults', 'kvasir\.' : 'kvasir', 'icq\.com\/search' : 'icq', '72\.14\.2[0-9]{2}\.104' : 'google_cache', 'www.sfr\.fr\/recherche\/google' : 'google', 'searches\.omiga-plus\.com' : 'Omiga-plus', 'lemoteur\.orange\.fr' : 'Orange', 'searches\.vi-view\.com' : 'vi-view', 'qwant\.com' : 'Qwant', 'buenosearch\.com' : 'Bueno Search', 'wow\.com' : 'WOW', 'windowssearch\.com' : 'Windows Search', 'jwss\.cc' : 'jws'} +search_engines_hashid = {'mirago\.be' : 'miragobe', 'search\.aol\.co' : 'aol', 'zoznam\.sk' : 'zoznam', 'engine\.exe' : 'engine', 'mywebsearch\.com' : 'mywebsearch', 'goliat\.hu' : 'goliat', 'danielsen\.com' : 'danielsen', 'recherche\.aol\.fr' : 'aolfr', 'schoenerbrausen\.de' : 'schoenerbrausen', 'bing\.' : 'bing', 'i-une\.com' : 'iune', 'bbc\.co\.uk/cgi-bin/search' : 'bbc', 'vindex\.' : 'vindex', '(^|\.)ask\.co\.uk' : 'askuk', 'mindset\.research\.yahoo' : 'yahoo_mindset', 'sify\.com' : 'sify', '(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)' : 'metacrawler_de', 'o2suche\.aol\.de' : 'o2aolde', 'najdi\.to' : 'najdi', 'szukacz\.pl' : 'szukaczpl', 'ilse\.' : 'ilse', 'questionanswering\.com' : 'questionanswering', 'toile\.com' : 'toile', 'jyxo\.(cz|com)' : 'jyxo', 'mirago\.co\.uk' : 'miragocouk', 'edderkoppen\.dk' : 'edderkoppen', 'scroogle\.org' : 'scroogle', '(?:www[12]?|mixidj)\.delta-search\.com' : 'delta-search', '\.accoona\.com' : 'accoona', 'mirago\.dk' : 'miragodk', 'mirago\.it' : 'miragoit', 'eniro\.se' : 'enirose', 'images\.google\.' : 'google_image', 'nbci\.com\/search' : 'nbci', 'searchy\.co\.uk' : 'searchy', 'chello\.se' : 'chellose', 'fr\.ask.\com' : 'askfr', 'de\.aolsearch\.com' : 'aolsearch', 'froogle\.google\.' : 'google_froogle', 'metacrawler\.' : 'metacrawler', 'live\.com' : 'live', 'suchen\.abacho\.de' : 'abacho', 'ineffabile\.it' : 'ineffabile', 'www\.benefind\.de' : 'benefind', 'vizsla\.origo\.hu' : 'origo', 'as\.starware\.com' : 'comettoolbar', 'steady-search\.com' : 'steadysearch', 'orbis\.dk' : 'orbis', '\.3721\.com' : '3721', 'bungeebonesdotcom' : 'bungeebonesdotcom', 'heureka\.hu' : 'heureka', 'dmoz\.org' : 'dmoz', 'webmania\.hu' : 'webmania', 'francite\.' : 'francite', 'www\.holasearch\.com' : 'holasearch', 'looksmart\.' : 'looksmart', 'lycos\.' : 'lycos', 'arianna\.libero\.it' : 'arianna', 'spotjockey\.' : 'spotjockey', 'www\.searchmobileonline\.com' : 'searchmobileonline', 'uk\.ask.\com' : 'askuk', 'miner\.bol\.com\.br' : 'miner', 'segnalo\.alice\.it' : 'segnalo', 'biglotron\.com' : 'biglotron', 'chello\.at' : 'chelloat', '(^|\.)ask\.com' : 'ask', 'goodsearch\.com' : 'goodsearch', 'ixquick\.com' : 'ixquick', 'overture\.com' : 'overture', 'interia\.pl' : 'interiapl', 'centraldatabase\.org' : 'centraldatabase', 'chello\.cz' : 'chellocz', 'vivisimo\.com' : 'vivisimo', 'lapkereso\.hu' : 'lapkereso', 'google\.[\w.]+/products' : 'google_products', 'groups\.google\.' : 'google_groups', 'search\.fbdownloader\.com' : 'fbdownloader', 'mirago\.nl' : 'miragonl', 'msn\.' : 'msn', 'nusearch\.com' : 'nusearch', '66\.102\.[1-9]\.104' : 'google_cache', 'sucheaol\.aol\.de' : 'aolde', 'google\.' : 'google', 'chello\.sk' : 'chellosk', 'rambler\.ru' : 'rambler', 'start\.iminent\.com' : 'iminent', 'polymeta\.hu' : 'polymeta_hu', 'wwweasel\.de' : 'wwweasel', 'googlecom\.com' : 'google', 'static\.flipora\.com' : 'flipora', 'alexa\.com' : 'alexa', 'metabot\.ru' : 'metabot', 'ask\.jp' : 'askjp', 'ecosia\.org' : 'ecosiasearch', 'search\.internetto\.hu' : 'internetto', '\.163\.com' : 'netease', '(66\.218\.71\.225|216\.109\.117\.135|216\.109\.125\.130|66\.218\.69\.11)' : 'yahoo', 'szukaj\.wp\.pl' : 'wp', 'meinestadt\.de' : 'meinestadt', 'answerbus\.com' : 'answerbus', 'es\.ask.\com' : 'askes', 'find\.dk' : 'finddk', 'findarticles\.com' : 'findarticles', 'netluchs\.de' : 'netluchs', 'index\.hu' : 'indexhu', 'chello\.fr' : 'chellofr', 'tiscali\.' : 'tiscali', 'it\.ask.\com' : 'askit', 'stumbleupon\.com' : 'stumbleupon', 'de\.ask.\com' : 'askde', 'euroseek\.' : 'euroseek', 'sapo\.pt' : 'sapo', '72\.14\.2[0-9]{2}\.104' : 'google_cache', 'steadysearch\.com' : 'steadysearch', 'ofir\.dk' : 'ofir', 'blingo\.com' : 'blingo', 'mozbot\.fr' : 'mozbot', 'search\.terra\.' : 'terra', 'icq\.com\/search' : 'icq', '64\.233\.1[0-9]{2}\.104' : 'google_cache', 'aport\.ru' : 'aport', 'quick\.cz' : 'quick', 'godado' : 'godado', 'northernlight\.' : 'northernlight', 'suche\.aol\.de' : 'aolsuche', 'netsprint\.pl' : 'netsprintpl', 'dogpile\.com' : 'dogpile', 'ukplus\.' : 'ukplus', '216\.239\.(35|37|39|51)\.101' : 'google_cache', 'wahoo\.hu' : 'wahoo', 'voila\.' : 'voila', 'katalog\.onet\.pl' : 'katalogonetpl', '4\-counter\.com' : 'google4counter', 'shinyseek\.it' : 'shinyseek\.it', 'base\.google\.' : 'google_base', '\.baidu\.com' : 'baidu', 'pogodak\.' : 'pogodak', 'search\.babylon\.com' : 'babylon', 'teecno\.it' : 'teecnoit', 'evreka\.passagen\.se' : 'passagen', 'atlas\.cz' : 'atlas', 'icerocket\.com' : 'icerocket', 'opasia\.dk' : 'opasia', 'chello\.hu' : 'chellohu', 'suche\.gmx\.net' : 'gmxsuche', 'webcrawler\.' : 'webcrawler', 'keresolap\.hu' : 'keresolap_hu', 'go2net\.com' : 'go2net', '(^|\.)go\.com' : 'go', 'claro-search\.com' : 'clarosearch', 'search\.alice\.it' : 'aliceit', 'seznam\.cz' : 'seznam', 'yahoo\.' : 'yahoo', 'clusty\.com' : 'clusty', 'tyfon\.dk' : 'tyfon', 'start\.shaw\.ca' : 'shawca', 'dejanews\.' : 'dejanews', 'szukaj\.onet\.pl' : 'onetpl', 'sphere\.com' : 'sphere', '(brisbane|suche)\.t-online\.de' : 't-online', 'att\.net' : 'att', 'chello\.nl' : 'chellonl', 'tango\.hu' : 'tango_hu', 'ya(ndex)?\.ru' : 'yandex', 'turtle\.ru' : 'turtle', 'altavista\.' : 'altavista', 'int\.search-results\.com' : 'nortonsavesearch', 'search\.alice\.it\.master' : 'aliceitmaster', 'netstjernen\.dk' : 'netstjernen', 'iask\.com' : 'iask', 'polska\.pl' : 'polskapl', 'infospace\.com' : 'infospace', 'netscape\.' : 'netscape', '66\.249\.93\.104' : 'google_cache', 'www\.startxxl\.com' : 'startxxl', '\.lbb\.org' : 'lbb', 'chello\.be' : 'chellobe', 'jubii\.dk' : 'jubii', 'ukindex\.co\.uk' : 'ukindex', 'netsprint\.pl\/hoga\-search' : 'hogapl', 'no\.mirago\.com' : 'miragono', '\.zhongsou\.com' : 'zhongsou', 'anzwers\.com\.au' : 'anzwers', 'avantfind\.com' : 'avantfind', 'ctrouve\.' : 'ctrouve', 'digg\.com' : 'digg', 'goggle\.co\.hu' : 'google', 'copernic\.com' : 'copernic', 'mirago\.ch' : 'miragoch', 'ledix\.net' : 'ledix', 'mysearch\.' : 'mysearch', 'wow\.pl' : 'wowpl', 'mirago' : 'mirago', 'mirago\.fr' : 'miragofr', 'swik\.net' : 'swik', 'searchalot\.com' : 'searchalot', '212\.227\.33\.241' : 'metaspinner', 'looksmart\.co\.uk' : 'looksmartuk', '[a-z]serv\.rrzn\.uni-hannover\.de' : 'meta', 'alltheweb\.com' : 'alltheweb', 'mirago\.se' : 'miragose', 'del\.icio\.us' : 'delicious', 'search[\w\-]+\.free\.fr' : 'free', '\.sogou\.com' : 'sogou', 'a9\.com' : 'a9', 'wisenut\.com' : 'wisenut', 'chello\.pl' : 'chellopl', '1klik\.dk' : '1klik', 'rechercher\.libertysurf\.fr' : 'libertysurf', 'nl\.ask.\com' : 'asknl', 'search\.ch' : 'searchch', '216\.239\.5[0-9]\.104' : 'google_cache', 'dodaj\.pl' : 'dodajpl', 'search\..*\.\w+' : 'search', 'search\.earthlink\.net' : 'earthlink', '216\.239\.(35|37|39|51)\.100' : 'google_cache', 'gotuneed\.com' : 'gotuneed', 'supereva\.com' : 'supereva', 'recherche\.club-internet\.fr' : 'clubinternet', 'allesklar\.de' : 'allesklar', 'chello' : 'chellocom', 'es\.mirago\.com' : 'miragoes', 'redbox\.cz' : 'redbox', 'jumpy\.it' : 'jumpy\.it', '\.soso\.com' : 'soso', 'gery\.pl' : 'gerypl', 'ukdirectory\.' : 'ukdirectory', 'chello\.no' : 'chellono', 'mamma\.' : 'mamma', 'kartoo\.com' : 'kartoo', '\.vnet\.cn' : 'vnet', 'search\.bluewin\.ch' : 'bluewin', 'teoma\.' : 'teoma', 'kvasir\.' : 'kvasir', 'hotbot\.' : 'hotbot', 'gazeta\.pl' : 'gazetapl', 'googlee\.' : 'google', 'ifind\.freeserve' : 'freeserve', 'sol\.dk' : 'sol', 'suche\d?\.web\.de' : 'webde', 'eniro\.no' : 'eniro', 'virgilio\.it' : 'virgilio', 'fireball\.de' : 'fireball', 'sok\.start\.no' : 'start', 'www1\.search-results\.com' : 'searchresults', 'o2\.pl' : 'o2pl', 'atomz\.' : 'atomz', 'search\.genieo\.com' : 'genieo', 'spray\.' : 'spray', 'kataweb\.it' : 'kataweb', 'sagool\.jp' : 'sagool', 'search\.sli\.sympatico\.ca' : 'sympatico', 'centrum\.cz' : 'centrum', 'www\.search\.com' : 'search.com', 'excite\.' : 'excite', 'search\.conduit\.com' : 'conduit', 'mirago\.de' : 'miragode', 'isearch\.avg\.com' : 'avgsearch', 'splut\.' : 'splut', 'infoseek\.de' : 'infoseek', 'haku\.www\.fi' : 'haku', 'lemoteur\.orange\.fr' : 'Orange', 'qwant\.com' : 'Qwant', 'wow\.com' : 'WOW', 'jwss\.cc' : 'jws', 'www.sfr\.fr\/recherche\/google' : 'google', 'searches\.omiga-plus\.com' : 'Omiga-plus', 'duckduckgo\.com' : 'DuckDuckGo', 'windowssearch\.com' : 'Windows Search', 'searches\.vi-view\.com' : 'vi-view', 'buenosearch\.com' : 'Bueno Search'} -search_engines_knwown_url = {'clusty' : 'query=', 'mywebsearch' : 'searchfor=', 'o2pl' : 'qt=', 'jubii' : 'soegeord=', 'finddk' : 'words=', 'chellono' : 'q1=', 'search.com' : 'q=', 'askuk' : '(ask|q)=', 'iminent' : 'q=', 'earthlink' : 'q=', 'passagen' : 'q=', 'miragobe' : '(txtsearch|qry)=', 'miragoit' : '(txtsearch|qry)=', 'danielsen' : 'q=', 'askde' : '(ask|q)=', 'looksmartuk' : 'key=', 'orbis' : 'search_field=', 'chellocz' : 'q1=', 'nusearch' : 'nusearch_terms=', 'searchmobileonline' : 'q=', 'avantfind' : 'keywords=', 'kartoo' : '', 'asknl' : '(ask|q)=', 'chellose' : 'q1=', 'teoma' : 'q=', 'bungeebonesdotcom' : 'query=', 'metacrawler_de' : 'qry=', '1klik' : 'query=', 'bing' : 'q=', 'mysearch' : 'searchfor=', 'aolsearch' : 'q=', 'yahoo_mindset' : 'p=', 'go' : 'qt=', 'wisenut' : 'query=', 'chellohu' : 'q1=', 'iune' : '(keywords|q)=', 'francite' : 'name=', 'gmxsuche' : 'q=', 'benefind' : 'q=', 'o2aolde' : 'q=', 'jyxo' : '(s|q)=', 'chellopl' : 'q1=', 'schoenerbrausen' : 'q=', 'findarticles' : 'key=', 'looksmart' : 'key=', 'conduit' : 'q=', 'google4counter' : '(p|q|as_p|as_q)=', 'google_image' : '(p|q|as_p|as_q)=', 'spray' : 'string=', 'baidu' : '(wd|word)=', 'mamma' : 'query=', 'chelloat' : 'q1=', 'ixquick' : 'query=', 'heureka' : 'heureka=', '3721' : '(p|name)=', 'questionanswering' : '', 'live' : 'q=', 'kataweb' : 'q=', 'aliceit' : 'qs=', 'google_products' : '(p|q|as_p|as_q)=', 'euroseek' : 'query=', 'sympatico' : 'query=', 'go2net' : 'general=', 'accoona' : 'qt=', 'netease' : 'q=', 'redbox' : 'srch=', 'sol' : 'q=', 'goodsearch' : 'Keywords=', 'miragoch' : '(txtsearch|qry)=', 'seznam' : '(w|q)=', 'chellonl' : 'q1=', 'start' : 'q=', 'zhongsou' : '(word|w)=', 'ecosiasearch' : 'q=', 'katalogonetpl' : 'qt=', 'nortonsavesearch' : 'q=', 'aolsuche' : 'q=', 'att' : 'qry=', 'delicious' : 'all=', 'origo' : '(q|search)=', 'jumpy\.it' : 'searchWord=', 'wwweasel' : 'q=', 'aliceitmaster' : 'qs=', 'sagool' : 'q=', 'flipora' : 'q=', 'gerypl' : 'q=', 'miragode' : '(txtsearch|qry)=', 'nbci' : 'keyword=', 'searchresults' : 'q=', 'centrum' : 'q=', 'engine' : 'p1=', 'tango_hu' : 'q=', 'netluchs' : 'query=', 'delta-search' : 'q=', 'icerocket' : 'q=', 'spotjockey' : 'Search_Keyword=', 'northernlight' : 'qr=', 'dodajpl' : 'keyword=', 'google_base' : '(p|q|as_p|as_q)=', 'google_cache' : '(p|q|as_p|as_q)=cache:[0-9A-Za-z]{12}:', 'blingo' : 'q=', 'google_froogle' : '(p|q|as_p|as_q)=', 'abacho' : 'q=', 'holasearch' : 'q=', 'fireball' : 'q=', 'google' : '(p|q|as_p|as_q)=', 'terra' : 'query=', 't-online' : 'q=', 'aol' : 'query=', 'lycos' : 'query=', 'edderkoppen' : 'query=', 'hogapl' : 'qt=', 'yandex' : 'text=', 'askjp' : '(ask|q)=', 'dmoz' : 'search=', 'chellocom' : 'q1=', 'goliat' : 'KERESES=', 'hotbot' : 'mt=', 'ukplus' : 'search=', 'anzwers' : 'search=', 'aport' : 'r=', 'avgsearch' : 'q=', 'centraldatabase' : 'query=', 'ilse' : 'search_for=', 'miragofr' : '(txtsearch|qry)=', 'metacrawler' : 'general=', 'infoseek' : 'qt=', 'aolde' : 'q=', 'interiapl' : 'q=', 'dogpile' : 'q(|kw)=', 'google_groups' : 'group\/', 'biglotron' : 'question=', 'startxxl' : 'q=', 'alexa' : 'q=', 'iask' : '(w|k)=', 'clarosearch' : 'q=', 'atlas' : '(searchtext|q)=', 'wahoo' : 'q=', 'toile' : 'q=', 'sphere' : 'q=', 'metabot' : 'st=', 'scroogle' : 'Gw=', 'mirago' : '(txtsearch|qry)=', 'alltheweb' : 'q(|uery)=', 'yahoo' : 'p=', 'pogodak' : 'q=', 'ukindex' : 'stext=', 'gazetapl' : 'slowo=', 'genieo' : 'q=', 'szukaczpl' : 'q=', 'steadysearch' : 'w=', 'gotuneed' : '', 'miner' : 'q=', 'virgilio' : 'qs=', 'miragodk' : '(txtsearch|qry)=', 'mozbot' : 'q=', 'wp' : 'szukaj=', 'swik' : 'swik\.net/', 'wowpl' : 'q=', 'najdi' : 'dotaz=', 'keresolap_hu' : 'q=', 'vivisimo' : 'query=', 'polymeta_hu' : '', 'kvasir' : 'q=', 'babylon' : 'q=', 'icq' : 'q=', 'comettoolbar' : 'qry=', 'vindex' : 'in=', 'atomz' : 'sp-q=', 'fbdownloader' : 'q=', 'ledix' : 'q=', 'ofir' : 'querytext=', 'chellobe' : 'q1=', 'answerbus' : '', 'miragoes' : '(txtsearch|qry)=', 'sogou' : 'query=', 'segnalo' : '', 'voila' : '(kw|rdata)=', 'msn' : 'q=', 'quick' : 'query=', 'webcrawler' : 'searchText=', 'searchch' : 'q=', 'internetto' : 'searchstr=', 'sify' : 'keyword=', 'arianna' : 'query=', 'splut' : 'pattern=', 'enirose' : 'q=', 'netscape' : 'search=', 'godado' : 'Keywords=', 'stumbleupon' : '', 'overture' : 'keywords=', 'netsprintpl' : 'q=', 'rambler' : 'words=', 'freeserve' : 'q=', 'chellofr' : 'q1=', 'askes' : '(ask|q)=', 'copernic' : 'web\/', 'polskapl' : 'qt=', 'bluewin' : 'qry=', 'ineffabile' : '', 'miragose' : '(txtsearch|qry)=', 'supereva' : 'q=', 'miragonl' : '(txtsearch|qry)=', 'metaspinner' : 'qry=', 'excite' : 'search=', 'miragocouk' : '(txtsearch|qry)=', 'ukdirectory' : 'k=', 'ask' : '(ask|q)=', 'opasia' : 'q=', 'bbc' : 'q=', 'a9' : 'a9\.com\/', 'eniro' : 'q=', 'askfr' : '(ask|q)=', 'askit' : '(ask|q)=', 'teecnoit' : 'q=', 'shawca' : 'q=', 'digg' : 's=', 'webde' : 'su=', 'searchalot' : 'q=', 'soso' : 'q=', 'shinyseek\.it' : 'KEY=', 'vnet' : 'kw=', 'clubinternet' : 'q=', 'miragono' : '(txtsearch|qry)=', 'chellosk' : 'q1=', 'tiscali' : 'key=', 'onetpl' : 'qt=', 'haku' : 'w=', 'altavista' : 'q=', 'infospace' : 'qkw=', 'searchy' : 'search_term=', 'vi-view' : 'q=', 'jws' : 'q=', 'WOW' : 'q=', 'Omiga-plus' : 'q=', 'Qwant' : 'q=', 'Windows Search' : 'q=', 'Bueno Search' : 'q=', 'Orange' : 'kw='} +search_engines_knwown_url = {'steadysearch' : 'w=', 'ledix' : 'q=', 'biglotron' : 'question=', 'centraldatabase' : 'query=', 'fbdownloader' : 'q=', 'seznam' : '(w|q)=', 'sphere' : 'q=', 'asknl' : '(ask|q)=', 'digg' : 's=', 'bbc' : 'q=', 'searchy' : 'search_term=', 'northernlight' : 'qr=', 'ukindex' : 'stext=', 'miragocouk' : '(txtsearch|qry)=', 'infoseek' : 'qt=', 'chellopl' : 'q1=', 'clusty' : 'query=', 'netease' : 'q=', 'flipora' : 'q=', 'metacrawler_de' : 'qry=', 'enirose' : 'q=', 'ask' : '(ask|q)=', 'mamma' : 'query=', 'ukdirectory' : 'k=', 'aliceit' : 'qs=', 'jyxo' : '(s|q)=', 'francite' : 'name=', 'conduit' : 'q=', 'blingo' : 'q=', 'chellosk' : 'q1=', 'miragono' : '(txtsearch|qry)=', 'avgsearch' : 'q=', 'miragose' : '(txtsearch|qry)=', 'bing' : 'q=', 'vindex' : 'in=', 'askes' : '(ask|q)=', 'nortonsavesearch' : 'q=', 'wowpl' : 'q=', 'wisenut' : 'query=', 'google_groups' : 'group\/', 'centrum' : 'q=', 'askde' : '(ask|q)=', 'internetto' : 'searchstr=', 'looksmart' : 'key=', 'wp' : 'szukaj=', 'live' : 'q=', 'aport' : 'r=', 'overture' : 'keywords=', 'gazetapl' : 'slowo=', 'freeserve' : 'q=', 'dmoz' : 'search=', 'holasearch' : 'q=', 'baidu' : '(wd|word)=', 'shawca' : 'q=', 'nbci' : 'keyword=', 'zhongsou' : '(word|w)=', 'avantfind' : 'keywords=', 'chellonl' : 'q1=', 'babylon' : 'q=', 'go' : 'qt=', 'tango_hu' : 'q=', 'metabot' : 'st=', 'euroseek' : 'query=', 'infospace' : 'qkw=', 'splut' : 'pattern=', 'goliat' : 'KERESES=', 'finddk' : 'words=', 'google_base' : '(p|q|as_p|as_q)=', 'szukaczpl' : 'q=', 'toile' : 'q=', 'tiscali' : 'key=', 'askit' : '(ask|q)=', 'askjp' : '(ask|q)=', 'comettoolbar' : 'qry=', 'danielsen' : 'q=', 'searchalot' : 'q=', 'soso' : 'q=', 'askuk' : '(ask|q)=', 'pogodak' : 'q=', 'kvasir' : 'q=', 'alltheweb' : 'q(|uery)=', 'teoma' : 'q=', 'bluewin' : 'qry=', 'sagool' : 'q=', 'najdi' : 'dotaz=', 'chellose' : 'q1=', 'vnet' : 'kw=', 'miragoch' : '(txtsearch|qry)=', 'start' : 'q=', 'findarticles' : 'key=', 'mozbot' : 'q=', 'chelloat' : 'q1=', 'heureka' : 'heureka=', 'chellohu' : 'q1=', 'goodsearch' : 'Keywords=', 'ecosiasearch' : 'q=', 'google_froogle' : '(p|q|as_p|as_q)=', 'a9' : 'a9\.com\/', 'bungeebonesdotcom' : 'query=', 'mysearch' : 'searchfor=', 'icq' : 'q=', 'dodajpl' : 'keyword=', 'excite' : 'search=', 'voila' : '(kw|rdata)=', 'miragode' : '(txtsearch|qry)=', 'engine' : 'p1=', 'iminent' : 'q=', 'arianna' : 'query=', 'gerypl' : 'q=', 'lycos' : 'query=', 't-online' : 'q=', 'netscape' : 'search=', 'yahoo' : 'p=', 'aolde' : 'q=', '1klik' : 'query=', 'miragoes' : '(txtsearch|qry)=', 'orbis' : 'search_field=', 'answerbus' : '', 'anzwers' : 'search=', 'miragobe' : '(txtsearch|qry)=', 'mirago' : '(txtsearch|qry)=', 'teecnoit' : 'q=', 'fireball' : 'q=', 'jumpy\.it' : 'searchWord=', 'google_products' : '(p|q|as_p|as_q)=', 'looksmartuk' : 'key=', 'sify' : 'keyword=', 'accoona' : 'qt=', 'redbox' : 'srch=', 'webde' : 'su=', 'askfr' : '(ask|q)=', 'earthlink' : 'q=', 'schoenerbrausen' : 'q=', 'atlas' : '(searchtext|q)=', 'kartoo' : '', 'o2pl' : 'qt=', 'clubinternet' : 'q=', 'webcrawler' : 'searchText=', 'atomz' : 'sp-q=', 'jubii' : 'soegeord=', 'interiapl' : 'q=', 'go2net' : 'general=', '3721' : '(p|name)=', 'segnalo' : '', 'abacho' : 'q=', 'wahoo' : 'q=', 'edderkoppen' : 'query=', 'gmxsuche' : 'q=', 'metacrawler' : 'general=', 'ixquick' : 'query=', 'hogapl' : 'qt=', 'polskapl' : 'qt=', 'mywebsearch' : 'searchfor=', 'yandex' : 'text=', 'searchch' : 'q=', 'genieo' : 'q=', 'att' : 'qry=', 'supereva' : 'q=', 'search.com' : 'q=', 'icerocket' : 'q=', 'google' : '(p|q|as_p|as_q)=', 'aolsuche' : 'q=', 'ineffabile' : '', 'swik' : 'swik\.net/', 'aliceitmaster' : 'qs=', 'eniro' : 'q=', 'spray' : 'string=', 'dogpile' : 'q(|kw)=', 'opasia' : 'q=', 'quick' : 'query=', 'miragoit' : '(txtsearch|qry)=', 'netluchs' : 'query=', 'onetpl' : 'qt=', 'wwweasel' : 'q=', 'sol' : 'q=', 'godado' : 'Keywords=', 'google_cache' : '(p|q|as_p|as_q)=cache:[0-9A-Za-z]{12}:', 'spotjockey' : 'Search_Keyword=', 'aolsearch' : 'q=', 'origo' : '(q|search)=', 'sympatico' : 'query=', 'netsprintpl' : 'q=', 'msn' : 'q=', 'startxxl' : 'q=', 'iask' : '(w|k)=', 'gotuneed' : '', 'miragodk' : '(txtsearch|qry)=', 'virgilio' : 'qs=', 'google4counter' : '(p|q|as_p|as_q)=', 'metaspinner' : 'qry=', 'yahoo_mindset' : 'p=', 'copernic' : 'web\/', 'miragonl' : '(txtsearch|qry)=', 'shinyseek\.it' : 'KEY=', 'google_image' : '(p|q|as_p|as_q)=', 'searchresults' : 'q=', 'rambler' : 'words=', 'searchmobileonline' : 'q=', 'aol' : 'query=', 'haku' : 'w=', 'vivisimo' : 'query=', 'nusearch' : 'nusearch_terms=', 'ukplus' : 'search=', 'katalogonetpl' : 'qt=', 'questionanswering' : '', 'terra' : 'query=', 'o2aolde' : 'q=', 'chellocom' : 'q1=', 'polymeta_hu' : '', 'stumbleupon' : '', 'chellofr' : 'q1=', 'hotbot' : 'mt=', 'keresolap_hu' : 'q=', 'miner' : 'q=', 'chellocz' : 'q1=', 'altavista' : 'q=', 'delta-search' : 'q=', 'chellobe' : 'q1=', 'alexa' : 'q=', 'ilse' : 'search_for=', 'iune' : '(keywords|q)=', 'benefind' : 'q=', 'chellono' : 'q1=', 'kataweb' : 'q=', 'ofir' : 'querytext=', 'passagen' : 'q=', 'scroogle' : 'Gw=', 'sogou' : 'query=', 'delicious' : 'all=', 'miragofr' : '(txtsearch|qry)=', 'clarosearch' : 'q=', 'DuckDuckGo' : 'q=', 'Windows Search' : 'q=', 'WOW' : 'q=', 'Orange' : 'kw=', 'Bueno Search' : 'q=', 'Omiga-plus' : 'q=', 'vi-view' : 'q=', 'Qwant' : 'q=', 'jws' : 'q='} operating_systems = ['windows[_+ ]?2005', 'windows[_+ ]nt[_+ ]6\.0', 'windows[_+ ]?2008', 'windows[_+ ]nt[_+ ]6\.1', 'windows[_+ ]?2012', 'windows[_+ ]nt[_+ ]6\.2', 'windows[_+ ]?vista', 'windows[_+ ]nt[_+ ]6', 'windows[_+ ]?2003', 'windows[_+ ]nt[_+ ]5\.2', 'windows[_+ ]xp', 'windows[_+ ]nt[_+ ]5\.1', 'windows[_+ ]me', 'win[_+ ]9x', 'windows[_+ ]?2000', 'windows[_+ ]nt[_+ ]5', 'winnt', 'windows[_+ \-]?nt', 'win32', 'win(.*)98', 'win(.*)95', 'win(.*)16', 'windows[_+ ]3', 'win(.*)ce', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]9', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]8', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]7', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]6', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]5', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]4', 'mac[_+ ]os[_+ ]x', 'mac[_+ ]?p', 'mac[_+ ]68', 'macweb', 'macintosh', 'linux(.*)android', 'linux(.*)asplinux', 'linux(.*)centos', 'linux(.*)debian', 'linux(.*)fedora', 'linux(.*)gentoo', 'linux(.*)mandr', 'linux(.*)momonga', 'linux(.*)pclinuxos', 'linux(.*)red[_+ ]hat', 'linux(.*)suse', 'linux(.*)ubuntu', 'linux(.*)vector', 'linux(.*)vine', 'linux(.*)white\sbox', 'linux(.*)zenwalk', 'linux', 'gnu.hurd', 'bsdi', 'gnu.kfreebsd', 'freebsd', 'openbsd', 'netbsd', 'dragonfly', 'aix', 'sunos', 'irix', 'osf', 'hp\-ux', 'unix', 'x11', 'gnome\-vfs', 'beos', 'os/2', 'amiga', 'atari', 'vms', 'commodore', 'qnx', 'inferno', 'palmos', 'syllable', 'blackberry', 'cp/m', 'crayos', 'dreamcast', 'iphone[_+ ]os', 'risc[_+ ]?os', 'symbian', 'webtv', 'playstation', 'xbox', 'wii', 'vienna', 'newsfire', 'applesyndication', 'akregator', 'plagger', 'syndirella', 'j2me', 'java', 'microsoft', 'msie[_+ ]', 'ms[_+ ]frontpage', 'windows'] -operating_systems_hashid = {'qnx' : 'qnx', 'blackberry' : 'blackberry', 'linux(.*)suse' : 'linuxsuse', 'linux(.*)white\sbox' : 'linuxwhitebox', 'amiga' : 'amigaos', 'java' : 'java', 'linux(.*)momonga' : 'linuxmomonga', 'msie[_+ ]' : 'winunknown', 'symbian' : 'symbian', 'microsoft' : 'winunknown', 'beos' : 'beos', 'win(.*)ce' : 'wince', 'applesyndication' : 'macosx', 'playstation' : 'psp', 'windows[_+ ]me' : 'winme', 'gnu.hurd' : 'gnu', 'gnu.kfreebsd' : 'bsdkfreebsd', 'windows[_+ ]nt[_+ ]6' : 'winvista', 'syllable' : 'syllable', 'openbsd' : 'bsdopenbsd', 'unix' : 'unix', 'windows[_+ ]nt[_+ ]5\.2' : 'win2003', 'linux(.*)android' : 'linuxandroid', 'windows[_+ ]nt[_+ ]5\.1' : 'winxp', 'mac[_+ ]os[_+ ]x' : 'macosx', 'gnome\-vfs' : 'unix', 'windows[_+ ]nt[_+ ]6\.0' : 'winlong', 'palmos' : 'palmos', 'windows[_+ ]nt[_+ ]6\.1' : 'win7', 'sunos' : 'sunos', 'windows[_+ ]?2005' : 'winlong', 'newsfire' : 'macosx', 'vms' : 'vms', 'risc[_+ ]?os' : 'riscos', 'linux' : 'linux', 'ms[_+ ]frontpage' : 'winunknown', 'vienna' : 'macosx', 'mac[_+ ]68' : 'macintosh', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]7' : 'macosx7', 'windows[_+ ]nt[_+ ]5' : 'win2000', 'syndirella' : 'winxp', 'wii' : 'wii', 'irix' : 'irix', 'dragonflybsd' : 'bsddflybsd', 'windows' : 'winunknown', 'atari' : 'atari', 'netbsd' : 'bsdnetbsd', 'macintosh' : 'macintosh', 'plagger' : 'unix', 'x11' : 'unix', 'linux(.*)zenwalk' : 'linuxzenwalk', 'crayos' : 'crayos', 'dreamcast' : 'dreamcast', 'linux(.*)vine' : 'linuxvine', 'osf' : 'osf', 'akregator' : 'linux', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]8' : 'macosx8', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]6' : 'macosx6', 'win(.*)95' : 'win95', 'windows[_+ ]?vista' : 'winvista', 'os/2' : 'os/2', 'linux(.*)debian' : 'linuxdebian', 'webtv' : 'webtv', 'win[_+ ]9x' : 'winme', 'aix' : 'aix', 'cp/m' : 'cp/m', 'linux(.*)red[_+ ]hat' : 'linuxredhat', 'win(.*)16' : 'win16', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]5' : 'macosx5', 'linux(.*)asplinux' : 'linuxasplinux', 'inferno' : 'inferno', 'win(.*)98' : 'win98', 'bsdi' : 'bsdi', 'windows[_+ ]?2008' : 'win2008', 'freebsd' : 'bsdfreebsd', 'hp\-ux' : 'hp\-ux', 'windows[_+ ]xp' : 'winxp', 'commodore' : 'commodore', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]9' : 'macosx9', 'xbox' : 'winxbox', 'windows[_+ \-]?nt' : 'winnt', 'linux(.*)gentoo' : 'linuxgentoo', 'windows[_+ ]?2012' : 'win2012', 'macweb' : 'macintosh', 'winnt' : 'winnt', 'linux(.*)fedora' : 'linuxfedora', 'iphone[_+ ]os' : 'ios', 'win32' : 'winnt', 'windows[_+ ]?2000' : 'win2000', 'linux(.*)pclinuxos' : 'linuxpclinuxos', 'j2me' : 'j2me', 'windows[_+ ]3' : 'win16', 'linux(.*)vector' : 'linuxvector', 'mac[_+ ]?p' : 'macintosh', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]4' : 'macosx4', 'windows[_+ ]?2003' : 'win2003', 'linux(.*)mandr' : 'linuxmandr', 'linux(.*)ubuntu' : 'linuxubuntu', 'linux(.*)centos' : 'linuxcentos', 'windows[_+ ]nt[_+ ]6\.2' : 'win8'} +operating_systems_hashid = {'windows[_+ ]nt[_+ ]6\.2' : 'win8', 'os/2' : 'os/2', 'beos' : 'beos', 'dragonflybsd' : 'bsddflybsd', 'linux' : 'linux', 'playstation' : 'psp', 'winnt' : 'winnt', 'linux(.*)centos' : 'linuxcentos', 'linux(.*)red[_+ ]hat' : 'linuxredhat', 'aix' : 'aix', 'macintosh' : 'macintosh', 'vms' : 'vms', 'windows[_+ ]?2008' : 'win2008', 'linux(.*)debian' : 'linuxdebian', 'linux(.*)white\sbox' : 'linuxwhitebox', 'webtv' : 'webtv', 'wii' : 'wii', 'windows[_+ ]nt[_+ ]6\.0' : 'winlong', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]6' : 'macosx6', 'inferno' : 'inferno', 'netbsd' : 'bsdnetbsd', 'unix' : 'unix', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]4' : 'macosx4', 'applesyndication' : 'macosx', 'windows[_+ ]nt[_+ ]5\.1' : 'winxp', 'iphone[_+ ]os' : 'ios', 'amiga' : 'amigaos', 'newsfire' : 'macosx', 'windows[_+ ]nt[_+ ]6' : 'winvista', 'windows[_+ ]nt[_+ ]6\.1' : 'win7', 'win[_+ ]9x' : 'winme', 'java' : 'java', 'linux(.*)ubuntu' : 'linuxubuntu', 'commodore' : 'commodore', 'plagger' : 'unix', 'bsdi' : 'bsdi', 'microsoft' : 'winunknown', 'windows' : 'winunknown', 'linux(.*)pclinuxos' : 'linuxpclinuxos', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]7' : 'macosx7', 'j2me' : 'j2me', 'win32' : 'winnt', 'hp\-ux' : 'hp\-ux', 'windows[_+ ]?2003' : 'win2003', 'gnu.kfreebsd' : 'bsdkfreebsd', 'gnome\-vfs' : 'unix', 'windows[_+ ]3' : 'win16', 'linux(.*)gentoo' : 'linuxgentoo', 'ms[_+ ]frontpage' : 'winunknown', 'windows[_+ ]nt[_+ ]5\.2' : 'win2003', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]9' : 'macosx9', 'linux(.*)suse' : 'linuxsuse', 'atari' : 'atari', 'mac[_+ ]?p' : 'macintosh', 'windows[_+ ]me' : 'winme', 'openbsd' : 'bsdopenbsd', 'irix' : 'irix', 'linux(.*)fedora' : 'linuxfedora', 'mac[_+ ]68' : 'macintosh', 'win(.*)16' : 'win16', 'xbox' : 'winxbox', 'freebsd' : 'bsdfreebsd', 'mac[_+ ]os[_+ ]x' : 'macosx', 'x11' : 'unix', 'palmos' : 'palmos', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]5' : 'macosx5', 'syllable' : 'syllable', 'windows[_+ ]?vista' : 'winvista', 'syndirella' : 'winxp', 'linux(.*)vine' : 'linuxvine', 'crayos' : 'crayos', 'linux(.*)momonga' : 'linuxmomonga', 'sunos' : 'sunos', 'linux(.*)vector' : 'linuxvector', 'linux(.*)mandr' : 'linuxmandr', 'windows[_+ ]?2005' : 'winlong', 'akregator' : 'linux', 'qnx' : 'qnx', 'win(.*)95' : 'win95', 'mac[_+ ]os[_+ ]x[_+ ]10[_\.]8' : 'macosx8', 'windows[_+ ]?2012' : 'win2012', 'linux(.*)android' : 'linuxandroid', 'osf' : 'osf', 'linux(.*)zenwalk' : 'linuxzenwalk', 'symbian' : 'symbian', 'risc[_+ ]?os' : 'riscos', 'win(.*)98' : 'win98', 'macweb' : 'macintosh', 'windows[_+ ]xp' : 'winxp', 'gnu.hurd' : 'gnu', 'cp/m' : 'cp/m', 'dreamcast' : 'dreamcast', 'windows[_+ ]?2000' : 'win2000', 'vienna' : 'macosx', 'linux(.*)asplinux' : 'linuxasplinux', 'windows[_+ ]nt[_+ ]5' : 'win2000', 'windows[_+ \-]?nt' : 'winnt', 'win(.*)ce' : 'wince', 'blackberry' : 'blackberry', 'msie[_+ ]' : 'winunknown'} -operating_systems_family = {'linux' : 'Linux', 'bsd' : 'BSD', 'win' : 'Windows', 'mac' : 'Macintosh'} +operating_systems_family = {'linux' : 'Linux', 'mac' : 'Macintosh', 'bsd' : 'BSD', 'win' : 'Windows'} browsers = ['elinks', 'firebird', 'go!zilla', 'icab', 'links', 'lynx', 'omniweb', '22acidownload', 'abrowse', 'aol\-iweng', 'amaya', 'amigavoyager', 'arora', 'aweb', 'charon', 'donzilla', 'seamonkey', 'flock', 'minefield', 'bonecho', 'granparadiso', 'songbird', 'strata', 'sylera', 'kazehakase', 'prism', 'icecat', 'iceape', 'iceweasel', 'w3clinemode', 'bpftp', 'camino', 'chimera', 'cyberdog', 'dillo', 'xchaos_arachne', 'doris', 'dreamcast', 'xbox', 'downloadagent', 'ecatch', 'emailsiphon', 'encompass', 'epiphany', 'friendlyspider', 'fresco', 'galeon', 'flashget', 'freshdownload', 'getright', 'leechget', 'netants', 'headdump', 'hotjava', 'ibrowse', 'intergo', 'k\-meleon', 'k\-ninja', 'linemodebrowser', 'lotus\-notes', 'macweb', 'multizilla', 'ncsa_mosaic', 'netcaptor', 'netpositive', 'nutscrape', 'msfrontpageexpress', 'contiki', 'emacs\-w3', 'phoenix', 'shiira', 'tzgeturl', 'viking', 'webfetcher', 'webexplorer', 'webmirror', 'webvcr', 'qnx\svoyager', 'cloudflare', 'grabber', 'teleport', 'webcapture', 'webcopier', 'real', 'winamp', 'windows\-media\-player', 'audion', 'freeamp', 'itunes', 'jetaudio', 'mint_audio', 'mpg123', 'mplayer', 'nsplayer', 'qts', 'quicktime', 'sonique', 'uplayer', 'xaudio', 'xine', 'xmms', 'gstreamer', 'abilon', 'aggrevator', 'aiderss', 'akregator', 'applesyndication', 'betanews_reader', 'blogbridge', 'cyndicate', 'feeddemon', 'feedreader', 'feedtools', 'greatnews', 'gregarius', 'hatena_rss', 'jetbrains_omea', 'liferea', 'netnewswire', 'newsfire', 'newsgator', 'newzcrawler', 'plagger', 'pluck', 'potu', 'pubsub\-rss\-reader', 'pulpfiction', 'rssbandit', 'rssreader', 'rssowl', 'rss\sxpress', 'rssxpress', 'sage', 'sharpreader', 'shrook', 'straw', 'syndirella', 'vienna', 'wizz\srss\snews\sreader', 'alcatel', 'lg\-', 'mot\-', 'nokia', 'panasonic', 'philips', 'sagem', 'samsung', 'sie\-', 'sec\-', 'sonyericsson', 'ericsson', 'mmef', 'mspie', 'vodafone', 'wapalizer', 'wapsilon', 'wap', 'webcollage', 'up\.', 'android', 'blackberry', 'cnf2', 'docomo', 'ipcheck', 'iphone', 'portalmmm', 'webtv', 'democracy', 'cjb\.net', 'ossproxy', 'smallproxy', 'adobeair', 'apt', 'analogx_proxy', 'gnome\-vfs', 'neon', 'curl', 'csscheck', 'httrack', 'fdm', 'javaws', 'wget', 'fget', 'chilkat', 'webdownloader\sfor\sx', 'w3m', 'wdg_validator', 'w3c_validator', 'jigsaw', 'webreaper', 'webzip', 'staroffice', 'gnus', 'nikto', 'download\smaster', 'microsoft\-webdav\-miniredir', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav', 'POE\-Component\-Client\-HTTP', 'mozilla', 'libwww', 'lwp', 'WebSec'] -browsers_hashid = {'sie\-' : 'SIE (PDA/Phone browser)', 'gnus' : 'Gnus Network User Services', 'webcopier' : 'WebCopier', 'nokia' : 'Nokia Browser (PDA/Phone browser)', 'feedtools' : 'FeedTools (RSS Reader)', 'iceape' : 'GNU IceApe', 'xbox' : 'XBoX', 'lotus\-notes' : 'Lotus Notes web client', 'konqueror' : 'Konqueror', 'hatena_rss' : 'Hatena (RSS Reader)', 'feeddemon' : 'FeedDemon (RSS Reader)', 'bpftp' : 'BPFTP', 'macweb' : 'MacWeb', 'sonyericsson' : 'Sony/Ericsson Browser (PDA/Phone browser)', 'straw' : 'Straw (RSS Reader)', 'democracy' : 'Democracy', 'emacs\-w3' : 'Emacs/w3s', 'xaudio' : 'Some XAudio Engine based MPEG player (media player)', 'android' : 'Android browser (PDA/Phone browser)', 'linemodebrowser' : 'W3C Line Mode Browser', 'sylera' : 'Sylera', 'jetaudio' : 'JetAudio (media player)', 'alcatel' : 'Alcatel Browser (PDA/Phone browser)', 'amaya' : 'Amaya', 'k\-meleon' : 'K-Meleon', 'netnewswire' : 'NetNewsWire (RSS Reader)', 'jetbrains_omea' : 'Omea (RSS Reader)', 'windows\-media\-player' : 'Windows Media Player (media player)', 'sage' : 'Sage (RSS Reader)', 'netpositive' : 'NetPositive', 'webvcr' : 'WebVCR', 'rssbandit' : 'RSS Bandit (RSS Reader)', 'wapalizer' : 'WAPalizer (PDA/Phone browser)', 'arora' : 'Arora', 'w3c_validator' : 'W3C Validator', 'netcaptor' : 'NetCaptor', 'audion' : 'Audion (media player)', 'sec\-' : 'Sony/Ericsson (PDA/Phone browser)', 'lynx' : 'Lynx', 'aggrevator' : 'Aggrevator (RSS Reader)', 'cjb\.net' : 'CJB.NET Proxy', 'feedreader' : 'FeedReader (RSS Reader)', 'itunes' : 'Apple iTunes (media player)', 'bonecho' : 'BonEcho (Firefox 2.0 development)', 'mozilla' : 'Mozilla', 'ericsson' : 'Ericsson Browser (PDA/Phone browser)', 'phoenix' : 'Phoenix', 'grabber' : 'Grabber', 'dillo' : 'Dillo', 'charon' : 'Charon', 'prism' : 'Prism', 'apt' : 'Debian APT', 'wdg_validator' : 'WDG HTML Validator', 'msfrontpageexpress' : 'MS FrontPage Express', 'newzcrawler' : 'NewzCrawler (RSS Reader)', 'mint_audio' : 'Mint Audio (media player)', 'abilon' : 'Abilon (RSS Reader)', 'adobeair' : 'AdobeAir', 'microsoft\-webdav\-miniredir' : 'Microsoft Data Access Component Internet Publishing Provider', 'staroffice' : 'StarOffice', '22acidownload' : '22AciDownload', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'Microsoft Data Access Component Internet Publishing Provider Cache Manager', 'seamonkey' : 'SeaMonkey', 'friendlyspider' : 'FriendlySpider', 'shrook' : 'Shrook (RSS Reader)', 'mspie' : 'MS Pocket Internet Explorer (PDA/Phone browser)', 'blogbridge' : 'BlogBridge (RSS Reader)', 'fresco' : 'ANT Fresco', 'wizz\srss\snews\sreader' : 'Wizz RSS News Reader (RSS Reader)', 'docomo' : 'I-Mode phone (PDA/Phone browser)', 'winamp' : 'WinAmp (media player)', 'webtv' : 'WebTV browser', 'freshdownload' : 'FreshDownload', 'ecatch' : 'eCatch', 'webzip' : 'WebZIP', 'sonique' : 'Sonique (media player)', 'contiki' : 'Contiki', 'pluck' : 'Pluck (RSS Reader)', 'webcollage' : 'WebCollage (PDA/Phone browser)', 'netants' : 'NetAnts', 'wget' : 'Wget', 'webexplorer' : 'IBM-WebExplorer', 'sagem' : 'Sagem (PDA/Phone browser)', 'wap' : 'Unknown WAP browser (PDA/Phone browser)', 'nutscrape' : 'Nutscrape', 'svn' : 'Subversion client', 'plagger' : 'Plagger (RSS Reader)', 'hotjava' : 'Sun HotJava', 'gstreamer' : 'GStreamer (media library)', 'aiderss' : 'AideRSS (RSS Reader)', 'opera' : 'Opera', 'dreamcast' : 'Dreamcast', 'analogx_proxy' : 'AnalogX Proxy', 'webcapture' : 'Acrobat Webcapture', 'doris' : 'Doris (for Symbian)', 'flashget' : 'FlashGet', 'downloadagent' : 'DownloadAgent', 'portalmmm' : 'I-Mode phone (PDA/Phone browser)', 'songbird' : 'Songbird', 'firebird' : 'Firebird (Old Firefox)', 'newsgator' : 'NewsGator (RSS Reader)', 'javaws' : 'Java Web Start', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'Microsoft Data Access Component Internet Publishing Provider DAV', 'iceweasel' : 'Iceweasel', 'uplayer' : 'Ultra Player (media player)', 'getright' : 'GetRight', 'chrome' : 'Google Chrome', 'ipcheck' : 'Supervision IP Check (phone)', 'xmms' : 'XMMS (media player)', 'akregator' : 'Akregator (RSS Reader)', 'w3m' : 'w3m', 'cyndicate' : 'Cyndicate (RSS Reader)', 'nsplayer' : 'NetShow Player (media player)', 'mplayer' : 'The Movie Player (media player)', 'elinks' : 'ELinks', 'mmef' : 'Microsoft Mobile Explorer (PDA/Phone browser)', 'greatnews' : 'GreatNews (RSS Reader)', 'go!zilla' : 'Go!Zilla', 'jigsaw' : 'W3C Validator', 'minefield' : 'Minefield (Firefox 3.0 development)', 'icab' : 'iCab', 'ossproxy' : 'OSSProxy', 'shiira' : 'Shiira', 'rssxpress' : 'RSSXpress (RSS Reader)', 'webmirror' : 'WebMirror', 'gregarius' : 'Gregarius (RSS Reader)', 'syndirella' : 'Syndirella (RSS Reader)', 'libwww' : 'LibWWW', 'icecat' : 'GNU IceCat', 'epiphany' : 'Epiphany', 'xchaos_arachne' : 'Arachne', 'flock' : 'Flock', 'k\-ninja' : 'K-Ninja', 'cnf2' : 'Supervision I-Mode ByTel (phone)', 'leechget' : 'LeechGet', 'webfetcher' : 'WebFetcher', 'sharpreader' : 'SharpReader (RSS Reader)', 'strata' : 'Strata', 'ncsa_mosaic' : 'NCSA Mosaic', 'lwp' : 'LibWWW-perl', 'fget' : 'FGet', 'webreaper' : 'WebReaper', 'philips' : 'Philips Browser (PDA/Phone browser)', 'intergo' : 'InterGO', 'fdm' : 'FDM Free Download Manager', 'newsfire' : 'NewsFire (RSS Reader)', 'donzilla' : 'Donzilla', 'cyberdog' : 'Cyberdog', 'w3clinemode' : 'W3CLineMode', 'aweb' : 'AWeb', 'rss\sxpress' : 'RSS Xpress (RSS Reader)', 'netscape' : 'Netscape', 'firefox' : 'Firefox', 'vienna' : 'Vienna (RSS Reader)', 'curl' : 'Curl', 'lg\-' : 'LG (PDA/Phone browser)', 'liferea' : 'Liferea (RSS Reader)', 'rssreader' : 'RssReader (RSS Reader)', 'quicktime' : 'QuickTime (media player)', 'rssowl' : 'RSSOwl (RSS Reader)', 'potu' : 'Potu (RSS Reader)', 'real' : 'Real player or compatible (media player)', 'kazehakase' : 'Kazehakase', 'amigavoyager' : 'AmigaVoyager', 'nikto' : 'Nikto Web Scanner', 'samsung' : 'Samsung (PDA/Phone browser)', 'camino' : 'Camino', 'headdump' : 'HeadDump', 'mpg123' : 'mpg123 (media player)', 'ibrowse' : 'iBrowse', 'httrack' : 'HTTrack', 'betanews_reader' : 'Betanews Reader (RSS Reader)', 'multizilla' : 'MultiZilla', 'csscheck' : 'WDG CSS Validator', 'chilkat' : 'Chilkat', 'gnome\-vfs' : 'Gnome FileSystem Abstraction library', 'qnx\svoyager' : 'QNX Voyager', 'xine' : 'Xine, a free multimedia player (media player)', 'wapsilon' : 'WAPsilon (PDA/Phone browser)', 'omniweb' : 'OmniWeb', 'qts' : 'QuickTime (media player)', 'iphone' : 'IPhone (PDA/Phone browser)', 'download\smaster' : 'Download Master', 'chimera' : 'Chimera (Old Camino)', 'WebSec' : 'Web Secretary', 'viking' : 'Viking', 'links' : 'Links', 'galeon' : 'Galeon', 'aol\-iweng' : 'AOL-Iweng', 'neon' : 'Neon HTTP and WebDAV client library', 'blackberry' : 'BlackBerry (PDA/Phone browser)', 'POE\-Component\-Client\-HTTP' : 'HTTP user-agent for POE (portable networking framework for Perl)', 'emailsiphon' : 'EmailSiphon', 'pulpfiction' : 'PulpFiction (RSS Reader)', 'panasonic' : 'Panasonic Browser (PDA/Phone browser)', 'msie' : 'MS Internet Explorer', 'encompass' : 'Encompass', 'tzgeturl' : 'TzGetURL', 'up\.' : 'UP.Browser (PDA/Phone browser)', 'safari' : 'Safari', 'vodafone' : 'Vodaphone browser (PDA/Phone browser)', 'smallproxy' : 'SmallProxy', 'webdownloader\sfor\sx' : 'Downloader for X', 'cloudflare' : 'CloudFlare', 'freeamp' : 'FreeAmp (media player)', 'applesyndication' : 'AppleSyndication (RSS Reader)', 'teleport' : 'TelePort Pro', 'abrowse' : 'ABrowse', 'mot\-' : 'Motorola Browser (PDA/Phone browser)', 'granparadiso' : 'GranParadiso (Firefox 3.0 development)', 'pubsub\-rss\-reader' : 'PubSub (RSS Reader)'} +browsers_hashid = {'encompass' : 'Encompass', 'k\-ninja' : 'K-Ninja', 'ericsson' : 'Ericsson Browser (PDA/Phone browser)', 'doris' : 'Doris (for Symbian)', 'jigsaw' : 'W3C Validator', 'netpositive' : 'NetPositive', 'rssxpress' : 'RSSXpress (RSS Reader)', 'sonyericsson' : 'Sony/Ericsson Browser (PDA/Phone browser)', 'sage' : 'Sage (RSS Reader)', 'newsfire' : 'NewsFire (RSS Reader)', 'granparadiso' : 'GranParadiso (Firefox 3.0 development)', 'headdump' : 'HeadDump', 'httrack' : 'HTTrack', 'applesyndication' : 'AppleSyndication (RSS Reader)', 'winamp' : 'WinAmp (media player)', 'jetbrains_omea' : 'Omea (RSS Reader)', 'bpftp' : 'BPFTP', 'w3m' : 'w3m', 'cnf2' : 'Supervision I-Mode ByTel (phone)', 'galeon' : 'Galeon', 'blogbridge' : 'BlogBridge (RSS Reader)', 'liferea' : 'Liferea (RSS Reader)', 'dillo' : 'Dillo', 'microsoft\-webdav\-miniredir' : 'Microsoft Data Access Component Internet Publishing Provider', 'icab' : 'iCab', 'links' : 'Links', 'xmms' : 'XMMS (media player)', 'netscape' : 'Netscape', 'plagger' : 'Plagger (RSS Reader)', 'straw' : 'Straw (RSS Reader)', 'newsgator' : 'NewsGator (RSS Reader)', 'ncsa_mosaic' : 'NCSA Mosaic', 'itunes' : 'Apple iTunes (media player)', 'javaws' : 'Java Web Start', 'fget' : 'FGet', 'iphone' : 'IPhone (PDA/Phone browser)', 'cjb\.net' : 'CJB.NET Proxy', 'opera' : 'Opera', 'samsung' : 'Samsung (PDA/Phone browser)', 'amigavoyager' : 'AmigaVoyager', 'gnome\-vfs' : 'Gnome FileSystem Abstraction library', 'fdm' : 'FDM Free Download Manager', 'abilon' : 'Abilon (RSS Reader)', 'potu' : 'Potu (RSS Reader)', 'aol\-iweng' : 'AOL-Iweng', 'amaya' : 'Amaya', 'philips' : 'Philips Browser (PDA/Phone browser)', 'webcopier' : 'WebCopier', 'sec\-' : 'Sony/Ericsson (PDA/Phone browser)', 'curl' : 'Curl', 'cloudflare' : 'CloudFlare', 'songbird' : 'Songbird', 'webexplorer' : 'IBM-WebExplorer', 'csscheck' : 'WDG CSS Validator', 'apt' : 'Debian APT', 'webmirror' : 'WebMirror', 'cyndicate' : 'Cyndicate (RSS Reader)', 'go!zilla' : 'Go!Zilla', 'wapsilon' : 'WAPsilon (PDA/Phone browser)', 'neon' : 'Neon HTTP and WebDAV client library', 'libwww' : 'LibWWW', 'intergo' : 'InterGO', 'strata' : 'Strata', 'donzilla' : 'Donzilla', 'freshdownload' : 'FreshDownload', 'sie\-' : 'SIE (PDA/Phone browser)', 'mot\-' : 'Motorola Browser (PDA/Phone browser)', 'nsplayer' : 'NetShow Player (media player)', 'epiphany' : 'Epiphany', 'nikto' : 'Nikto Web Scanner', 'elinks' : 'ELinks', 'webreaper' : 'WebReaper', 'flock' : 'Flock', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'Microsoft Data Access Component Internet Publishing Provider DAV', '22acidownload' : '22AciDownload', 'download\smaster' : 'Download Master', 'chimera' : 'Chimera (Old Camino)', 'rssbandit' : 'RSS Bandit (RSS Reader)', 'qts' : 'QuickTime (media player)', 'real' : 'Real player or compatible (media player)', 'camino' : 'Camino', 'sylera' : 'Sylera', 'feeddemon' : 'FeedDemon (RSS Reader)', 'wdg_validator' : 'WDG HTML Validator', 'phoenix' : 'Phoenix', 'qnx\svoyager' : 'QNX Voyager', 'aweb' : 'AWeb', 'svn' : 'Subversion client', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'Microsoft Data Access Component Internet Publishing Provider Cache Manager', 'k\-meleon' : 'K-Meleon', 'downloadagent' : 'DownloadAgent', 'getright' : 'GetRight', 'omniweb' : 'OmniWeb', 'sonique' : 'Sonique (media player)', 'teleport' : 'TelePort Pro', 'webtv' : 'WebTV browser', 'bonecho' : 'BonEcho (Firefox 2.0 development)', 'jetaudio' : 'JetAudio (media player)', 'lotus\-notes' : 'Lotus Notes web client', 'pubsub\-rss\-reader' : 'PubSub (RSS Reader)', 'panasonic' : 'Panasonic Browser (PDA/Phone browser)', 'aggrevator' : 'Aggrevator (RSS Reader)', 'ecatch' : 'eCatch', 'shiira' : 'Shiira', 'nutscrape' : 'Nutscrape', 'mint_audio' : 'Mint Audio (media player)', 'prism' : 'Prism', 'xchaos_arachne' : 'Arachne', 'democracy' : 'Democracy', 'multizilla' : 'MultiZilla', 'webcollage' : 'WebCollage (PDA/Phone browser)', 'shrook' : 'Shrook (RSS Reader)', 'charon' : 'Charon', 'wizz\srss\snews\sreader' : 'Wizz RSS News Reader (RSS Reader)', 'pulpfiction' : 'PulpFiction (RSS Reader)', 'viking' : 'Viking', 'macweb' : 'MacWeb', 'mspie' : 'MS Pocket Internet Explorer (PDA/Phone browser)', 'sagem' : 'Sagem (PDA/Phone browser)', 'rssowl' : 'RSSOwl (RSS Reader)', 'emailsiphon' : 'EmailSiphon', 'up\.' : 'UP.Browser (PDA/Phone browser)', 'quicktime' : 'QuickTime (media player)', 'wap' : 'Unknown WAP browser (PDA/Phone browser)', 'netcaptor' : 'NetCaptor', 'mmef' : 'Microsoft Mobile Explorer (PDA/Phone browser)', 'mplayer' : 'The Movie Player (media player)', 'netants' : 'NetAnts', 'dreamcast' : 'Dreamcast', 'safari' : 'Safari', 'ipcheck' : 'Supervision IP Check (phone)', 'audion' : 'Audion (media player)', 'linemodebrowser' : 'W3C Line Mode Browser', 'uplayer' : 'Ultra Player (media player)', 'webcapture' : 'Acrobat Webcapture', 'vienna' : 'Vienna (RSS Reader)', 'arora' : 'Arora', 'msfrontpageexpress' : 'MS FrontPage Express', 'android' : 'Android browser (PDA/Phone browser)', 'ibrowse' : 'iBrowse', 'portalmmm' : 'I-Mode phone (PDA/Phone browser)', 'xaudio' : 'Some XAudio Engine based MPEG player (media player)', 'seamonkey' : 'SeaMonkey', 'rssreader' : 'RssReader (RSS Reader)', 'iceweasel' : 'Iceweasel', 'icecat' : 'GNU IceCat', 'staroffice' : 'StarOffice', 'blackberry' : 'BlackBerry (PDA/Phone browser)', 'alcatel' : 'Alcatel Browser (PDA/Phone browser)', 'analogx_proxy' : 'AnalogX Proxy', 'ossproxy' : 'OSSProxy', 'aiderss' : 'AideRSS (RSS Reader)', 'lg\-' : 'LG (PDA/Phone browser)', 'contiki' : 'Contiki', 'netnewswire' : 'NetNewsWire (RSS Reader)', 'cyberdog' : 'Cyberdog', 'hotjava' : 'Sun HotJava', 'firefox' : 'Firefox', 'gnus' : 'Gnus Network User Services', 'flashget' : 'FlashGet', 'w3c_validator' : 'W3C Validator', 'gstreamer' : 'GStreamer (media library)', 'wget' : 'Wget', 'msie' : 'MS Internet Explorer', 'WebSec' : 'Web Secretary', 'xine' : 'Xine, a free multimedia player (media player)', 'friendlyspider' : 'FriendlySpider', 'pluck' : 'Pluck (RSS Reader)', 'xbox' : 'XBoX', 'grabber' : 'Grabber', 'leechget' : 'LeechGet', 'iceape' : 'GNU IceApe', 'wapalizer' : 'WAPalizer (PDA/Phone browser)', 'webfetcher' : 'WebFetcher', 'newzcrawler' : 'NewzCrawler (RSS Reader)', 'abrowse' : 'ABrowse', 'POE\-Component\-Client\-HTTP' : 'HTTP user-agent for POE (portable networking framework for Perl)', 'betanews_reader' : 'Betanews Reader (RSS Reader)', 'konqueror' : 'Konqueror', 'rss\sxpress' : 'RSS Xpress (RSS Reader)', 'gregarius' : 'Gregarius (RSS Reader)', 'syndirella' : 'Syndirella (RSS Reader)', 'windows\-media\-player' : 'Windows Media Player (media player)', 'chilkat' : 'Chilkat', 'tzgeturl' : 'TzGetURL', 'sharpreader' : 'SharpReader (RSS Reader)', 'firebird' : 'Firebird (Old Firefox)', 'adobeair' : 'AdobeAir', 'feedtools' : 'FeedTools (RSS Reader)', 'lynx' : 'Lynx', 'webdownloader\sfor\sx' : 'Downloader for X', 'docomo' : 'I-Mode phone (PDA/Phone browser)', 'mpg123' : 'mpg123 (media player)', 'greatnews' : 'GreatNews (RSS Reader)', 'webvcr' : 'WebVCR', 'kazehakase' : 'Kazehakase', 'lwp' : 'LibWWW-perl', 'nokia' : 'Nokia Browser (PDA/Phone browser)', 'feedreader' : 'FeedReader (RSS Reader)', 'freeamp' : 'FreeAmp (media player)', 'chrome' : 'Google Chrome', 'akregator' : 'Akregator (RSS Reader)', 'hatena_rss' : 'Hatena (RSS Reader)', 'w3clinemode' : 'W3CLineMode', 'vodafone' : 'Vodaphone browser (PDA/Phone browser)', 'webzip' : 'WebZIP', 'emacs\-w3' : 'Emacs/w3s', 'mozilla' : 'Mozilla', 'fresco' : 'ANT Fresco', 'minefield' : 'Minefield (Firefox 3.0 development)', 'smallproxy' : 'SmallProxy'} -browsers_icons = {'staroffice' : 'staroffice', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'frontpage', 'seamonkey' : 'seamonkey', 'abilon' : 'abilon', 'adobeair' : 'adobe', 'microsoft\-webdav\-miniredir' : 'frontpage', 'mspie' : 'pdaphone', 'avantbrowser' : 'avant', 'shrook' : 'rss', 'prism' : 'mozilla', 'apt' : 'apt', 'mint_audio' : 'mediaplayer', 'msfrontpageexpress' : 'fpexpress', 'newzcrawler' : 'rss', 'wap' : 'pdaphone', 'svn' : 'subversion', 'winamp' : 'mediaplayer', 'docomo' : 'pdaphone', 'webtv' : 'webtv', 'ecatch' : 'ecatch', 'freshdownload' : 'freshdownload', 'webzip' : 'webzip', 'sonique' : 'mediaplayer', 'blogbridge' : 'rss', 'fresco' : 'fresco', 'wizz\srss\snews\sreader' : 'wizz', 'sagem' : 'pdaphone', 'pluck' : 'rss', 'webcollage' : 'pdaphone', 'flashget' : 'flashget', 'analogx_proxy' : 'analogx', 'webcapture' : 'adobe', 'doris' : 'doris', 'javaws' : 'java', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'frontpage', 'portalmmm' : 'pdaphone', 'songbird' : 'mozilla', 'newsgator' : 'rss', 'firebird' : 'phoenix', 'hotjava' : 'hotjava', 'aiderss' : 'rss', 'plagger' : 'rss', 'dreamcast' : 'dreamcast', 'microsoft\soffice\sprotocol\sdiscovery' : 'frontpage', 'opera' : 'opera', 'nsplayer' : 'netshow', 'mmef' : 'pdaphone', 'greatnews' : 'rss', 'mplayer' : 'mediaplayer', 'getright' : 'getright', 'chrome' : 'chrome', 'uplayer' : 'mediaplayer', 'iceweasel' : 'iceweasel', 'akregator' : 'rss', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sprotocol\sdiscovery' : 'frontpage', 'xmms' : 'mediaplayer', 'hatena_rss' : 'rss', 'feeddemon' : 'rss', 'microsoft\soffice\sexistence\sdiscovery' : 'frontpage', 'sonyericsson' : 'pdaphone', 'straw' : 'rss', 'bpftp' : 'bpftp', 'macweb' : 'macweb', 'webcopier' : 'webcopier', 'gnus' : 'gnus', 'nokia' : 'pdaphone', 'feedtools' : 'rss', 'xbox' : 'winxbox', 'iceape' : 'mozilla', 'lotus\-notes' : 'lotusnotes', 'sie\-' : 'pdaphone', 'konqueror' : 'konqueror', 'netnewswire' : 'rss', 'k\-meleon' : 'kmeleon', 'alcatel' : 'pdaphone', 'amaya' : 'amaya', 'sage' : 'rss', 'windows\-media\-player' : 'mplayer', 'netpositive' : 'netpositive', 'jetbrains_omea' : 'rss', 'jetaudio' : 'mediaplayer', 'xaudio' : 'mediaplayer', 'android' : 'android', 'sylera' : 'mozilla', 'sec\-' : 'pdaphone', 'audion' : 'mediaplayer', 'lynx' : 'lynx', 'aggrevator' : 'rss', 'cjb\.net' : 'cjbnet', 'rssbandit' : 'rss', 'wapalizer' : 'pdaphone', 'dillo' : 'dillo', 'itunes' : 'mediaplayer', 'feedreader' : 'rss', 'bonecho' : 'firefox', 'mozilla' : 'mozilla', 'ericsson' : 'pdaphone', 'phoenix' : 'phoenix', 'grabber' : 'grabber', 'ibrowse' : 'ibrowse', 'httrack' : 'httrack', 'mpg123' : 'mediaplayer', 'multizilla' : 'multizilla', 'betanews_reader' : 'rss', 'samsung' : 'pdaphone', 'camino' : 'chimera', 'chimera' : 'chimera', 'iphone' : 'pdaphone', 'galeon' : 'galeon', 'gnome\-vfs' : 'gnome', 'omniweb' : 'omniweb', 'qts' : 'mediaplayer', 'xine' : 'mediaplayer', 'wapsilon' : 'pdaphone', 'msie' : 'msie', 'encompass' : 'encompass', 'panasonic' : 'pdaphone', 'up\.' : 'pdaphone', 'pulpfiction' : 'rss', 'neon' : 'neon', 'blackberry' : 'pdaphone', 'teleport' : 'teleport', 'mot\-' : 'pdaphone', 'granparadiso' : 'firefox', 'freeamp' : 'mediaplayer', 'applesyndication' : 'rss', 'pubsub\-rss\-reader' : 'rss', 'safari' : 'safari', 'vodafone' : 'pdaphone', 'rssxpress' : 'rss', 'gregarius' : 'rss', 'minefield' : 'firefox', 'go!zilla' : 'gozilla', 'icab' : 'icab', 'flock' : 'flock', 'leechget' : 'leechget', 'syndirella' : 'rss', 'icecat' : 'icecat', 'epiphany' : 'epiphany', 'donzilla' : 'mozilla', 'philips' : 'pdaphone', 'webreaper' : 'webreaper', 'newsfire' : 'rss', 'sharpreader' : 'rss', 'strata' : 'mozilla', 'ncsa_mosaic' : 'ncsa_mosaic', 'rssreader' : 'rss', 'rssowl' : 'rss', 'potu' : 'rss', 'vienna' : 'rss', 'lg\-' : 'pdaphone', 'liferea' : 'rss', 'kazehakase' : 'mozilla', 'amigavoyager' : 'amigavoyager', 'real' : 'real', 'aweb' : 'aweb', 'cyberdog' : 'cyberdog', 'netscape' : 'netscape', 'firefox' : 'firefox', 'rss\sxpress' : 'rss'} +browsers_icons = {'bpftp' : 'bpftp', 'jetbrains_omea' : 'rss', 'blogbridge' : 'rss', 'galeon' : 'galeon', 'liferea' : 'rss', 'dillo' : 'dillo', 'microsoft\-webdav\-miniredir' : 'frontpage', 'icab' : 'icab', 'xmms' : 'mediaplayer', 'netscape' : 'netscape', 'plagger' : 'rss', 'encompass' : 'encompass', 'ericsson' : 'pdaphone', 'doris' : 'doris', 'rssxpress' : 'rss', 'netpositive' : 'netpositive', 'sage' : 'rss', 'sonyericsson' : 'pdaphone', 'newsfire' : 'rss', 'granparadiso' : 'firefox', 'httrack' : 'httrack', 'applesyndication' : 'rss', 'winamp' : 'mediaplayer', 'iphone' : 'pdaphone', 'cjb\.net' : 'cjbnet', 'samsung' : 'pdaphone', 'amigavoyager' : 'amigavoyager', 'opera' : 'opera', 'gnome\-vfs' : 'gnome', 'abilon' : 'abilon', 'amaya' : 'amaya', 'potu' : 'rss', 'philips' : 'pdaphone', 'webcopier' : 'webcopier', 'sec\-' : 'pdaphone', 'songbird' : 'mozilla', 'apt' : 'apt', 'newsgator' : 'rss', 'straw' : 'rss', 'ncsa_mosaic' : 'ncsa_mosaic', 'itunes' : 'mediaplayer', 'javaws' : 'java', 'rssbandit' : 'rss', 'chimera' : 'chimera', 'qts' : 'mediaplayer', 'real' : 'real', 'sylera' : 'mozilla', 'camino' : 'chimera', 'aweb' : 'aweb', 'feeddemon' : 'rss', 'phoenix' : 'phoenix', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\scache\smanager' : 'frontpage', 'svn' : 'subversion', 'go!zilla' : 'gozilla', 'wapsilon' : 'pdaphone', 'neon' : 'neon', 'donzilla' : 'mozilla', 'strata' : 'mozilla', 'freshdownload' : 'freshdownload', 'mot\-' : 'pdaphone', 'sie\-' : 'pdaphone', 'webreaper' : 'webreaper', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sdav' : 'frontpage', 'flock' : 'flock', 'nsplayer' : 'netshow', 'epiphany' : 'epiphany', 'mint_audio' : 'mediaplayer', 'prism' : 'mozilla', 'multizilla' : 'multizilla', 'shrook' : 'rss', 'wizz\srss\snews\sreader' : 'wizz', 'webcollage' : 'pdaphone', 'pulpfiction' : 'rss', 'k\-meleon' : 'kmeleon', 'getright' : 'getright', 'sonique' : 'mediaplayer', 'omniweb' : 'omniweb', 'teleport' : 'teleport', 'webtv' : 'webtv', 'microsoft\soffice\sexistence\sdiscovery' : 'frontpage', 'jetaudio' : 'mediaplayer', 'lotus\-notes' : 'lotusnotes', 'bonecho' : 'firefox', 'panasonic' : 'pdaphone', 'pubsub\-rss\-reader' : 'rss', 'ecatch' : 'ecatch', 'aggrevator' : 'rss', 'mmef' : 'pdaphone', 'mplayer' : 'mediaplayer', 'dreamcast' : 'dreamcast', 'safari' : 'safari', 'audion' : 'mediaplayer', 'uplayer' : 'mediaplayer', 'webcapture' : 'adobe', 'vienna' : 'rss', 'macweb' : 'macweb', 'microsoft\soffice\sprotocol\sdiscovery' : 'frontpage', 'sagem' : 'pdaphone', 'rssowl' : 'rss', 'mspie' : 'pdaphone', 'avantbrowser' : 'avant', 'up\.' : 'pdaphone', 'wap' : 'pdaphone', 'hotjava' : 'hotjava', 'netnewswire' : 'rss', 'cyberdog' : 'cyberdog', 'gnus' : 'gnus', 'firefox' : 'firefox', 'flashget' : 'flashget', 'msie' : 'msie', 'android' : 'android', 'msfrontpageexpress' : 'fpexpress', 'ibrowse' : 'ibrowse', 'portalmmm' : 'pdaphone', 'xaudio' : 'mediaplayer', 'rssreader' : 'rss', 'seamonkey' : 'seamonkey', 'iceweasel' : 'iceweasel', 'blackberry' : 'pdaphone', 'alcatel' : 'pdaphone', 'icecat' : 'icecat', 'staroffice' : 'staroffice', 'analogx_proxy' : 'analogx', 'aiderss' : 'rss', 'lg\-' : 'pdaphone', 'newzcrawler' : 'rss', 'konqueror' : 'konqueror', 'betanews_reader' : 'rss', 'rss\sxpress' : 'rss', 'gregarius' : 'rss', 'syndirella' : 'rss', 'windows\-media\-player' : 'mplayer', 'adobeair' : 'adobe', 'firebird' : 'phoenix', 'sharpreader' : 'rss', 'feedtools' : 'rss', 'xine' : 'mediaplayer', 'pluck' : 'rss', 'xbox' : 'winxbox', 'leechget' : 'leechget', 'grabber' : 'grabber', 'iceape' : 'mozilla', 'wapalizer' : 'pdaphone', 'feedreader' : 'rss', 'nokia' : 'pdaphone', 'freeamp' : 'mediaplayer', 'chrome' : 'chrome', 'akregator' : 'rss', 'hatena_rss' : 'rss', 'webzip' : 'webzip', 'vodafone' : 'pdaphone', 'mozilla' : 'mozilla', 'minefield' : 'firefox', 'fresco' : 'fresco', 'lynx' : 'lynx', 'microsoft\sdata\saccess\sinternet\spublishing\sprovider\sprotocol\sdiscovery' : 'frontpage', 'docomo' : 'pdaphone', 'mpg123' : 'mediaplayer', 'greatnews' : 'rss', 'kazehakase' : 'mozilla'} diff --git a/tools/own_search_engines.pm b/tools/own_search_engines.pm index ff758a6..3a9b19f 100644 --- a/tools/own_search_engines.pm +++ b/tools/own_search_engines.pm @@ -4,6 +4,7 @@ 'windowssearch\.com', 'qwant\.com', 'wow\.com', +'duckduckgo\.com', 'searches\.omiga-plus\.com', 'buenosearch\.com', 'searches\.vi-view\.com' @@ -18,7 +19,8 @@ 'searches\.omiga-plus\.com', 'Omiga-plus', 'buenosearch\.com', 'Bueno Search', 'searches\.vi-view\.com', 'vi-view', - 'www.sfr\.fr\/recherche\/google', 'google' + 'www.sfr\.fr\/recherche\/google', 'google', + 'duckduckgo\.com', 'DuckDuckGo' ); %Own_SearchEnginesKnownUrl=( @@ -29,7 +31,9 @@ 'WOW', 'q=', 'Omiga-plus', 'q=', 'Bueno Search', 'q=', - 'vi-view', 'q=' + 'vi-view', 'q=', + # Know it's not good + 'DuckDuckGo', 'q=' ); From 73e4b0d8a615ada0cf854200700217322ec03939 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sat, 2 Jan 2016 11:50:31 +0100 Subject: [PATCH 04/22] Dont count 'uri' and 'uri/' as differents uri --- ChangeLog | 3 ++- iwla.py | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3fb03fa..8b5a4e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.3 (13/07/2015) +v0.3 (20/12/2015) ** User ** Add referers_diff display plugin Add year statistics in month details @@ -21,6 +21,7 @@ v0.3 (13/07/2015) Sort documentation output Add debug traces in robots plugin Update awstats data + Dont count 'uri' and 'uri/' as differents uri ** Bugs ** Forgot tag diff --git a/iwla.py b/iwla.py index 150f699..73d3d2c 100755 --- a/iwla.py +++ b/iwla.py @@ -148,6 +148,7 @@ class IWLA(object): self.log_re = re.compile(self.log_format_extracted) self.uri_re = re.compile(r'(?P[^\?#]+)(\?(?P[^#]+))?(#.*)?') self.domain_name_re = re.compile(r'.*%s' % conf.domain_name) + self.normalize_uri_final_slashes = re.compile(r'/+$') self.plugins = [(conf.PRE_HOOK_DIRECTORY , conf.pre_analysis_hooks), (conf.POST_HOOK_DIRECTORY , conf.post_analysis_hooks), (conf.DISPLAY_HOOK_DIRECTORY , conf.display_hooks)] @@ -334,6 +335,16 @@ class IWLA(object): super_hit['robot'] = False super_hit['hit_only'] = 0 + def _normalizeURI(self, uri): + if uri == '/': return uri + uri = self.normalize_uri_final_slashes.sub('', uri) + return uri + + def _normalizeParameters(self, parameters): + # No parameters + if parameters == '?': return None + return parameters + def _decodeHTTPRequest(self, hit): if not 'request' in hit.keys(): return False @@ -344,9 +355,11 @@ class IWLA(object): uri_groups = self.uri_re.match(hit['extract_request']['http_uri']) if uri_groups: d = uri_groups.groupdict() - hit['extract_request']['extract_uri'] = d['extract_uri'] + hit['extract_request']['extract_uri'] = self._normalizeURI(d['extract_uri']) if 'extract_parameters' in d.keys(): - hit['extract_request']['extract_parameters'] = d['extract_parameters'] + parameters = self._normalizeParameters(d['extract_parameters']) + if parameters: + hit['extract_request']['extract_parameters'] = parameters else: self.logger.warning("Bad request extraction %s" % (hit['request'])) return False @@ -354,7 +367,7 @@ class IWLA(object): if hit['http_referer']: referer_groups = self.uri_re.match(hit['http_referer']) if referer_groups: - hit['extract_referer'] = referer_groups.groupdict() + hit['extract_referer'] = self._normalizeURI(referer_groups.groupdict()) return True def _decodeTime(self, hit): From ec0a3a52a80196edd80a46a3c3afa1e2ae3df23e Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sun, 3 Jan 2016 09:28:19 +0100 Subject: [PATCH 05/22] Fix _normalizeURI substitution. Fix _normalizeParameters. Fix -r argument --- iwla.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iwla.py b/iwla.py index 73d3d2c..caaa7d1 100755 --- a/iwla.py +++ b/iwla.py @@ -337,7 +337,7 @@ class IWLA(object): def _normalizeURI(self, uri): if uri == '/': return uri - uri = self.normalize_uri_final_slashes.sub('', uri) + uri = self.normalize_uri_final_slashes.sub('/', uri) return uri def _normalizeParameters(self, parameters): @@ -367,7 +367,9 @@ class IWLA(object): if hit['http_referer']: referer_groups = self.uri_re.match(hit['http_referer']) if referer_groups: - hit['extract_referer'] = self._normalizeURI(referer_groups.groupdict()) + hit['extract_referer'] = referer_groups.groupdict() + hit['extract_referer']['extract_uri'] = self._normalizeURI(hit['extract_referer']['extract_uri']) + hit['extract_referer']['extract_parameters'] = self._normalizeParameters(hit['extract_referer']['extract_parameters']) return True def _decodeTime(self, hit): @@ -817,7 +819,7 @@ if __name__ == '__main__': default='INFO', type=str, help='Loglevel in %s, default : %s' % (['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], 'INFO')) - parser.add_argument('-r', '--reset', dest='reset', action='store_true', + parser.add_argument('-r', '--reset', dest='reset', default=False, help='Reset analysis to a specific date (month/year)') From 5c750e8b0c406f4d7cd3c1aac2282ea4deffe9b3 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sat, 16 Jan 2016 08:43:29 +0100 Subject: [PATCH 06/22] Remove final slashes for referers --- iwla.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/iwla.py b/iwla.py index caaa7d1..c72c5e1 100755 --- a/iwla.py +++ b/iwla.py @@ -148,7 +148,7 @@ class IWLA(object): self.log_re = re.compile(self.log_format_extracted) self.uri_re = re.compile(r'(?P[^\?#]+)(\?(?P[^#]+))?(#.*)?') self.domain_name_re = re.compile(r'.*%s' % conf.domain_name) - self.normalize_uri_final_slashes = re.compile(r'/+$') + self.final_slashes_re = re.compile(r'/+$') self.plugins = [(conf.PRE_HOOK_DIRECTORY , conf.pre_analysis_hooks), (conf.POST_HOOK_DIRECTORY , conf.post_analysis_hooks), (conf.DISPLAY_HOOK_DIRECTORY , conf.display_hooks)] @@ -337,9 +337,13 @@ class IWLA(object): def _normalizeURI(self, uri): if uri == '/': return uri - uri = self.normalize_uri_final_slashes.sub('/', uri) + uri = self.final_slashes_re.sub('/', uri) return uri + def _removeFinalSlashes(self, uri): + if uri == '/': return uri + return self.final_slashes_re.sub('', uri) + def _normalizeParameters(self, parameters): # No parameters if parameters == '?': return None @@ -368,7 +372,7 @@ class IWLA(object): referer_groups = self.uri_re.match(hit['http_referer']) if referer_groups: hit['extract_referer'] = referer_groups.groupdict() - hit['extract_referer']['extract_uri'] = self._normalizeURI(hit['extract_referer']['extract_uri']) + hit['extract_referer']['extract_uri'] = self._removeFinalSlashes(hit['extract_referer']['extract_uri']) hit['extract_referer']['extract_parameters'] = self._normalizeParameters(hit['extract_referer']['extract_parameters']) return True From 3d927543f7cbbf10575c67fa2567f5a3e11a30e4 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sat, 16 Jan 2016 08:44:57 +0100 Subject: [PATCH 07/22] Syntax error --- iwla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iwla.py b/iwla.py index caaa7d1..66e236d 100755 --- a/iwla.py +++ b/iwla.py @@ -634,7 +634,7 @@ class IWLA(object): for (k, super_hit) in visits.items(): if super_hit['last_access'].tm_mday != cur_time.tm_mday: continue - viewed_page = False + viewed_pages = False for hit in super_hit['requests'][::-1]: if hit['time_decoded'].tm_mday != cur_time.tm_mday: break From 519033e474800f6d93ae54ccac299268f67a4edd Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Mon, 18 Jan 2016 07:33:48 +0100 Subject: [PATCH 08/22] Do reverse DNS on feeds parsers --- ChangeLog | 6 ++++-- iwla.py | 14 +++++++++----- plugins/post_analysis/reverse_dns.py | 5 ++++- tools/iwla_convert.pl | 2 ++ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8b5a4e5..2af6636 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.3 (20/12/2015) +v0.3 (17/01/2016) ** User ** Add referers_diff display plugin Add year statistics in month details @@ -15,13 +15,15 @@ v0.3 (20/12/2015) Add gz files support Add -z option (don't compress databases) Add own search enfines files + Do reverse DNS on feeds parsers ** Dev ** Add istats_diff interface Sort documentation output Add debug traces in robots plugin Update awstats data - Dont count 'uri' and 'uri/' as differents uri + Remove doule // at the end of URL + Remove final slashes for referrers ** Bugs ** Forgot tag diff --git a/iwla.py b/iwla.py index c72c5e1..9453a74 100755 --- a/iwla.py +++ b/iwla.py @@ -289,6 +289,13 @@ class IWLA(object): self.logger.debug("False") return False + def isValidVisitor(self, hit): + if hit['robot']: return False + if not (conf.count_hit_only_visitors or\ + hit['viewed_pages']): + return False + return True + def _appendHit(self, hit): remote_addr = hit['remote_addr'] @@ -596,11 +603,8 @@ class IWLA(object): self.valid_visitors = {} for (k,v) in visits.items(): - if v['robot']: continue - if not (conf.count_hit_only_visitors or\ - v['viewed_pages']): - continue - self.valid_visitors[k] = v + if self.isValidVisitor(v): + self.valid_visitors[k] = v duplicated_stats['nb_visitors'] = stats['nb_visitors'] = len(self.valid_visitors.keys()) diff --git a/plugins/post_analysis/reverse_dns.py b/plugins/post_analysis/reverse_dns.py index c63965f..b94a8cb 100644 --- a/plugins/post_analysis/reverse_dns.py +++ b/plugins/post_analysis/reverse_dns.py @@ -64,9 +64,12 @@ class IWLAPostAnalysisReverseDNS(IPlugin): return True def hook(self): - hits = self.iwla.getValidVisitors() + hits = self.iwla.getCurrentVisists() for (k, hit) in hits.items(): if hit.get('dns_analysed', False): continue + if not hit['feed_parser'] and\ + not self.iwla.isValidVisitor(hit): + continue try: name, _, _ = socket.gethostbyaddr(k) hit['remote_addr'] = name.lower() diff --git a/tools/iwla_convert.pl b/tools/iwla_convert.pl index 696e230..2df1928 100755 --- a/tools/iwla_convert.pl +++ b/tools/iwla_convert.pl @@ -107,3 +107,5 @@ dumpHash(\%BrowsersHashIcon, $FIC, 1); print $FIC "}\n\n"; close($FIC); + +print "Done !\n"; From 79da471398ff8265c7b82eaf54425fba2a0402f8 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Thu, 4 Feb 2016 20:44:36 +0100 Subject: [PATCH 09/22] Fix typo error in getCurrentVisits() method name --- iwla.py | 2 +- plugins/display/feeds.py | 2 +- plugins/display/track_users.py | 2 +- plugins/post_analysis/feeds.py | 2 +- plugins/post_analysis/hours_stats.py | 2 +- plugins/post_analysis/referers.py | 2 +- plugins/post_analysis/reverse_dns.py | 2 +- plugins/post_analysis/top_hits.py | 2 +- plugins/post_analysis/top_pages.py | 2 +- plugins/pre_analysis/page_to_hit.py | 2 +- plugins/pre_analysis/robots.py | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/iwla.py b/iwla.py index 1e24f2e..d6cda8e 100755 --- a/iwla.py +++ b/iwla.py @@ -188,7 +188,7 @@ class IWLA(object): def getMonthStats(self): return self.current_analysis['month_stats'] - def getCurrentVisists(self): + def getCurrentVisits(self): return self.current_analysis['visits'] def getValidVisitors(self): diff --git a/plugins/display/feeds.py b/plugins/display/feeds.py index bcd7194..ca5de4e 100644 --- a/plugins/display/feeds.py +++ b/plugins/display/feeds.py @@ -62,7 +62,7 @@ class IWLADisplayFeeds(IPlugin): from plugins.post_analysis.feeds import IWLAPostAnalysisFeeds display = self.iwla.getDisplay() - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() nb_feeds_parsers = 0 # All in a page diff --git a/plugins/display/track_users.py b/plugins/display/track_users.py index 53b7b9d..8c194f7 100644 --- a/plugins/display/track_users.py +++ b/plugins/display/track_users.py @@ -64,7 +64,7 @@ class IWLADisplayTrackUsers(IPlugin): def hook(self): display = self.iwla.getDisplay() - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() stats = {} # All in a page diff --git a/plugins/post_analysis/feeds.py b/plugins/post_analysis/feeds.py index 8476881..570649f 100644 --- a/plugins/post_analysis/feeds.py +++ b/plugins/post_analysis/feeds.py @@ -85,7 +85,7 @@ class IWLAPostAnalysisFeeds(IPlugin): hit['feed_parser'] = isFeedParser def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() one_hit_only = {} for hit in hits.values(): isFeedParser = hit.get('feed_parser', None) diff --git a/plugins/post_analysis/hours_stats.py b/plugins/post_analysis/hours_stats.py index a45dbdd..4ec9014 100644 --- a/plugins/post_analysis/hours_stats.py +++ b/plugins/post_analysis/hours_stats.py @@ -62,7 +62,7 @@ class IWLAPostAnalysisHoursStats(IPlugin): self.API_VERSION = 1 def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() hours_stats = month_stats.get('hours_stats', {}) diff --git a/plugins/post_analysis/referers.py b/plugins/post_analysis/referers.py index 619963f..aeceb8a 100644 --- a/plugins/post_analysis/referers.py +++ b/plugins/post_analysis/referers.py @@ -120,7 +120,7 @@ class IWLAPostAnalysisReferers(IPlugin): break def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() referers = month_stats.get('referers', {}) diff --git a/plugins/post_analysis/reverse_dns.py b/plugins/post_analysis/reverse_dns.py index b94a8cb..8b04784 100644 --- a/plugins/post_analysis/reverse_dns.py +++ b/plugins/post_analysis/reverse_dns.py @@ -64,7 +64,7 @@ class IWLAPostAnalysisReverseDNS(IPlugin): return True def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() for (k, hit) in hits.items(): if hit.get('dns_analysed', False): continue if not hit['feed_parser'] and\ diff --git a/plugins/post_analysis/top_hits.py b/plugins/post_analysis/top_hits.py index 8006aa7..bc16ddc 100644 --- a/plugins/post_analysis/top_hits.py +++ b/plugins/post_analysis/top_hits.py @@ -53,7 +53,7 @@ class IWLAPostAnalysisTopHits(IPlugin): self.API_VERSION = 1 def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() top_hits = month_stats.get('top_hits', {}) diff --git a/plugins/post_analysis/top_pages.py b/plugins/post_analysis/top_pages.py index 37db81d..1e649d3 100644 --- a/plugins/post_analysis/top_pages.py +++ b/plugins/post_analysis/top_pages.py @@ -59,7 +59,7 @@ class IWLAPostAnalysisTopPages(IPlugin): return True def hook(self): - stats = self.iwla.getCurrentVisists() + stats = self.iwla.getCurrentVisits() month_stats = self.iwla.getMonthStats() top_pages = month_stats.get('top_pages', {}) diff --git a/plugins/pre_analysis/page_to_hit.py b/plugins/pre_analysis/page_to_hit.py index 282f53f..9d8765b 100644 --- a/plugins/pre_analysis/page_to_hit.py +++ b/plugins/pre_analysis/page_to_hit.py @@ -69,7 +69,7 @@ class IWLAPreAnalysisPageToHit(IPlugin): return True def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() for (k, super_hit) in hits.items(): if super_hit['robot']: continue diff --git a/plugins/pre_analysis/robots.py b/plugins/pre_analysis/robots.py index d84087d..6f89bb3 100644 --- a/plugins/pre_analysis/robots.py +++ b/plugins/pre_analysis/robots.py @@ -76,7 +76,7 @@ class IWLAPreAnalysisRobots(IPlugin): # Basic rule to detect robots def hook(self): - hits = self.iwla.getCurrentVisists() + hits = self.iwla.getCurrentVisits() for (k, super_hit) in hits.items(): if super_hit['robot']: self.logger.debug('%s is a robot' % (k)) From bb189425f153a4b5178075e83947c6c0fd36d17d Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Thu, 4 Feb 2016 20:46:12 +0100 Subject: [PATCH 10/22] Add filter mechanism for plugins --- display.py | 47 +++++++++++++++++++++++++++++----- iwla.py | 2 +- plugins/display/track_users.py | 2 +- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/display.py b/display.py index 6be75df..b5a5bc0 100644 --- a/display.py +++ b/display.py @@ -48,10 +48,18 @@ class DisplayHTMLRaw(object): def _build(self, f, html): if html: f.write(html) - def build(self, f): + def build(self, f, filters=None): + if filters: self.filter(filters) self._buildHTML() self._build(f, self.html) + def _filter(self, function, **kwargs): + pass + + def filter(self, filters): + for (args, function) in filters: + self._filter(function, **args) + def getTitle(self): return '' @@ -189,6 +197,18 @@ class DisplayHTMLBlockTable(DisplayHTMLBlock): val = r[column] and int(r[column]) or 0 self.setCellValue(index, column_insertion, '%.1f%%' % (float(val*100)/float(total))) + def _filter(self, function, column, args): + target_col = None + for col in range(0, len(self.cols)): + if self.cols[col] == column: + target_col = col + break + if target_col is None: return + for row in self.rows: + res = function(row[target_col], **args) + if res: + row[target_col] = res + def _buildHTML(self): style = u'' if self.table_css: style = u' class="%s"' % (self.table_css) @@ -315,11 +335,14 @@ class DisplayHTMLPage(object): if title == b.getTitle(): return b return None - + + def getAllBlocks(self): + return self.blocks + def appendBlock(self, block): self.blocks.append(block) - def build(self, root, displayVersion=True): + def build(self, root, displayVersion=True, filters=None): filename = os.path.join(root, self.filename) base = os.path.dirname(filename) @@ -339,7 +362,7 @@ class DisplayHTMLPage(object): f.write(u'%s' % (self.title)) f.write(u'') for block in self.blocks: - block.build(f) + block.build(f, filters=filters) if displayVersion: f.write(u'
Generated by IWLA %s
' % ("http://indefero.soutade.fr/p/iwla", self.iwla.getVersion())) @@ -349,8 +372,12 @@ class DisplayHTMLPage(object): class DisplayHTMLBuild(object): def __init__(self, iwla): - self.pages = [] self.iwla = iwla + self.filters = [] + self.clear() + + def clear(self): + self.pages = [] def createPage(self, *args): return DisplayHTMLPage(self.iwla, *args) @@ -364,6 +391,9 @@ class DisplayHTMLBuild(object): return page return None + def getAllPages(self): + return self.pages + def addPage(self, page): self.pages.append(page) @@ -378,7 +408,11 @@ class DisplayHTMLBuild(object): os.symlink(target, link_name) for page in self.pages: - page.build(root) + page.build(root, filters=self.filters) + + def addColumnFilter(self, column, function, args): + self.filters.append(({'column':column, 'args':args}, function)) + # # Global functions @@ -417,4 +451,3 @@ def createCurTitle(iwla, title): if domain_name: title += u' - %s' % (domain_name) return title - diff --git a/iwla.py b/iwla.py index d6cda8e..480d2f1 100755 --- a/iwla.py +++ b/iwla.py @@ -230,7 +230,7 @@ class IWLA(object): return self.meta_infos def _clearDisplay(self): - self.display = DisplayHTMLBuild(self) + self.display.clear() return self.display def getDBFilename(self, time): diff --git a/plugins/display/track_users.py b/plugins/display/track_users.py index 8c194f7..c653e4a 100644 --- a/plugins/display/track_users.py +++ b/plugins/display/track_users.py @@ -110,7 +110,7 @@ class IWLADisplayTrackUsers(IPlugin): index = self.iwla.getDisplayIndex() - table = display.createBlock(DisplayHTMLBlockTable, title, [self.iwla._(u'IP'), self.iwla._(u'Last Access'), self.iwla._(u'Pages'), self.iwla._(u'Hits')]) + table = display.createBlock(DisplayHTMLBlockTable, title, [self.iwla._(u'Host'), self.iwla._(u'Last Access'), self.iwla._(u'Pages'), self.iwla._(u'Hits')]) table.setColsCSSClass(['', '', 'iwla_page', 'iwla_hit']) for ip in self.tracked_ip: if not ip in hits.keys(): continue From 7a655616ec606960152ff29c6410df7d662353b9 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sat, 6 Feb 2016 14:41:41 +0100 Subject: [PATCH 11/22] Add IPToGeo plugin --- conf.py | 4 +- plugins/display/ip_to_geo.py | 120 +++++++++++++++++++++++++++++ plugins/post_analysis/ip_to_geo.py | 92 ++++++++++++++++++++++ plugins/post_analysis/iptogeo.py | 89 +++++++++++++++++++++ resources/icon/flags/a2.png | Bin 0 -> 381 bytes resources/icon/flags/ac.png | Bin 0 -> 389 bytes resources/icon/flags/ad.png | Bin 0 -> 255 bytes resources/icon/flags/ae.png | Bin 0 -> 224 bytes resources/icon/flags/aero.png | Bin 0 -> 381 bytes resources/icon/flags/af.png | Bin 0 -> 240 bytes resources/icon/flags/ag.png | Bin 0 -> 255 bytes resources/icon/flags/ai.png | Bin 0 -> 271 bytes resources/icon/flags/al.png | Bin 0 -> 247 bytes resources/icon/flags/am.png | Bin 0 -> 219 bytes resources/icon/flags/an.png | Bin 0 -> 241 bytes resources/icon/flags/ao.png | Bin 0 -> 251 bytes resources/icon/flags/aq.png | Bin 0 -> 255 bytes resources/icon/flags/ar.png | Bin 0 -> 231 bytes resources/icon/flags/arpa.png | Bin 0 -> 226 bytes resources/icon/flags/as.png | Bin 0 -> 248 bytes resources/icon/flags/at.png | Bin 0 -> 225 bytes resources/icon/flags/au.png | Bin 0 -> 260 bytes resources/icon/flags/aw.png | Bin 0 -> 222 bytes resources/icon/flags/ax.png | Bin 0 -> 484 bytes resources/icon/flags/az.png | Bin 0 -> 260 bytes resources/icon/flags/ba.png | Bin 0 -> 234 bytes resources/icon/flags/bb.png | Bin 0 -> 252 bytes resources/icon/flags/bd.png | Bin 0 -> 248 bytes resources/icon/flags/be.png | Bin 0 -> 246 bytes resources/icon/flags/bf.png | Bin 0 -> 258 bytes resources/icon/flags/bg.png | Bin 0 -> 226 bytes resources/icon/flags/bh.png | Bin 0 -> 229 bytes resources/icon/flags/bi.png | Bin 0 -> 244 bytes resources/icon/flags/biz.png | Bin 0 -> 381 bytes resources/icon/flags/bj.png | Bin 0 -> 182 bytes resources/icon/flags/bm.png | Bin 0 -> 298 bytes resources/icon/flags/bn.png | Bin 0 -> 286 bytes resources/icon/flags/bo.png | Bin 0 -> 224 bytes resources/icon/flags/br.png | Bin 0 -> 279 bytes resources/icon/flags/bs.png | Bin 0 -> 242 bytes resources/icon/flags/bt.png | Bin 0 -> 294 bytes resources/icon/flags/bv.png | Bin 0 -> 243 bytes resources/icon/flags/bw.png | Bin 0 -> 232 bytes resources/icon/flags/by.png | Bin 0 -> 198 bytes resources/icon/flags/bz.png | Bin 0 -> 253 bytes resources/icon/flags/ca.png | Bin 0 -> 258 bytes resources/icon/flags/cc.png | Bin 0 -> 260 bytes resources/icon/flags/cd.png | Bin 0 -> 268 bytes resources/icon/flags/cf.png | Bin 0 -> 281 bytes resources/icon/flags/cg.png | Bin 0 -> 251 bytes resources/icon/flags/ch.png | Bin 0 -> 256 bytes resources/icon/flags/ci.png | Bin 0 -> 200 bytes resources/icon/flags/ck.png | Bin 0 -> 285 bytes resources/icon/flags/cl.png | Bin 0 -> 237 bytes resources/icon/flags/cm.png | Bin 0 -> 226 bytes resources/icon/flags/cn.png | Bin 0 -> 253 bytes resources/icon/flags/co.png | Bin 0 -> 229 bytes resources/icon/flags/com.png | Bin 0 -> 381 bytes resources/icon/flags/coop.png | Bin 0 -> 381 bytes resources/icon/flags/cr.png | Bin 0 -> 241 bytes resources/icon/flags/cs.png | Bin 0 -> 239 bytes resources/icon/flags/cu.png | Bin 0 -> 249 bytes resources/icon/flags/cv.png | Bin 0 -> 247 bytes resources/icon/flags/cx.png | Bin 0 -> 280 bytes resources/icon/flags/cy.png | Bin 0 -> 256 bytes resources/icon/flags/cz.png | Bin 0 -> 239 bytes resources/icon/flags/de.png | Bin 0 -> 192 bytes resources/icon/flags/dj.png | Bin 0 -> 244 bytes resources/icon/flags/dk.png | Bin 0 -> 223 bytes resources/icon/flags/dm.png | Bin 0 -> 267 bytes resources/icon/flags/do.png | Bin 0 -> 226 bytes resources/icon/flags/dz.png | Bin 0 -> 253 bytes resources/icon/flags/ec.png | Bin 0 -> 245 bytes resources/icon/flags/edu.png | Bin 0 -> 256 bytes resources/icon/flags/ee.png | Bin 0 -> 206 bytes resources/icon/flags/eg.png | Bin 0 -> 236 bytes resources/icon/flags/eh.png | Bin 0 -> 262 bytes resources/icon/flags/en.png | Bin 0 -> 302 bytes resources/icon/flags/er.png | Bin 0 -> 250 bytes resources/icon/flags/es.png | Bin 0 -> 231 bytes resources/icon/flags/es_cat.png | Bin 0 -> 229 bytes resources/icon/flags/es_eu.png | Bin 0 -> 309 bytes resources/icon/flags/et.png | Bin 0 -> 259 bytes resources/icon/flags/eu.png | Bin 0 -> 269 bytes resources/icon/flags/fi.png | Bin 0 -> 239 bytes resources/icon/flags/fj.png | Bin 0 -> 299 bytes resources/icon/flags/fk.png | Bin 0 -> 310 bytes resources/icon/flags/fm.png | Bin 0 -> 263 bytes resources/icon/flags/fo.png | Bin 0 -> 234 bytes resources/icon/flags/fr.png | Bin 0 -> 191 bytes resources/icon/flags/fx.png | Bin 0 -> 191 bytes resources/icon/flags/ga.png | Bin 0 -> 199 bytes resources/icon/flags/gb.png | Bin 0 -> 280 bytes resources/icon/flags/gd.png | Bin 0 -> 298 bytes resources/icon/flags/ge.png | Bin 0 -> 223 bytes resources/icon/flags/gf.png | Bin 0 -> 264 bytes resources/icon/flags/gg.png | Bin 0 -> 605 bytes resources/icon/flags/gh.png | Bin 0 -> 237 bytes resources/icon/flags/gi.png | Bin 0 -> 289 bytes resources/icon/flags/gl.png | Bin 0 -> 240 bytes resources/icon/flags/glg.png | Bin 0 -> 922 bytes resources/icon/flags/gm.png | Bin 0 -> 228 bytes resources/icon/flags/gn.png | Bin 0 -> 200 bytes resources/icon/flags/gov.png | Bin 0 -> 256 bytes resources/icon/flags/gp.png | Bin 0 -> 257 bytes resources/icon/flags/gq.png | Bin 0 -> 278 bytes resources/icon/flags/gr.png | Bin 0 -> 256 bytes resources/icon/flags/gs.png | Bin 0 -> 215 bytes resources/icon/flags/gt.png | Bin 0 -> 278 bytes resources/icon/flags/gu.png | Bin 0 -> 303 bytes resources/icon/flags/gw.png | Bin 0 -> 244 bytes resources/icon/flags/gy.png | Bin 0 -> 287 bytes resources/icon/flags/hk.png | Bin 0 -> 248 bytes resources/icon/flags/hm.png | Bin 0 -> 260 bytes resources/icon/flags/hn.png | Bin 0 -> 253 bytes resources/icon/flags/hr.png | Bin 0 -> 246 bytes resources/icon/flags/ht.png | Bin 0 -> 184 bytes resources/icon/flags/hu.png | Bin 0 -> 210 bytes resources/icon/flags/i0.png | Bin 0 -> 226 bytes resources/icon/flags/id.png | Bin 0 -> 217 bytes resources/icon/flags/ie.png | Bin 0 -> 229 bytes resources/icon/flags/il.png | Bin 0 -> 250 bytes resources/icon/flags/im.png | Bin 0 -> 291 bytes resources/icon/flags/in.png | Bin 0 -> 239 bytes resources/icon/flags/info.png | Bin 0 -> 381 bytes resources/icon/flags/int.png | Bin 0 -> 310 bytes resources/icon/flags/io.png | Bin 0 -> 351 bytes resources/icon/flags/ip.png | Bin 0 -> 218 bytes resources/icon/flags/iq.png | Bin 0 -> 238 bytes resources/icon/flags/ir.png | Bin 0 -> 244 bytes resources/icon/flags/is.png | Bin 0 -> 242 bytes resources/icon/flags/it.png | Bin 0 -> 191 bytes resources/icon/flags/jm.png | Bin 0 -> 262 bytes resources/icon/flags/jo.png | Bin 0 -> 246 bytes resources/icon/flags/jp.png | Bin 0 -> 248 bytes resources/icon/flags/ke.png | Bin 0 -> 250 bytes resources/icon/flags/kg.png | Bin 0 -> 253 bytes resources/icon/flags/kh.png | Bin 0 -> 239 bytes resources/icon/flags/ki.png | Bin 0 -> 336 bytes resources/icon/flags/km.png | Bin 0 -> 260 bytes resources/icon/flags/kn.png | Bin 0 -> 305 bytes resources/icon/flags/kp.png | Bin 0 -> 272 bytes resources/icon/flags/kr.png | Bin 0 -> 270 bytes resources/icon/flags/kw.png | Bin 0 -> 234 bytes resources/icon/flags/ky.png | Bin 0 -> 309 bytes resources/icon/flags/kz.png | Bin 0 -> 291 bytes resources/icon/flags/la.png | Bin 0 -> 239 bytes resources/icon/flags/lb.png | Bin 0 -> 265 bytes resources/icon/flags/lc.png | Bin 0 -> 273 bytes resources/icon/flags/li.png | Bin 0 -> 231 bytes resources/icon/flags/lk.png | Bin 0 -> 287 bytes resources/icon/flags/lr.png | Bin 0 -> 257 bytes resources/icon/flags/ls.png | Bin 0 -> 281 bytes resources/icon/flags/lt.png | Bin 0 -> 192 bytes resources/icon/flags/lu.png | Bin 0 -> 206 bytes resources/icon/flags/lv.png | Bin 0 -> 229 bytes resources/icon/flags/ly.png | Bin 0 -> 181 bytes resources/icon/flags/ma.png | Bin 0 -> 242 bytes resources/icon/flags/mc.png | Bin 0 -> 184 bytes resources/icon/flags/md.png | Bin 0 -> 268 bytes resources/icon/flags/me.png | Bin 0 -> 339 bytes resources/icon/flags/mg.png | Bin 0 -> 168 bytes resources/icon/flags/mil.png | Bin 0 -> 252 bytes resources/icon/flags/mk.png | Bin 0 -> 256 bytes resources/icon/flags/ml.png | Bin 0 -> 137 bytes resources/icon/flags/mm.png | Bin 0 -> 279 bytes resources/icon/flags/mn.png | Bin 0 -> 245 bytes resources/icon/flags/mo.png | Bin 0 -> 283 bytes resources/icon/flags/mp.png | Bin 0 -> 466 bytes resources/icon/flags/mq.png | Bin 0 -> 191 bytes resources/icon/flags/mr.png | Bin 0 -> 238 bytes resources/icon/flags/ms.png | Bin 0 -> 258 bytes resources/icon/flags/mt.png | Bin 0 -> 229 bytes resources/icon/flags/mu.png | Bin 0 -> 214 bytes resources/icon/flags/museum.png | Bin 0 -> 381 bytes resources/icon/flags/mv.png | Bin 0 -> 226 bytes resources/icon/flags/mw.png | Bin 0 -> 480 bytes resources/icon/flags/mx.png | Bin 0 -> 231 bytes resources/icon/flags/my.png | Bin 0 -> 272 bytes resources/icon/flags/mz.png | Bin 0 -> 294 bytes resources/icon/flags/na.png | Bin 0 -> 300 bytes resources/icon/flags/name.png | Bin 0 -> 381 bytes resources/icon/flags/nato.png | Bin 0 -> 158 bytes resources/icon/flags/nb.png | Bin 0 -> 243 bytes resources/icon/flags/nc.png | Bin 0 -> 191 bytes resources/icon/flags/ne.png | Bin 0 -> 247 bytes resources/icon/flags/net.png | Bin 0 -> 381 bytes resources/icon/flags/ng.png | Bin 0 -> 220 bytes resources/icon/flags/ni.png | Bin 0 -> 246 bytes resources/icon/flags/nl.png | Bin 0 -> 214 bytes resources/icon/flags/nn.png | Bin 0 -> 243 bytes resources/icon/flags/no.png | Bin 0 -> 243 bytes resources/icon/flags/np.png | Bin 0 -> 288 bytes resources/icon/flags/nr.png | Bin 0 -> 461 bytes resources/icon/flags/nt.png | Bin 0 -> 381 bytes resources/icon/flags/nu.png | Bin 0 -> 280 bytes resources/icon/flags/nz.png | Bin 0 -> 254 bytes resources/icon/flags/om.png | Bin 0 -> 230 bytes resources/icon/flags/org.png | Bin 0 -> 381 bytes resources/icon/flags/pa.png | Bin 0 -> 265 bytes resources/icon/flags/pe.png | Bin 0 -> 238 bytes resources/icon/flags/pf.png | Bin 0 -> 276 bytes resources/icon/flags/pg.png | Bin 0 -> 215 bytes resources/icon/flags/ph.png | Bin 0 -> 267 bytes resources/icon/flags/pk.png | Bin 0 -> 269 bytes resources/icon/flags/pl.png | Bin 0 -> 241 bytes resources/icon/flags/pr.png | Bin 0 -> 313 bytes resources/icon/flags/pro.png | Bin 0 -> 381 bytes resources/icon/flags/ps.png | Bin 0 -> 222 bytes resources/icon/flags/pt.png | Bin 0 -> 249 bytes resources/icon/flags/py.png | Bin 0 -> 256 bytes resources/icon/flags/qa.png | Bin 0 -> 242 bytes resources/icon/flags/re.png | Bin 0 -> 308 bytes resources/icon/flags/ro.png | Bin 0 -> 232 bytes resources/icon/flags/rs.png | Bin 0 -> 684 bytes resources/icon/flags/ru.png | Bin 0 -> 220 bytes resources/icon/flags/rw.png | Bin 0 -> 247 bytes resources/icon/flags/sa.png | Bin 0 -> 245 bytes resources/icon/flags/sb.png | Bin 0 -> 299 bytes resources/icon/flags/sc.png | Bin 0 -> 330 bytes resources/icon/flags/sd.png | Bin 0 -> 299 bytes resources/icon/flags/se.png | Bin 0 -> 229 bytes resources/icon/flags/sg.png | Bin 0 -> 233 bytes resources/icon/flags/si.png | Bin 0 -> 249 bytes resources/icon/flags/sk.png | Bin 0 -> 251 bytes resources/icon/flags/sl.png | Bin 0 -> 469 bytes resources/icon/flags/sm.png | Bin 0 -> 148 bytes resources/icon/flags/sn.png | Bin 0 -> 258 bytes resources/icon/flags/sr.png | Bin 0 -> 205 bytes resources/icon/flags/st.png | Bin 0 -> 233 bytes resources/icon/flags/su.png | Bin 0 -> 238 bytes resources/icon/flags/sv.png | Bin 0 -> 219 bytes resources/icon/flags/sy.png | Bin 0 -> 238 bytes resources/icon/flags/sz.png | Bin 0 -> 319 bytes resources/icon/flags/tc.png | Bin 0 -> 272 bytes resources/icon/flags/td.png | Bin 0 -> 222 bytes resources/icon/flags/tf.png | Bin 0 -> 231 bytes resources/icon/flags/tg.png | Bin 0 -> 238 bytes resources/icon/flags/th.png | Bin 0 -> 229 bytes resources/icon/flags/tk.png | Bin 0 -> 270 bytes resources/icon/flags/tm.png | Bin 0 -> 291 bytes resources/icon/flags/tn.png | Bin 0 -> 234 bytes resources/icon/flags/to.png | Bin 0 -> 231 bytes resources/icon/flags/tr.png | Bin 0 -> 244 bytes resources/icon/flags/tt.png | Bin 0 -> 223 bytes resources/icon/flags/tv.png | Bin 0 -> 274 bytes resources/icon/flags/tw.png | Bin 0 -> 226 bytes resources/icon/flags/tz.png | Bin 0 -> 250 bytes resources/icon/flags/ua.png | Bin 0 -> 239 bytes resources/icon/flags/ug.png | Bin 0 -> 224 bytes resources/icon/flags/uk.png | Bin 0 -> 284 bytes resources/icon/flags/um.png | Bin 0 -> 171 bytes resources/icon/flags/unknown.png | Bin 0 -> 191 bytes resources/icon/flags/us.png | Bin 0 -> 252 bytes resources/icon/flags/uy.png | Bin 0 -> 251 bytes resources/icon/flags/uz.png | Bin 0 -> 247 bytes resources/icon/flags/va.png | Bin 0 -> 220 bytes resources/icon/flags/vc.png | Bin 0 -> 210 bytes resources/icon/flags/ve.png | Bin 0 -> 237 bytes resources/icon/flags/vg.png | Bin 0 -> 226 bytes resources/icon/flags/vi.png | Bin 0 -> 275 bytes resources/icon/flags/vn.png | Bin 0 -> 237 bytes resources/icon/flags/vu.png | Bin 0 -> 223 bytes resources/icon/flags/wf.png | Bin 0 -> 260 bytes resources/icon/flags/wlk.png | Bin 0 -> 268 bytes resources/icon/flags/ws.png | Bin 0 -> 347 bytes resources/icon/flags/ye.png | Bin 0 -> 202 bytes resources/icon/flags/yt.png | Bin 0 -> 191 bytes resources/icon/flags/yu.png | Bin 0 -> 206 bytes resources/icon/flags/za.png | Bin 0 -> 251 bytes resources/icon/flags/ze.png | Bin 0 -> 253 bytes resources/icon/flags/zm.png | Bin 0 -> 240 bytes resources/icon/flags/zw.png | Bin 0 -> 271 bytes 273 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 plugins/display/ip_to_geo.py create mode 100644 plugins/post_analysis/ip_to_geo.py create mode 100644 plugins/post_analysis/iptogeo.py create mode 100644 resources/icon/flags/a2.png create mode 100644 resources/icon/flags/ac.png create mode 100644 resources/icon/flags/ad.png create mode 100644 resources/icon/flags/ae.png create mode 100644 resources/icon/flags/aero.png create mode 100644 resources/icon/flags/af.png create mode 100644 resources/icon/flags/ag.png create mode 100644 resources/icon/flags/ai.png create mode 100644 resources/icon/flags/al.png create mode 100644 resources/icon/flags/am.png create mode 100644 resources/icon/flags/an.png create mode 100644 resources/icon/flags/ao.png create mode 100644 resources/icon/flags/aq.png create mode 100644 resources/icon/flags/ar.png create mode 100644 resources/icon/flags/arpa.png create mode 100644 resources/icon/flags/as.png create mode 100644 resources/icon/flags/at.png create mode 100644 resources/icon/flags/au.png create mode 100644 resources/icon/flags/aw.png create mode 100644 resources/icon/flags/ax.png create mode 100644 resources/icon/flags/az.png create mode 100644 resources/icon/flags/ba.png create mode 100644 resources/icon/flags/bb.png create mode 100644 resources/icon/flags/bd.png create mode 100644 resources/icon/flags/be.png create mode 100644 resources/icon/flags/bf.png create mode 100644 resources/icon/flags/bg.png create mode 100644 resources/icon/flags/bh.png create mode 100644 resources/icon/flags/bi.png create mode 100644 resources/icon/flags/biz.png create mode 100644 resources/icon/flags/bj.png create mode 100644 resources/icon/flags/bm.png create mode 100644 resources/icon/flags/bn.png create mode 100644 resources/icon/flags/bo.png create mode 100644 resources/icon/flags/br.png create mode 100644 resources/icon/flags/bs.png create mode 100644 resources/icon/flags/bt.png create mode 100644 resources/icon/flags/bv.png create mode 100644 resources/icon/flags/bw.png create mode 100644 resources/icon/flags/by.png create mode 100644 resources/icon/flags/bz.png create mode 100644 resources/icon/flags/ca.png create mode 100644 resources/icon/flags/cc.png create mode 100644 resources/icon/flags/cd.png create mode 100644 resources/icon/flags/cf.png create mode 100644 resources/icon/flags/cg.png create mode 100644 resources/icon/flags/ch.png create mode 100644 resources/icon/flags/ci.png create mode 100644 resources/icon/flags/ck.png create mode 100644 resources/icon/flags/cl.png create mode 100644 resources/icon/flags/cm.png create mode 100644 resources/icon/flags/cn.png create mode 100644 resources/icon/flags/co.png create mode 100644 resources/icon/flags/com.png create mode 100644 resources/icon/flags/coop.png create mode 100644 resources/icon/flags/cr.png create mode 100644 resources/icon/flags/cs.png create mode 100644 resources/icon/flags/cu.png create mode 100644 resources/icon/flags/cv.png create mode 100644 resources/icon/flags/cx.png create mode 100644 resources/icon/flags/cy.png create mode 100644 resources/icon/flags/cz.png create mode 100644 resources/icon/flags/de.png create mode 100644 resources/icon/flags/dj.png create mode 100644 resources/icon/flags/dk.png create mode 100644 resources/icon/flags/dm.png create mode 100644 resources/icon/flags/do.png create mode 100644 resources/icon/flags/dz.png create mode 100644 resources/icon/flags/ec.png create mode 100644 resources/icon/flags/edu.png create mode 100644 resources/icon/flags/ee.png create mode 100644 resources/icon/flags/eg.png create mode 100644 resources/icon/flags/eh.png create mode 100644 resources/icon/flags/en.png create mode 100644 resources/icon/flags/er.png create mode 100644 resources/icon/flags/es.png create mode 100644 resources/icon/flags/es_cat.png create mode 100644 resources/icon/flags/es_eu.png create mode 100644 resources/icon/flags/et.png create mode 100644 resources/icon/flags/eu.png create mode 100644 resources/icon/flags/fi.png create mode 100644 resources/icon/flags/fj.png create mode 100644 resources/icon/flags/fk.png create mode 100644 resources/icon/flags/fm.png create mode 100644 resources/icon/flags/fo.png create mode 100644 resources/icon/flags/fr.png create mode 100644 resources/icon/flags/fx.png create mode 100644 resources/icon/flags/ga.png create mode 100644 resources/icon/flags/gb.png create mode 100644 resources/icon/flags/gd.png create mode 100644 resources/icon/flags/ge.png create mode 100644 resources/icon/flags/gf.png create mode 100644 resources/icon/flags/gg.png create mode 100644 resources/icon/flags/gh.png create mode 100644 resources/icon/flags/gi.png create mode 100644 resources/icon/flags/gl.png create mode 100644 resources/icon/flags/glg.png create mode 100644 resources/icon/flags/gm.png create mode 100644 resources/icon/flags/gn.png create mode 100644 resources/icon/flags/gov.png create mode 100644 resources/icon/flags/gp.png create mode 100644 resources/icon/flags/gq.png create mode 100644 resources/icon/flags/gr.png create mode 100644 resources/icon/flags/gs.png create mode 100644 resources/icon/flags/gt.png create mode 100644 resources/icon/flags/gu.png create mode 100644 resources/icon/flags/gw.png create mode 100644 resources/icon/flags/gy.png create mode 100644 resources/icon/flags/hk.png create mode 100644 resources/icon/flags/hm.png create mode 100644 resources/icon/flags/hn.png create mode 100644 resources/icon/flags/hr.png create mode 100644 resources/icon/flags/ht.png create mode 100644 resources/icon/flags/hu.png create mode 100644 resources/icon/flags/i0.png create mode 100644 resources/icon/flags/id.png create mode 100644 resources/icon/flags/ie.png create mode 100644 resources/icon/flags/il.png create mode 100644 resources/icon/flags/im.png create mode 100644 resources/icon/flags/in.png create mode 100644 resources/icon/flags/info.png create mode 100644 resources/icon/flags/int.png create mode 100644 resources/icon/flags/io.png create mode 100644 resources/icon/flags/ip.png create mode 100644 resources/icon/flags/iq.png create mode 100644 resources/icon/flags/ir.png create mode 100644 resources/icon/flags/is.png create mode 100644 resources/icon/flags/it.png create mode 100644 resources/icon/flags/jm.png create mode 100644 resources/icon/flags/jo.png create mode 100644 resources/icon/flags/jp.png create mode 100644 resources/icon/flags/ke.png create mode 100644 resources/icon/flags/kg.png create mode 100644 resources/icon/flags/kh.png create mode 100644 resources/icon/flags/ki.png create mode 100644 resources/icon/flags/km.png create mode 100644 resources/icon/flags/kn.png create mode 100644 resources/icon/flags/kp.png create mode 100644 resources/icon/flags/kr.png create mode 100644 resources/icon/flags/kw.png create mode 100644 resources/icon/flags/ky.png create mode 100644 resources/icon/flags/kz.png create mode 100644 resources/icon/flags/la.png create mode 100644 resources/icon/flags/lb.png create mode 100644 resources/icon/flags/lc.png create mode 100644 resources/icon/flags/li.png create mode 100644 resources/icon/flags/lk.png create mode 100644 resources/icon/flags/lr.png create mode 100644 resources/icon/flags/ls.png create mode 100644 resources/icon/flags/lt.png create mode 100644 resources/icon/flags/lu.png create mode 100644 resources/icon/flags/lv.png create mode 100644 resources/icon/flags/ly.png create mode 100644 resources/icon/flags/ma.png create mode 100644 resources/icon/flags/mc.png create mode 100644 resources/icon/flags/md.png create mode 100644 resources/icon/flags/me.png create mode 100644 resources/icon/flags/mg.png create mode 100644 resources/icon/flags/mil.png create mode 100644 resources/icon/flags/mk.png create mode 100644 resources/icon/flags/ml.png create mode 100644 resources/icon/flags/mm.png create mode 100644 resources/icon/flags/mn.png create mode 100644 resources/icon/flags/mo.png create mode 100644 resources/icon/flags/mp.png create mode 100644 resources/icon/flags/mq.png create mode 100644 resources/icon/flags/mr.png create mode 100644 resources/icon/flags/ms.png create mode 100644 resources/icon/flags/mt.png create mode 100644 resources/icon/flags/mu.png create mode 100644 resources/icon/flags/museum.png create mode 100644 resources/icon/flags/mv.png create mode 100644 resources/icon/flags/mw.png create mode 100644 resources/icon/flags/mx.png create mode 100644 resources/icon/flags/my.png create mode 100644 resources/icon/flags/mz.png create mode 100644 resources/icon/flags/na.png create mode 100644 resources/icon/flags/name.png create mode 100644 resources/icon/flags/nato.png create mode 100644 resources/icon/flags/nb.png create mode 100644 resources/icon/flags/nc.png create mode 100644 resources/icon/flags/ne.png create mode 100644 resources/icon/flags/net.png create mode 100644 resources/icon/flags/ng.png create mode 100644 resources/icon/flags/ni.png create mode 100644 resources/icon/flags/nl.png create mode 100644 resources/icon/flags/nn.png create mode 100644 resources/icon/flags/no.png create mode 100644 resources/icon/flags/np.png create mode 100644 resources/icon/flags/nr.png create mode 100644 resources/icon/flags/nt.png create mode 100644 resources/icon/flags/nu.png create mode 100644 resources/icon/flags/nz.png create mode 100644 resources/icon/flags/om.png create mode 100644 resources/icon/flags/org.png create mode 100644 resources/icon/flags/pa.png create mode 100644 resources/icon/flags/pe.png create mode 100644 resources/icon/flags/pf.png create mode 100644 resources/icon/flags/pg.png create mode 100644 resources/icon/flags/ph.png create mode 100644 resources/icon/flags/pk.png create mode 100644 resources/icon/flags/pl.png create mode 100644 resources/icon/flags/pr.png create mode 100644 resources/icon/flags/pro.png create mode 100644 resources/icon/flags/ps.png create mode 100644 resources/icon/flags/pt.png create mode 100644 resources/icon/flags/py.png create mode 100644 resources/icon/flags/qa.png create mode 100644 resources/icon/flags/re.png create mode 100644 resources/icon/flags/ro.png create mode 100644 resources/icon/flags/rs.png create mode 100644 resources/icon/flags/ru.png create mode 100644 resources/icon/flags/rw.png create mode 100644 resources/icon/flags/sa.png create mode 100644 resources/icon/flags/sb.png create mode 100644 resources/icon/flags/sc.png create mode 100644 resources/icon/flags/sd.png create mode 100644 resources/icon/flags/se.png create mode 100644 resources/icon/flags/sg.png create mode 100644 resources/icon/flags/si.png create mode 100644 resources/icon/flags/sk.png create mode 100644 resources/icon/flags/sl.png create mode 100644 resources/icon/flags/sm.png create mode 100644 resources/icon/flags/sn.png create mode 100644 resources/icon/flags/sr.png create mode 100644 resources/icon/flags/st.png create mode 100644 resources/icon/flags/su.png create mode 100644 resources/icon/flags/sv.png create mode 100644 resources/icon/flags/sy.png create mode 100644 resources/icon/flags/sz.png create mode 100644 resources/icon/flags/tc.png create mode 100644 resources/icon/flags/td.png create mode 100644 resources/icon/flags/tf.png create mode 100644 resources/icon/flags/tg.png create mode 100644 resources/icon/flags/th.png create mode 100644 resources/icon/flags/tk.png create mode 100644 resources/icon/flags/tm.png create mode 100644 resources/icon/flags/tn.png create mode 100644 resources/icon/flags/to.png create mode 100644 resources/icon/flags/tr.png create mode 100644 resources/icon/flags/tt.png create mode 100644 resources/icon/flags/tv.png create mode 100644 resources/icon/flags/tw.png create mode 100644 resources/icon/flags/tz.png create mode 100644 resources/icon/flags/ua.png create mode 100644 resources/icon/flags/ug.png create mode 100644 resources/icon/flags/uk.png create mode 100644 resources/icon/flags/um.png create mode 100644 resources/icon/flags/unknown.png create mode 100644 resources/icon/flags/us.png create mode 100644 resources/icon/flags/uy.png create mode 100644 resources/icon/flags/uz.png create mode 100644 resources/icon/flags/va.png create mode 100644 resources/icon/flags/vc.png create mode 100644 resources/icon/flags/ve.png create mode 100644 resources/icon/flags/vg.png create mode 100644 resources/icon/flags/vi.png create mode 100644 resources/icon/flags/vn.png create mode 100644 resources/icon/flags/vu.png create mode 100644 resources/icon/flags/wf.png create mode 100644 resources/icon/flags/wlk.png create mode 100644 resources/icon/flags/ws.png create mode 100644 resources/icon/flags/ye.png create mode 100644 resources/icon/flags/yt.png create mode 100644 resources/icon/flags/yu.png create mode 100644 resources/icon/flags/za.png create mode 100644 resources/icon/flags/ze.png create mode 100644 resources/icon/flags/zm.png create mode 100644 resources/icon/flags/zw.png diff --git a/conf.py b/conf.py index e06aa5b..330196b 100644 --- a/conf.py +++ b/conf.py @@ -10,8 +10,8 @@ display_visitor_ip = True # Hooks used pre_analysis_hooks = ['page_to_hit', 'robots'] -post_analysis_hooks = ['referers', 'top_pages', 'top_downloads', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'reverse_dns'] -display_hooks = ['track_users', 'top_visitors', 'all_visits', 'referers', 'top_pages', 'top_downloads', 'referers_diff', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'top_downloads_diff'] +post_analysis_hooks = ['referers', 'top_pages', 'top_downloads', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'reverse_dns', 'ip_to_geo'] +display_hooks = ['track_users', 'top_visitors', 'all_visits', 'referers', 'top_pages', 'top_downloads', 'referers_diff', 'ip_to_geo', 'operating_systems', 'browsers', 'feeds', 'hours_stats', 'top_downloads_diff'] # Reverse DNS timeout reverse_dns_timeout = 0.2 diff --git a/plugins/display/ip_to_geo.py b/plugins/display/ip_to_geo.py new file mode 100644 index 0000000..c0127ac --- /dev/null +++ b/plugins/display/ip_to_geo.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +# +# Copyright Grégory Soutadé 2015 + +# This file is part of iwla + +# iwla is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iwla is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with iwla. If not, see . +# + +import re + +from iwla import IWLA +from iplugin import IPlugin +from display import * + +import awstats_data + +""" +Display hook + +Add geo statistics + +Plugin requirements : + post_analysis/ip_to_geo + +Conf values needed : + create_geo_page* + +Output files : + OUTPUT_ROOT/year/month/index.html + +Statistics creation : + None + +Statistics update : + None + +Statistics deletion : + None +""" + +class IWLADisplayTopGeo(IPlugin): + def __init__(self, iwla): + super(IWLADisplayTopGeo, self).__init__(iwla) + self.API_VERSION = 1 + self.requires = ['IWLAPostAnalysisIPToGeo'] + + def load(self): + self.icon_path = self.iwla.getConfValue('icon_path', '/') + self.create_geo_page = self.iwla.getConfValue('create_geo_page_page', True) + + display = self.iwla.getDisplay() + display.addColumnFilter(self.iwla._(u'Host'), self.FlagFilter, {'self':self}) + + return True + + @staticmethod # Needed to have unbound methd + def FlagFilter(host, self): + cc = None + host_name = host.split(' ')[0] # hostname or ip + if host_name in self.valid_visitors.keys(): + cc = self.valid_visitors[host_name]['country_code'] + else: + for visitor in self.valid_visitors.values(): + if visitor['remote_addr'] == host_name: + cc = visitor['country_code'] + break + if not cc or cc == 'ip': return None + icon = '' % (self.icon_path, cc) + return '%s %s' % (icon ,host) + + def hook(self): + display = self.iwla.getDisplay() + geo = self.iwla.getMonthStats()['geo'] + geo = sorted(geo.items(), key=lambda t: t[1], reverse=True) + self.valid_visitors = self.iwla.getValidVisitors() + + # All in a page + if self.create_geo_page: + title = createCurTitle(self.iwla, u'All Coutries') + filename = 'geo.html' + path = self.iwla.getCurDisplayPath(filename) + + page = display.createPage(title, path, self.iwla.getConfValue('css_path', [])) + table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Countries'), ['', self.iwla._(u'Country'), self.iwla._(u'Visitors')]) + table.setColsCSSClass(['', '', 'iwla_hit']) + for (cc, visitors) in geo: + icon = '' % (self.icon_path, cc) + table.appendRow([icon, cc, visitors]) + table.computeRatio(2) + page.appendBlock(table) + + display.addPage(page) + + # Countries in index + title = self.iwla._(u'Countries') + if self.create_geo_page: + link = '%s' % (filename, self.iwla._(u'Details')) + title = '%s - %s' % (title, link) + + index = self.iwla.getDisplayIndex() + + table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Countries'), self.iwla._(u'Visitors')]) + table.setColsCSSClass(['', '', 'iwla_hit']) + for (cc, visitors) in geo[:10]: + icon = '' % (self.icon_path, cc) + table.appendRow([icon, cc, visitors]) + table.computeRatio(2) + index.appendBlock(table) diff --git a/plugins/post_analysis/ip_to_geo.py b/plugins/post_analysis/ip_to_geo.py new file mode 100644 index 0000000..a15e016 --- /dev/null +++ b/plugins/post_analysis/ip_to_geo.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# +# Copyright Grégory Soutadé 2016 + +# This file is part of iwla + +# iwla is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iwla is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with iwla. If not, see . +# + +from iwla import IWLA +from iplugin import IPlugin + +from iptogeo import IPToGeo + +""" +Post analysis hook + +Get country code from IP address + +Plugin requirements : + None + +Conf values needed : + iptogeo_remote_addr* + iptogeo_remote_port* + +Output files : + None + +Statistics creation : + geo => + country_code => count + None + +Statistics update : +valid_visitors: + country_code + +Statistics deletion : + None +""" + +class IWLAPostAnalysisIPToGeo(IPlugin): + + def __init__(self, iwla): + super(IWLAPostAnalysisIPToGeo, self).__init__(iwla) + self.API_VERSION = 1 + + def load(self): + remote_addr = self.iwla.getConfValue('iptogeo_remote_addr', + None) + remote_port = self.iwla.getConfValue('iptogeo_remote_port', + None) + + args = {} + if remote_addr: args['remote_addr'] = remote_addr + if remote_port: args['remote_port'] = remote_port + self.iptogeo = IPToGeo(**args) + + return True + + def hook(self): + visitors = self.iwla.getValidVisitors() + month_stats = self.iwla.getMonthStats() + + geo = month_stats.get('geo', {}) + + for (ip, visitor) in visitors.items(): + if visitor.get('country_code', False): continue + try: + (_, cc) = self.iptogeo.ip_to_geo(ip) + cc = cc and cc or 'ip' + visitor['country_code'] = cc + if cc in geo.keys(): + geo[cc] += 1 + else: + geo[cc] = 1 + except Exception, e: + print e + + month_stats['geo'] = geo diff --git a/plugins/post_analysis/iptogeo.py b/plugins/post_analysis/iptogeo.py new file mode 100644 index 0000000..f887346 --- /dev/null +++ b/plugins/post_analysis/iptogeo.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import socket +import struct + +class IPToGeoException(Exception): + pass + +class IPToGeo(object): + + MAGIC = 0x179E08EF + VERSION = 1 + REQ = 1 + RESP = 0 + IPV4 = 4 + IPV6 = 16 + + IP_NOT_FOUND = 6 + + PACKET_SIZE = 32 + + ERRORS = {1 : 'Bad magic', + 2 : 'Bad version', + 3 : 'Bad request field' , + 4 : 'Bad IP version', + 5 : 'Unsupported IP version', + 6 : 'IP not found'} + + def __init__(self, remote_addr='127.0.0.1', remote_port=53333, timeout=None): + self._remote_addr = remote_addr + self._remote_port = remote_port + self._timeout = timeout + + self._create_socket() + + def _create_socket(self): + self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + if not self._timeout is None: + self._socket.settimeout(self._timeout) + self._socket.connect((self._remote_addr, self._remote_port)) + + def _create_request(self, ip): + packet = '' + packet += struct.pack('1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&TyM-%x?c z+!iRrS>O>_47A`d2s0kfUy%Y7WJ!1Qb!1@J*w6hZkrl`f3GfMV{r~@e+RQTy#>NcB zX$)yIfdqr`Odu~UEzKB20l8-w(*Dl`@_;0enh8{BeCEG#8jvyb%$b?SXU+hXodNRG zX3hla1kyX^UbqZ2pRpv!FPOpM*$to}45^+jjv*DdTF;&2Yf#`}30Ppz6;c@g|G)j( zM@5E(dFv-H3w@>CefN|2nV(js*B!newm8dZH`8)kEW5*e)$omLqy-)>NPRX*#e;|O z!@V6>v~DUH?JM}U=tMwSyqS>F_dg3=!~UkRZ#HLkIiY6I3$&2I)78&qol`;+02_^i Ae*gdg literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ac.png b/resources/icon/flags/ac.png new file mode 100644 index 0000000000000000000000000000000000000000..4f154f8a531aea25abf4507b3a5ab7737b602c63 GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=)3J5B({DHiXMZ;vv>?smXOS6;LzAvuMj#~QP z$tfyo?fdE$C&iYYV#}pH64_B+Ym4W+U%U7JlqvrW4gc@md#-0`b<~_G#fHb0a%2a2 z{byh}#~>jfP<*bq=l`5J|1~xLx3oO(nX@#iCrGpUeM?Vu_1i1KYT3XI2E#!Rz zbXS_Ei(^Q|tz-ieQ_;t!*OD5Tn4OgklZEpn!o8iM-NXImkA<=`^RltI`3i)G`NcT~ zdd_TgbPeS_Au1*)Dm;BcO2ULm(-?~^ckZaH`1wOpf`z43VgiG-HM`ODnXRHTPoFsA cAj!b6e*t^-#NO9yfHpFCy85}Sb4q9e0HD@|kpKVy literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ad.png b/resources/icon/flags/ad.png new file mode 100644 index 0000000000000000000000000000000000000000..f676f64466ca55cd5baf9e964dddcb8f86658ed7 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t3O{dj>Ua5k!Jbug)tB{h`j<_a_^-}u3jvzJ;OXk;vd$@?2>_?VRGPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc=i|VP|5A3JLmmXwScYf1HX~{MH3AP37qbxW5dj zM%B~BF{I*Fasm*fwllL$+L=?p@W^QM0mhRtYAg(el7bB?dJL}HnPP4>Uy286VDNPH Kb6Mw<&;$UdX+Y!v literal 0 HcmV?d00001 diff --git a/resources/icon/flags/aero.png b/resources/icon/flags/aero.png new file mode 100644 index 0000000000000000000000000000000000000000..0d37472082b301b52da1434942020f8bd4833a10 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%oaa~J z<5HjyXMsm#G0=j;Ak26?e?X*16-7#lMf zr!l0>1QHC!Gl9Icv@~N71>~M#Nc%q%$ODo&j@tOa|X+XxzGiPQRpE(0mb_U2# zn>iDx6G-ovd*L$Be8!R>zhDN3XE%U`Fr<3AIEGZ*YCU(7uR(!_C18O;S4d&}|Nr)D z9~BuE=B=N+EcBIj_uWt8XMS3lUU&F@*y1ds-Av1EvFr}>Rl_%~krsHkAobZK6%QW9 z5BGLl(YmQ*w6EaXq7wmS@n%9w-~TLh4f~tMzS*4F<%F6+FVI2;Pgg&ebxsLQ08m$j Aj{pDw literal 0 HcmV?d00001 diff --git a/resources/icon/flags/af.png b/resources/icon/flags/af.png new file mode 100644 index 0000000000000000000000000000000000000000..582fc0610ea476a0a576e7997d2475b923164e2f GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEdI!b8~a&a8V4X z#?;frF{I*Fa)LV}&yj-2n+syX1QM8)6%rC08J83uZ0PKq$$2P=g;9-7jf2_g5Tlj& c5}8JZ`7ul{m-Vjt1T=ub)78&qol`;+0B@j0FaQ7m literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ag.png b/resources/icon/flags/ag.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf917c32cd624627a2cd381156146fff74485eb GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPIs5{xo^YiQ_<3`QpZ(tjjH@@l@LmHnkHOQ`&t;ucLK6UaO<05g literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ai.png b/resources/icon/flags/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..badcd96c9309280fc9dfc2f7559e26b0d3aab99f GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH2=>yJ$B(IdN{<#C@xaCndN}nCDyY-qk%Vb>r2J z370eT_A#-X>7BU=sNTcV#WAGf*3uqFp#}qvBVt@rj{g52epGH%c=72JwFD(5Cr4#d zr8)m3de(T}x|F=}>ZNsA%%1%x>8bg K=d#Wzp$Pyija+^J literal 0 HcmV?d00001 diff --git a/resources/icon/flags/al.png b/resources/icon/flags/al.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff77805e146fbf477dea09ed270bfca5db2fe04 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxIUDY{lmhxiizbk6H6!)iy#wADHBU46H9x+z7s$- zHl8kyAr-fJ`y9C#6gXH)w|@O^e@-tg;KH4@#6ZEfbCwmYbZZDReQ|DulyYb6^iPqO kZ(qB^e(@bseEeLWS#ubZzD4r70L@|WboFyt=akR{06?@$aR2}S literal 0 HcmV?d00001 diff --git a/resources/icon/flags/am.png b/resources/icon/flags/am.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e056b171a55b41cb90597473bbf20ce23f7caa GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxc*~eStjKp=C()7YtK3{mt6ZR1wbiHPZ!6Kid)GE z3m7&mU|>^AIdJAc4@*Ogh^HEx+5`<@54JTk1X%+fX)r{UF`T{HxFGPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1=T=_M1}6Sx%bxVPwJPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxQeiIdP@q1ne)^nvz?pHk?6y9H&5i5tNaUVh0{Pa z4xTQKAr-fBPcrfyP~dRBD5kahf3K)<>8m=0hpaZyKTlzjV25AYHM36+{w&;S oA~hFp->BO4PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEjy;Q@ry}gTe~DWM4f%ywQO literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ar.png b/resources/icon/flags/ar.png new file mode 100644 index 0000000000000000000000000000000000000000..755b40e20fc25cf1be54b1f45baac5db9f21e745 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxH9bh!?5o!!`{Dvm;V0y_wWDz{|o_KpMbJPo-U3d z6}OTTTo`$Hd>lBO1RC_Zxn=}1FmrPyBqXvJLPn*jjyeCbBMc^e*2m`}HSH_C0 Si7b9V-3*?telF{r5}E)G@j_4l literal 0 HcmV?d00001 diff --git a/resources/icon/flags/arpa.png b/resources/icon/flags/arpa.png new file mode 100644 index 0000000000000000000000000000000000000000..4502b8d4e90fdca26f5adc97855fb8e289d84854 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;L$d!SqK#3EbxddW?Nn{1`*#dk*T>t<74`hZOx?BgO7)yfuf*Bm1-ADs+bUa-gLn>}1 zCp0j*8E7)NCGaV?a4ShH)M8QaVwDWYm|+nj>mz?fX2(tepyF)|XT$2UCjs>_c)I$z JtaD0e0ssktJYE0* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/as.png b/resources/icon/flags/as.png new file mode 100644 index 0000000000000000000000000000000000000000..614d01d22f29a4eea9b12034728c492669c84c76 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qZ$XdBfm1PXB$ zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<)0X`wFLOe_yn$-e^E&mx9{sY1J z^Dl2O-QkfscI?opa)Idy9Ena0DbgzUb|hT^Y6->9hk-L3Yect=;Oxm^zzh!~uGkCiCxvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>iw5|FxPD_|`NzcaEhyw)Sje|;U;h33^Uckr^je}3P=ThW zi(^Q|t>lCR7bYGamBO0=49wixMhOlNH!e7pR4{YKLPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxU#X$_SNXSv;I(8{ElxAo?Pr%bTuaZ9w&E3=-nou z8c$Cb$B>F!t$vJL2OKyq&ARu$e$TeMtnAIgOumyBv^XXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2*Q`S(l4%Ib(3-;*@4HFiQ*F7ep}3GESH=Q$Us zM%mNFF{I*Fa)JZ<8J!b0VPPx#z)(z7MF2LU03??H4U5l>0NMZm)@=X)0BisNPJE-%bezoX(RuV}U-QOgU5dh1 zg~d^WzDs_-MR>V9a$pJau{6tB0R0#Y{gjXVdvyDCZ~A9t z^GQSTLp<&@EbU4{^u8$k;hp%}hWW&A?ZH}}yy9n+%3_bjA7Z^vfy4LWqWMUf#Q*>R z0b)x>L;#2d9Y_EG010qNS#tmY3labT3lag+-G2N4000McNliru+zJs0Eg&9hbua(` z0G&xhK~xCWWzNYCf-o2a;9mlzjcf%9VUZL81!YrI6zu!ImT<+neVI87L_&!A=(+$q zNs=I%rm4vi#xR~|w56CBYjfhwzG3-m%UD;C`Ky~$NAP@&WB)#BX&P1^1?r~ldd`E} zeHb3{md7kF_<5O@)up_Gn-IcNi&DplsR}Oh{2*Kq#Rppjz?kec-7qa`JO5ms%L+nB aUGoF-VHDu2#rJst0000PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMT$u}5ii2c}S{(jqvj3ai_3zq+f0+UQf-U}i`Sh=^ zrcAGg$?%s}?NMQuI!hY85u1&_CIOQ0t#^! zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF44Us5EWayyecyWQ|Nnao z|L<}9f6nk9H~8o>-x{db*3-o?q~cbxfC&#PlOvns(GU(@J+6hVM-;XsFir_8X}zGp zsu1PD;>0cHlbP0l+XkK{moS! literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bb.png b/resources/icon/flags/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..88e4e67f8151ffde619b2b544b9d2c2232c15a30 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT(jM)eN_6pQsTc|=e)O9=Gao*O?|f0O2SIcDcl9B zarAU?45_%)dd^Uc!I6bIp!vw({5{u90(%dAUV6Z9y6g1wU(D~%*)rwA6b&tA)iW*2 q9GzZnn-Nnk+`nFLt@+$%7wo22F=no7nspUu7=x#)pUXO@geCw;sZ}Nb literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bd.png b/resources/icon/flags/bd.png new file mode 100644 index 0000000000000000000000000000000000000000..b49714ac8262e13b44ed8c8e8addaf3a2b0a7d8a GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT$!p^r1M#PBUsY?S^n{`JQHIvN@1B}#&WSf17wh` zr;B4q#jV_Px49S;IG6+UFaP`BFRWu!n9ttclfkiCM3dq3Dh~OmqNO&hzjtlFd*jqw jQBS$bd4kGI`)Y3X>M@4-${$t-8pPn~>gTe~DWM4fwA@Fh literal 0 HcmV?d00001 diff --git a/resources/icon/flags/be.png b/resources/icon/flags/be.png new file mode 100644 index 0000000000000000000000000000000000000000..872f562f1fc754a1e82c25cb87d5129c8ec19fe6 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT$z|y0-adCUSRp^&hn9o<<~`)A3)NBg@Y^P08ov! zr;B4q#jWH71|~N(g@iOlCN`Goy}i8WQd3=@Z89?4s9YR5QIuKrqR8e&Cl+a{T})Al hT%fW_d0`v_!PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMT$u}4)S6hr7O>1a#`5JG%eO}?>y%lx%whS?#PThi za9Ip978H@B|mUryLS~^uo__0r#xQug`njxgN@xNAp+8Fh literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bg.png b/resources/icon/flags/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1f46bfa8635dcbaf912b78f3eafa8b3f21fca7 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`g#vs+T>tU0{NrLd<|GrgDrDciJ^%jwncF$}Cs0<`)5S5Q z;#P8kDPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxTz`E3{`JCzuU%c=t*yQ@vHaMwCO5; zHCmo7jv*Ddk`sU+B`K|uNuj@SYOn0f(+9e=PWOb1h3d~bsSX__m;mzPX2#ZgbS QfVvnwUHx3vIVCg!0HUu+g8%>k literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bi.png b/resources/icon/flags/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..518e030195141effe3c601582c84c900547ec807 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mz=V@!R_fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g>fKP~Pa&q$j|NqY!G60GHbLJS% zVK`@KIOp7)_wV1IJ2&SX5X_mwb}jHHP<^nci(^Q|t>greASNb9HaMF_s=_n1A2(CrUOIe%`Zc&&L7Q%A5Ram|0$zfHNgRgk!UYR1}D>>uf gGfv|JXWE$rDPOj#4`@7tr>mdKI;Vst0C90v82|tP literal 0 HcmV?d00001 diff --git a/resources/icon/flags/biz.png b/resources/icon/flags/biz.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd40c2207e109193ca6308706e537d519703d78 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bj.png b/resources/icon/flags/bj.png new file mode 100644 index 0000000000000000000000000000000000000000..6473bf1659a222984d34cdeca42bcb0e5ad0f132 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mz=V@!R_fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g*fKP}kLox$HHp4vzhW9{`Vut?= z4FB&j{Qu7|;X&SBpopTUi(^Q|tz?11LQQriHlY_L3Jez)Iyjh|)zDaxlas^4z!)pr U^3p=t3aFUD)78&qol`;+04w(`#Q*>R literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bm.png b/resources/icon/flags/bm.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea8c4f2fbd29bae347ac570ca827effe0a39765 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`4FY^ZT>mk#d@|FTQ5dgwiACrW%k02{vcn;-&h7XW81!iM z6lvc2`;%rq%d7UapYEejGr_Lpw#WWzpx$s#7srr_TT^>CiZvVXFpEwl?0-X`tW^zF$R%|A14-K>_WU)vQH^w3k8^K+J>q{DLOueodcyq_kdz0TZI^5c?` nlGxkB$F2U}eDf`(;wWbx8&mPjn`vf1D;PXo{an^LB{Ts5sC8{> literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bn.png b/resources/icon/flags/bn.png new file mode 100644 index 0000000000000000000000000000000000000000..2585a38d60fd308143a14b194b241f9f9dee2482 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMT;IK8zqmFyHA#z)o#la>+D$p`cy5*#mr4$GHg*Z~ zp3e6E_3csAx&7@x_2Hf_jv*DdYWt$O8VqlPOrS_8C#!PC{xWt~$(69C3UWLp3L literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bo.png b/resources/icon/flags/bo.png new file mode 100644 index 0000000000000000000000000000000000000000..27025ca220a3ab3fc9321ad85162322b49dbfc1a GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT+JqM{r$sw;}pmHjhx>yI95#3>FVP7$;_I5VCD^= z8dXmh$B>F!$qDX^JSv5e0SwH_5(XO`Gc=~RPL<@J-YL0iMim1?=qDzT+r_2qKn)C@ Lu6{1-oD!MPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxTshi=*e9@LuQB-ej$`W5z__BiHCI@84c0oxY?lJ6 ziScxC45_$f>)R;CV94V1(1OYdK~_i7gxEg zVQgG8QSj0iT~)W_A6?sZcE>)u$UA$+E4@!oD^6%zR!lyo-gd)z4*}Q$iB}nt@@7 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bs.png b/resources/icon/flags/bs.png new file mode 100644 index 0000000000000000000000000000000000000000..0eaa50dea97921a24390ab5c967c3567f624722a GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT$vKnnGT&{W@ce3sS@j|47t{E-~h|Ne=IBRTIvAR zn0vZ7hE&{2PDpTJPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`4FY^ZTz@gM{9DJeN`UX8hWg*XEY~iH&P)xM(_45bEM)E4 z*u1=y$vRqd0z8rf{H|TQ@~?`8qdVUMs5jWt#WAGfR_!TAz6Jvhm%t@UEw;S)o4-25 zuyA4h(bEoJMQa6=M5~2vFf3cL>g5j2iRIV23${O8mmG9PYWMv0o>T56^EgH8EM-~x ivTH{gxAEo0|M_~XnWY>R7K#ClXYh3Ob6Mw<&;$UBH)S~h literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bv.png b/resources/icon/flags/bv.png new file mode 100644 index 0000000000000000000000000000000000000000..e75a6c88d8962196742beb423b44796f3719dd29 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT>o)!{%fc=G@PB1viV|F2&oK=`cUym7EKYzr;(zdN_CeRE9Pgg&ebxsLQ0Py8bJpcdz literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bw.png b/resources/icon/flags/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..c224fcdff9a723aea336ae934c8b26ca0866a206 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`MFV_7T#c?h5qtJW>e-)l+qOta$pi(3lzsY>_H6wLpaKI= z7srr_TgeG7j66OX4UGGBq`49jTp4+EG#KWd?qRy1>y*^2lXPf8YLbfuvnT_@<#xvN UeS$47fO;7`UHx3vIVCg!02OFNH~;_u literal 0 HcmV?d00001 diff --git a/resources/icon/flags/by.png b/resources/icon/flags/by.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f4713ad861aa4886d183373ba03b56785527e4 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gMS$Nf%qg*EG0fjgV zJR*yM%1S_(FmdKI;Vst0PFKk A^Z)<= literal 0 HcmV?d00001 diff --git a/resources/icon/flags/bz.png b/resources/icon/flags/bz.png new file mode 100644 index 0000000000000000000000000000000000000000..378ec4a0142f48d8de57aa4308ea433e9054473f GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT%QU`8aYjE?OwHd*QU8E*Bn24>ecf%d0Huf&FdEf z)i`;&IEGZ*s_nBBYH;8=+$5v_|G(jx4Ju0<=W@vlPA(QW{vgmOb87BKtxY{%dyOt{ sIaHMTe#xAr9=ogFA1dFT|EGv?%SOgDso)R%K+_mJUHx3vIVCg!07~#y)c^nh literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ca.png b/resources/icon/flags/ca.png new file mode 100644 index 0000000000000000000000000000000000000000..38a5ae63999a983ddee114a8c947d3572c07bd09 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT=y}tJZf(J`}^mu!s2hYZok{L^O%gxr&A{q*`{Uy z)wp}QIEGZ*sy!dbcR+!I`9hdi`G0Bu^eH?0KVE#|=)u5nV;Vu{VlO{kHV% xhP%ZRH}71oyts^aN13#{$kdhdSKGzt-^qB&$Y^DolngYI!PC{xWt~$(69A?hSl9pn literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cc.png b/resources/icon/flags/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..0050bab98845bdf8651958e374e9ae5f588925ed GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT-n%W`)c&vS$`-ke#f^5PcHT>x*C&ykCQti^llSS zji;xJV@SoVRzF6r0}dRQX5IT=zh~QBR`zCLCf~^mS{xIbysqoa?(WW$<+Mb6Mw<&;$UxLRGB* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cd.png b/resources/icon/flags/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..f50b0ae0e78f240eebb533280c83eac54e1dccb5 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMTqCcaH#+xc>8pIlORqM(N$|aPr}*BQ+WQOs{bSkw zF7nVPpR8MZ#O~V50@b^Ex;TbZ+^X#hh|CF)?wZ&m+I8_vwM0}@V1KH zc@sLLt!}~%JCh^4Gf%vdyPLLghj&=18?&EtRQ`wmy-D%&N*QyXh?$-O8pz=3>gTe~ HDWM4fSAt*| literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cf.png b/resources/icon/flags/cf.png new file mode 100644 index 0000000000000000000000000000000000000000..fcca6fd4b14b465e6ad0d4fbbb373d054e0f5888 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`4FY^ZT>t%J`E;G<9}~;pK98(hEVH&Ltf)z0-OZAgtn&Nc z&%ZZsPMh}RP*4jS(@sszg?UUlCvSx{0QI_gx;TbZ+-g0uQLI6M$N8d!Zquz_|Le8S zGIh7_Hp$nt*`s{lrf-AQ^5`>_%bo0`GF~c`_qxt=3cKqnck;v{#+$#idFp>Mt_f!O U;@4+&6lfxYr>mdKI;Vst0JCvoT>t<8 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cg.png b/resources/icon/flags/cg.png new file mode 100644 index 0000000000000000000000000000000000000000..14ada0a734fce46e58a3b221775cd21c2c23d181 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT%WyE-E!IGUpmh(F`>VI`F~yzDPCXvZw8OwqMzS^ zY8*UW978H@`JOq*ctC;YutU4VuK&kW6L@~zb(i2%Njw^ITw6uX@NAHA_UEUGE1xgi qx}sO&R>zK6OP0+p-^}S^T%Y}tS^CtasY`)oF?hQAxvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT>tT~{BySY7w-Sh&*k5-Bme&W`FHT(zYiboO>8^> zRO9OD;uunKtGCaP?|=aZbMl6V|LxaB-f}s0A$rZ^0~@ZfrX*dS^lJK|RZ&^T-z?Wz wb~TZAZ%@+`9_tUGA9LFVdQ&MBb@0Cy!{ga7~l literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ci.png b/resources/icon/flags/ci.png new file mode 100644 index 0000000000000000000000000000000000000000..53a7ccdff32c52960d4c885f3286d43d67ebaa0f GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1``2&1HT>tH3`FAbm-@iY8mwcG^vBbr>E(c19dAc};RNP8V nU|@1nQ%Fc-WNKS@o|R$F7sk#z27guqRWNwE`njxgN@xNA`}R3X literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ck.png b/resources/icon/flags/ck.png new file mode 100644 index 0000000000000000000000000000000000000000..18b5fe133b549d578e0bd7797966136883147888 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxN>kTRae{SV!A3YU~hiT(KW$MySp|{%Gvrlt?^8W;%MZ9+I&g7KW8|?co$U|SYgfLCGfvltPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxZahQ{mRU0!J2k!-j)|fu5ocS{rmRE%5t8IeC&Oo z8Y52^$B>F!$qB5CVrCi%38|^>4>uWaUVLKH!c&X1+)TSTS!P5oXlQH{lw9yhLUXb! aBSV-MQ<%oWO%s8-89ZJ6T-G@yGywq2wny9m literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cm.png b/resources/icon/flags/cm.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab7c6032c34a13e534d53a252991d7617dc23eb GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxQ49^>8i5%%fs?_BFo=tKeq9jyGpk#FUBXNlWh(Gko-jiDBOd#;d6}3_bw0 OFnGH9xvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxV~2u{>Q}f&zI$23Cll0mVXmj{#|4F_noCYu-+4> z#>vygF{I+w+_Qmv2Mjov0z~F~-~Z9=mdUsBKemfGj_~-n3bcFpZ|T%Jzhmaz81d|% rnY~(5tB+iM!!cQ=e*crRKMsoL>oENKxc|jEplJ-Au6{1-oD!MPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxL(WCd6KL2FNtMuu&c50=}nt_-@Oz0_m5?n`l)w7 zHCmo7jv*Ddk`t2M*?2;pY+A&?CMM$0aJq*{LSp6wMrL8H>5YwoJQ4>u81Aq#FX-j$ RT?^F3;OXk;vd$@?2>^&PLnr_M literal 0 HcmV?d00001 diff --git a/resources/icon/flags/com.png b/resources/icon/flags/com.png new file mode 100644 index 0000000000000000000000000000000000000000..114dba3e2d24f0a8003639a050ca5649b345f3c9 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%Liw7- zA&_C51s;*bKno6oFyrz36)8YLmUKs7M+SzC{oH>NS%LhJ0G|-o|NsA|%{;?kY|LPs z#*j7>NH7@B1oG0-(u_eAkb8z9?f*<54@d&3nLvfcXZ{!y;?zJhOyP6U+2n+Yj>|Fh6F>~9+TW^-nj6KV#%Knoc>UHx3vIVCg!09ZMN AmjD0& literal 0 HcmV?d00001 diff --git a/resources/icon/flags/coop.png b/resources/icon/flags/coop.png new file mode 100644 index 0000000000000000000000000000000000000000..114dba3e2d24f0a8003639a050ca5649b345f3c9 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%Liw7- zA&_C51s;*bKno6oFyrz36)8YLmUKs7M+SzC{oH>NS%LhJ0G|-o|NsA|%{;?kY|LPs z#*j7>NH7@B1oG0-(u_eAkb8z9?f*<54@d&3nLvfcXZ{!y;?zJhOyP6U+2n+Yj>|Fh6F>~9+TW^-nj6KV#%Knoc>UHx3vIVCg!09ZMN AmjD0& literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cr.png b/resources/icon/flags/cr.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d8933fdbeff83e455fe86a241fd50b21370ce9 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH7R#D5^aA`oXJzzkgoYx%~|n+vl>Po4qabU;J4L zRAc7p;uunKtM;5VAAPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxYqC${N`oT71;dX&X+%bejnTSX3>m0Sy5-+DFlOD zVB+cG7*cU7^t2-%g968q1FRwc{wFhcPW)!p{%Xz4n#qz2)L*vCR9|l15+3{@yl_Rv cf<`9&{}UJ=m9Q1d0`)U^y85}Sb4q9e05Ez`UjP6A literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cu.png b/resources/icon/flags/cu.png new file mode 100644 index 0000000000000000000000000000000000000000..16b2b3aee40f51ff87b4806a4a0cca6f74f1216b GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxVAWC*oMsi$}jjmF!cS0Z=Yt(`?l{$Ro5QIDd%&6 zYV15+978H@h4vdVF(_~_abEfN|8dp|mgUiWEN=W9?rBGN_x8+hezoH4XSSY4*BfW1 n7<=mkFP-_+b>AuT-`v~}W->8-TXM`BXcB{`tDnm{r-UW|PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxGE_wVr5KL kjy<+wbLEruKi-9zEuX@8A$O8YGte9cPgg&ebxsLQ04PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH7ZslG50rY`%plCV_oF3)3RGzP<=QzcrtKv&?(Q zDO3`Wa)X7ZLB9s5KG4&}F{I*F=$UAt0}3202RVPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y5>%-e)`)+TVdY~m^N#N^eTYeqk{dX(v@M>+4 zlUzMr978H@_4*nL9WdY!QvLYfK94{7aRi&FfT?suK=9F1N!wblIK5-Gl-Cx&{5m0i tC3|wut3s1cqH}WWB^KOgVAyV7!LW&qF?>^5mM73a22WQ%mvv4FO#n&zRm=bY literal 0 HcmV?d00001 diff --git a/resources/icon/flags/cz.png b/resources/icon/flags/cz.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca1fb6ad5f01bed91da4793ce8efbf644b95f91 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxYqC${N`oT71;dX&X+%bejnTSX3>m0Sy5-+DFlOD zVB+cG7*cU7^t2-%g968q1FRwc{wFhcPW)!p{%Xz4n#qz2)L*vCR9|l15+3{@yl_Rv cf<`9&{}UJ=m9Q1d0`)U^y85}Sb4q9e05Ez`UjP6A literal 0 HcmV?d00001 diff --git a/resources/icon/flags/de.png b/resources/icon/flags/de.png new file mode 100644 index 0000000000000000000000000000000000000000..ff85c6697b09892906d08fa68c4b01119e9263f1 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;5%v~+Y1!pEbxddW?Nn`~n3h)VW{r8FGpA?S}3(NA?KV*S|BAzaeAr-fh1DY7voVF;i d2rS`bU{Doe`!)BNZVynN!PC{xWt~$(69BQ6GFbos literal 0 HcmV?d00001 diff --git a/resources/icon/flags/dj.png b/resources/icon/flags/dj.png new file mode 100644 index 0000000000000000000000000000000000000000..bb98a867f7f653706d08575daf526bc01c26e319 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxK7?aDRp-GmoHy_ty=ZZ%I04|fidgprqqYF+b-M( zsQYqz literal 0 HcmV?d00001 diff --git a/resources/icon/flags/dk.png b/resources/icon/flags/dk.png new file mode 100644 index 0000000000000000000000000000000000000000..7986a0fb5ee5b01e289cff28cb3d5bf3de746352 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxb9)|NkdcR6d)${B_Sm#Eioa5WuwH36RE6BW@%+%91hPforz;;RcCY-@JM|ERL|h) L>gTe~DWM4fm48Id literal 0 HcmV?d00001 diff --git a/resources/icon/flags/dm.png b/resources/icon/flags/dm.png new file mode 100644 index 0000000000000000000000000000000000000000..34e4fb3c11b6dc716a7aaf705ae1f2c748f5ec27 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxbjTl-LT4LVw}B2u))W#Z|%wiR>*QlaPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc*~e`StxL6Vso6MJ50K{V6K?b4SKO1}LlR>Eakt zaVt52iP_DKjblN}X)d;&o-+vt4m2@c*eT%Jqa)xOAS@xN=oWN{m0^+wV@jQO`Dvg= N22WQ%mvv4FO#uF$LoxsW literal 0 HcmV?d00001 diff --git a/resources/icon/flags/dz.png b/resources/icon/flags/dz.png new file mode 100644 index 0000000000000000000000000000000000000000..6454fa8ae582faaac49ec855d0ce6d0190971b49 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxUw*@{P_NJE)&Z;R`z#!1&K^7?-wunwPQ!Fmhly! z8YfQ|$B>F!rRO~P7!){|4|uWu`=8t^<=A^iZ3^p*&@|nH##7fgE}ijPZDxA4a9U@V q*MEVznl)>s+I0?1c-;H_`BAo#tBm3z^BO>=F?hQAxvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxUOOrVP;;H9_mz4Vzhp-wDZ}8p;PUD|7JOLv0oaf z#>&&hF{I+w)RWO%3uJ`+?i i2^N)_VwApqzSQE^OvmQRxheupVeoYIb6Mw<&;$U@&`Rn6 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/edu.png b/resources/icon/flags/edu.png new file mode 100644 index 0000000000000000000000000000000000000000..78d0951893976d5dc1a736edd01eae568d861842 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;5%v~+Y1!pEbxddW?Nn{1`B?5dxT>lG5{J(bYe^k`}o}QkTa}p9ulNGCzz1EiOi(3Lz z7DBLh9mS7XcpIA2w%h^KCO+{jD2lAcLo?pUXO@geCwkyH{=i literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ee.png b/resources/icon/flags/ee.png new file mode 100644 index 0000000000000000000000000000000000000000..80763f0847f50b72c395e34f13d387aec2533866 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxc>Y1XVt1TOiV0ld~=M1?r0z0r3RFe@pN$vskoJ# t;K<0MQaCe^fmxVKq4#tLlY|BX!}Acv&Z{cBbAaj?JYD@<);T3K0RZ=UH`@RJ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/eg.png b/resources/icon/flags/eg.png new file mode 100644 index 0000000000000000000000000000000000000000..71947de2ceb39c535329c5aca774119c1db0171e GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2)ZczJsM`}h0bt9k#vocs5n{907>J|>p6&Em#D zHHMxpjv*Ddk`vq+c~lB-1~4!Sb8OhKp&?U^WBSyYQzd7fK6R?;NNQSITajcS12fRr XMsudhSmC;rK+O!Eu6{1-oD!M<@!&_( literal 0 HcmV?d00001 diff --git a/resources/icon/flags/eh.png b/resources/icon/flags/eh.png new file mode 100644 index 0000000000000000000000000000000000000000..d518ea55d39852c9be7e476d4a77529dee7e6328 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxUx)RU8N_pn~5bX+ShBF&m||9zrTOo&d-0hefxu! zmM}XTRwfofgZ3n#dV5b7$B>F!wWqv=4k&Q2ToioFaPsea>Bt`kTlZFn_Ug0l4CXr( zoqo_Ms5dZR%Caw>%PmVcJpCD28kUo~@WCa1t9<5LyO>_%)r3)0fZTy)|kuy z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xJpPYO;)T<_FCK1a_+x?#Q&(M|2;kbubumk18nRy zdjixO?djqeQgKW5v>{)Ef`H3K{od;aRm_%+odMAu*Jf?la*S!6zV>CGdui-1u1Ou3 zA~kFNvlgoz}{bC)bFc Uz2Ffl3ABd6)78&qol`;+0E51JumAu6 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/er.png b/resources/icon/flags/er.png new file mode 100644 index 0000000000000000000000000000000000000000..b21bb88bddfd4b142b136991323176d63e1230f6 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m#Wj@rof0);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G}50G|-oIhI}w+3)Wu3VhdOFbvwt zQ2hV9roeYYf&Y7*z5@lL6tjVL_AoHCFqrW#ZwBfL_H=O!skoIKaJyKXMdHe(l7%I= z;tb|qoVJbKC4KACrHwE8zHHgD#g->)Zlr@1?}_=WOClOySzVqK>nwTY($z~5&W$D= n?8_Q$6xQ-QV$5`NG+PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc=i}`NYNYkB{ZwES7)YSpLO>_%)r3)0fZTy)|kuy z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xB}@0Fm3=-4M1K)!+`?_8X6k@1I7O{{0CD&8pr|y xe_=IGptz8yi(^Q|t>hb))oKE7(-sKxGH^yYsB5pY4g<#3oCO|{#S9GG!XV7ZFl&wkP>?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hU$_H=O!skoJtvN|y(A>oH%=S)U63HyI+lm7pVe5fQ-S>LGQz+k9Yyn$(l2#|5` z?BP{XdK@8a0uDYWwk=-i7RIi^$kf3(vstHi86O7&keSD}>HG#RCKiFm|NsA&>|kbK zJaWXrgn>gr?97MXH~;W^Y`Si=(2_x+VTQrqZc~8<5Ub#)xUmmN^J=R#tAOSSPGXy& qdf^ho9fbylq(j0hGJ+Tw*%-buIvQPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxV~1A`4lBH%_&CMWy|lQY9YCkGAdeD%!m>5Sy!}( z$Ewanr;kN2=8OeUy^W`fV@SoVrKcRZ7!-Jz4`%sFfBpY|s+glqSMe#Ql(;9F)e=um wDC$nQATyJX`H#xkicOk1^SxKBGHtJk$V_Bmym^23L7+Jdp00i_>zopr0323Q2><{9 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/eu.png b/resources/icon/flags/eu.png new file mode 100644 index 0000000000000000000000000000000000000000..eec69ea7207def100b29f8fdea3c40852c87c1be GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85u1MA3Wqw0t#^! zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF42EkN44)est~JcgHq2g| z4FYSyFnjG1ZUggOGzQ6Hm`t2W68+wiz0n1}hrQ s+&;5}*Qno7aZ)Rz#`yy$Se`I2TszId;8`cs0JMw2)78&qol`;+06kz@I{*Lx literal 0 HcmV?d00001 diff --git a/resources/icon/flags/fi.png b/resources/icon/flags/fi.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5ffe171ca73c7ebd90f1ecce24cb39cc7f74b2 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1XWObTMNv<>%HEVEJt>QOQWW>3D(%S~<{dz_ z3?`l~jv*DdmYy{fVh|8vzR2PEu0FXdziry}+^q~3?i6O!oKaB+0t$UH*)oZTEykfchCcUHx3vIVCg!01oF)(f|Me literal 0 HcmV?d00001 diff --git a/resources/icon/flags/fj.png b/resources/icon/flags/fj.png new file mode 100644 index 0000000000000000000000000000000000000000..91b022cccd8a711e27c2a125a84d9f68f2804bd0 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xHi>)>z?#xMR@)3v&WyfYEIg<@?m_?#hSK%Mkc|= zZCqR}d0AU-Pn`Z}&4ztUEKW{K?uGnpdRgshG|FZBxy< ncSVThlub|i-M%Tzy(n)J`HjglDPUR+&<+MqS3j3^P6PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xH2*Au{GE;WzwyKYmOc}W`C|{Uel_A{QQ^i-+zl^ zGr4;9W2Jf1%7995&&vn$JGZg&u0ETt4%D0M>EaktaVz(XH{W3c4%dt9Gah_6{jWUQ z+xHP)mAg!1gQD=l9ogr27EZsl@>aHx{)1m^GeQNgEpz2nvFTnoG1J#zdG>$?^S$8IvRGzHH}TQo+nJO;ODlXdQ#6tDnm{r-UW|pF(f! literal 0 HcmV?d00001 diff --git a/resources/icon/flags/fm.png b/resources/icon/flags/fm.png new file mode 100644 index 0000000000000000000000000000000000000000..6364ebd0b8bb38ddb2534167d14e1b6240ca45d5 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>D+c(4xH2*Qk(K=;BJxL5^UtD1f2K|Qvwiy?Hnu-XN`E$O z`m<)upQEoh&I1)Yd%8G=RNP8VP+&4JQv5t4GGfNWpE+|piX4v0Byh3Jh}a>~$P}X^ z@V7^2j)NY%`V{VvqkT&xazvz8xvuHiF}IPMfx(TDVU^Iw*JpsnF?hQAxvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1$4hF;zp#)`pZ?e>EwQrNqbD@yzE=!C|AT)( zHTs?|jv*Ddk`ox1#MIo<*jNsnPd%b}nu{gJr)Q18fdhO@K5qgV&bbEn+)oLLVP#lh W$T)3T)7+&%tqh*7elF{r5}E)Wgh#;u literal 0 HcmV?d00001 diff --git a/resources/icon/flags/fr.png b/resources/icon/flags/fr.png new file mode 100644 index 0000000000000000000000000000000000000000..aea11511932a5df49a73f580509dd93997af50f2 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn`~n3h)VWWoO^^@86$)?3~7(J1T*K!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0E;d&1ONa4 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/fx.png b/resources/icon/flags/fx.png new file mode 100644 index 0000000000000000000000000000000000000000..aea11511932a5df49a73f580509dd93997af50f2 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn`~n3h)VWWoO^^@86$)?3~7(J1T*K!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0E;d&1ONa4 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ga.png b/resources/icon/flags/ga.png new file mode 100644 index 0000000000000000000000000000000000000000..5208c027515d6ad96174252b2420d500bbfff414 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn{1`c>;VwT$z~GczM jr!7J(50PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc+13Z1U?7;P1>yUh^X%<^97Ke>>WjEI7;4q1psg z6YJ^X7*cVo_MD**vmpnwL*s-$|K;6P{0h$o-gt9^xyi3w_}tCp1m82^PHVq!UE~(^ zvSqc~#~zm3O5BgvR;OOc{`qs}6t@!=lg}vmzKydC-0-V4Cb`u3xWiZb;y;Z4<})RJ T-RXY`Xc2>_tDnm{r-UW|<27Vb literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gd.png b/resources/icon/flags/gd.png new file mode 100644 index 0000000000000000000000000000000000000000..318dcdcc9a412aaa0f56bb1103a825495ed7ea46 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xbA0RIc>;tHHxLUo8{|W7Udcivo$Qg{;;r4WjXSk zMQk3+sv9ip*0C(AV_DY3;mlyACCov(hhy#ntzhtU^>bP0l+XkKoi1l0 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ge.png b/resources/icon/flags/ge.png new file mode 100644 index 0000000000000000000000000000000000000000..0907b869f7ab2438895e712d5371eb030e732f47 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxYjYTEOc~g%4 zM#a;`F{I*Faso4B8Jom`^Qo+iViwaSSuX78DbQ2qFfhCTw5}$DVLRK6bN_(q89ZJ6 KT-G@yGywqJlRlmR literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gf.png b/resources/icon/flags/gf.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac9c2cf6cde2531d8c0bfdd722ab4e0ac6f4012 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH9i!`SX`0;tGr8T9&3bmZdLP-tw^=a%1`B$@0&L zPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyt~ z3Mf13{G9gy00G@eL_t(2&pnd8YE)4aM!&PqKKIU<88tBzLW+A5Eh3zypMVkV;^iDTP7pc{wzH5#pXJvEnUqT@dPO3#0f zIP`ix16_~)oY63mv7T4TRuB z_}8|Tixc*Nvn&8;9VLhjwmS6>`YK`on$2p^FV(`3hSkU>6E`|E1GBf3*i<(+UIQ=y rc|QKJD>c)ejnmJQ8?UIG{NLpdeF6PVI3-rH00000NkvXXu0mjf#}EaF literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gh.png b/resources/icon/flags/gh.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4e4f1d066d41417a89cfc241f1b54b0878ce66 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxC$*`*}0SD&mWeoEEWR;79jW=%JPqiCCmG|B~Xo# zr;B4q#jWH7cSatS!kYmM%)$}|Mot+V(`UA}N_L(;ajHw_^ocV}foBhJvPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc*~e`KQP7eTx52|G=lE;s5^qd4BZx&Gz<#%&ePO z**@L5vy_Qtos{IGt=o1Pn{4y)5vvJO1?u(lba4!+xRu+<$ag@2gE??cSJUtR`NvaI z5^pZ`tk#ra{1G^DYn1G|Gppxs-X-+)oJxP+&dm3#&3A^~o%N`z!?##F&ubf-aw><* d-+d=vG2ObsT$KApw+3i3gQu&X%Q~loCIAm9XPp25 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gl.png b/resources/icon/flags/gl.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4a2913c01e90a7d56127dd931eadd47413b0a0 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn{1`c>;VwT=%oGzgV{X@1I{+BO+hMyju?xcl2~|45_#kd-@=6 zg8>h-gSZ-p&V^mvE~ozOPGpb!Q5=-iobPb$s#=10gL9tclPSyhcz1s2k6#|z{;p!q di{|D3ZGO&Vce3IMZ3G&|;OXk;vd$@?2>^#mPZ9tC literal 0 HcmV?d00001 diff --git a/resources/icon/flags/glg.png b/resources/icon/flags/glg.png new file mode 100644 index 0000000000000000000000000000000000000000..0610c23ea826c99c8f479523bf5ffff7bf276b66 GIT binary patch literal 922 zcmWksJ&RUn5Iwrhy0BIupeW210TF~vkxs%J?<3}T$#A;gusR9{D z8Sn>KO>8VgLM#KOkpzE%sbq4V3-`Y7eeTTpnmN3B@Y(j($t?ie`&ag^`}g>|H#ht| z^V91$zy_{w?N=_y+ znW@Z4IVV#oHCf1Fma--r+00hw=w%!GM7--!8As6gX?^x zb&U!ts-zk<)Kp77@|0}UwKL@r*`*6H6{ui^DyBR)TX#375|yk}<&;ozBu1SoRIy4` zQ;lj?t9r_lcX;NXX^-8>nHDuK%o)-ri-ydvI!wO{0N$u%U;!_hn0wRGaLu4UdnZOMu))S66hbc4Fz zrT%y7#IL&mj@`cU^&MdA?z)eB{?Y6AKIH!1g&PlkzWK-R+t}Sa%6o}-zr6bE*13P~ zAMR}axpDaM&f9~hKYsJ~`G4QsJN?1)mv5iFIJ^7h&bOCNetPZMf8T%j__tf1eD&zN QhsMJG<%7K^7xRbz0mBuB{r~^~ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gm.png b/resources/icon/flags/gm.png new file mode 100644 index 0000000000000000000000000000000000000000..75c58fbd9419aab215c6e6f24e22d430349a81e2 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>iw5|FxH6q%VLHWf>f0G5r9VtefBv02^N)$8lmFLVpaLCF z7srr_TT@SMPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxb9bP0l+XkKgCI9& literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gov.png b/resources/icon/flags/gov.png new file mode 100644 index 0000000000000000000000000000000000000000..a293ebda1f8152b6e9f54d0933a7494c18edd984 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn{1`B?5dxT>lG5{J(bYe^k`}o}QkTa}p9ulNGCzz1EiOi(3Lz z7DBLh9mS7XcpIA2w%h^KCO+{jD2lAcLo?pUXO@geCyuGFJHj literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gp.png b/resources/icon/flags/gp.png new file mode 100644 index 0000000000000000000000000000000000000000..89ece9410f10ea4df47e6313a8873a38675daa0f GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxEj6Vt@@JkZ_=E9W##|0Z2sAp{Btq+7hv-5md?LD zI{$v@{9C5uaB3Myzm=zpV@SoV+H;0{33{{N4EoWR1aA3IBrb)OfLr-PP$ uK>C_z$;YnlZn-r@>^e*7PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc*~eNnx79%=~8_Q_4Q2l;3V1ckey^{rmf|qsOIm zAMRVU#P6c7!4e;)vJ|F$EKFfNZ+<2C1NAz4x;TbZ+=@Nr$#+13$NAzFUBxLc|7~wg zb2O|^wmo@C!_%ikO-opHy`9ry^W!sPb_%?``eXjpD|7rKeD7^)&7QuYkL|@PmM_PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxT@-IuWh{Y@82IUzavR$XWqR1dFk4h&0C&at(kot zsK(XP#WAGfR_r-$t^)=ftOvi=|CctOy5uO2kchm5f`mv+%srv1*}EpL6#VA8ddsQs vU3VYKy^V;y!7uyaq0ENAF^Q7TzE?6VF=woL#mOHCG?2m5)z4*}Q$iB}LdjU* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gs.png b/resources/icon/flags/gs.png new file mode 100644 index 0000000000000000000000000000000000000000..5f779ec7a0509c4f0d17b9319b2a306e516b4561 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qZ$Z?e{v1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;v0X`wFOiX(!&6`#RRC;?}K9Jve zu4i6;{!3efJqOnu-Nwp0WzsG4qt6!s6PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxUw(%CAjRh=)(6Idv1LF`|I!DKamGtGp+uuZZUZ} zP))R_i(^Q|t=Rr(z5@z8hbLV+{x^TmmIa1y*%KvqvYHgRwy0;et#aCBv3mVkr|-SB zOYXTjtm={_8`*2OGq>*a SDQW~-!{F)a=d#Wzp$P!ru4Bjm literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gu.png b/resources/icon/flags/gu.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea9ba6428d9232cb9548b0097f8a9a97dc06f5a GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xE^G(pT?5Q%KUSlL1{S4no#d0uU?2;%qw0vyR)tB z&d$vbs)~MG?B8jX)S3j3^P6PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5Ijxb9Rq`2YXvr3+_r*$?_ZS{b!!+lRRc gK2iP(K~n#|Fn#G@o^5_68RS3)Pgg&ebxsLQ0AvD6_y7O^ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/gy.png b/resources/icon/flags/gy.png new file mode 100644 index 0000000000000000000000000000000000000000..e0069944e910efb9e072bcf5833c448f9697e58a GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xQ2Cw7_Bm4p3a)d#?seUv-9zK@2x(&m{^Lkc)t9a zTXL)@%8TXiUtu2&mOFP?cI{&Me}8KaP_K`ti(^Q|t=#k8d<_O1ECE{E9*3;@zJKk( zUz%=Z{VWnLmrSO-m~-0Uh10d^2eOXMkz15|Ps7}Q_W2U0^3O>M`rFq1+O8$jWoW1P bn4A4-C`-}*!@fs><}!G?`njxgN@xNA;i_ZA literal 0 HcmV?d00001 diff --git a/resources/icon/flags/hk.png b/resources/icon/flags/hk.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b12f0407c8b1ed208450c97d71c290c4fff998 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~i`DdW_Z_?y{VPXHie*bsw{J*NIf9uy@lm4|7 zsK(aQ#WAGf*3@1@J_ZFIrf9Bj|Lw!r*XDUeoNzR#4%nh?)c-(Dl;2BWqr%ms53y_o meM@yLjvw4rw1fBmDrRpkhIOkIi~WEGF?hQAxvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxU#X$_SNXSv;I(8{ElxAo?Pr%bTuaZ9w&E3=-nou z8c$Cb$B>F!t$vJL2OKyq&ARu$e$TeMtnAIgOumyBv^XXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH2)V@$x$I@86%^-aA!QR~9aOcN_xh$@j#58LPBbL@y#2S s5jQO##-ydGsfmRdOc!Jgc%;FwA(^q_{DHn>Kob}|UHx3vIVCg!0Oko--~a#s literal 0 HcmV?d00001 diff --git a/resources/icon/flags/hr.png b/resources/icon/flags/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bb792e94d8b9c058f95e3703100d446a30ef26 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxaw%EU}xU(zPJC+&!6Y)Le2)|KQF0yz|1Ldpz8rp zjkTwXV@SoV){}u;3gF5 j_ti3&CsHTxwr^$3oW)e3p6}HNG={;`)z4*}Q$iB}P%%&I literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ht.png b/resources/icon/flags/ht.png new file mode 100644 index 0000000000000000000000000000000000000000..237e7581d8c06074fbeb7391d8e186d6b904266b GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uo3?xNn{1`*#dk*T$!0x?_*-IJXG8Q6yf)DaSW-rm7H*Z?ce`{E({Zo W^4=@cJT)CC#o+1c=d#Wzp$P!q6EUy= literal 0 HcmV?d00001 diff --git a/resources/icon/flags/hu.png b/resources/icon/flags/hu.png new file mode 100644 index 0000000000000000000000000000000000000000..ade6808eb1184c150b93ed21be57bd0f124fa587 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~Ea{HEjtmSN`?>!lvI6-A0X`wF z((_gR{rmGzUK}Vu3}6k-;s&Z?FY)wsWxv41$FCt^Z>;bRC?r+l8d2hsTAW;zSx}Oh zpU2>vn3Aeco>`Ki;O^-g@HND6GfgTe~DWM4f9NsKk literal 0 HcmV?d00001 diff --git a/resources/icon/flags/i0.png b/resources/icon/flags/i0.png new file mode 100644 index 0000000000000000000000000000000000000000..4502b8d4e90fdca26f5adc97855fb8e289d84854 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;L$d!SqK#3EbxddW?Nn{1`*#dk*T>t<74`hZOx?BgO7)yfuf*Bm1-ADs+bUa-gLn>}1 zCp0j*8E7)NCGaV?a4ShH)M8QaVwDWYm|+nj>mz?fX2(tepyF)|XT$2UCjs>_c)I$z JtaD0e0ssktJYE0* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/id.png b/resources/icon/flags/id.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb490582a8531ba8d04c58ca26391b6d46abb22 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxZb*T=h?F-@7}%n_wUa;CzpR_Chx>V{xPwr0Yi(^Q|t>lDccQ&4oC!01XF|(PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxH3)R3ELL)@86$)hhqNCV_}-cb27}L5GZTl>Eakt zaVt52mB~#_At8;CiA})asnThttB)qKewvUP$$4VYtPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>hAhlSdHY@%11{%fS>FVdQ&MBb@0CXu;od5s; literal 0 HcmV?d00001 diff --git a/resources/icon/flags/im.png b/resources/icon/flags/im.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9b7c9a8b43951d08d6d291712f1e0eedd497be GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30g zsd;(|MivTbFUyL63vp=PZGU6lZy`x$T=xI~ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/in.png b/resources/icon/flags/in.png new file mode 100644 index 0000000000000000000000000000000000000000..fca700e2f038bb67f444b6b267ed743480483b05 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxax1x-*>4N&7BbdJ>;H@6eVVzbA=mSn!_# zsxk3&aSW-rm7L(t$fHsiIm4l$m)FP8u)$L-Eley$Pg_eobXw<3$yMUK28$S&V%Rza bLL?ZnRGA94svmp{)X(7Q>gTe~DWM4fHB3dr literal 0 HcmV?d00001 diff --git a/resources/icon/flags/info.png b/resources/icon/flags/info.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd40c2207e109193ca6308706e537d519703d78 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/int.png b/resources/icon/flags/int.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1a781cce9931bfa54e732bf5148626cbb3c5d8 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH9kiBXRVP(V0IHSN}|V@~7?LpY)r5%J2Mfzwqb# z-#=Hr{8{(<&&_0uB|!E0o-U3d6}NKxJoyd>a5x`i^RfHBKi_lFs@YZSRdQ$KcHRzu z$0zooE=J*oNQwQCyh)}j?if$=PSp`gTd~e&miEo2pH7nt&pADQ7FswpO)7Nu(l-fl z?z1-pMhHh;^}2J^XCb5N{m7n_+{^jTtKRh6iQi=E%A4S1544)W)78&qol`;+0Q_8d A+5i9m literal 0 HcmV?d00001 diff --git a/resources/icon/flags/io.png b/resources/icon/flags/io.png new file mode 100644 index 0000000000000000000000000000000000000000..a64095c1c420f9028c4e8aa4b1febedaf8f45e7d GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>+XVQ8xPJWjqoicR#dFX4x{hpGbHvDKij&iv(2xa}wyE4o zD)}cX|8DtuF{zSGZaK4R3jQ&%lyUhmnXx>pYKdx!Ii{`N0yL+=)5S5Q;+AR;Bi~^I z4rX4%3oRzmyZ-+#bzwa%BxYCeYr{=Wfsi|z%2l5QX5ao`V>$1Q=fQk-yZ1G%#qT<& zTAGL-RSf$or~Jum)mqUPVaru(Cy8H_>RPmjBd$rHyfC{=L}BIHC8|Pli4WDDCBCZ& pe!7uqPM`bQIpPdcP4`v&VRSgl(#6$hoeFddgQu&X%Q~loCIIM}ex(2a literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ip.png b/resources/icon/flags/ip.png new file mode 100644 index 0000000000000000000000000000000000000000..883082b099c70fc7d321718320109c9320320ee3 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5U@8^cn1{XEbxddW?Nn{1`*#dk*T>t<74`hZOx?BgO7)yfuf*Bm1-ADs+R6JcALn>}1 zCp0j-IdbSSv?%CFC}zyCm~oV0s^h|oOCB=JPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEdLmaB^}Ve6|1k?{AssGUwi(_cbl`Ei-Eme-Fq> z#-1*YAr-f#p4!OEpuod?FyVO0|K838M!b)9PqsVNrSGSmVJbXDC_pagc95`LJnw7A a?@UwWna(`S;oJb!&fw|l=d#Wzp$PzB8A;Co literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ir.png b/resources/icon/flags/ir.png new file mode 100644 index 0000000000000000000000000000000000000000..51da41e7464562f5842fc2e43de47213d1ecd492 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxW3oX{>R4gFE;kyuOI&w%uiiesM2o4UnQ#*{`@RZ zjislHV@SoV+LM7?3PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxXR17yzig#CoRR_e+dgq{l0y-Ki_%$S3saxt@Z*? zjk%|bV@SoVspky&7!)|1FE+8huTP%+K&koI_P+-L8kYP_aP$ f(rv;zg;E*4-ZC>R(fRNRXas|&tDnm{r-UW|M?X)V literal 0 HcmV?d00001 diff --git a/resources/icon/flags/it.png b/resources/icon/flags/it.png new file mode 100644 index 0000000000000000000000000000000000000000..879296fe427df4e6f44db4efcc806b8fffec2c3c GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5U@8^cn1{XEbxddW?Nn`~n3h)VWWo+X3|NsAA9)|FzUuuDZ!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0KVcg*8l(j literal 0 HcmV?d00001 diff --git a/resources/icon/flags/jm.png b/resources/icon/flags/jm.png new file mode 100644 index 0000000000000000000000000000000000000000..980f613896eb0dd94b66868dd7cf529abef78734 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPJJ~!ajo~n#5MEbG>>u(PvFn85Po&TSr` z8gEY*$B>F!q5Xk;2NXD*@4KA-n{RWhgG;_e+#`C!^Hq#8Ml%e|EGLOJYj3dNo4TU4 z^@Mrqw1~zIlUZ?qicIL#M-09=EvlFI;8(exhK%7tmM+Pgg&ebxsLQ06;5M AE&u=k literal 0 HcmV?d00001 diff --git a/resources/icon/flags/jo.png b/resources/icon/flags/jo.png new file mode 100644 index 0000000000000000000000000000000000000000..90f6cc53d7310f5e5a336a48b11713c1e94be7ae GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxbn{B>*ixQ!^##F;rwRtqQ5`C-|-7zWn$6!vn&ay z#@f@xF{I*F?U_g}1_d7GizZ=v|M#wy-oiR}KfB@!MGqCti784;=a_k})n5Fnq}rf& jZPV>vt&5ozewZ*M-C#PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1=ijv(|N1BVTQL9M!w3JWEB`UE{F9KV-yiiE zsK(aQ#WAGfR_i%WJ_ZF2W`}FP{>!g+bmcpCPi+FzMf+u0ng=^X7PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxJtK}IC|?H3kdph@$#7^OYYXU928Ly=M%X0dQ&Y> zjlHLfV@SoV-X2FT21Op`GZt~Xb4ZHj!oO!sP|p2zl5 n4bPchtL=gX=NYLOvFiIQH)Lj2l4R5c8pYu0>gTe~DWM4f;zdld literal 0 HcmV?d00001 diff --git a/resources/icon/flags/kg.png b/resources/icon/flags/kg.png new file mode 100644 index 0000000000000000000000000000000000000000..c765f8334b3a68dbd7443a74aadfd3c7d1584124 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~i`KQnFZzIdU3oQTgSpI!x`4`3VZyL+n39nxO z)i`;&IEGZ*YVC96V^HK_VqNm*|MAzZuaD|%KWWlx_^&xKLo3Rr$F-=>L^$(x#KN9! rDYqwieAmAfR{GXz?vC<1AI`AHZeqATNi^di&@={5S3j3^P6zY literal 0 HcmV?d00001 diff --git a/resources/icon/flags/kh.png b/resources/icon/flags/kh.png new file mode 100644 index 0000000000000000000000000000000000000000..d43f0606cc9cdc11279f12ffecedf8107c2e966c GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxN=A@sp1L!!ov2azUklkO~33Ne`y$OWY_Kad0`Gv zjftm=V@SoVsplN|7!){|9k=NI`+uCxSETPvZeI4a%&9rk^qzil;kclF(uMV}U=N@B c%C9>ZXZ>Uhc3Ly*8&E%kr>mdKI;Vst0J*SCp#T5? literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ki.png b/resources/icon/flags/ki.png new file mode 100644 index 0000000000000000000000000000000000000000..2de878512fc13d957881956e9c986a1d35281fb1 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>+XVQ8xbpEG%+9`b<;s^0Yfo!wo%Zm!`1Z}G-rh(5s%q{@ zbA9e@{PBbD4>QYAUA7}DSWY>ytSe%=rt# zz`-KOlH73Q`2YXe7u9r)Wwz_gn7MoXjEM=|@6DEnS6`^aGM@&fw|l=d#Wzp$PzHYI)WG literal 0 HcmV?d00001 diff --git a/resources/icon/flags/km.png b/resources/icon/flags/km.png new file mode 100644 index 0000000000000000000000000000000000000000..335526d09de36727717b94beeb9a491fbdcf2a64 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxc>kDpW`f7(u2g;zhBRPGyg*4@;smvV@Z%-FoVOh z8)-m}tEY=&NX4ztzDO|!1r8?OJ^yDeUgB!^#WzW4vF0kn&<3Xtg-WkiFK2CBD?WK^ x#*PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`4FY^ZTv=IJ_4NhcePr3Q!K|K{`MWTyk&N&wOyt`#Uy>Xr{jv*DdTu*y49Z=w4Immdi5jnX z*D@Bq_dUn(Pr^{h&urd-lgC8O=Z4w~%-OgxsNu|uWJ9Hpuoy85&No3<bP0l+XkKfPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT$z~GtaBgYtS+1kS2o;p5h;LSnbP0l+XkKcq?7$ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/kr.png b/resources/icon/flags/kr.png new file mode 100644 index 0000000000000000000000000000000000000000..48098aa67532b3d0c9f21f823be6b68f43e1899a GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxTz~!iaqax&g7mzjTX!y-GS^(W|1&%9_sB?1Z^;Cp znqW^C$B>F!wSLiD2MltVW0Dbw=Fc(J8#Rz z(5cDmju;p3&2&E|$oEW6IJke&jWl<|WhW$h>-K-F-Sj$5zQK{vLcF=631~cnr>mdK II;Vst04EV!?EnA( literal 0 HcmV?d00001 diff --git a/resources/icon/flags/kw.png b/resources/icon/flags/kw.png new file mode 100644 index 0000000000000000000000000000000000000000..94fc856dac5878b0f3af6e0e2c66fc708cbec62f GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>E5Xe)4hiadRI#dgR}qUo4Y3()Q(W`f&<<`d|Z8 zqwneB7*cU->TyFR1_2)C112H={wM3Gnr)YzVjd7@H+8z@sl3-ucNeZXBzbP0l+XkKQrt)Q literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ky.png b/resources/icon/flags/ky.png new file mode 100644 index 0000000000000000000000000000000000000000..e27858268ecbacc190812a2904bec4059d182a7a GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`4FY^ZT$!2o6c=2(df{+J@aiw$K06ri+cwpzYTK048EaktajW)>C*NTM9_PTUqPH#~@9J-J zc`%h<-T#Q0rE!B(%7b+oqFdZgobgK2U&wGh_ViialxfRY?(m0iSkt3^==g%e1>gK; zoL~8`E@$1>!*+4U)kPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT&t^FB_*FTG5uMyCaAZ!NK5NVM#gkEx1CW@iw_;L z`TLjU&K(8b*DrPh)yH_cIEGZ*3hfW%J7B=!^m2>W-M{a5ukzjY^Qke5fW-B5h0W9V zG4;BfOlS>GHVpKBTHc~&bTN1FnZh+k!dr4@yQ#X=u6JMKw|rTsbP0l+XkKR5oYf literal 0 HcmV?d00001 diff --git a/resources/icon/flags/la.png b/resources/icon/flags/la.png new file mode 100644 index 0000000000000000000000000000000000000000..7550211f9c6fa2f940c82ec5b08abe47db097858 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>mk#%##bTvsx1puw~}di@$&WPD$DmWi&
    #SF zjftm=V@SoV}m6PYgy=t*m9Ya2J6W_q&e!4o6qogP&)XGG3WjByij bm?X`(z@0JDd{z7vpne8VS3j3^P6PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT>mk#{F^rAZgPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT$z~uXlj0KZOyK#iaT{G;`eWsJ$q~>O}e0@B*V_m z?(J<67WQXyynQWDy_ctpV@SoV+`d4r0|p$PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>mh!a1= zbUa-gLn>}1C%7>3^z@uL5o0D6CRWBWo%2MhbHU8Wh=>^zz8Wo*YE3fQ%fJw~h++Eo THEXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT)+NgdHR6m#s!wFLo7_wSY|Y_{L5nbH;ZNKGM2U+ zmSekEs`FW5AOD;WR3G8#;uunK%eOC(?|=b^)6w3rw}0PT-_5bwSD`52!qBlu_4?jp zCiO=>p3KPE!mn+xSpG`JnRSz+{?5H5+SshMviJ1FFWxJ+Se%}B&+HrT`|#RJ#T)vZ byPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>s@|e;4HYIB~}34Lg3`y!ZF-Z%6qXc|rFdC-{5- zs&VslaSW-r72DIub-;ncX|K`m|MqdbWsB!2v8aX2;a(!5?_u;&xt#IZHoLPTDJ7;I vrcZVDUTosskifE@DV?GCf6T`E^xuqEXEW{&uM{~2G?Bs6)z4*}Q$iB}-{n?# literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ls.png b/resources/icon/flags/ls.png new file mode 100644 index 0000000000000000000000000000000000000000..8fff8816a04759cb3909c12dadc8bd7e2d6d3108 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMTxE2hF|+(;3hiOq%lh{1g`l86fB*idsQ5Eu#vi6h zHdn6}?%(erHQnI@P<@c6i(^Q|t=O}Hd<_O1%omh)Xx{n1&&mDFmU{hw13y^oXYJfS zOJcTPqx%-#NnhmJQ;IBCbT?H>WY2W|JaKK5XJEmru(dB&1s*-AeCoh258>Tk7`H?* VH$`te0dy(@gQu&X%Q~loCIHpUWZD1# literal 0 HcmV?d00001 diff --git a/resources/icon/flags/lt.png b/resources/icon/flags/lt.png new file mode 100644 index 0000000000000000000000000000000000000000..edbb14324c1a29304982f09a34fc32bdf4269ce5 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5cDt+r~nFa7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(j1O1^9%xzTszK+Q;(pCrfp4L^e=R#M8wwq~ca`KobL-(-sAm d2TM9x7(~L@n)$L!Hv#1tJYD@<);T3K0RUk1F^K>G literal 0 HcmV?d00001 diff --git a/resources/icon/flags/lu.png b/resources/icon/flags/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6e836ce4170c445817f7123b43bbdf0f755c44 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1``2&1HTy1RrH#YtUfvl|m3=H4a@RtCkWISCQLn>}1Cpa?l ps1(i&WMCHNQs_P1!6c!x22WQ%mvv4FO#n)VIpqKV literal 0 HcmV?d00001 diff --git a/resources/icon/flags/lv.png b/resources/icon/flags/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..90fdf8f7f09dd76a06d7ecdd3272fb435fc0acfb GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxTo<{SEHV;VWTmo9iRI>w8E>Zvh literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ma.png b/resources/icon/flags/ma.png new file mode 100644 index 0000000000000000000000000000000000000000..5e43d7ca83bdffd6f07a4961cae63682b0b2bd36 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>mk#+>&OgO=QU^WQnL{nGnRX+K%Or4ojr_+n+!+ z=AJH&Ar-fl_8RgrDDW^vFZl6a{`HbljteNeGjC7F4t$=!%eQK2HY e&q^iz$zn2QWhhwNziA%O2nJ7AKbLh*2~7a8fJZR^ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mc.png b/resources/icon/flags/mc.png new file mode 100644 index 0000000000000000000000000000000000000000..71c462a4444bdf2789a7289f94e54e9f11b84dde GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uo3?x>l++rR$@T^J@F W<-J#?d1^XPiow&>&t;ucLK6TX%`>b3 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/md.png b/resources/icon/flags/md.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7357b628696317403c53fbb4d797ca04e5bdeb GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT$z~G1P5pR`OR|1pJg8t%jr!l^SW4$Ol7UiS6*Mt zvc-($(Nz}CEY;;e^{$>Sjv*DdV$XSVH8}7vU+DAuwfBGRa)qRk44ofy`glX(f`Bn0?`xV}1U z{cyL{_08u0Z&*HaG`rzwdTXWDBWBK<%$(<#IbQCzyPvD^WRCIwJ5Jx7%wMx`#ad@P zT&Mm2p_|ddqUW1z{=c;U!ou~Y*XZpwJN~qdFO-GeZr6LU#QX^Z+uzHMU(VX+pUDKd zgfYq6-G!lpRn`N@;VkfoEM{Qf76M_$OLy!300r4gJbhi+?{Eon=rK=M2yX-m<#@U{ zhHzXjJ>xCbtRTP|7_jB1r+Sx=Z`1GlOZoZFeL0sEl%&IU!t(v@8HZgpzq;xjaQHIe zO?|ymta0we{J85+zC>Q{cylj_=gc|3;F4Pk?G5aaxA*v*411V3w?yvd{UvO{b2wwK eb~`y0TQThU%juKPeeF2VUItHBKbLh*2~7Z~AB3*} literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mg.png b/resources/icon/flags/mg.png new file mode 100644 index 0000000000000000000000000000000000000000..d61454815f8bbbca4b1b339616f00d79cc4849e3 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1myhJxl~DfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstUx}0fKQ0)wQJY@|NqZW%y5r^;XeaI zqjUZ|pp=ZKi(^Q|t>gp|kwQi$wnv$X$qEdYoV*+yw0Ifx9`U?dx9WrdP#uG(tDnm{ Hr-UW|Y~Cys literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mil.png b/resources/icon/flags/mil.png new file mode 100644 index 0000000000000000000000000000000000000000..898a2550669febb5516a0bf83b71e7acd490a99e GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>ptn{=0boUu5*Zp5D%;6VlR4k`-!_{MYmxj`ISl zarAU?45_%)d(xfjfCCS+!_+DN|6AzI=G~VnaLmc#a%=e2+1&ru2wCl&b*^Il$wPsA q4#>M+WtcV5N|0ls#oq?zW$bqx84rIbeE$z<7=x#)pUXO@geCxO_Ee() literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mk.png b/resources/icon/flags/mk.png new file mode 100644 index 0000000000000000000000000000000000000000..578266db8bfcb7f2b16af94464589a89305a6bbd GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~1_3@Hu5YA8zSPOQ@sjzqN$$0g z#A`M2Uo+*tWXt?IrSiE;_SXTG*S0c$mdpIPq4KFz_Dh(|rrcUrpkDS8PhVH|%dB!d zLM&mo)q;US6`n4RAr*6yIo|NyeR}Ht2>}DklFh59Gc;?bH$@+C3~LK$x3N3MxsGQY zPfuwp&l(=H&vnoJe%iG!{GRu@bI!fpJTt#WKli&4e^TJUsfdWt}K&?NMQuI!iCB!v}3uY0Kn0);pW zJR*x37`TN%nDNrxx<4Sn0G|+7hE)uI|1$h#V33K*(E$nyd%8G=RNP8VNJtP72?#3>?NMQuI!h&MFp+2@66cq7%0S9 z;1OBOz#w-Bgc}xc!PC{xWt~$(699?!by)xa literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mn.png b/resources/icon/flags/mn.png new file mode 100644 index 0000000000000000000000000000000000000000..407510f91ea044a8b5f4acf5c89c6bd707823235 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=(vG9ot$!w@R2^8Wi z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCilg0(?ST-)k~>ZGHb&a||Dp7!q?|2m?)U@^o8|%GfrEGqeXVYB;R7NdTJ0;OXk;vd$@?2>_=*P~`vs literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mo.png b/resources/icon/flags/mo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7ced43ca200309a1d7275ef270f85b752b2e6d GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85u2@;tlgkfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g&fKP}kLpB3LH3LTvgG3L5<`f3Y zIY5Sl?i5|8IZj#I#j>|%cOUKEcx~gk=jYykfB*mgf1b}emw|foJY5_^DsCkQgoKE& zB(XUv9`tZ@RAh5?3=9`nbYxRZ+!)%~Bbtxjlu7)t1$h%^#9)8 z`z#^qU;p3#-|EEEBvf5~KQkmHU`o{1q^nK~c071>cXz`p7SW~WbXZ;rhX^p-Vq|!= WM=pF_@pUnv%?zHdelF{r5}E)aT|vj1~)|6ybQ&G7#}Oauy87#JAg97ZOF)Hr^3ljkSC{P}QA zYWBh}42+D(rXqm38>_X(({(46@19q6xAi_Z!Z2$cI`|#mr zsegj}d|%$Z`-kqWfBzWX2`b&bb@{@D7e9XddGzr2<@f*D*swX^+cySD9%e2s23FSZ z>>NM1xEL+u<=?*j3k@6w24)FyZ+KYg%W=vp3H)dL{P5vhO=aOfUs#Wwc!xa%<}ZKf zVJZ0G{kNY#{{{!BuG{u?aRdmA4o7b;@MpnuQP6LeKSYZT$ z|Ns8}2gd3D|4c~n1PcKsR=C5#amxbK08;$#4?Iyu20OhcUcgP=(`Tzg`07*qo IM6N<$f{N+dMF0Q* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mq.png b/resources/icon/flags/mq.png new file mode 100644 index 0000000000000000000000000000000000000000..053f9503bfcd55a291874c0da7d5d0cfd381c4ac GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5cDt+r~nFa7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(j1O1^9%xva@gd_wUa?c248Y9hE>qVNVywkcwN$2?+@zB0)h( c3xs(YOpdZ{{K@5O0hDI&boFyt=akR{0Cy8I)c^nh literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mr.png b/resources/icon/flags/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8e04eb95a8c0e65cde30d5d8b71fb6e8cf297d GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`g#vs+T$%T=DDPu2+sCqPA4|nP7N31A(|#6B1Ik)@x;TbZ z+)7SRVA`;0K|$na1Dgz_e_-B+mmkgM}X)xGwk{ a=VQ>}Vkp^L)Gh!tgu&C*&t;ucLK6V(D@8{D literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ms.png b/resources/icon/flags/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..286cabdfb40d8dc0d45444828a57242d12fd09c8 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!iDIQT`4o^5$~94N$D z;1OBOz`*qZgc+UIn9KkQvZOouIx;Y9?C1WI$O_~e1o(uwGDs9NC>C=lRx4^|OBfa_ z8W!_p&17A)-N#4UJSyJNuR1lhceRSxuE^L0Jxiag*btrgnPbQgJJ}Vtd)w z)uF4y4Byo6u3x-h0mtFr`~S-~y)aHcCnMtB{Nd>GZi6@Xf7dB?)V+QESI~u>i%Y9( xd$)lF7Z;aTi9?2@hHj07Q}da|i>nnF7~B%n_H4iF{tIXUgQu&X%Q~loCIDvbR&M|R literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mt.png b/resources/icon/flags/mt.png new file mode 100644 index 0000000000000000000000000000000000000000..83e20a0624362f1e031f2aebb260b455cc2fd19f GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>t(3vyX}8;i;1!9z57IZ^^L@8-BiiGpncPUf2I0 zKs8#PE{-7;w~`YQk{KA?I1&;PQk|X|ZQQ(Bv2bQ&#KfIEK4&zlBqi7w#Top=80Jpn SYCZPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7YgtRab-HkQuK`F-#->s)}K{OE&rHUcF8kq17#IGT^vIy zZY3wUGV=V`siV=*D9I}Dz-S=@Q;eI)0SBPFC9g5QKGWA%2~^DB>FVdQ&MBb@0LsQX A@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/museum.png b/resources/icon/flags/museum.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd40c2207e109193ca6308706e537d519703d78 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mv.png b/resources/icon/flags/mv.png new file mode 100644 index 0000000000000000000000000000000000000000..449b944efec6337c150dee3fce0d20e211b4ae01 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{o zGIRA5Occ^ymKEtK7#SECDj1qt0g;iJg0_L7fx(}t0`q}7*-JcqUD+=(vG9p985?rz z1BEyXJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|>0G|-oGsX|NrjY zJ0-2Ci$HOCPZ!6Kid)GE3Jekt8Pun9ww~_MI_<(Gepchow?~W&I%gSjJSFT`1C=s( My85}Sb4q9e0Ci?QBLDyZ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/mw.png b/resources/icon/flags/mw.png new file mode 100644 index 0000000000000000000000000000000000000000..50d32c06c025429937cf7a26e29b9ccb7dfd5e6f GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCSkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%+7vK}(`d$;rVh|D%$~@^Cc)=#> zm}TTKi@EjkKNJ`~XfosqG5pkK_^ZwENt5BH0>c|Cu|L`j-?bPv$}&V9xBREg5O~oh z^0);TBZCJQ!&`HqdG+#{r+meQg_8Lg5|26lvJ^66XZUF&7JI>4Sy{PVltD;D%vMsU zNt9txyOAFkLog4+O%;Z6HL)ljhHv^pC8wiOkGqM9iA|AU5EK*?6%q>J0h;6N%Ej>2 zNVr6p!Jmu4LPBU!n|>M}L-FZ|mF2V+%`pdHM9;@g0q>`W4;p;#YVb%DH`_ z_P?n3u^IOFpIh(i&{QdG{PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)ab@ab@mb~fgTe~DWM4f7C%Lz literal 0 HcmV?d00001 diff --git a/resources/icon/flags/my.png b/resources/icon/flags/my.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb61396d89489a17c65d3b381fe644e75ac3dec GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mkaO-as448@#DgY9}y8hdOA89PW%8V{2?K+Ai-xvfltH)|7RHfry2kMe#6XQsE_!3j2LrVZZ&+@!{(pSLwG)}j dQ&;+=%KGkP{$!R?ZvZrn!PC{xWt~$(698{LVJZLs literal 0 HcmV?d00001 diff --git a/resources/icon/flags/na.png b/resources/icon/flags/na.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d5687e79a6e35e34508287704e6cac952610c0 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%Hwf?vajj=z-BwtTxITfYj%9AJ|Dr=PN=tesYifve3bC-% z`1wuQGNF6x+L;;}EjMn6{P@AL{PWX?K)sQkE{-7;w?fa}=4&wEV7}m2R>=J2|Nk(y zb4T~hU6OgRJfvamL4&?k>t;2y)!n^1)t6N&C0H*db>k)z1zDF4PvO~ftkh#C*D0v8 o{$0?*v0m(P0;_%Co!UwUxegY`#}|ti0xe1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%LeuQ6 z_Fte7XMsm#G0=j;Ak26?e?X*16-7#lMf zr!l0>1QHC!Gl9Icv@~N71>~M#Nc%q%$ODo&j@tOa|X+XxzGiPQRpE(0mb_U2# zn>iDx6G-ovd*L$Be8!R>zhDN3XE%U`Fr<3AIEGZ*YCU(7uR(!_C18O;S4d&}|Nr)D z9~BuE=B=N+EcBIj_uWt8XMS3lUU&F@*y1ds-Av1EvFr}>Rl_%~krsHkAobZK6%QW9 z5BGLl(YmQ*w6EaXq7wmS@n%9w-~TLh4f~tMzS*4F<%F6+FVI2;Pgg&ebxsLQ0Phur AH2?qr literal 0 HcmV?d00001 diff --git a/resources/icon/flags/nato.png b/resources/icon/flags/nato.png new file mode 100644 index 0000000000000000000000000000000000000000..bd90ac81d143d3e47a4fbd8441095d0c4acd2e21 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!1F4{UC0t#^! zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;R0X`wF3=9qb|Nr-B(0m3Ik@j?P w45_%4oN$1p$AX20MZv}~B+<<+=GO+Gm4ytJ{YU>y0xDzhboFyt=akR{0NGS1!TPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)as9`^`LChg&~SE2%I1I3(f^jMc<|r@6H{Yf*2GAl z8VgSs$B>F!Q_mT4F(~k`95l6j{J(yUkmDACIU(HPEDL6Izn$o0>>9`OY~uyK^0;Kr ht9vv)em!Pv{rnLVOWU@#nLslbJYD@<);T3K0RWAlPd@+v literal 0 HcmV?d00001 diff --git a/resources/icon/flags/nc.png b/resources/icon/flags/nc.png new file mode 100644 index 0000000000000000000000000000000000000000..aea11511932a5df49a73f580509dd93997af50f2 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn`~n3h)VWWoO^^@86$)?3~7(J1T*K!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0E;d&1ONa4 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ne.png b/resources/icon/flags/ne.png new file mode 100644 index 0000000000000000000000000000000000000000..6c42be58988c5cf5e382136dd43a6842c2d1dcb9 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab=pu616Ml-@iZq-re~(P3PY%i+`V<{M(fBuaV{7 zu9AP-a{f(HnRj)`OQ3oKPZ!6Kid)GK92j|23U5wi6lWIZFeu)1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&TyMU;A#t zId`BCXMsm#G0=j;Ak26?e?X*16-7#lMf zr!l0>1QHC!Gl9Icv@~N71>~M#Nc%q%$ODo&j@tOa|X+XxzGiPQRpE(0mb_U2# zn>iDx6G-ovd*L$Be8!R>zhDN3XE%U`Fr<3AIEGZ*YCU(7uR(!_C18O;S4d&}|Nr)D z9~BuE=B=N+EcBIj_uWt8XMS3lUU&F@*y1ds-Av1EvFr}>Rl_%~krsHkAobZK6%QW9 z5BGLl(YmQ*w6EaXq7wmS@n%9w-~TLh4f~tMzS*4F<%F6+FVI2;Pgg&ebxsLQ0Pt>w AH2?qr literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ng.png b/resources/icon/flags/ng.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3927017d178b079736d77349c1b6f2233146df GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aaEY4X1~_;(W56>>vDu9$uLc3{rB%r(!P|{Yo}!b z)hK$pIEGZ*N=`^jO-)TppPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab;rq`Kz4maJJVuijnRHt)!; zMQ1*JdJ+}&JH-5V0Z_fZr;B4q#jWIo1q=m?8Q9bW5}qZcvl$qq literal 0 HcmV?d00001 diff --git a/resources/icon/flags/nl.png b/resources/icon/flags/nl.png new file mode 100644 index 0000000000000000000000000000000000000000..4195ae93b34b7ac307964131e91c181a9be9c58f GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7YgtRaWxXUQvKf-B1_lcmF74>iXlP_&VEE0#xU`3bYYk8_gQu&X%Q~loCIFma BJ(BPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)as9`^`LChg&~SE2%I1I3(f^jMc<|r@6H{Yf*2GAl z8VgSs$B>F!Q_mT4F(~k`95l6j{J(yUkmDACIU(HPEDL6Izn$o0>>9`OY~uyK^0;Kr ht9vv)em!Pv{rnLVOWU@#nLslbJYD@<);T3K0RWAlPd@+v literal 0 HcmV?d00001 diff --git a/resources/icon/flags/no.png b/resources/icon/flags/no.png new file mode 100644 index 0000000000000000000000000000000000000000..76cea41d9f8f9ef4c609d938ac5d9c74f5504d14 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)as9`^`LChg&~SE2%I1I3(f^jMc<|r@6H{Yf*2GAl z8VgSs$B>F!Q_mT4F(~k`95l6j{J(yUkmDACIU(HPEDL6Izn$o0>>9`OY~uyK^0;Kr ht9vv)em!Pv{rnLVOWU@#nLslbJYD@<);T3K0RWAlPd@+v literal 0 HcmV?d00001 diff --git a/resources/icon/flags/np.png b/resources/icon/flags/np.png new file mode 100644 index 0000000000000000000000000000000000000000..1efd2df094f6cc5c5bad883decacb2554bfeafc7 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5aW!IZ4QGy<+jDX=i@@K%e=Y@w+$}3Vvi{=Lv(NYF z+1MGaPf0l9Wci>Ss6Nuu#WAGfmTzyQ&;bP=C(q3t-~N5iU9@Llf^fxcba5~AdX~`zn9aFZLtb6vda+Y-R?fzV^Z|UAa d&P7uW%ZIfyGk4eXPXJoN;OXk;vd$@?2>|(TYd8P^ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/nr.png b/resources/icon/flags/nr.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3f13a86957539add7e3db47cf4eae1921d013b GIT binary patch literal 461 zcmV;;0W$uHP)Xx000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP00048Nkl!Ab)`42F};Ok1_OSc_m04_>_V74)EZ^Hv1!zJm`Z^$FC2pdhH=K`0f9Vyk7l zo5W1pty+JEfn>hPmpwFORN z${<0M=!C6W@xD1R&*)EETL!r3$52Delr_g#pg0ksPnWhq@<5PO7yE-xAS6PEH&7%(M zC^^FNYLYliyj!z&RBa|YhdQ@%s0^79ORarzIrvi61&!m$$NSH6Avs{lhW(F+r{~^l z4_rwhxU&5VK}WxrH86ts4Tjy9M1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/nu.png b/resources/icon/flags/nu.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2d75c54f787549ea9d54a645d8a8a4014381c9 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%Hwf?vasBs?yrlYCaQT_k_huwZB z?R7{c#VIK6iBZf;-(Xh0clklHgwJh|t?gmvfBoq42G(UkS08ofEJ)@59d5=h!8pq^ SZ#5&(Kn71&KbLh*2~7ajuwJ_W literal 0 HcmV?d00001 diff --git a/resources/icon/flags/nz.png b/resources/icon/flags/nz.png new file mode 100644 index 0000000000000000000000000000000000000000..9bdd98dd95fe92272c4c58364b6597224e8e5939 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)ab@G05}-BVe$|YV`f;_z+xCUGrFhJ|uzopr063CWwEzGB literal 0 HcmV?d00001 diff --git a/resources/icon/flags/om.png b/resources/icon/flags/om.png new file mode 100644 index 0000000000000000000000000000000000000000..55885109038e1c9e6ded323b5cc0ef5e5165fdbb GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aoxwn664FlG>ye5kL84#+O^pD=kpf)`}fDjs`Uj> zjkc$YV@SoVu*x_T~ASBKpGN18{+tqoO Qf!Y{6UHx3vIVCg!0NS2FApigX literal 0 HcmV?d00001 diff --git a/resources/icon/flags/org.png b/resources/icon/flags/org.png new file mode 100644 index 0000000000000000000000000000000000000000..30dd64aee9a8cd49480cb6a006717c6d742dc2b2 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&TyM-%x?c z+!iRrS>O>_47A`d2s0kfUy%Y7WJ!1Qb!1@J*w6hZkrl`f3GfMV{r~@e+RQTy#>NcB zX$)yIfdqr`Odu~UEzKB20l8-w(*Dl`@_;0enh8{BeCEG#8jvyb%$b?SXU+hXodNRG zX3hla1kyX^UbqZ2pRpv!FPOpM*$to}45^+jjv*DdTF;&2Yf#`}30Ppz6;c@g|G)j( zM@5E(dFv-H3w@>CefN|2nV(js*B!newm8dZH`8)kEW5*e)$omLqy-)>NPRX*#e;|O z!@V6>v~DUH?JM}U=tMwSyqS>F_dg3=!~UkRZ#HLkIiY6I3$&2I)78&qol`;+02_^i Ae*gdg literal 0 HcmV?d00001 diff --git a/resources/icon/flags/pa.png b/resources/icon/flags/pa.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4ae8de8663c621606218cf82c9704da36e48bc GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab;%y^Y`!Xeh;`EHQ96{z0H)5S5Q;#TOH+guC^9LyJ{hE4nbfB(&=2YuP(1Onr}ux|8Q zCM-K|XHKf0;-z%vMQTCk9;oxVnQRoEz3t4ZsTxOS^FDH7+PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)ah=J`vNJ2=>$gwy_fI);dwa5=m|{rvj1|9=Mp z)fjuaIEGZ*N={&4a#K@CNNHdc+Nq-vBUY9srlL3Dc;AuKv{ct;n>K7x)J{uEQ@k%} apvU0%f#JZ73aN6Sb_P#ZKbLh*2~7ahTS^`P literal 0 HcmV?d00001 diff --git a/resources/icon/flags/pf.png b/resources/icon/flags/pf.png new file mode 100644 index 0000000000000000000000000000000000000000..4f60b16427df8d0c78990e7d4355e9abfdb3f130 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%*A4Iqas9`{@_S0(jl3!U{{3uf`cqx`YsHE`IkBIfJ-X6m zx8~o!)HA!zywg*8w=3kHR|x-cYdN4s7f%<*kcwMVdmV)u6nL1UH}JB2{eM1{fz@`? z@;50)f;S!OJ#s$yy;-PT85e&wXv%uE^A6u`N+m={@f*wEE)+Oayv3PyhZp14&dW0b QfaWoHy85}Sb4q9e09h$x*Z=?k literal 0 HcmV?d00001 diff --git a/resources/icon/flags/pg.png b/resources/icon/flags/pg.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea06e3406fa6dfcb32e61f93148fd6214d596c8 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>k@$;&PPVV@97%0S9 z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`032l#}z0_n934Bx+hKgPiDeh$O` z{|rEV&s!J_85kOwHWmP-?LA!_Ln>~Co(be@P~c&?$Qb$MpSoG0=BB@oS~C;ljx(IE zI<-XiREhq}e>XaJ{935=|LNt5omCz6mv(RM%=C;~d63cIDAG literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ph.png b/resources/icon/flags/ph.png new file mode 100644 index 0000000000000000000000000000000000000000..d252607a67c973f952a9883756c8f727c60f0dc6 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5as3w=`Hz|P-@gz4)~)#WZ~mueAO8KbI&$O>3-j+8 zGk#=b{IRn7vqZz-Dp0+Pr;B4q#jVhDo}mr7^kntOe= zdU)2UdVRi-HPvm&$*8EaJAXy|_{_`mMc2-p%ilvu;HdPOU}n1jK6?eAc?_PeelF{r G5}E)YzhBJ& literal 0 HcmV?d00001 diff --git a/resources/icon/flags/pk.png b/resources/icon/flags/pk.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0ad1352638be57817e9d5dc2d527a0211d2fa0 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5asBu2&%JkdnCe-ARs?LgvA*e0OXB+Y(p@Ddo}3Wv z7Bib|raoEy?4#}&pn5k?7srr_Tear`xf%?3m@mvIy?g2I|9x5+cU{ihUp#@0!7S~= z*$Zb1iZn8hFYTXg_44F~rLSBQYp+PJY-hcC+hlRXU&+c;_8r`eTOAhf-3~O7!PC{x JWt~$(69D{tVp9MB literal 0 HcmV?d00001 diff --git a/resources/icon/flags/pl.png b/resources/icon/flags/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e3c5678b22d9fd522a8ef499ba2e62d54aa33a GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7Y* zM*5ceMg|5(sjtt60+q0rc>21sU*h2s6<3jBlC}j3aTa()7Bet#eE?xbr!^)sfPyUP zj=qiz3>*8o|0J>k`33<#A+GNw7`}@zyjNs+ugP#vSK_xS!y@yLpUs6qE{g(u*2Vg- zT{q+4iwE!iKfm|?`}hC<|L-c;R0`Ca>FMGaQgJKU!<3D=E%V^9W2YRdQddo!IB}EE z;Z;}59UBs_t}1?iZ|~3J81CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ps.png b/resources/icon/flags/ps.png new file mode 100644 index 0000000000000000000000000000000000000000..19157ee0e1980b8c3e26d795ec3d2e1558afd6e6 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYxp)->K6Ly9iZE~% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;90X`wFPC#XI7>+42{AXY&ZZQnn z8}#4O@;?yl-CJyE7!(wA3}haI69dELw>N-l8O%Lh978H@CGRL^z`MT-G@y GGywn-GeJ!N literal 0 HcmV?d00001 diff --git a/resources/icon/flags/pt.png b/resources/icon/flags/pt.png new file mode 100644 index 0000000000000000000000000000000000000000..06b747f6dacc4a4227f556bfc5eddbaac52a3140 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aSf>o>JKpZ$;@)KGv(t#%MpsIf ny02DY-zf9>!uFT1R?p{e$zgOqaILu&XcB{`tDnm{r-UW|7b8`? literal 0 HcmV?d00001 diff --git a/resources/icon/flags/py.png b/resources/icon/flags/py.png new file mode 100644 index 0000000000000000000000000000000000000000..63afcaffc2964f7216b3b39170c50201dbf01d8e GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab;rq6BYS8O6$tMzrRmTJM#M2ot9M<(>CrXJLU2( zBI=)(&OauWVmI?OK=qcME{-7;w~`;YG4iMsS{`iRb}BS7XlCHH=AMzpRvdZL@PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aeaK}&Xq|M7wPE#{P}$qEBocD`ez%qygG8kQ~Uf5 zpc->e7srr_TgeGPkkZ7=mX?<0CT77gMG&5D>Z3;s3Jdp(XO=t&E6O&6RVr>1kx eA*|;WD}&G{rn$U4dyRocFnGH9xvX#3iY2ZQCBgY=CFO}lsSNH#i3J&% z$U>G6?S-mCxRHu}a!35h37h&9OYA~kZqb~q<~!S@ z^3##b%WD2j4VeK|mqavrA2pcE-(xr#ySt3hQ%`T*p+kpGojSE>k&;f{-@m`VPhTHz zSO1SE<^S*R{3m{VeSLktef@_v20n)-P&hFB|If@Is`CHn$Ia0!Aik%opUXO@geCx4 CAbkM< literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ro.png b/resources/icon/flags/ro.png new file mode 100644 index 0000000000000000000000000000000000000000..26ea38ab7dab29a91f6442b34aa50b237ad2e854 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7YgtRag|fsl9pBT?;p#*ES7&Kh=0%eUoT^vIy zZY3u$FuAEIB&4x2v9U~N<(RN@#ilhGnmdKI;Vst0I^L(1ONa4 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/rs.png b/resources/icon/flags/rs.png new file mode 100644 index 0000000000000000000000000000000000000000..98967d27b8899ad3e3be5a621b31558f8699de2d GIT binary patch literal 684 zcmV;d0#p5oP) z_4WS#{`U6v_xJa=zt=uhl;eS8+e}8?Q!i6tnV&dSmtcEASC;6Jj{pAsxWU*fOOpEg z``$4()`dRTZBn?v*!}z0=>NsY*iljWnL-YYUSOpct9t==m!+aoICGB+|xj@%|J z+$Aj5ku{w)Qae+W&AY}gM~u_U)h~D=y$CEYUzeoikBARh8l{IOdIr;3zGY zaE#wFI4DVxDoc@`Iak~yE8HY1+$AgBB`e-9Hq4=n%656)Ei=}CTI->X-6k&MoQ~Zm zE=^mP-H?(;U7Pgu^xY*ab-<~&A zzQEEkOOM?>Lo!N@HBOJ*DKIfpm%=zj=8B0nOpe_uG3TP0PhgokQj+hnu-`2+y2aex zC@!5gQ`;me-7GWWCokPxFx(+1+#)I5BPumbk2q42`{?5|OpexzS~N_L-Y+%dGdbNZ zHTB5ALt2;KEHa}(T%kZ*H&2i@PLSOuEiFxw+$k^NDla)uk@)!d+#n}2OOD+rFI-;n z_W%F@zDYzuRA}B~NUxPo>T+xHwkj;>=+I%PsB)Ci&1~svQntxf$Y(GU&WUmgv}=j& za#69hW~fv&5>*x9$PH?3HPQ29sH^wY&*O}@4CW5cQZrx(iSu-Db><1sZf+K|FlXRZ zPtov@mg{V2jFBx>VyH3X(vnCEO-yZTYiKNDU@LZ)O5ih%Ebr`$megeM&xj~XX15O$ z5Mu=b27U&HY9Heg1}I==WEK)6n literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ru.png b/resources/icon/flags/ru.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b1a15250444facb668357148780a8484e0e88d GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5ME|g7y=aHEbxddW?Nn{1`B?5dxT%RjSyq6I8&%khxL(@|6njy!%>g@Ob|NpmNW~c#F zqv+}47*cU7S)-kSEv7_@#b8HU6QkcP2_}h_DF+yu+n5+c-^kob-1H_3sF=ai)z4*} HQ$iB}f!sf4 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/rw.png b/resources/icon/flags/rw.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8dc8559c7e34372fcf681cee1f14a6dd47f1f2 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~e`RBy)^Cyew5tdDxSW;40dU{x-q*%1ia?1hL z*m$})hE&|@?Q`T~P~bRR(D(7be7Cr(uyA$uHr6wf+LrjgS$fB7&%la5+U0?Z1A7~DPr>mdKI;Vst07I-!W&i*H literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sa.png b/resources/icon/flags/sa.png new file mode 100644 index 0000000000000000000000000000000000000000..15d1995429c56b6e89a7a776882e1ef5bf7190cc GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2`cn9VlpJlf^5$a%r}`O literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sb.png b/resources/icon/flags/sb.png new file mode 100644 index 0000000000000000000000000000000000000000..5249207155b42ba3acc26b28f6da967f9dd22a0c GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xUP7|!g`wJ#0i}j-&t8$&P<;k7=> zH1pTn9*sC$qb+%OS+@4BLl<6e(pbstU$g&fKP}kLkojMj|2n5Ua#c( z{|pRsqAZupaGJQa^S=PY|4`Qd&l&#zXZRlx^8fks|L@=b|NnnNT+&^j-egY~$B>F! zvL`n39#G(MxhUNz>ErI^@w%zW>XejZOP}I|8w_a+mUYcgDdM?qbC><%O(WwDFYnu7 zm6_pTcTdTcthwX3{F%mrNftg^H_cbtFmv~b2JgUq>;;K@%n$0mzR=tJlX3r6b>a74 StjvMdF?hQAxvX zM*5ceMg|5(sjtt60+q0rc>21sU*h2s6*r!Fao#VW5NCl$WHAE+*9Q=0bXsFF11QLn z?&#~tz_78O`%fY(kZ%y+6XFV_IRqFuBp4K2Mf?|;M;)^ax?mr7%J#hi!{Jcj?}`ln zB^a`IcpdI^fAsy{|Ns9V{xAfY747Nb7*cU7dB;UYHXcoDg_0kgqH`Ti2n5?@U+r2a z%JcB))a`lqb{!QEj{EiwsEudg(xrCq8%umDGAugy)^ghO3-R;of86?UE8{EU1ct^B jNd`v)lo%GuDvB_CIH;qp87pi6w1&ac)z4*}Q$iB}4qs!V literal 0 HcmV?d00001 diff --git a/resources/icon/flags/se.png b/resources/icon/flags/se.png new file mode 100644 index 0000000000000000000000000000000000000000..35aeb7bba2791786c5cfc4c617383afd3af4bbf8 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEcxFxphwE**%e2Z8`5AiF|s&^Y0r=U0Tbu`(>L)ZWS literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sg.png b/resources/icon/flags/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba1eeb98758379f45e229926aad97273cefaf43 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1=hw3*-%lUEt1bD+M(=rQ%)73Jr-AN`f9-66 zYVPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5Ijxc*~eImTqe%=E|K^xm4j2fKFtDbD|S>eQbPw_eD| zyh-!A^Y7muS@%F~pn4-u7srr_TT71{3Na{fFmH$waQ**3-kdMutk@l>SpkC^>bP0l+XkKDy35% literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sk.png b/resources/icon/flags/sk.png new file mode 100644 index 0000000000000000000000000000000000000000..98645d11584de3bb14fdbea48a80576428300eee GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPIZ_+U*?CCuG8{RsC)C>YgdPzh$I+`}S>>@((tk z8V64o$B>F!b5A>R9WdZvz4$Zh((n5gYEzS5u50GtpYmE%-t8JkRh~q%W%2!o>o_W> px-2rDFI~DUV_T-^?~p%PjPX89-r?29W&zD&@O1TaS?83{1OPc9Qt|)* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sl.png b/resources/icon/flags/sl.png new file mode 100644 index 0000000000000000000000000000000000000000..3202cd85ef142bee1914ecbc802eb9ae73674c58 GIT binary patch literal 469 zcmV;`0V@89P)Px#z)(z7MF0S(005T&0Ehqpdt_wXTU*&uQq@UG(nCYiK0eSoI?psT%PT9%EiKU) z8O03^z@VV&ii+ieg5rF9;Cgx8b93BoZrN&T*JWka^Yi-t{{H;@{QLX+`uh6#`1tnr z_VxAk^z`)e^Yhcw-`3XRJJdU;?WdFJlaA<)isp)i+6)ItEA0CeJX0KotNyZ`{F029nNi~s-t z0b)x>L;#2d9Y_EG010qNS#tmY3labT3lag+-G2N4000McNliru+zJs0E+s`R(tH2_ z0FFsSK~xCWZO7XdLO>J%&?5;MO3{VLC|PQn2IUg*|9{oA>Mi?iL(09nu49b#eGh4t zWrVaXrT3z2{+s8IqO9ur8C4BLr#McM^M#Nry)oE2j^pk;&-eE@IDYzD5DwLKzr!Iu zfIc_P#nQ6v)p}zAz*tc=9U;RoW=Q0fq=_sm>QqAm1rP*b#EIM+g?bjiR?7gD00000 LNkvXXu0mjfJ&Dod literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sm.png b/resources/icon/flags/sm.png new file mode 100644 index 0000000000000000000000000000000000000000..ce75b61d7a2a4d0bb15f8a1786b1f3782aa801f5 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=(vG9o)PW=^K0Tkja z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCils0(?ST8Pd-D|Np<=z^4x=BIxPj n7*cU7Il+aIXUpSD+zbr1vJA-!`menQN-}u5`njxgN@xNApED-+ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sn.png b/resources/icon/flags/sn.png new file mode 100644 index 0000000000000000000000000000000000000000..1e86ff8e3b55db6befaad71dffb4fc669c16c215 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv31r ziMe_Th6W0`iABWO>_%)r3)0fZTy)|kuy3bLd-`Z_W&Z0zU$lgJ9>8wB`-xEju3m~)QdoFT*i za}5890HJ$r-U9VXd%8G=RNP8VNJua<3kyn8XcQA@yTGRMiuoeLH)Bpij? MUHx3vIVCg!06#rm{r~^~ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/sr.png b/resources/icon/flags/sr.png new file mode 100644 index 0000000000000000000000000000000000000000..230c0cc72365f3d3ea9d4617f0ce89103cb96a16 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPirxY)j=3j@!*MLI4o-U3d8t0Q! zG%o!)@4%Ljq#$hY@Bjb#=gi`S3=U>3es|B9XZl=UkIjMQ_a)ib+%$aGxRo5;VUnD& s=S@n}bbo__f=mSoi)I74m-E6HuPVr@{%EcE3N)C()78&qol`;+0H<(2@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/st.png b/resources/icon/flags/st.png new file mode 100644 index 0000000000000000000000000000000000000000..789282bf493cb178afe268d4f7b0b3fd5a6a4360 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!f?WyQ>tzwC__0}62# zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<)0X`wFPC#XI7>+42{AXbJzn9_v ze}?z(8U9-`Jb%t`?Ha?JISht|48_F^2g*!3fLdHVT^vIyZY3v(urRZ^YUDC3?Om{C zV{}ATRF+nAVP=N=iz@+a$&)V_PqaSxWz~hX3l%<|yO8N{%hc3F$Ao9yd4{twD{L8( XABgZ31Ri(-G?2m5)z4*}Q$iB}^>|AP literal 0 HcmV?d00001 diff --git a/resources/icon/flags/su.png b/resources/icon/flags/su.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1b499456999943bde99f1067a8f8c7c603deca GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxb9?NMQuI!f>MOZaBR7#}!fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g>fKP}kNA_NZ>|;@Lu0<`q_y7C% z|NsA2&&huO{(1J4h_SW94 zt6FT=FIPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2)ZczOB!{rCIn$ER`Y;}>06@XyQV9}`PW^OYi? z8e>lv$B>F!$qDX^JSv4Z0~nZvg@uiUg?m_vW=2NLJgCxg`pBU}EoWM_*aCTaG#VP2 a7#JF2naU4|c(4PtGkCiCxvXPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wdD=xB}_)nWz7qV>y|^x*)+|HXC~cFPD&j!2OFCj_usB zNL%vDmoF(9Wotd8{QUzobxrO~(s5rXDht%cSQ6wH%;50sMjDV4zgXn_pXua;mP>51pKdLXxl`C7UK*AEtIj*CRM><^Rqd?vo#l+Z z(+q<|Kfh$K5WRFH)aAm#9H~GhUO`dTr?0Kk|K!y%mdKI;Vst E0Dr-0XaE2J literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tc.png b/resources/icon/flags/tc.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9d43d8cc339a4f3dd7fad02a7b134d942a8a61 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH2<;pEAqO-}ZD+m(HWxGPibX%nRDG%&O-_Y|*{i z>HTHT|JmBKrj~34s`vDCaSW-rRommp)!@Lxd^u`%+VB7Wxppm5vfAG0qrfg3*Ee^~ z!6nBMSG;PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxGE_viH^>_bxY<)G}|*d88)_6@7}TeV`4E4ZV?8m zQTB9k45_%4oWRQDW~Pvk#?HiMqQ@L}({YhFi^R-^hMBA!46D4DUy1F>^#Uqq@O1Ta JS?83{1ORV6JNN(q literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tf.png b/resources/icon/flags/tf.png new file mode 100644 index 0000000000000000000000000000000000000000..85c55910bd1212eb1fcaf4f97f55824473ccc708 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!1msu5t0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|-oJTZyZv%sH2w{C`gJIYWlzPZ!6Kid)GECHIO0 z0|F*AUaXX#@~{0^`-#mhXNy=qH?~x;wuqUuTsWi`U?u6b+v(}TSFEC}k_#9Zc3bj) U@N-+_4K#(p)78&qol`;+079Hn{{R30 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tg.png b/resources/icon/flags/tg.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f6101d23da5d6427d730159c2c3053a5a4d66a GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxC$O(`S*|I$1=?YPg(x4u!hyK{7X%%Yh%gXBBcye zW9;eT7*cU7If0Qej7{Reu~hehn>QjNW=Je-U_9aSuqkyWkg@-ykHP_-@G~7u7j`aT ZV3-%qsCR5t*9M?=22WQ%mvv4FO#lPGNuK}! literal 0 HcmV?d00001 diff --git a/resources/icon/flags/th.png b/resources/icon/flags/th.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8a282754bb384d5c0fc5ed57c16dbe554d0956 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc=i}`FHBbzkh#Lt$QM;w&fom%QVBn9-yp&r;B4q z#jWIoR0iiTHa0eawhs*=+7S~3Sq%&pGO(qI95~R#EaMMM4A&Mio|i5E RdIG4I!PC{xWt~$(69AiKM92UD literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tk.png b/resources/icon/flags/tk.png new file mode 100644 index 0000000000000000000000000000000000000000..ab79b28a1607e550cad77ed71072e88118871920 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxU#UWN=ho6F~haCHY_YEhugBy$*F~@K&M#1vkRyu z*we)^q~ca;Uo;nkAqVs1jN8BOSJaAft&SI#rzZON_p=^eSD<(^9+0Z4Tfj44WxU4#xr=j`njxg HN@xNA!bwze literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tm.png b/resources/icon/flags/tm.png new file mode 100644 index 0000000000000000000000000000000000000000..344049aacc045add9b33f044e4d01d60e019e494 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|Wamxc>kDzib)Hr#e37Gb~>^gsv}fc{W4ma;u8N4ZB5e z7ZyA!P`<3vm1pzi*qjoe7RHhwzhDN3XE)M-93M{?$B>F!v3=ou2Mjozg%!@+`@hFm z)hg!SJevPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc*~e`KPP*FF5$$#`XVRzWg_B+Tj;7rU7M5JzX3_ zDsD~f*(u0iz;XD`fq&Y^MK8F`^|NEXzhZW_;Ph<^54oJW@+4!U`^^uM&ewK&P4CE; Yvz@~*VX@^FMW6u;p00i_>zopr0Ol7@v;Y7A literal 0 HcmV?d00001 diff --git a/resources/icon/flags/to.png b/resources/icon/flags/to.png new file mode 100644 index 0000000000000000000000000000000000000000..32891282f1712d8310b730909eac60b055fea30d GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~e`S<77zl#_C&7S?Qu=rn4z`wSRe`Y36D&rM^ zYIHnZ978H@B`2h$B&DUKq$D;lxVfdVrRW)JGfN9Mo#s=SQFv<6OIOpGaSRM@j~EJ9 Tu&agx^)Yz5`njxgN@xNAH$g{+ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tr.png b/resources/icon/flags/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..175d81a3cedffaf7cb28f709267d123531898442 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxZX1|`JklomxcA8nf_l-kAFvw{hPDkUtP)Me|qzQ zYAiin978H@we}hEF(~jbc}KtcU%zH@qiZCGr4z>ztxJ#lo4B2p_k4;t_~?tSa9G|p hKUJ@nuiYHBGOl{YIH})H|31(V22WQ%mvv4FO#tH%PwfBz literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tt.png b/resources/icon/flags/tt.png new file mode 100644 index 0000000000000000000000000000000000000000..f5dc69e2ef521f712afe31bee50e1654b12d35dd GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc=i|`KKVVX8JTHCKfR=M-bT8l&mro6kys>KQy; L{an^LB{Ts5L$*O^ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tv.png b/resources/icon/flags/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3793687a574b0516ab03337de5a8e4f36e2b72 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!f>MOf7==IF7n1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6}FNcdT{Nu%^!E|ymz;3I#6SVr;B4q#jWHQk$X1< z25e|ZJoZwuy|?$S#Jjz9)J5}Of$;4*G4l`d)w##a6$J%&$nwp%NnwS^@UMrq+kmd$? OlEKr}&t;ucLK6VAUui!8 literal 0 HcmV?d00001 diff --git a/resources/icon/flags/tw.png b/resources/icon/flags/tw.png new file mode 100644 index 0000000000000000000000000000000000000000..106d66481b2d1da4c8e556c636ceeca5d5102468 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPE0~;pA9mVX-AO^~9k=Ph@1)%$jxM+qW+qJ%R6l zYScYl978H@B`35nuxTWuq$H&|Ju}*Dpj;Sv^Ty4H!c&W0yBf}nV_>kE$dDksphgU+ Og~8L+&t;ucLK6VPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxGE{~EZxAStUOCnoP~*rWz{TIR@PapvstpH&xio3 zvG;Uw45_#kditOsg8~Qh!G^BC%j!j=n5`i<7{xTd9W?3=hV ncHMXPPnRT4rEbXc^Ea_xTEo1zqq| literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ua.png b/resources/icon/flags/ua.png new file mode 100644 index 0000000000000000000000000000000000000000..aa20c8391a0647b6a5dda5ce0eccd7b68115f3e1 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc)uK@DGSiG5kHnz_98+!^-~*tNt;p{CEE!J3mm3 ziKmNWNX4z>gm%U-fusayMxHks46)Nh`63!-G_tZTDE`RoCUW3F57UL638p>?JSrD` am>6=CnI>{cHe3PfXYh3Ob6Mw<&;$U&|43f| literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ug.png b/resources/icon/flags/ug.png new file mode 100644 index 0000000000000000000000000000000000000000..b86caaa48178f85f46b3e90f80837f51ff4a6f9b GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-k0X`wF?->~W1Cap3|NjinpEGc9 z03{fzi<93!f37GX@LW;i`BuxGuiyNDqV}FHjv*Ddl0BLk+5$Kd3e4D;*^)KZE?KgK z_XtlO>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc+D0Xz}V1;ONOtUi&{e`Tg_v|9e`NEBmq6nRBvvxlmc(> zWKSS=V9yLFd>jxy?Lta2+f#u=v#TPiY{Bjeb|(7qC^|VrnYK0ta%Sucl3@54EqHUg S?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;R0X`wF3~S#5!3#x`i$D<#PZ!6K zid)GE2bd)mPHAA6Ai@&Fl(0^rrEP*kp<9R53X^7r#SD4MjMfhsWpa4ep8@J&@O1Ta JS?83{1OT{1FAx9# literal 0 HcmV?d00001 diff --git a/resources/icon/flags/unknown.png b/resources/icon/flags/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..85e4c4c4d87e4f403fe36fc1a0ff145a7d03f1bb GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>GY9yDxc>kDfB6yV6F@FwNswPKgTu2MX+RE-r;B4q#jWIo a1^Pf<0Rv<3_smN`7K5j&pUXO@geCwOJv4X# literal 0 HcmV?d00001 diff --git a/resources/icon/flags/us.png b/resources/icon/flags/us.png new file mode 100644 index 0000000000000000000000000000000000000000..865e458781540b88bc5ecc2ed1aeb096c9f8e73f GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tl`{H(AD)PW@Y&c zpc)5H7srr_Te0Un`4|*9SPoue{QJNE=u-uej|@H?0iGY9vC3_z+bg#B(D8zlw;elo q@B6^_u9|(?g~_`@gAVIz{*OPD%DB(`qsS(pSqz@8elF{r5}E+$tXmcU literal 0 HcmV?d00001 diff --git a/resources/icon/flags/uz.png b/resources/icon/flags/uz.png new file mode 100644 index 0000000000000000000000000000000000000000..56e95a8f2a0edfebd56c89c349fe8354da58f0ba GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tDw@p9t%_wSDvmy5aioOSE2NK5y4c`adLs+~6N zOkUo0A)%HDa~aiv>J2?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;v0X`wF$Br?)f6s94+`0Gf-~a#5 z@c;k+_wVnWTe|evu{kX*noH+cesVkvGSSY{#WAGfR?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;X0X`wF92{%E19kK;FtjifA7eQ8 zp5gs_hNagSg0?bnOkvnBq~QfrY3}Lb7*cU7IUzwnL_{Pg>41}ZS5szZ=h1{Hk3daM y7j9{(#-B+?g#=2S8U=2h6gbuXO8i)o9>crs95eX4U&aEBVDNPHb6Mw<&;$UVo;^zd literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ve.png b/resources/icon/flags/ve.png new file mode 100644 index 0000000000000000000000000000000000000000..bb14a3ff69adf77f4c9ec3a7317bc78d5292fb71 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t}ymGw_f&L0DVKmPuIwr%tI_m747c$flE zjghB|V@SoVrNi@$qYjSj0W~4iw@n z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCik70(?STnV9w*$nR`gRZwZ(v@)R5 z+w=0do_YECFKrF>99(mB8!PXWNw-oz*eL_mJ9@e}hE&{IdeTs+!9c(%@PyLr7k}Sp z&)IS7<`3n%6b^l&vA?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6aj_9p2ZI#8VS>2A825ziaBbGw@=QzSxE zq{<6-oi;GwDl6J3%EkEdS!P>X6HiyuqC+p66rutmSUe7&VZY?$<>ke&>$q^yH{J5z QKuZ}sUHx3vIVCg!02t6^WdHyG literal 0 HcmV?d00001 diff --git a/resources/icon/flags/vn.png b/resources/icon/flags/vn.png new file mode 100644 index 0000000000000000000000000000000000000000..7db23752d981f8172577736b17b615b22b44bf79 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tMl?>gQu&X%Q~loCIG>WNl^d* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/vu.png b/resources/icon/flags/vu.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa2dcd050e92bc9098b8ecf7be41da80c77ecb0 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv{%1Q}GNZhSKD0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wFK$<~7fML$oYzBdA42u8H zG5p61o*i4K0n}pT>EaktaVt5Ykdc{9;w)F9fx(7Z3oh~q{A6egP-wW!vyjKjfnkcc j)56G^Qx2H4G+k!+`JDed@0PDWKsI{1`njxgN@xNAEE`oJ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/wf.png b/resources/icon/flags/wf.png new file mode 100644 index 0000000000000000000000000000000000000000..205bebf206ad4b988b9165ef96f1f8801b6ab62e GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tR`15~%R??KkoqJ91UYJ#SG;w9~ z=6xZZH>Reiu2lT)I`!^ksmx23VNR!(K4@or9LL!9`Af7j&>#j+S3j3^P6?NMQuI!hY85u1!Kle^I0Sa*z zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF4CPTA#Ze5^$qa27RzdCx z1yLEM#6_=(Ol!*~wz4p((8`Eh%lN;mFX##?ZCTl;P0sDZhYLF?hQAxvXSQnR^mS#w%*@DWA+acU zI>=H$bjL2 za;zj!F2d8rF{I*F@(+GS9)~-ZxR%`xT0WEMrTx|Ghh!d0{;NM-m-DD--oyVJUmaER z`p5JC?jV>{vLJhyeQ#ft!dEN^u^df<7V>2go3=DEf4&tIe Si|+#MVDNPHb6Mw<&;$Uc7k*Cw literal 0 HcmV?d00001 diff --git a/resources/icon/flags/ye.png b/resources/icon/flags/ye.png new file mode 100644 index 0000000000000000000000000000000000000000..70c36180310aaed04e4aac0196e4610662d165a7 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^91;WxQd8~{maVv_wUa?CYHlKkANB&q&;06Ln>}18?-U7 n#cWYvG0<>i@QY$#lHdT!6>^!_u{VbSl`(j_`njxgN@xNAB}O!$ literal 0 HcmV?d00001 diff --git a/resources/icon/flags/yt.png b/resources/icon/flags/yt.png new file mode 100644 index 0000000000000000000000000000000000000000..f007cfd6b873d37066de2be18b7571ba0fc86b26 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ8E6yOu$%Fe#+-@iZq*g1_mcT@reg*{yyLn>}1CnO|@hy(>C cEfD5qFgeP)@h6wB1yGv7)78&qol`;+01C!5MF0Q* literal 0 HcmV?d00001 diff --git a/resources/icon/flags/yu.png b/resources/icon/flags/yu.png new file mode 100644 index 0000000000000000000000000000000000000000..b741ead025fc9919b9536706c74de8fa89385d31 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t=&};1 z#=+CYF{I*F>bXF!0}4DW7Y(Cd|INSiAj;69o?lF8!Tx0SqhFF1N$6Uqm`~plF8=yP pRnjwO-6wyJ=^IYB+A;kmyV5ZxcRsGz&p@*nJYD@<);T3K0RXqPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tZyNX_i})Sf1Qtd1uA)mzSljR_ZfQ zjgzN~V@SoV)^mn@2MjozFEadl_|IHV*6U<|=rZ-lwypov75ExW9fkUNjJ_{0+I#uv qT;nxS_tN&Sp8afA`zgbFKjv^}wKDuPN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tcAreM81kBBV)%36VMGXSLg1JcIkO;evv~6O)!qZ=A@< dBB`*6q2o4V|K4p9-+%@%c)I$ztaD0e0s!&aNC5x< literal 0 HcmV?d00001 diff --git a/resources/icon/flags/zw.png b/resources/icon/flags/zw.png new file mode 100644 index 0000000000000000000000000000000000000000..78ad9d24ec5a4c857750c6d60cc62f6f50d959e7 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>YX$g(xE4$(;F-bu^5)IYpFUjKx9;%`mP7k&j(N#^G3Hz} zH}WkLOI=Y37Zc0gVnq*|`EEd6PM$7~Ar-e$&l`$07;vy$oT_+i#hw4V!a5gR{@cXv z5$#u#QC%$@V)Zwsv%vccN6Gmk5;3jw(ih6F{=aBi=GPOy4l!?6VA1X7Si%A{jlt8^ K&t;ucLK6V8B3&W? literal 0 HcmV?d00001 From 4dbcef661f3dee7dab04b0b5b69d805de47df47e Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sat, 6 Feb 2016 14:47:47 +0100 Subject: [PATCH 12/22] Update ChangeLog --- ChangeLog | 3 ++- plugins/display/ip_to_geo.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2af6636..347484e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.3 (17/01/2016) +v0.3 (06/02/2016) ** User ** Add referers_diff display plugin Add year statistics in month details @@ -16,6 +16,7 @@ v0.3 (17/01/2016) Add -z option (don't compress databases) Add own search enfines files Do reverse DNS on feeds parsers + Add IPToGeo plugin ** Dev ** Add istats_diff interface diff --git a/plugins/display/ip_to_geo.py b/plugins/display/ip_to_geo.py index c0127ac..a383968 100644 --- a/plugins/display/ip_to_geo.py +++ b/plugins/display/ip_to_geo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright Grégory Soutadé 2015 +# Copyright Grégory Soutadé 2016 # This file is part of iwla From 19e9b9d4fb7df715c3ff7d9b6236894176ea14ed Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sun, 7 Feb 2016 10:16:33 +0100 Subject: [PATCH 13/22] Forgot to append block in all_visits plugin --- plugins/display/all_visits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/display/all_visits.py b/plugins/display/all_visits.py index 4dbc92c..2dec3e0 100644 --- a/plugins/display/all_visits.py +++ b/plugins/display/all_visits.py @@ -96,4 +96,4 @@ class IWLADisplayAllVisits(IPlugin): else: block = display.createBlock(DisplayHTMLRawBlock) block.setRawHTML(link) - index.appendBlock(block) + index.appendBlock(block) From 9bb188b6fca158ff8f7c827fd888771805799740 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Sun, 7 Feb 2016 10:17:32 +0100 Subject: [PATCH 14/22] Check for presence of country_code field to avoid key error exception --- plugins/display/ip_to_geo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/display/ip_to_geo.py b/plugins/display/ip_to_geo.py index a383968..97433a3 100644 --- a/plugins/display/ip_to_geo.py +++ b/plugins/display/ip_to_geo.py @@ -70,11 +70,11 @@ class IWLADisplayTopGeo(IPlugin): cc = None host_name = host.split(' ')[0] # hostname or ip if host_name in self.valid_visitors.keys(): - cc = self.valid_visitors[host_name]['country_code'] + cc = self.valid_visitors[host_name].get('country_code', None) else: for visitor in self.valid_visitors.values(): if visitor['remote_addr'] == host_name: - cc = visitor['country_code'] + cc = visitor.get('country_code', None) break if not cc or cc == 'ip': return None icon = '' % (self.icon_path, cc) From e9c250900618ca3a676773384239d2d7907756ab Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Tue, 12 Apr 2016 07:56:10 +0200 Subject: [PATCH 15/22] Update iptogeo.py class --- plugins/post_analysis/iptogeo.py | 74 +++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/plugins/post_analysis/iptogeo.py b/plugins/post_analysis/iptogeo.py index f887346..76a8d1c 100644 --- a/plugins/post_analysis/iptogeo.py +++ b/plugins/post_analysis/iptogeo.py @@ -1,6 +1,25 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +# +# Copyright 2016 Grégory Soutadé +# +# This file is part of iptogeo. +# +# iptogeo is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iptogeo is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with iptogeo. If not, see . +# + import socket import struct @@ -27,26 +46,44 @@ class IPToGeo(object): 5 : 'Unsupported IP version', 6 : 'IP not found'} - def __init__(self, remote_addr='127.0.0.1', remote_port=53333, timeout=None): + def __init__(self, remote_addr='127.0.0.1', remote_port=53333, timeout=None, family=socket.AF_INET): self._remote_addr = remote_addr self._remote_port = remote_port self._timeout = timeout - + self._family = family + self._create_socket() def _create_socket(self): - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._socket = socket.socket(self._family, socket.SOCK_STREAM) if not self._timeout is None: self._socket.settimeout(self._timeout) self._socket.connect((self._remote_addr, self._remote_port)) - def _create_request(self, ip): + def _extend_ipv6(self, ipv6): + tmp = '' + for s in ipv6.split(':'): + if not s: break + while len(s) != 4: + s = '0' + s + tmp += s + while len(tmp) < 16*2: + tmp += '0' + res = '' + for i in range(0, 15*2, 2): + res += tmp[i] + tmp[i+1] + ':' + res += tmp[30] + tmp[31] + + return res + + def _create_request(self, ip, ip_type): packet = '' packet += struct.pack('= 0: + splitted_ip = [int(a) for a in ip.split('.')] + if len(splitted_ip) != 4: + raise Exception('Bad IP %s' % (ip)) + elif ip.find(':') >= 0: + splitted_ip = [int(a, 16) for a in self._extend_ipv6(ip).split(':')] + if len(splitted_ip) != 16: + raise Exception('Bad IP %s' % (ip)) + ip_type = IPToGeo.IPV6 + else: + raise Exception('Bad IP %s' % (ip)) - packet = self._create_request(splitted_ip) + packet = self._create_request(splitted_ip, ip_type) try: self._socket.send(packet) except IOError, e: From 4baa0e6f5c32bbb535bdb0932949619ed2aaeb11 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Tue, 12 Apr 2016 08:17:34 +0200 Subject: [PATCH 16/22] Add alternative text for icons/flags --- display.py | 2 +- plugins/display/browsers.py | 12 ++++++------ plugins/display/ip_to_geo.py | 10 +++++----- plugins/display/operating_systems.py | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/display.py b/display.py index b5a5bc0..2eaab86 100644 --- a/display.py +++ b/display.py @@ -364,7 +364,7 @@ class DisplayHTMLPage(object): for block in self.blocks: block.build(f, filters=filters) if displayVersion: - f.write(u'
    Generated by IWLA %s
    ' % + f.write(u'Generated by IWLA %s' % ("http://indefero.soutade.fr/p/iwla", self.iwla.getVersion())) f.write(u'') f.close() diff --git a/plugins/display/browsers.py b/plugins/display/browsers.py index 3d1202d..cfe15a3 100644 --- a/plugins/display/browsers.py +++ b/plugins/display/browsers.py @@ -83,11 +83,11 @@ class IWLADisplayBrowsers(IPlugin): for (browser, entrance) in new_list: if browser != 'unknown': try: - icon = '' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) + icon = 'Browser icon' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) except: - icon = '' % (self.icon_path) + icon = 'Browser icon' % (self.icon_path) else: - icon = '' % (self.icon_path) + icon = 'Browser icon' % (self.icon_path) browser = 'Unknown' table.appendRow([icon, browser, entrance]) total_browsers[2] += entrance @@ -115,11 +115,11 @@ class IWLADisplayBrowsers(IPlugin): for (browser, entrance) in browsers[:10]: if browser != 'unknown': try: - icon = '' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) + icon = 'Browser icon' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) except: - icon = '' % (self.icon_path) + icon = 'Browser icon' % (self.icon_path) else: - icon = '' % (self.icon_path) + icon = 'Browser icon' % (self.icon_path) browser = self.iwla._(u'Unknown') table.appendRow([icon, browser, entrance]) total_browsers[2] -= entrance diff --git a/plugins/display/ip_to_geo.py b/plugins/display/ip_to_geo.py index 97433a3..d104a64 100644 --- a/plugins/display/ip_to_geo.py +++ b/plugins/display/ip_to_geo.py @@ -54,7 +54,7 @@ class IWLADisplayTopGeo(IPlugin): def __init__(self, iwla): super(IWLADisplayTopGeo, self).__init__(iwla) self.API_VERSION = 1 - self.requires = ['IWLAPostAnalysisIPToGeo'] + #self.requires = ['IWLAPostAnalysisIPToGeo'] def load(self): self.icon_path = self.iwla.getConfValue('icon_path', '/') @@ -65,7 +65,7 @@ class IWLADisplayTopGeo(IPlugin): return True - @staticmethod # Needed to have unbound methd + @staticmethod # Needed to have unbound method def FlagFilter(host, self): cc = None host_name = host.split(' ')[0] # hostname or ip @@ -77,7 +77,7 @@ class IWLADisplayTopGeo(IPlugin): cc = visitor.get('country_code', None) break if not cc or cc == 'ip': return None - icon = '' % (self.icon_path, cc) + icon = 'Country flag' % (self.icon_path, cc) return '%s %s' % (icon ,host) def hook(self): @@ -96,7 +96,7 @@ class IWLADisplayTopGeo(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Countries'), ['', self.iwla._(u'Country'), self.iwla._(u'Visitors')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (cc, visitors) in geo: - icon = '' % (self.icon_path, cc) + icon = 'Country flag' % (self.icon_path, cc) table.appendRow([icon, cc, visitors]) table.computeRatio(2) page.appendBlock(table) @@ -114,7 +114,7 @@ class IWLADisplayTopGeo(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Countries'), self.iwla._(u'Visitors')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (cc, visitors) in geo[:10]: - icon = '' % (self.icon_path, cc) + icon = 'Country flag' % (self.icon_path, cc) table.appendRow([icon, cc, visitors]) table.computeRatio(2) index.appendBlock(table) diff --git a/plugins/display/operating_systems.py b/plugins/display/operating_systems.py index 0b4324f..dfb88c3 100644 --- a/plugins/display/operating_systems.py +++ b/plugins/display/operating_systems.py @@ -78,7 +78,7 @@ class IWLADisplayTopOperatingSystems(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Operating Systems'), ['', self.iwla._(u'Operating System'), self.iwla._(u'Entrance')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (os_name, entrance) in operating_systems: - icon = '' % (self.icon_path, os_name) + icon = 'Operating system icon' % (self.icon_path, os_name) table.appendRow([icon, os_name, entrance]) page.appendBlock(table) @@ -95,7 +95,7 @@ class IWLADisplayTopOperatingSystems(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Operating System'), self.iwla._(u'Entrance')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (family, entrance) in os_families: - icon = '' % (self.icon_path, self.icon_names[family]) + icon = 'Operating system icon' % (self.icon_path, self.icon_names[family]) table.appendRow([icon, family, entrance]) table.computeRatio(2) index.appendBlock(table) From e3b0f914bd4b0dc1e00529d209e499749b8df342 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Tue, 12 Apr 2016 08:34:18 +0200 Subject: [PATCH 17/22] Update documentation --- docs/index.md | 128 ++++++++++++++++++++++++++++++++++++------------ docs/modules.md | 128 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 192 insertions(+), 64 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0415eea..2d5ab68 100644 --- a/docs/index.md +++ b/docs/index.md @@ -103,12 +103,13 @@ Optional configuration values ends with *. * plugins/display/browsers.py * plugins/display/feeds.py * plugins/display/hours_stats.py + * plugins/display/ip_to_geo.py * plugins/display/istats_diff.py * plugins/display/operating_systems.py - * plugins/display/referers.py * plugins/display/referers_diff.py - * plugins/display/top_downloads.py + * plugins/display/referers.py * plugins/display/top_downloads_diff.py + * plugins/display/top_downloads.py * plugins/display/top_hits.py * plugins/display/top_pages.py * plugins/display/top_visitors.py @@ -116,6 +117,8 @@ Optional configuration values ends with *. * plugins/post_analysis/browsers.py * plugins/post_analysis/feeds.py * plugins/post_analysis/hours_stats.py + * plugins/post_analysis/ip_to_geo.py + * plugins/post_analysis/iptogeo.py * plugins/post_analysis/operating_systems.py * plugins/post_analysis/referers.py * plugins/post_analysis/reverse_dns.py @@ -323,6 +326,32 @@ plugins.display.hours_stats None +plugins.display.ip_to_geo +------------------------- + + Display hook + + Add geo statistics + + Plugin requirements : + post_analysis/ip_to_geo + + Conf values needed : + create_geo_page* + + Output files : + OUTPUT_ROOT/year/month/index.html + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.istats_diff --------------------------- @@ -375,6 +404,32 @@ plugins.display.operating_systems None +plugins.display.referers_diff +----------------------------- + + Display hook + + Enlight new and updated key phrases in in all_key_phrases.html + + Plugin requirements : + display/referers + + Conf values needed : + None + + Output files : + None + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.referers ------------------------ @@ -406,15 +461,15 @@ plugins.display.referers None -plugins.display.referers_diff ------------------------------ +plugins.display.top_downloads_diff +---------------------------------- Display hook - Enlight new and updated key phrases in in all_key_phrases.html + Enlight new and updated downloads in in top_downloads.html Plugin requirements : - display/referers + display/top_downloads Conf values needed : None @@ -460,32 +515,6 @@ plugins.display.top_downloads None -plugins.display.top_downloads_diff ----------------------------------- - - Display hook - - Enlight new and updated downloads in in top_downloads.html - - Plugin requirements : - display/top_downloads - - Conf values needed : - None - - Output files : - None - - Statistics creation : - None - - Statistics update : - None - - Statistics deletion : - None - - plugins.display.top_hits ------------------------ @@ -695,6 +724,41 @@ plugins.post_analysis.hours_stats None +plugins.post_analysis.ip_to_geo +------------------------------- + + Post analysis hook + + Get country code from IP address + + Plugin requirements : + None + + Conf values needed : + iptogeo_remote_addr* + iptogeo_remote_port* + + Output files : + None + + Statistics creation : + geo => + country_code => count + None + + Statistics update : + valid_visitors: + country_code + + Statistics deletion : + None + + +plugins.post_analysis.iptogeo +----------------------------- + + + plugins.post_analysis.operating_systems --------------------------------------- diff --git a/docs/modules.md b/docs/modules.md index b68c706..0a8f2f1 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -3,12 +3,13 @@ * plugins/display/browsers.py * plugins/display/feeds.py * plugins/display/hours_stats.py + * plugins/display/ip_to_geo.py * plugins/display/istats_diff.py * plugins/display/operating_systems.py - * plugins/display/referers.py * plugins/display/referers_diff.py - * plugins/display/top_downloads.py + * plugins/display/referers.py * plugins/display/top_downloads_diff.py + * plugins/display/top_downloads.py * plugins/display/top_hits.py * plugins/display/top_pages.py * plugins/display/top_visitors.py @@ -16,6 +17,8 @@ * plugins/post_analysis/browsers.py * plugins/post_analysis/feeds.py * plugins/post_analysis/hours_stats.py + * plugins/post_analysis/ip_to_geo.py + * plugins/post_analysis/iptogeo.py * plugins/post_analysis/operating_systems.py * plugins/post_analysis/referers.py * plugins/post_analysis/reverse_dns.py @@ -223,6 +226,32 @@ plugins.display.hours_stats None +plugins.display.ip_to_geo +------------------------- + + Display hook + + Add geo statistics + + Plugin requirements : + post_analysis/ip_to_geo + + Conf values needed : + create_geo_page* + + Output files : + OUTPUT_ROOT/year/month/index.html + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.istats_diff --------------------------- @@ -275,6 +304,32 @@ plugins.display.operating_systems None +plugins.display.referers_diff +----------------------------- + + Display hook + + Enlight new and updated key phrases in in all_key_phrases.html + + Plugin requirements : + display/referers + + Conf values needed : + None + + Output files : + None + + Statistics creation : + None + + Statistics update : + None + + Statistics deletion : + None + + plugins.display.referers ------------------------ @@ -306,15 +361,15 @@ plugins.display.referers None -plugins.display.referers_diff ------------------------------ +plugins.display.top_downloads_diff +---------------------------------- Display hook - Enlight new and updated key phrases in in all_key_phrases.html + Enlight new and updated downloads in in top_downloads.html Plugin requirements : - display/referers + display/top_downloads Conf values needed : None @@ -360,32 +415,6 @@ plugins.display.top_downloads None -plugins.display.top_downloads_diff ----------------------------------- - - Display hook - - Enlight new and updated downloads in in top_downloads.html - - Plugin requirements : - display/top_downloads - - Conf values needed : - None - - Output files : - None - - Statistics creation : - None - - Statistics update : - None - - Statistics deletion : - None - - plugins.display.top_hits ------------------------ @@ -595,6 +624,41 @@ plugins.post_analysis.hours_stats None +plugins.post_analysis.ip_to_geo +------------------------------- + + Post analysis hook + + Get country code from IP address + + Plugin requirements : + None + + Conf values needed : + iptogeo_remote_addr* + iptogeo_remote_port* + + Output files : + None + + Statistics creation : + geo => + country_code => count + None + + Statistics update : + valid_visitors: + country_code + + Statistics deletion : + None + + +plugins.post_analysis.iptogeo +----------------------------- + + + plugins.post_analysis.operating_systems --------------------------------------- From c86961921c569bbbbccd50f987639a3537dba633 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Tue, 12 Apr 2016 08:41:48 +0200 Subject: [PATCH 18/22] Update translations --- iwla.pot | 127 ++++++++------- locales/fr_FR/LC_MESSAGES/iwla.mo | Bin 4198 -> 4314 bytes locales/fr_FR/LC_MESSAGES/iwla.pot | 254 +++++++++++++++++++---------- 3 files changed, 238 insertions(+), 143 deletions(-) diff --git a/iwla.pot b/iwla.pot index 478a75a..22328b1 100644 --- a/iwla.pot +++ b/iwla.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2015-03-02 19:44+CET\n" +"POT-Creation-Date: 2016-04-12 08:34+CEST\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,11 +35,11 @@ msgstr "" msgid "March" msgstr "" -#: display.py:32 iwla.py:440 +#: display.py:32 iwla.py:472 msgid "June" msgstr "" -#: display.py:32 iwla.py:440 +#: display.py:32 iwla.py:472 msgid "May" msgstr "" @@ -63,143 +63,146 @@ msgstr "" msgid "September" msgstr "" -#: display.py:187 +#: display.py:195 msgid "Ratio" msgstr "" -#: iwla.py:381 +#: iwla.py:413 msgid "Statistics" msgstr "" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 iwla.py:474 msgid "Not viewed Bandwidth" msgstr "" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 iwla.py:474 msgid "Visits" msgstr "" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 +#: iwla.py:421 iwla.py:474 plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 plugins/display/hours_stats.py:73 #: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 #: plugins/display/referers.py:153 plugins/display/top_downloads.py:97 #: plugins/display/top_visitors.py:72 plugins/display/track_users.py:113 msgid "Hits" msgstr "" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 +#: iwla.py:421 iwla.py:474 plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 plugins/display/hours_stats.py:73 #: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 #: plugins/display/referers.py:153 plugins/display/top_visitors.py:72 #: plugins/display/track_users.py:77 plugins/display/track_users.py:113 msgid "Pages" msgstr "" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 +#: iwla.py:421 iwla.py:474 plugins/display/all_visits.py:70 #: plugins/display/hours_stats.py:73 plugins/display/hours_stats.py:83 #: plugins/display/top_visitors.py:72 msgid "Bandwidth" msgstr "" -#: iwla.py:389 plugins/display/hours_stats.py:71 +#: iwla.py:421 plugins/display/hours_stats.py:71 msgid "By day" msgstr "" -#: iwla.py:389 plugins/display/hours_stats.py:73 +#: iwla.py:421 plugins/display/hours_stats.py:73 msgid "Day" msgstr "" -#: iwla.py:426 +#: iwla.py:458 msgid "Average" msgstr "" -#: iwla.py:431 iwla.py:476 +#: iwla.py:463 iwla.py:508 msgid "Total" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Apr" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Aug" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Dec" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Feb" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Jan" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Jul" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Mar" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Nov" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Oct" msgstr "" -#: iwla.py:440 +#: iwla.py:472 msgid "Sep" msgstr "" -#: iwla.py:441 +#: iwla.py:473 msgid "Summary" msgstr "" -#: iwla.py:442 +#: iwla.py:474 msgid "Month" msgstr "" -#: iwla.py:442 -msgid "Visitors" -msgstr "" - -#: iwla.py:442 iwla.py:454 plugins/display/feeds.py:98 -#: plugins/display/operating_systems.py:90 plugins/display/track_users.py:108 +#: iwla.py:474 iwla.py:486 plugins/display/feeds.py:99 +#: plugins/display/ip_to_geo.py:109 plugins/display/operating_systems.py:90 +#: plugins/display/track_users.py:108 msgid "Details" msgstr "" -#: iwla.py:490 +#: iwla.py:474 plugins/display/ip_to_geo.py:96 +#: plugins/display/ip_to_geo.py:114 +msgid "Visitors" +msgstr "" + +#: iwla.py:522 msgid "Statistics for" msgstr "" -#: iwla.py:497 +#: iwla.py:529 msgid "Last update" msgstr "" -#: iwla.py:501 +#: iwla.py:533 msgid "Time analysis" msgstr "" -#: iwla.py:503 +#: iwla.py:535 msgid "hours" msgstr "" -#: iwla.py:504 +#: iwla.py:536 msgid "minutes" msgstr "" -#: iwla.py:504 +#: iwla.py:536 msgid "seconds" msgstr "" -#: plugins/display/all_visits.py:70 plugins/display/feeds.py:75 -#: plugins/display/top_visitors.py:72 +#: plugins/display/all_visits.py:70 plugins/display/feeds.py:76 +#: plugins/display/ip_to_geo.py:64 plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:113 msgid "Host" msgstr "" @@ -242,27 +245,35 @@ msgstr "" msgid "Others" msgstr "" +#: plugins/display/browsers.py:105 +msgid "Top Browsers" +msgstr "" + #: plugins/display/browsers.py:107 msgid "All Browsers" msgstr "" -#: plugins/display/feeds.py:69 +#: plugins/display/browsers.py:123 +msgid "Unknown" +msgstr "" + +#: plugins/display/feeds.py:70 msgid "All Feeds parsers" msgstr "" -#: plugins/display/feeds.py:75 +#: plugins/display/feeds.py:76 msgid "All feeds parsers" msgstr "" -#: plugins/display/feeds.py:91 +#: plugins/display/feeds.py:92 msgid "Merged feeds parsers" msgstr "" -#: plugins/display/feeds.py:96 +#: plugins/display/feeds.py:97 msgid "Feeds parsers" msgstr "" -#: plugins/display/feeds.py:103 +#: plugins/display/feeds.py:104 msgid "Found" msgstr "" @@ -302,6 +313,15 @@ msgstr "" msgid "Hours" msgstr "" +#: plugins/display/ip_to_geo.py:96 +msgid "Country" +msgstr "" + +#: plugins/display/ip_to_geo.py:96 plugins/display/ip_to_geo.py:107 +#: plugins/display/ip_to_geo.py:114 +msgid "Countries" +msgstr "" + #: plugins/display/operating_systems.py:78 #: plugins/display/operating_systems.py:88 msgid "Operating Systems" @@ -344,10 +364,6 @@ msgstr "" msgid "All Key Phrases" msgstr "" -#: plugins/display/referers.py:200 -msgid "Key phrases" -msgstr "" - #: plugins/display/referers.py:200 plugins/display/referers.py:216 msgid "Key phrase" msgstr "" @@ -356,6 +372,10 @@ msgstr "" msgid "Search" msgstr "" +#: plugins/display/referers.py:200 plugins/display/referers_diff.py:56 +msgid "Key phrases" +msgstr "" + #: plugins/display/referers.py:210 msgid "Top key phrases" msgstr "" @@ -369,6 +389,7 @@ msgid "Hit" msgstr "" #: plugins/display/top_downloads.py:71 plugins/display/top_downloads.py:91 +#: plugins/display/top_downloads_diff.py:56 msgid "All Downloads" msgstr "" @@ -402,7 +423,3 @@ msgstr "" msgid "Last Access" msgstr "" -#: plugins/display/track_users.py:113 -msgid "IP" -msgstr "" - diff --git a/locales/fr_FR/LC_MESSAGES/iwla.mo b/locales/fr_FR/LC_MESSAGES/iwla.mo index a37799c04601c042239e671b57792d4032084cea..8fe7195da6030297e4442dd414b5769663eb9cdb 100644 GIT binary patch literal 4314 zcmai#ZH!!18OM)W-nK%qwg{qdwMq+RmfgNtwm`e>?6SLbyW8E_Qb1^LXU^_iI&<&z zzDzqG8p4MrqDf;ygbxIjG{mmNAQ3dt5YhQ$e1k+y)TDmV#26Dy)DI*^{r&GfyF1%T zyt&W)o#(th=Q+=L?xpo>zG8TeA)i1te8`xm;D@i~!*lJml;L&odUzB32>cA>HM{t% zgL~n1a0;sbBT)V3UHci>hyDe~66RTW6@1?5FG4N(61)apgqrW$PX9jSH9vOzDOCSo z!5iT3q5A&?YWzQ-*7=vC8Y!AJQ0><{eIt~;x4{i?E7Z7suDuMk?@1_oA9L-#qlIgz z4;(|Neu-=EK&^My>F1#OKjU~F$}i8tweYKs--Nv8yH0-#%C4V5&HuL3e*ABg|h2*cq7~lbzZxn{5s)y7;3$vj!!_1uetU*lz$>ue-^T& zc^dMXFY(d&JO{Pj%TVLL<@g%Z_&1==q3iUwq2{^d>i-NCXa98iRX9s_t%n+aGt|6y zINk-dUO&{ncR}rIuWKKL8b1NmZ`$!F3_oDZaVWq35~Ds2{|Gn2|3Iy`kA^$6KKMcpKEXEsldw^A17TJqk7cQP+M9>OAUDc4biZpLKj1s{c8t{d^J1 zzh8Fk&qIxS!RZ&A{tc*cuR^W=I@CIELG9<~j+fv~=d!;%<2k5(y$EIJ1*mmjh4SZjp#1ixtAEGU z{~BsPe}KAAe}!8A-%#VPVUyxosPXF{O=c5R+-!%Me;jI_S;%XS^Wmt?DJZ+1g6e+` zYQ7g7zXr9x3sCdC;`BFM`gLG?0W|i_PI~=FSrfS`g-n0rjgGfhmlVsOV2(E zw>xD9DrRNpJ;+|TV6k8L> z5yV5L5czo!xew7U~rWrF=G*1DU6)(LxbewCbEV>I($NF6shW*7ZUTZt(kfrd(9xsQerHz z)hOidOvllawwjj4Yo#Ojg=ie|g3}GZZ+fayIuKhqC@hsZz9Dbhz~HXZz>d=3Hg90} z(Dof$4~)!K=vbPuvhMx*-Me*QaA2TM@lnF;FlqSMHssAlS?brii{5=nUb6cZnuK?M zHEKRU?{FdGLX|4kZ#t8f>V~*5$3|!RCdVg7R;(WEAL!#sr8Z=lP78ZednUc7)$oIG zk5{cLHKg~?RYps@SNh2uazJS$tVT7$XUN-qB1rolw4vh3)=K+3Ltd-1U{g)j-|BdS z{X6@PmRtvIV>+_6Afkgu!8cza%I|G zY;+f8>Vj>ukDexfA?_|-F`%wX%WzIKpVeh6ugWy5>hqM>(=o~~197mt_T>xwzbW&0 zR32@U4cmD(jJiJ{5$4~?sAI`)c{;SDNnF>H9c#9g zagC<^j{8igy^N#s50^8xDy`(k?jkdh5 zuNTfBYbHva`UI!VebI#;k z#u;9?^{En~6d@kM144bM+lL|%BnT29Mgk!aAj$)UP$3@LB6vatR8b+m|D0`m+)%MK z>wJ6d>)LCtz2?Oo+rDZjk02jHUcb?p&%kRp@uB?gt;W0^z5w3=UxM$3ufn&%oB7-d zZ-uwOT~OoqK#e=>`X^u?`Z@R(ScTf6?(`$o`z0W%Ramdd+>3A7x{8R9q z@L8yJuR8t!@-si?qxF97^yi`My9VC_{{l7dKd%2qHq|+|L)o_zs(+W`-EbTFZpZtf z#tlMTXO2LPFGKBn!s+8s^QIhUq5M&S+u@^*7a%{g>h#Y+t@lN!eZK7UuR+;=+3DYM z{a0N3RoDJ2$kEL6PQM0a*Pr0K;44t~^cs{uw_}vJ1Lo&<+y!OFJ+6Nbl%ED%`w7Sr zW*G7_(|mLvYfk?jls!Lzn)eH+^?vX8BGftm z3}ydcUHjjm=KT}Oj@KQx;q>MW>;>h=PqXO<;FsWg;WJSC{0P1e{u0VxFTva3zo5o# zXOQ~uggf9dD7&Vi_MLM)G<8PqW`2&=lFGJ1yx9iuYm~L)?vg39rd+%_(3u^qmQ1@4xe;jK5 zLry>G^ixpt7ohAo2en@f>KqpxKM!w5{|eOjXB?k{TK@`^U%%`0U%UR_LVo52*ZvCB z`Tyqhe?Zyw8r1w72%`7Holx!jq0Uo=I^PhKohPC8U4ZiISt$Scu03<@9jNns0qWg6 z0k!`(q2@p9_#D*yZ$rh&PodWRBh>ttq5SbG*anb`;al$Fb^jX#em{%2$7$UAon1IiJ3$y$Q_7^{5*ghN4TDiawoMt$b-ly zkWobCBr=}YHb1AReiWH@O&@psAY4GsI(@gJa*)a*qW7SpIOr{khhserN2wn`K8Xyw zcIBYF3^f|wa2%~BHcpI`(P%YnM1HN%#;vU-UdxX+`X_?4=sIOP-rP#;C$`Y%{JN{n z+hrTCueW^N3Ky8z>Y3OMl6=ipY=&BK&@e+;U6LiK8EV^@beaBx?-HM>rBjW z$D4>Utfx}*J7y#bLwhNRLT@>anr4)yQCpSR=8}!6q<+vy%vhMlept0;>{4pu&~JE) z^V3@t@4h%%iqbu1+%8Gt%#S-%dR;OeWns;X$AQ5ylEh3z7+#n(IcKK)P?Arb${Ggg z@CmJv0}DU&R1-7pC#g47t=h!Z6KlhwHEY%U)S4MTmQ+{xcFc^8>$c`?_47;=8U%lx zj#953*j0vXI`MSWrlVarWVV_bB$9JxTlhN-!n(K6NmARqt|2kAaZnFJGn=mHii=yH zXHH}m{M0Pi+^_=PSjbRIV@tw%+G8PQbdm84_JY-h-#0f~DUHNdz6eXB+*H}y zKQMTxG;p9au-_XzRz7%e@5oq%aiw`Hquy-Tp}hlx0|R}Egc8<>XVS(!P^6ROHxNX}DAN zTAjL0wOD_v;|=y7>N{6*19XhJ$ku|C_QU;y19TO7iPObZJ5p?0_KJPEvn=r%Ht|Bg z9n{%DPko~??XEStYcjQNo1CMk%df}Xwd*FV=!G(!3(Z$`iO8$6%$D{%oAnHg@~|fi zHuiqw2LEr#JPeg0+a$Vnp6H_P_sMbjcP8ps5?7w-EEzXRd~U{^-Z*tnRnIQ=R&WK& zsd^sQ^(4NUZDl-|DYcH`p8Uh(i>+##>94!Se6pU$O_2ii5H{+Y$*;TCHsgHafX6$u z#jA0Ywej1O&3e*b_X>7T6vk~PKypw_-U}p+hE2uL6n`Lv_ltT`D5KaDbf1oG@p>`* z%^R9QV!iG+3NMft6JECfK5AiV7U)qA-H1oDf7DX^d zk?qy27jLxnq)l1i(&ojCg?bgQrF)*|SXqhN~mzS>I HmCpYHCQF9< diff --git a/locales/fr_FR/LC_MESSAGES/iwla.pot b/locales/fr_FR/LC_MESSAGES/iwla.pot index 09e7e94..4239d1d 100644 --- a/locales/fr_FR/LC_MESSAGES/iwla.pot +++ b/locales/fr_FR/LC_MESSAGES/iwla.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: iwla\n" -"POT-Creation-Date: 2015-03-02 19:44+CET\n" -"PO-Revision-Date: 2015-03-02 19:45+0100\n" +"POT-Creation-Date: 2016-04-12 08:34+CEST\n" +"PO-Revision-Date: 2016-04-12 08:39+0100\n" "Last-Translator: Soutadé \n" "Language-Team: iwla\n" "Language: fr_FR\n" @@ -37,11 +37,13 @@ msgstr "Juillet" msgid "March" msgstr "Mars" -#: display.py:32 iwla.py:440 +#: display.py:32 +#: iwla.py:472 msgid "June" msgstr "Juin" -#: display.py:32 iwla.py:440 +#: display.py:32 +#: iwla.py:472 msgid "May" msgstr "Mai" @@ -65,147 +67,177 @@ msgstr "Octobre" msgid "September" msgstr "Septembre" -#: display.py:187 +#: display.py:195 msgid "Ratio" msgstr "Pourcentage" -#: iwla.py:381 +#: iwla.py:413 msgid "Statistics" msgstr "Statistiques" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 +#: iwla.py:474 msgid "Not viewed Bandwidth" msgstr "Traffic non vu" -#: iwla.py:389 iwla.py:442 +#: iwla.py:421 +#: iwla.py:474 msgid "Visits" msgstr "Visites" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 -#: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 -#: plugins/display/referers.py:153 plugins/display/top_downloads.py:97 -#: plugins/display/top_visitors.py:72 plugins/display/track_users.py:113 +#: iwla.py:421 +#: iwla.py:474 +#: plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 +#: plugins/display/hours_stats.py:73 +#: plugins/display/hours_stats.py:83 +#: plugins/display/referers.py:95 +#: plugins/display/referers.py:153 +#: plugins/display/top_downloads.py:97 +#: plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:113 msgid "Hits" msgstr "Hits" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/feeds.py:75 plugins/display/hours_stats.py:73 -#: plugins/display/hours_stats.py:83 plugins/display/referers.py:95 -#: plugins/display/referers.py:153 plugins/display/top_visitors.py:72 -#: plugins/display/track_users.py:77 plugins/display/track_users.py:113 +#: iwla.py:421 +#: iwla.py:474 +#: plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 +#: plugins/display/hours_stats.py:73 +#: plugins/display/hours_stats.py:83 +#: plugins/display/referers.py:95 +#: plugins/display/referers.py:153 +#: plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:77 +#: plugins/display/track_users.py:113 msgid "Pages" msgstr "Pages" -#: iwla.py:389 iwla.py:442 plugins/display/all_visits.py:70 -#: plugins/display/hours_stats.py:73 plugins/display/hours_stats.py:83 +#: iwla.py:421 +#: iwla.py:474 +#: plugins/display/all_visits.py:70 +#: plugins/display/hours_stats.py:73 +#: plugins/display/hours_stats.py:83 #: plugins/display/top_visitors.py:72 msgid "Bandwidth" msgstr "Bande passante" -#: iwla.py:389 plugins/display/hours_stats.py:71 +#: iwla.py:421 +#: plugins/display/hours_stats.py:71 msgid "By day" msgstr "Par jour" -#: iwla.py:389 plugins/display/hours_stats.py:73 +#: iwla.py:421 +#: plugins/display/hours_stats.py:73 msgid "Day" msgstr "Jour" -#: iwla.py:426 +#: iwla.py:458 msgid "Average" msgstr "Moyenne" -#: iwla.py:431 iwla.py:476 +#: iwla.py:463 +#: iwla.py:508 msgid "Total" msgstr "Total" -#: iwla.py:440 +#: iwla.py:472 msgid "Apr" msgstr "Avr" -#: iwla.py:440 +#: iwla.py:472 msgid "Aug" msgstr "Août" -#: iwla.py:440 +#: iwla.py:472 msgid "Dec" msgstr "Déc" -#: iwla.py:440 +#: iwla.py:472 msgid "Feb" msgstr "Fév" -#: iwla.py:440 +#: iwla.py:472 msgid "Jan" msgstr "Jan" -#: iwla.py:440 +#: iwla.py:472 msgid "Jul" msgstr "Jui" -#: iwla.py:440 +#: iwla.py:472 msgid "Mar" msgstr "Mars" -#: iwla.py:440 +#: iwla.py:472 msgid "Nov" msgstr "Nov" -#: iwla.py:440 +#: iwla.py:472 msgid "Oct" msgstr "Oct" -#: iwla.py:440 +#: iwla.py:472 msgid "Sep" msgstr "Sep" -#: iwla.py:441 +#: iwla.py:473 msgid "Summary" msgstr "Résumé" -#: iwla.py:442 +#: iwla.py:474 msgid "Month" msgstr "Mois" -#: iwla.py:442 -msgid "Visitors" -msgstr "Visiteurs" - -#: iwla.py:442 iwla.py:454 plugins/display/feeds.py:98 -#: plugins/display/operating_systems.py:90 plugins/display/track_users.py:108 +#: iwla.py:474 +#: iwla.py:486 +#: plugins/display/feeds.py:99 +#: plugins/display/ip_to_geo.py:109 +#: plugins/display/operating_systems.py:90 +#: plugins/display/track_users.py:108 msgid "Details" msgstr "Détails" -#: iwla.py:490 +#: iwla.py:474 +#: plugins/display/ip_to_geo.py:96 +#: plugins/display/ip_to_geo.py:114 +msgid "Visitors" +msgstr "Visiteurs" + +#: iwla.py:522 msgid "Statistics for" msgstr "Statistiques pour" -#: iwla.py:497 +#: iwla.py:529 msgid "Last update" msgstr "Dernière mise à jour" -#: iwla.py:501 +#: iwla.py:533 msgid "Time analysis" msgstr "Durée de l'analyse" -#: iwla.py:503 +#: iwla.py:535 msgid "hours" msgstr "heures " -#: iwla.py:504 +#: iwla.py:536 msgid "minutes" msgstr "minutes" -#: iwla.py:504 +#: iwla.py:536 msgid "seconds" msgstr "secondes" -#: plugins/display/all_visits.py:70 plugins/display/feeds.py:75 +#: plugins/display/all_visits.py:70 +#: plugins/display/feeds.py:76 +#: plugins/display/ip_to_geo.py:64 #: plugins/display/top_visitors.py:72 +#: plugins/display/track_users.py:113 msgid "Host" msgstr "Hôte" -#: plugins/display/all_visits.py:70 plugins/display/top_visitors.py:72 +#: plugins/display/all_visits.py:70 +#: plugins/display/top_visitors.py:72 msgid "Last seen" msgstr "Dernière visite" @@ -213,7 +245,8 @@ msgstr "Dernière visite" msgid "All visits" msgstr "Toutes les visites" -#: plugins/display/all_visits.py:93 plugins/display/top_visitors.py:72 +#: plugins/display/all_visits.py:93 +#: plugins/display/top_visitors.py:72 msgid "Top visitors" msgstr "Top visiteurs" @@ -221,50 +254,70 @@ msgstr "Top visiteurs" msgid "Browsers" msgstr "Navigateurs" -#: plugins/display/browsers.py:79 plugins/display/browsers.py:113 +#: plugins/display/browsers.py:79 +#: plugins/display/browsers.py:113 msgid "Browser" msgstr "Navigateur" -#: plugins/display/browsers.py:79 plugins/display/browsers.py:113 +#: plugins/display/browsers.py:79 +#: plugins/display/browsers.py:113 #: plugins/display/operating_systems.py:78 -#: plugins/display/operating_systems.py:95 plugins/display/top_hits.py:71 -#: plugins/display/top_hits.py:97 plugins/display/top_pages.py:71 +#: plugins/display/operating_systems.py:95 +#: plugins/display/top_hits.py:71 +#: plugins/display/top_hits.py:97 +#: plugins/display/top_pages.py:71 #: plugins/display/top_pages.py:96 msgid "Entrance" msgstr "Entrées" -#: plugins/display/browsers.py:98 plugins/display/browsers.py:128 -#: plugins/display/referers.py:110 plugins/display/referers.py:125 -#: plugins/display/referers.py:140 plugins/display/referers.py:163 -#: plugins/display/referers.py:174 plugins/display/referers.py:185 -#: plugins/display/referers.py:222 plugins/display/top_downloads.py:83 -#: plugins/display/top_downloads.py:103 plugins/display/top_hits.py:82 -#: plugins/display/top_hits.py:103 plugins/display/top_pages.py:82 -#: plugins/display/top_pages.py:102 plugins/display/top_visitors.py:92 +#: plugins/display/browsers.py:98 +#: plugins/display/browsers.py:128 +#: plugins/display/referers.py:110 +#: plugins/display/referers.py:125 +#: plugins/display/referers.py:140 +#: plugins/display/referers.py:163 +#: plugins/display/referers.py:174 +#: plugins/display/referers.py:185 +#: plugins/display/referers.py:222 +#: plugins/display/top_downloads.py:83 +#: plugins/display/top_downloads.py:103 +#: plugins/display/top_hits.py:82 +#: plugins/display/top_hits.py:103 +#: plugins/display/top_pages.py:82 +#: plugins/display/top_pages.py:102 +#: plugins/display/top_visitors.py:92 msgid "Others" msgstr "Autres" +#: plugins/display/browsers.py:105 +msgid "Top Browsers" +msgstr "Top Navigateurs" + #: plugins/display/browsers.py:107 msgid "All Browsers" msgstr "Tous les navigateurs" -#: plugins/display/feeds.py:69 +#: plugins/display/browsers.py:123 +msgid "Unknown" +msgstr "Inconnu" + +#: plugins/display/feeds.py:70 msgid "All Feeds parsers" msgstr "Tous les agrégateurs" -#: plugins/display/feeds.py:75 +#: plugins/display/feeds.py:76 msgid "All feeds parsers" msgstr "Tous les agrégateurs" -#: plugins/display/feeds.py:91 +#: plugins/display/feeds.py:92 msgid "Merged feeds parsers" msgstr "Agrégateurs fusionnés" -#: plugins/display/feeds.py:96 +#: plugins/display/feeds.py:97 msgid "Feeds parsers" msgstr "Agrégateurs" -#: plugins/display/feeds.py:103 +#: plugins/display/feeds.py:104 msgid "Found" msgstr "Trouvé" @@ -304,6 +357,16 @@ msgstr "Par heures" msgid "Hours" msgstr "Heures" +#: plugins/display/ip_to_geo.py:96 +msgid "Country" +msgstr "Pays" + +#: plugins/display/ip_to_geo.py:96 +#: plugins/display/ip_to_geo.py:107 +#: plugins/display/ip_to_geo.py:114 +msgid "Countries" +msgstr "Pays" + #: plugins/display/operating_systems.py:78 #: plugins/display/operating_systems.py:88 msgid "Operating Systems" @@ -318,19 +381,23 @@ msgstr "Système d'exploitation" msgid "Connexion from" msgstr "Connexion depuis" -#: plugins/display/referers.py:95 plugins/display/referers.py:153 +#: plugins/display/referers.py:95 +#: plugins/display/referers.py:153 msgid "Origin" msgstr "Origine" -#: plugins/display/referers.py:99 plugins/display/referers.py:156 +#: plugins/display/referers.py:99 +#: plugins/display/referers.py:156 msgid "Search Engine" msgstr "Moteur de recherche" -#: plugins/display/referers.py:114 plugins/display/referers.py:167 +#: plugins/display/referers.py:114 +#: plugins/display/referers.py:167 msgid "External URL" msgstr "URL externe" -#: plugins/display/referers.py:129 plugins/display/referers.py:178 +#: plugins/display/referers.py:129 +#: plugins/display/referers.py:178 msgid "External URL (robot)" msgstr "URL externe (robot)" @@ -347,17 +414,20 @@ msgid "All Key Phrases" msgstr "Toutes les phrases clé" #: plugins/display/referers.py:200 -msgid "Key phrases" -msgstr "Phrases clé" - -#: plugins/display/referers.py:200 plugins/display/referers.py:216 +#: plugins/display/referers.py:216 msgid "Key phrase" msgstr "Phrase clé" -#: plugins/display/referers.py:200 plugins/display/referers.py:216 +#: plugins/display/referers.py:200 +#: plugins/display/referers.py:216 msgid "Search" msgstr "Recherche" +#: plugins/display/referers.py:200 +#: plugins/display/referers_diff.py:56 +msgid "Key phrases" +msgstr "Phrases clé" + #: plugins/display/referers.py:210 msgid "Top key phrases" msgstr "Top phrases clé" @@ -370,13 +440,18 @@ msgstr "Toutes les phrases clé" msgid "Hit" msgstr "Hit" -#: plugins/display/top_downloads.py:71 plugins/display/top_downloads.py:91 +#: plugins/display/top_downloads.py:71 +#: plugins/display/top_downloads.py:91 +#: plugins/display/top_downloads_diff.py:56 msgid "All Downloads" msgstr "Tous les téléchargements" -#: plugins/display/top_downloads.py:71 plugins/display/top_downloads.py:97 -#: plugins/display/top_hits.py:71 plugins/display/top_hits.py:97 -#: plugins/display/top_pages.py:71 plugins/display/top_pages.py:96 +#: plugins/display/top_downloads.py:71 +#: plugins/display/top_downloads.py:97 +#: plugins/display/top_hits.py:71 +#: plugins/display/top_hits.py:97 +#: plugins/display/top_pages.py:71 +#: plugins/display/top_pages.py:96 msgid "URI" msgstr "URI" @@ -384,11 +459,13 @@ msgstr "URI" msgid "Top Downloads" msgstr "Top Téléchargements" -#: plugins/display/top_hits.py:71 plugins/display/top_hits.py:91 +#: plugins/display/top_hits.py:71 +#: plugins/display/top_hits.py:91 msgid "All Hits" msgstr "Tous les hits" -#: plugins/display/top_pages.py:71 plugins/display/top_pages.py:90 +#: plugins/display/top_pages.py:71 +#: plugins/display/top_pages.py:90 msgid "All Pages" msgstr "Toutes les pages" @@ -396,17 +473,18 @@ msgstr "Toutes les pages" msgid "Top Pages" msgstr "Top Pages" -#: plugins/display/track_users.py:77 plugins/display/track_users.py:106 +#: plugins/display/track_users.py:77 +#: plugins/display/track_users.py:106 msgid "Tracked users" msgstr "Utilisateurs traqués" -#: plugins/display/track_users.py:77 plugins/display/track_users.py:113 +#: plugins/display/track_users.py:77 +#: plugins/display/track_users.py:113 msgid "Last Access" msgstr "Dernière visite" -#: plugins/display/track_users.py:113 -msgid "IP" -msgstr "IP" +#~ msgid "IP" +#~ msgstr "IP" #~ msgid "Page" #~ msgstr "Page" From 2c07b57baf96c61a3e2ad4fde78192d003372f5a Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Tue, 12 Apr 2016 08:45:05 +0200 Subject: [PATCH 19/22] Update OS icons --- resources/icon/os/macosx4.png | Bin 0 -> 329 bytes resources/icon/os/macosx5.png | Bin 0 -> 329 bytes resources/icon/os/macosx6.png | Bin 0 -> 329 bytes resources/icon/os/macosx7.png | Bin 0 -> 329 bytes resources/icon/os/macosx8.png | Bin 0 -> 329 bytes resources/icon/os/macosx9.png | Bin 0 -> 329 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/icon/os/macosx4.png create mode 100644 resources/icon/os/macosx5.png create mode 100644 resources/icon/os/macosx6.png create mode 100644 resources/icon/os/macosx7.png create mode 100644 resources/icon/os/macosx8.png create mode 100644 resources/icon/os/macosx9.png diff --git a/resources/icon/os/macosx4.png b/resources/icon/os/macosx4.png new file mode 100644 index 0000000000000000000000000000000000000000..777f35057c6ba959bd664254921745decfc01581 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv2~} zrFnV^h6W00FUyMb6pRcEj1>$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL Date: Tue, 12 Apr 2016 09:23:07 +0200 Subject: [PATCH 20/22] Revert commit 19e9b9d4fb7df715c3ff7d9b6236894176ea14ed, multiple top visitors included --- plugins/display/all_visits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/display/all_visits.py b/plugins/display/all_visits.py index 2dec3e0..4dbc92c 100644 --- a/plugins/display/all_visits.py +++ b/plugins/display/all_visits.py @@ -96,4 +96,4 @@ class IWLADisplayAllVisits(IPlugin): else: block = display.createBlock(DisplayHTMLRawBlock) block.setRawHTML(link) - index.appendBlock(block) + index.appendBlock(block) From 9a593713d10cdb0d92f41a9a25b8e844de09ead2 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Tue, 12 Apr 2016 09:35:03 +0200 Subject: [PATCH 21/22] Add real names to icons/flags instead of generic ones --- display.py | 2 +- plugins/display/browsers.py | 14 ++++++++------ plugins/display/ip_to_geo.py | 6 +++--- plugins/display/operating_systems.py | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/display.py b/display.py index 2eaab86..35dc0b3 100644 --- a/display.py +++ b/display.py @@ -364,7 +364,7 @@ class DisplayHTMLPage(object): for block in self.blocks: block.build(f, filters=filters) if displayVersion: - f.write(u'Generated by IWLA %s' % + f.write(u'
    Generated by IWLA %s
    ' % ("http://indefero.soutade.fr/p/iwla", self.iwla.getVersion())) f.write(u'') f.close() diff --git a/plugins/display/browsers.py b/plugins/display/browsers.py index cfe15a3..9052162 100644 --- a/plugins/display/browsers.py +++ b/plugins/display/browsers.py @@ -83,11 +83,12 @@ class IWLADisplayBrowsers(IPlugin): for (browser, entrance) in new_list: if browser != 'unknown': try: - icon = 'Browser icon' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) + name = awstats_data.browsers_icons[self.icon_names[browser]] + icon = '%s icon' % (name, self.icon_path, name) except: - icon = 'Browser icon' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) else: - icon = 'Browser icon' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) browser = 'Unknown' table.appendRow([icon, browser, entrance]) total_browsers[2] += entrance @@ -115,11 +116,12 @@ class IWLADisplayBrowsers(IPlugin): for (browser, entrance) in browsers[:10]: if browser != 'unknown': try: - icon = 'Browser icon' % (self.icon_path, awstats_data.browsers_icons[self.icon_names[browser]]) + name = awstats_data.browsers_icons[self.icon_names[browser]] + icon = '%s icon' % (name, self.icon_path, name) except: - icon = 'Browser icon' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) else: - icon = 'Browser icon' % (self.icon_path) + icon = 'Unknown browser icon' % (self.icon_path) browser = self.iwla._(u'Unknown') table.appendRow([icon, browser, entrance]) total_browsers[2] -= entrance diff --git a/plugins/display/ip_to_geo.py b/plugins/display/ip_to_geo.py index d104a64..8b01260 100644 --- a/plugins/display/ip_to_geo.py +++ b/plugins/display/ip_to_geo.py @@ -77,7 +77,7 @@ class IWLADisplayTopGeo(IPlugin): cc = visitor.get('country_code', None) break if not cc or cc == 'ip': return None - icon = 'Country flag' % (self.icon_path, cc) + icon = '%s flag' % (cc, self.icon_path, cc) return '%s %s' % (icon ,host) def hook(self): @@ -96,7 +96,7 @@ class IWLADisplayTopGeo(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Countries'), ['', self.iwla._(u'Country'), self.iwla._(u'Visitors')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (cc, visitors) in geo: - icon = 'Country flag' % (self.icon_path, cc) + icon = '%s flag' % (cc, self.icon_path, cc) table.appendRow([icon, cc, visitors]) table.computeRatio(2) page.appendBlock(table) @@ -114,7 +114,7 @@ class IWLADisplayTopGeo(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Countries'), self.iwla._(u'Visitors')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (cc, visitors) in geo[:10]: - icon = 'Country flag' % (self.icon_path, cc) + icon = '%s flag' % (cc, self.icon_path, cc) table.appendRow([icon, cc, visitors]) table.computeRatio(2) index.appendBlock(table) diff --git a/plugins/display/operating_systems.py b/plugins/display/operating_systems.py index dfb88c3..98bec17 100644 --- a/plugins/display/operating_systems.py +++ b/plugins/display/operating_systems.py @@ -78,7 +78,7 @@ class IWLADisplayTopOperatingSystems(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, self.iwla._(u'Operating Systems'), ['', self.iwla._(u'Operating System'), self.iwla._(u'Entrance')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (os_name, entrance) in operating_systems: - icon = 'Operating system icon' % (self.icon_path, os_name) + icon = '%s icon' % (os_name, self.icon_path, os_name) table.appendRow([icon, os_name, entrance]) page.appendBlock(table) @@ -95,7 +95,7 @@ class IWLADisplayTopOperatingSystems(IPlugin): table = display.createBlock(DisplayHTMLBlockTable, title, ['', self.iwla._(u'Operating System'), self.iwla._(u'Entrance')]) table.setColsCSSClass(['', '', 'iwla_hit']) for (family, entrance) in os_families: - icon = 'Operating system icon' % (self.icon_path, self.icon_names[family]) + icon = '%s icon' % (self.icon_names[family], self.icon_path, self.icon_names[family]) table.appendRow([icon, family, entrance]) table.computeRatio(2) index.appendBlock(table) From ddb4bae2e289e853b7e6affda1d00cdcb20f8d40 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Wed, 13 Apr 2016 08:13:18 +0200 Subject: [PATCH 22/22] Update ChangeLog --- ChangeLog | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 347484e..bd5fd43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.3 (06/02/2016) +v0.3 (12/04/2016) ** User ** Add referers_diff display plugin Add year statistics in month details @@ -23,11 +23,12 @@ v0.3 (06/02/2016) Sort documentation output Add debug traces in robots plugin Update awstats data - Remove doule // at the end of URL + Remove double slashes at the end of URL Remove final slashes for referrers + Add alt attribute for all img tag ** Bugs ** Forgot tag Bad UTC time computation - Hits/pages in the same second where not analyzed + Hits/pages in the same second were not analyzed Last day of month was skipped