diff --git a/software/plugins/external-item-search/.gitignore b/software/plugins/external-item-search/.gitignore index 216783d79..04c0a083b 100644 --- a/software/plugins/external-item-search/.gitignore +++ b/software/plugins/external-item-search/.gitignore @@ -37,3 +37,11 @@ nb-configuration.xml # Plugin directory /.quarkus/cli/plugins/ + +# Quarkus CLI +.quarkus/ + +# Eclipse (anywhere in project) +**/.settings/ +**/.project +.classpath \ No newline at end of file diff --git a/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/README.md b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/README.md new file mode 100644 index 000000000..198bf560b --- /dev/null +++ b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/README.md @@ -0,0 +1,4 @@ +# Open Food Facts +[search](https://wiki.openfoodfacts.org/API/Read/Search) +[barcode](https://openfoodfacts.github.io/documentation/docs/Product-Opener/v3/products/get-api-v3-product-code) +[docs](https://openfoodfacts.github.io/documentation/docs) \ No newline at end of file diff --git a/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_barcode.json b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_barcode.json new file mode 100644 index 000000000..21fc6eaca --- /dev/null +++ b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_barcode.json @@ -0,0 +1,6847 @@ +{ + "request": { + "urlPathPattern": "/openfoodfacts/api/v3/product/3046920029759", + "method": "GET" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "delayDistribution": { + "type": "lognormal", + "median": 5000, + "sigma": 0.4 + }, + "jsonBody": { + "code": "3046920029759", + "errors": [], + "product": { + "_id": "3046920029759", + "_keywords": [ + "90", + "and", + "bar", + "botana", + "cacao", + "chocolate", + "cocoa", + "dark", + "dot", + "dulce", + "edelbitter-schokolade", + "extra", + "extra-fine-dark-chocolate", + "fine", + "fino", + "green", + "it", + "lindt", + "negro", + "product", + "producto", + "snack", + "su", + "sweet", + "triman" + ], + "added_countries_tags": [], + "additives_n": 0, + "additives_original_tags": [], + "additives_tags": [], + "allergens": "", + "allergens_from_ingredients": "", + "allergens_from_user": "(en) ", + "allergens_hierarchy": [], + "allergens_lc": "en", + "allergens_tags": [], + "amino_acids_prev_tags": [], + "amino_acids_tags": [], + "brands": "Lindt", + "brands_tags": [ + "lindt" + ], + "categories": "Dark chocolate bar, Extra fine dark chocolates, Botanas, Cacao y sus productos, Chocolates negros, Chocolates negros extra finos, Snacks dulces", + "categories_hierarchy": [ + "en:snacks", + "en:sweet-snacks", + "en:cocoa-and-its-products", + "en:chocolates", + "en:dark-chocolates", + "en:dark-chocolate-bar", + "en:extra-fine-dark-chocolates", + "en:Botanas", + "en:Cacao y sus productos", + "en:Chocolates negros", + "en:Chocolates negros extra finos", + "en:Snacks dulces" + ], + "categories_lc": "en", + "categories_properties": { + "agribalyse_proxy_food_code:en": "31005" + }, + "categories_properties_tags": [ + "all-products", + "categories-known", + "agribalyse-food-code-unknown", + "agribalyse-proxy-food-code-31005", + "agribalyse-proxy-food-code-known", + "ciqual-food-code-unknown", + "agribalyse-known", + "agribalyse-31005" + ], + "categories_tags": [ + "en:snacks", + "en:sweet-snacks", + "en:cocoa-and-its-products", + "en:chocolates", + "en:dark-chocolates", + "en:dark-chocolate-bar", + "en:extra-fine-dark-chocolates", + "en:Botanas", + "en:Cacao y sus productos", + "en:Chocolates negros", + "en:Chocolates negros extra finos", + "en:Snacks dulces" + ], + "category_properties": {}, + "checkers": [], + "checkers_tags": [], + "ciqual_food_name_tags": [ + "unknown" + ], + "cities_tags": [], + "code": "3046920029759", + "codes_tags": [ + "code-13", + "3046920029xxx", + "304692002xxxx", + "30469200xxxxx", + "3046920xxxxxx", + "304692xxxxxxx", + "30469xxxxxxxx", + "3046xxxxxxxxx", + "304xxxxxxxxxx", + "30xxxxxxxxxxx", + "3xxxxxxxxxxxx" + ], + "compared_to_category": "en:snacks-dulces", + "complete": 0, + "completeness": 0.9, + "correctors": [], + "correctors_tags": [ + "javichu", + "gatien", + "manu1400", + "kyzh", + "tacite", + "garber1199", + "boism", + "scanbot", + "standardanalysis", + "neptuno", + "kiliweb", + "solveig-yuka", + "yuka.WTRJcVNha0ZvL3RTZ1BJN3J3SEZ3OVJ0MnFPbVJseTlPY3NLSWc9PQ", + "yuka.U2F3TFNaUXFyOHNLc01JUDNULzYzOXhiK2JINUJYKytMTklOSWc9PQ", + "moon-rabbit", + "yuka.Uy9rZ09xUXFnK010dGZRMTBqZnNwdjFLLzQzMUJUdVlBZXBNSVE9PQ", + "openfoodfacts-contributors", + "sebleouf", + "yuka.UTdrSkFabzdqT0kya2NRYXBFMkY2czVPd01PTFdUeXBNdGdlSWc9PQ", + "yuka.UktVOUc2OWIrZk1scXZjVm9objMvTjlOblp1SWRqMmFlN1llSWc9PQ", + "yuka.ZktzQ0Q1MEUvdHRVZy9ZZSt6TGUydUo3eExpV2NXS3dOUG9VSWc9PQ", + "yuka.ZTQwS0hvOWVsdFF2by9BU3h6WHUvY050d0kzMWUxR2RkdThUSWc9PQ", + "yuka.ZVA4R0xwMGhqZFZhbWZZbi9Tbm8rdHROOXFHZ1cwbWxkOGNTSVE9PQ", + "yuka.ZUw4eE41WUl1T2NieXNRUjBSZm44ZkVsellhd1FYS1dJdkllSWc9PQ", + "yuka.SDZzWVNMa1luT2dSaGNSaHBpTFo1b2xGK0xXYlgwVG1CTnNCSVE9PQ", + "yukafix", + "magasins-u", + "fgouget", + "pascal-h", + "date-limite-app", + "foodrepo", + "marmotte73", + "ccrdz", + "roboto-app", + "vaiton", + "charlesnepote", + "musarana", + "inf", + "zixianglim", + "teolemon", + "jumati", + "stephane", + "ariesmars", + "dahlqvist", + "sashay", + "nur", + "quechoisir", + "zipotlan", + "quentinbrd", + "ibwocoruytrc", + "thaialagata", + "off.f437954f-0a6f-4e52-8293-85d8e69cf333", + "swipe-studio", + "driveoff", + "packbot", + "tolgato", + "franzmari", + "smoothie-app", + "duhowpi", + "spotter", + "aleene", + "taiko", + "jo23", + "redfriend", + "angelbcn", + "insectproductadd", + "kjr", + "predatorix", + "skuma", + "moncoachigbas", + "macrofactor", + "chevalstar", + "nutrinet-sante", + "factfinds", + "freemox", + "alia", + "fighter-food-facts", + "navig491", + "oliwua", + "foodless", + "doodledoo", + "alarieux", + "avis9", + "jimmix", + "ompopo", + "boterman76", + "municorn-calorie-counter-app", + "auroralifescience", + "andrey-arhangel", + "thejerem76", + "graistergarden", + "prepperapp", + "intolerapp", + "bodysupport", + "igweni", + "monsieurtanuki", + "odinh", + "tvlf" + ], + "countries": "Algeria, Austria, Belgium, Bulgaria, Canada, Czech Republic, Finland, France, French Polynesia, Germany, Ireland, Italy, Mauritius, Monaco, Morocco, Netherlands, Norway, Poland, Portugal, Réunion, Romania, Singapore, Spain, Sweden, Switzerland, Tunisia, United Kingdom", + "countries_beforescanbot": "Argelia,Austria,Bélgica,Bulgaria,Canadá,República Checa,Finlandia,Francia,Polinesia Francesa,Alemania,Irlanda,Italia,Mauricio,Marruecos,Países Bajos,Noruega,Reunión,Rumania,Singapur,España,Suecia,Suiza,Túnez,Reino Unido", + "countries_hierarchy": [ + "en:algeria", + "en:austria", + "en:belgium", + "en:bulgaria", + "en:canada", + "en:czech-republic", + "en:finland", + "en:france", + "en:french-polynesia", + "en:germany", + "en:ireland", + "en:italy", + "en:mauritius", + "en:monaco", + "en:morocco", + "en:netherlands", + "en:norway", + "en:poland", + "en:portugal", + "en:reunion", + "en:romania", + "en:singapore", + "en:spain", + "en:sweden", + "en:switzerland", + "en:tunisia", + "en:united-kingdom" + ], + "countries_lc": "en", + "countries_tags": [ + "en:algeria", + "en:austria", + "en:belgium", + "en:bulgaria", + "en:canada", + "en:czech-republic", + "en:finland", + "en:france", + "en:french-polynesia", + "en:germany", + "en:ireland", + "en:italy", + "en:mauritius", + "en:monaco", + "en:morocco", + "en:netherlands", + "en:norway", + "en:poland", + "en:portugal", + "en:reunion", + "en:romania", + "en:singapore", + "en:spain", + "en:sweden", + "en:switzerland", + "en:tunisia", + "en:united-kingdom" + ], + "created_t": 1348995410, + "creator": "openfoodfacts-contributors", + "data_quality_bugs_tags": [], + "data_quality_completeness_tags": [ + "en:photo-and-data-to-be-checked-by-an-experienced-contributor", + "en:ingredients-de-photo-selected", + "en:ingredients-de-completed", + "en:ingredients-completed-at-least-for-one-language", + "en:ingredients-en-photo-selected", + "en:ingredients-en-completed", + "en:ingredients-es-photo-selected", + "en:ingredients-es-completed", + "en:ingredients-fi-photo-selected", + "en:ingredients-fi-completed", + "en:ingredients-fr-photo-selected", + "en:ingredients-fr-completed", + "en:ingredients-it-photo-selected", + "en:ingredients-it-completed", + "en:ingredients-ja-photo-selected", + "en:ingredients-ja-to-be-completed", + "en:ingredients-nb-photo-selected", + "en:ingredients-nb-to-be-completed", + "en:ingredients-nl-photo-to-be-selected", + "en:ingredients-nl-completed", + "en:ingredients-pl-photo-selected", + "en:ingredients-pl-to-be-completed", + "en:ingredients-sv-photo-selected", + "en:ingredients-sv-completed", + "en:nutrition-photo-selected", + "en:categories-completed", + "en:nutrition-completed", + "en:packaging-photo-selected", + "en:packagings-completed", + "en:front-photo-selected", + "en:product-name-completed", + "en:quantity-completed", + "en:brands-completed", + "en:expiration-date-completed" + ], + "data_quality_dimensions": { + "accuracy": { + "overall": "0.00" + }, + "completeness": { + "general_information": "1.00", + "ingredients": "0.82", + "nutrition": "1.00", + "overall": "0.88", + "packaging": "1.00" + } + }, + "data_quality_errors_tags": [], + "data_quality_info_tags": [ + "en:packaging-data-incomplete", + "en:ingredients-percent-analysis-ok", + "en:food-groups-1-known", + "en:food-groups-2-known", + "en:food-groups-3-unknown" + ], + "data_quality_tags": [ + "en:photo-and-data-to-be-checked-by-an-experienced-contributor", + "en:ingredients-de-photo-selected", + "en:ingredients-de-completed", + "en:ingredients-completed-at-least-for-one-language", + "en:ingredients-en-photo-selected", + "en:ingredients-en-completed", + "en:ingredients-es-photo-selected", + "en:ingredients-es-completed", + "en:ingredients-fi-photo-selected", + "en:ingredients-fi-completed", + "en:ingredients-fr-photo-selected", + "en:ingredients-fr-completed", + "en:ingredients-it-photo-selected", + "en:ingredients-it-completed", + "en:ingredients-ja-photo-selected", + "en:ingredients-ja-to-be-completed", + "en:ingredients-nb-photo-selected", + "en:ingredients-nb-to-be-completed", + "en:ingredients-nl-photo-to-be-selected", + "en:ingredients-nl-completed", + "en:ingredients-pl-photo-selected", + "en:ingredients-pl-to-be-completed", + "en:ingredients-sv-photo-selected", + "en:ingredients-sv-completed", + "en:nutrition-photo-selected", + "en:categories-completed", + "en:nutrition-completed", + "en:packaging-photo-selected", + "en:packagings-completed", + "en:front-photo-selected", + "en:product-name-completed", + "en:quantity-completed", + "en:brands-completed", + "en:expiration-date-completed", + "en:packaging-data-incomplete", + "en:ingredients-percent-analysis-ok", + "en:food-groups-1-known", + "en:food-groups-2-known", + "en:food-groups-3-unknown", + "en:ingredients-en-ending-comma", + "en:environmental-score-origins-of-ingredients-origins-are-100-percent-unknown", + "en:environmental-score-production-system-no-label" + ], + "data_quality_warnings_tags": [ + "en:ingredients-en-ending-comma", + "en:environmental-score-origins-of-ingredients-origins-are-100-percent-unknown", + "en:environmental-score-production-system-no-label" + ], + "data_sources": "Database - FoodRepo / openfood.ch, Databases, App - yuka, Apps, App - Horizon, App - InFood, App - Open Food Facts, App - smoothie-openfoodfacts, App - mon-coach-ig-bas, App - macrofactor, App - caloriecounterapp, App - Speisekammer, App - intolerapp", + "data_sources_tags": [ + "database-foodrepo-openfood-ch", + "databases", + "app-yuka", + "apps", + "app-horizon", + "app-infood", + "app-open-food-facts", + "app-smoothie-openfoodfacts", + "app-mon-coach-ig-bas", + "app-macrofactor", + "app-caloriecounterapp", + "app-speisekammer", + "app-intolerapp" + ], + "debug_param_sorted_langs": [ + "de", + "en", + "es", + "fi", + "fr", + "it", + "ja", + "nb", + "nl", + "pl", + "sv" + ], + "debug_tags": [ + "43" + ], + "ecoscore_data": { + "adjustments": { + "origins_of_ingredients": { + "aggregated_origins": [ + { + "epi_score": 0, + "origin": "en:unknown", + "percent": 100.0, + "transportation_score": 0 + } + ], + "epi_score": 0, + "epi_value": -5, + "origins_from_categories": [ + "en:unknown" + ], + "origins_from_origins_field": [ + "en:unknown" + ], + "transportation_score": 0, + "transportation_scores": { + "ad": 0, + "al": 0, + "at": 0, + "ax": 0, + "ba": 0, + "be": 0, + "bg": 0, + "ch": 0, + "cy": 0, + "cz": 0, + "de": 0, + "dk": 0, + "dz": 0, + "ee": 0, + "eg": 0, + "es": 0, + "fi": 0, + "fo": 0, + "fr": 0, + "gg": 0, + "gi": 0, + "gr": 0, + "hr": 0, + "hu": 0, + "ie": 0, + "il": 0, + "im": 0, + "is": 0, + "it": 0, + "je": 0, + "lb": 0, + "li": 0, + "lt": 0, + "lu": 0, + "lv": 0, + "ly": 0, + "ma": 0, + "mc": 0, + "md": 0, + "me": 0, + "mk": 0, + "mt": 0, + "nl": 0, + "no": 0, + "pl": 0, + "ps": 0, + "pt": 0, + "ro": 0, + "rs": 0, + "se": 0, + "si": 0, + "sj": 0, + "sk": 0, + "sm": 0, + "sy": 0, + "tn": 0, + "tr": 0, + "ua": 0, + "uk": 0, + "us": 0, + "va": 0, + "world": 0, + "xk": 0 + }, + "transportation_value": 0, + "transportation_values": { + "ad": 0, + "al": 0, + "at": 0, + "ax": 0, + "ba": 0, + "be": 0, + "bg": 0, + "ch": 0, + "cy": 0, + "cz": 0, + "de": 0, + "dk": 0, + "dz": 0, + "ee": 0, + "eg": 0, + "es": 0, + "fi": 0, + "fo": 0, + "fr": 0, + "gg": 0, + "gi": 0, + "gr": 0, + "hr": 0, + "hu": 0, + "ie": 0, + "il": 0, + "im": 0, + "is": 0, + "it": 0, + "je": 0, + "lb": 0, + "li": 0, + "lt": 0, + "lu": 0, + "lv": 0, + "ly": 0, + "ma": 0, + "mc": 0, + "md": 0, + "me": 0, + "mk": 0, + "mt": 0, + "nl": 0, + "no": 0, + "pl": 0, + "ps": 0, + "pt": 0, + "ro": 0, + "rs": 0, + "se": 0, + "si": 0, + "sj": 0, + "sk": 0, + "sm": 0, + "sy": 0, + "tn": 0, + "tr": 0, + "ua": 0, + "uk": 0, + "us": 0, + "va": 0, + "world": 0, + "xk": 0 + }, + "value": -5, + "values": { + "ad": -5, + "al": -5, + "at": -5, + "ax": -5, + "ba": -5, + "be": -5, + "bg": -5, + "ch": -5, + "cy": -5, + "cz": -5, + "de": -5, + "dk": -5, + "dz": -5, + "ee": -5, + "eg": -5, + "es": -5, + "fi": -5, + "fo": -5, + "fr": -5, + "gg": -5, + "gi": -5, + "gr": -5, + "hr": -5, + "hu": -5, + "ie": -5, + "il": -5, + "im": -5, + "is": -5, + "it": -5, + "je": -5, + "lb": -5, + "li": -5, + "lt": -5, + "lu": -5, + "lv": -5, + "ly": -5, + "ma": -5, + "mc": -5, + "md": -5, + "me": -5, + "mk": -5, + "mt": -5, + "nl": -5, + "no": -5, + "pl": -5, + "ps": -5, + "pt": -5, + "ro": -5, + "rs": -5, + "se": -5, + "si": -5, + "sj": -5, + "sk": -5, + "sm": -5, + "sy": -5, + "tn": -5, + "tr": -5, + "ua": -5, + "uk": -5, + "us": -5, + "va": -5, + "world": -5, + "xk": -5 + }, + "warning": "origins_are_100_percent_unknown" + }, + "packaging": { + "non_recyclable_and_non_biodegradable_materials": 0, + "packagings": [ + { + "environmental_score_material_score": 36, + "environmental_score_shape_ratio": 0.1, + "food_contact": 1, + "material": "en:light-aluminium", + "number_of_units": 1, + "quantity_per_unit": "100 g", + "quantity_per_unit_unit": "g", + "quantity_per_unit_value": 100, + "recycling": "en:recycle-in-sorting-bin", + "shape": "en:sheet", + "weight_measured": 1.2 + }, + { + "environmental_score_material_score": 92, + "environmental_score_shape_ratio": 1, + "material": "en:cardboard", + "number_of_units": 1, + "quantity_per_unit": "100 g", + "quantity_per_unit_unit": "g", + "quantity_per_unit_value": 100, + "recycling": "en:recycle-in-sorting-bin", + "shape": "en:sleeve", + "weight_measured": 10.2 + } + ], + "score": 85.6, + "value": -1 + }, + "production_system": { + "labels": [], + "value": 0, + "warning": "no_label" + }, + "threatened_species": {} + }, + "agribalyse": { + "agribalyse_proxy_food_code": "31005", + "co2_agriculture": 17.8, + "co2_consumption": 0, + "co2_distribution": 0.0209, + "co2_packaging": 0.705, + "co2_processing": 0.194, + "co2_total": 19.1, + "co2_transportation": 0.308, + "code": "31005", + "dqr": "1.886436469961008", + "ef_agriculture": 0.851, + "ef_consumption": 0, + "ef_distribution": 0.0049, + "ef_packaging": 0.0741, + "ef_processing": 0.0218, + "ef_total": 0.98, + "ef_transportation": 0.0286, + "is_beverage": 0, + "name_en": "Dark chocolate bar, less than 70% cocoa", + "name_fr": "Chocolat noir à moins de 70% de cacao, à croquer, tablette", + "score": 32, + "version": "3.2" + }, + "grade": "e", + "grades": { + "ad": "e", + "al": "e", + "at": "e", + "ax": "e", + "ba": "e", + "be": "e", + "bg": "e", + "ch": "e", + "cy": "e", + "cz": "e", + "de": "e", + "dk": "e", + "dz": "e", + "ee": "e", + "eg": "e", + "es": "e", + "fi": "e", + "fo": "e", + "fr": "e", + "gg": "e", + "gi": "e", + "gr": "e", + "hr": "e", + "hu": "e", + "ie": "e", + "il": "e", + "im": "e", + "is": "e", + "it": "e", + "je": "e", + "lb": "e", + "li": "e", + "lt": "e", + "lu": "e", + "lv": "e", + "ly": "e", + "ma": "e", + "mc": "e", + "md": "e", + "me": "e", + "mk": "e", + "mt": "e", + "nl": "e", + "no": "e", + "pl": "e", + "ps": "e", + "pt": "e", + "ro": "e", + "rs": "e", + "se": "e", + "si": "e", + "sj": "e", + "sk": "e", + "sm": "e", + "sy": "e", + "tn": "e", + "tr": "e", + "ua": "e", + "uk": "e", + "us": "e", + "va": "e", + "world": "e", + "xk": "e" + }, + "missing": { + "labels": 1, + "origins": 1 + }, + "missing_data_warning": 1, + "previous_data": { + "agribalyse": { + "agribalyse_proxy_food_code": "31005", + "co2_agriculture": 15.887773, + "co2_consumption": 0, + "co2_distribution": 0.017263204, + "co2_packaging": 0.10402936, + "co2_processing": 0.45803597, + "co2_total": 16.878582384, + "co2_transportation": 0.41148085, + "code": "31005", + "dqr": "2.99", + "ef_agriculture": 0.77882279, + "ef_consumption": 0, + "ef_distribution": 0.0046101581, + "ef_packaging": 0.010330022, + "ef_processing": 0.043605116, + "ef_total": 0.8797669371, + "ef_transportation": 0.042398851, + "is_beverage": 0, + "name_en": "Dark chocolate bar, less than 70% cocoa", + "name_fr": "Chocolat noir à moins de 70% de cacao, à croquer, tablette", + "score": 35, + "version": "3.1.1" + }, + "grade": "e", + "score": 29 + }, + "score": 26, + "scores": { + "ad": 26, + "al": 26, + "at": 26, + "ax": 26, + "ba": 26, + "be": 26, + "bg": 26, + "ch": 26, + "cy": 26, + "cz": 26, + "de": 26, + "dk": 26, + "dz": 26, + "ee": 26, + "eg": 26, + "es": 26, + "fi": 26, + "fo": 26, + "fr": 26, + "gg": 26, + "gi": 26, + "gr": 26, + "hr": 26, + "hu": 26, + "ie": 26, + "il": 26, + "im": 26, + "is": 26, + "it": 26, + "je": 26, + "lb": 26, + "li": 26, + "lt": 26, + "lu": 26, + "lv": 26, + "ly": 26, + "ma": 26, + "mc": 26, + "md": 26, + "me": 26, + "mk": 26, + "mt": 26, + "nl": 26, + "no": 26, + "pl": 26, + "ps": 26, + "pt": 26, + "ro": 26, + "rs": 26, + "se": 26, + "si": 26, + "sj": 26, + "sk": 26, + "sm": 26, + "sy": 26, + "tn": 26, + "tr": 26, + "ua": 26, + "uk": 26, + "us": 26, + "va": 26, + "world": 26, + "xk": 26 + }, + "status": "known" + }, + "ecoscore_grade": "e", + "ecoscore_score": 26, + "ecoscore_tags": [ + "e" + ], + "editors": [ + "", + "kyzh", + "tacite", + "manu1400", + "javichu", + "gatien" + ], + "editors_tags": [ + "alarieux", + "aleene", + "alia", + "andrey-arhangel", + "angelbcn", + "ariesmars", + "auroralifescience", + "avis9", + "bcatelin", + "bodysupport", + "boism", + "boterman76", + "ccrdz", + "charlesnepote", + "chevalstar", + "dahlqvist", + "date-limite-app", + "doodledoo", + "driveoff", + "duhowpi", + "ecoscore-impact-estimator", + "emeterio", + "factfinds", + "fgouget", + "fighter-food-facts", + "fms08", + "foodless", + "foodrepo", + "foodvisor", + "franzmari", + "freemox", + "garber1199", + "gatien", + "graistergarden", + "ibwocoruytrc", + "igweni", + "inf", + "insectproductadd", + "intolerapp", + "javichu", + "jimmix", + "jo23", + "jumati", + "keragui", + "kiliweb", + "kjr", + "kyzh", + "maciej-lawniczak", + "macrofactor", + "magasins-u", + "manu1400", + "marmotte73", + "moncoachigbas", + "monsieurtanuki", + "moon-rabbit", + "municorn-calorie-counter-app", + "musarana", + "mvainola", + "navig491", + "neptuno", + "nur", + "nutrinet-sante", + "october-food-facts", + "odinh", + "off.f437954f-0a6f-4e52-8293-85d8e69cf333", + "oliwua", + "ompopo", + "openfoodfacts-contributors", + "packbot", + "pascal-h", + "predatorix", + "prepperapp", + "quechoisir", + "quentinbrd", + "redfriend", + "roboto-app", + "sashay", + "scanbot", + "sebleouf", + "skuma", + "smoothie-app", + "solveig-yuka", + "spotter", + "standardanalysis", + "stephane", + "swipe-studio", + "tacite", + "taiko", + "teolemon", + "thaialagata", + "thejerem76", + "tolgato", + "tvlf", + "tylili23", + "vaiton", + "yosa", + "yuka.R0s4cEYva09vcWcwaGZBeDNqN1VvUHQ0N2NHUlZtK1lNZEFWSVE9PQ", + "yuka.SDZzWVNMa1luT2dSaGNSaHBpTFo1b2xGK0xXYlgwVG1CTnNCSVE9PQ", + "yuka.U2F3TFNaUXFyOHNLc01JUDNULzYzOXhiK2JINUJYKytMTklOSWc9PQ", + "yuka.UTdrSkFabzdqT0kya2NRYXBFMkY2czVPd01PTFdUeXBNdGdlSWc9PQ", + "yuka.UktVOUc2OWIrZk1scXZjVm9objMvTjlOblp1SWRqMmFlN1llSWc9PQ", + "yuka.Uy9rZ09xUXFnK010dGZRMTBqZnNwdjFLLzQzMUJUdVlBZXBNSVE9PQ", + "yuka.VElrcVRidy9oZlVHcHZNWTRqYUwyNDVrbUthUVlFQ3NCc29XSVE9PQ", + "yuka.WHExZk1MczZqNlVYcThGaXpEL3ArNDR0M0pPT2ZuS2RKT3NhSVE9PQ", + "yuka.WHI0YURMb3hoYVFCdWNFZDJnM1E1ZXRXL2NLclpHMnBCOXBBSVE9PQ", + "yuka.WHJFZUtiMGZsTVVsdnN3bDhBTGExZjlzeXFPaloxR1lJUHBJSUE9PQ", + "yuka.WTRJcVNha0ZvL3RTZ1BJN3J3SEZ3OVJ0MnFPbVJseTlPY3NLSWc9PQ", + "yuka.YWI0bUNyNDhpUFlqcGYwZzJTTFZxL0ZTMTYrTFFUMlRlK2tnSVE9PQ", + "yuka.ZDdoY1Q3UUcvT01haWN3RDh6V042TjExeWFLMkRUeUpDN0JOSVE9PQ", + "yuka.ZTQwS0hvOWVsdFF2by9BU3h6WHUvY050d0kzMWUxR2RkdThUSWc9PQ", + "yuka.ZUw4eE41WUl1T2NieXNRUjBSZm44ZkVsellhd1FYS1dJdkllSWc9PQ", + "yuka.ZVA4R0xwMGhqZFZhbWZZbi9Tbm8rdHROOXFHZ1cwbWxkOGNTSVE9PQ", + "yuka.ZktzQ0Q1MEUvdHRVZy9ZZSt6TGUydUo3eExpV2NXS3dOUG9VSWc9PQ", + "yuka.ZlBncFFLME9yS2NsdXZBNDd4enE1UFowNTYrV2YxbW1FTEpBSUE9PQ", + "yukafix", + "zipotlan", + "zixianglim" + ], + "emb_codes": "", + "emb_codes_20141016": "LINDT & SPRÜNGLI SAS,CHOCOLADEFABRIKEN LINDT & SPRÜNGLI AG", + "emb_codes_hierarchy": [], + "emb_codes_lc": "en", + "emb_codes_orig": "", + "emb_codes_tags": [], + "entry_dates_tags": [ + "2012-09-30", + "2012-09", + "2012" + ], + "environment_impact_level": "", + "environment_impact_level_tags": [], + "expiration_date": "28/02/24", + "food_groups": "en:chocolate-products", + "food_groups_tags": [ + "en:sugary-snacks", + "en:chocolate-products" + ], + "fruits-vegetables-nuts_100g_estimate": 0, + "generic_name": "Extra fine dark chocolate 90% cocoa", + "generic_name_de": "Edelbitterschokolade 90% Kakao", + "generic_name_en": "Extra fine dark chocolate 90% cocoa", + "generic_name_es": "Chocolate negro", + "generic_name_fi": "Hieno tumma suklaa jossa 90% kaakaota", + "generic_name_fr": "Chocolat noir extra-fin traditionnel à 90% de cacao", + "generic_name_it": "Cioccolato fondente 90%", + "generic_name_ja": "", + "generic_name_nb": "", + "generic_name_nl": "", + "generic_name_pl": "", + "generic_name_sv": "Fin mörk choklad med 90% kakao", + "grades": {}, + "id": "3046920029759", + "image_front_small_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.200.jpg", + "image_front_thumb_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.100.jpg", + "image_front_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.400.jpg", + "image_ingredients_small_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_en.529.200.jpg", + "image_ingredients_thumb_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_en.529.100.jpg", + "image_ingredients_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_en.529.400.jpg", + "image_nutrition_small_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_en.546.200.jpg", + "image_nutrition_thumb_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_en.546.100.jpg", + "image_nutrition_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_en.546.400.jpg", + "image_packaging_small_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_en.531.200.jpg", + "image_packaging_thumb_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_en.531.100.jpg", + "image_packaging_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_en.531.400.jpg", + "image_small_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.200.jpg", + "image_thumb_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.100.jpg", + "image_url": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.400.jpg", + "images": { + "1": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 299 + }, + "full": { + "h": 2592, + "w": 1936 + } + }, + "uploaded_t": 1361474452, + "uploader": "openfoodfacts-contributors" + }, + "10": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": "1474660001", + "uploader": "bcatelin" + }, + "100": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + }, + "uploaded_t": 1755508027, + "uploader": "municorn-calorie-counter-app" + }, + "101": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + }, + "uploaded_t": 1755508039, + "uploader": "municorn-calorie-counter-app" + }, + "102": { + "sizes": { + "100": { + "h": 100, + "w": 61 + }, + "400": { + "h": 400, + "w": 245 + }, + "full": { + "h": 1700, + "w": 1042 + } + }, + "uploaded_t": 1759516638, + "uploader": "macrofactor" + }, + "103": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 299 + }, + "full": { + "h": 669, + "w": 500 + } + }, + "uploaded_t": 1759516649, + "uploader": "macrofactor" + }, + "104": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + }, + "uploaded_t": 1761596263, + "uploader": "municorn-calorie-counter-app" + }, + "105": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + }, + "uploaded_t": 1761596275, + "uploader": "municorn-calorie-counter-app" + }, + "106": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + }, + "uploaded_t": 1763403702, + "uploader": "municorn-calorie-counter-app" + }, + "107": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + }, + "uploaded_t": 1763403712, + "uploader": "municorn-calorie-counter-app" + }, + "108": { + "sizes": { + "100": { + "h": 100, + "w": 78 + }, + "400": { + "h": 400, + "w": 310 + }, + "full": { + "h": 1794, + "w": 1391 + } + }, + "uploaded_t": 1766662027, + "uploader": "graistergarden" + }, + "109": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 184 + }, + "full": { + "h": 3655, + "w": 1681 + } + }, + "uploaded_t": 1770893631, + "uploader": "foodless" + }, + "11": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": "1474660021", + "uploader": "bcatelin" + }, + "110": { + "sizes": { + "100": { + "h": 54, + "w": 100 + }, + "400": { + "h": 215, + "w": 400 + }, + "full": { + "h": 1589, + "w": 2958 + } + }, + "uploaded_t": 1773255497, + "uploader": "igweni" + }, + "111": { + "sizes": { + "100": { + "h": 100, + "w": 43 + }, + "400": { + "h": 400, + "w": 171 + }, + "full": { + "h": 2744, + "w": 1176 + } + }, + "uploaded_t": 1775997757, + "uploader": "foodless" + }, + "112": { + "sizes": { + "100": { + "h": 100, + "w": 51 + }, + "400": { + "h": 400, + "w": 203 + }, + "full": { + "h": 1389, + "w": 704 + } + }, + "uploaded_t": 1777741915, + "uploader": "macrofactor" + }, + "113": { + "sizes": { + "100": { + "h": 64, + "w": 100 + }, + "400": { + "h": 256, + "w": 400 + }, + "full": { + "h": 753, + "w": 1176 + } + }, + "uploaded_t": 1777741927, + "uploader": "macrofactor" + }, + "12": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": "1476212413", + "uploader": "openfoodfacts-contributors" + }, + "13": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 2666, + "w": 2000 + } + }, + "uploaded_t": "1478404832", + "uploader": "openfoodfacts-contributors" + }, + "14": { + "sizes": { + "100": { + "h": 56, + "w": 100 + }, + "400": { + "h": 225, + "w": 400 + }, + "full": { + "h": 1125, + "w": 2000 + } + }, + "uploaded_t": "1482493943", + "uploader": "standardanalysis" + }, + "15": { + "sizes": { + "100": { + "h": 100, + "w": 56 + }, + "400": { + "h": 400, + "w": 225 + }, + "full": { + "h": 3555, + "w": 2000 + } + }, + "uploaded_t": "1482494102", + "uploader": "standardanalysis" + }, + "16": { + "sizes": { + "100": { + "h": 56, + "w": 100 + }, + "400": { + "h": 225, + "w": 400 + }, + "full": { + "h": 1125, + "w": 2000 + } + }, + "uploaded_t": "1482494498", + "uploader": "standardanalysis" + }, + "17": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 2666, + "w": 2000 + } + }, + "uploaded_t": "1488632440", + "uploader": "keragui" + }, + "18": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": "1509534099", + "uploader": "openfoodfacts-contributors" + }, + "19": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": "1509536567", + "uploader": "openfoodfacts-contributors" + }, + "2": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 299 + }, + "full": { + "h": 2592, + "w": 1936 + } + }, + "uploaded_t": 1361474549, + "uploader": "openfoodfacts-contributors" + }, + "20": { + "sizes": { + "100": { + "h": 75, + "w": 100 + }, + "400": { + "h": 300, + "w": 400 + }, + "full": { + "h": 1944, + "w": 2592 + } + }, + "uploaded_t": "1510987995", + "uploader": "openfoodfacts-contributors" + }, + "21": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 1360, + "w": 1021 + } + }, + "uploaded_t": "1513531047", + "uploader": "kiliweb" + }, + "22": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 4030, + "w": 3024 + } + }, + "uploaded_t": "1513531050", + "uploader": "kiliweb" + }, + "24": { + "sizes": { + "100": { + "h": 100, + "w": 57 + }, + "400": { + "h": 400, + "w": 226 + }, + "full": { + "h": 1200, + "w": 679 + } + }, + "uploaded_t": "1523097979", + "uploader": "kiliweb" + }, + "25": { + "sizes": { + "100": { + "h": 100, + "w": 53 + }, + "400": { + "h": 400, + "w": 212 + }, + "full": { + "h": 1200, + "w": 635 + } + }, + "uploaded_t": "1524923116", + "uploader": "kiliweb" + }, + "26": { + "sizes": { + "100": { + "h": 40, + "w": 100 + }, + "400": { + "h": 159, + "w": 400 + }, + "full": { + "h": 875, + "w": 2207 + } + }, + "uploaded_t": "1526557239", + "uploader": "kiliweb" + }, + "27": { + "sizes": { + "100": { + "h": 75, + "w": 100 + }, + "400": { + "h": 300, + "w": 400 + }, + "full": { + "h": 1500, + "w": 2000 + } + }, + "uploaded_t": "1526646856", + "uploader": "openfoodfacts-contributors" + }, + "28": { + "sizes": { + "100": { + "h": 100, + "w": 60 + }, + "400": { + "h": 400, + "w": 241 + }, + "full": { + "h": 1200, + "w": 722 + } + }, + "uploaded_t": "1527358351", + "uploader": "kiliweb" + }, + "29": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3328, + "w": 2496 + } + }, + "uploaded_t": 1536939292, + "uploader": "openfoodfacts-contributors" + }, + "30": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3328, + "w": 2496 + } + }, + "uploaded_t": 1536939318, + "uploader": "openfoodfacts-contributors" + }, + "31": { + "sizes": { + "100": { + "h": 100, + "w": 55 + }, + "400": { + "h": 400, + "w": 220 + }, + "full": { + "h": 1200, + "w": 660 + } + }, + "uploaded_t": "1526289297", + "uploader": "kiliweb" + }, + "32": { + "sizes": { + "100": { + "h": 100, + "w": 53 + }, + "400": { + "h": 400, + "w": 211 + }, + "full": { + "h": 1200, + "w": 633 + } + }, + "uploaded_t": "1526289310", + "uploader": "kiliweb" + }, + "33": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 1360, + "w": 1021 + } + }, + "uploaded_t": "1495134202", + "uploader": "kiliweb" + }, + "34": { + "sizes": { + "100": { + "h": 79, + "w": 100 + }, + "400": { + "h": 316, + "w": 400 + }, + "full": { + "h": 1874, + "w": 2372 + } + }, + "uploaded_t": "1495134203", + "uploader": "kiliweb" + }, + "36": { + "sizes": { + "100": { + "h": 57, + "w": 100 + }, + "400": { + "h": 229, + "w": 400 + }, + "full": { + "h": 1021, + "w": 1787 + } + }, + "uploaded_t": 1551220078, + "uploader": "ccrdz" + }, + "37": { + "sizes": { + "100": { + "h": 100, + "w": 56 + }, + "400": { + "h": 400, + "w": 225 + }, + "full": { + "h": 1000, + "w": 563 + } + }, + "uploaded_t": 1554150442, + "uploader": "foodrepo" + }, + "38": { + "sizes": { + "100": { + "h": 100, + "w": 59 + }, + "400": { + "h": 325, + "w": 193 + }, + "full": { + "h": 325, + "w": 193 + } + }, + "uploaded_t": 1554150443, + "uploader": "foodrepo" + }, + "39": { + "sizes": { + "100": { + "h": 57, + "w": 100 + }, + "400": { + "h": 173, + "w": 303 + }, + "full": { + "h": 173, + "w": 303 + } + }, + "uploaded_t": 1554150443, + "uploader": "foodrepo" + }, + "40": { + "sizes": { + "100": { + "h": 100, + "w": 56 + }, + "400": { + "h": 400, + "w": 225 + }, + "full": { + "h": 1000, + "w": 563 + } + }, + "uploaded_t": 1554150443, + "uploader": "foodrepo" + }, + "42": { + "sizes": { + "100": { + "h": 56, + "w": 100 + }, + "400": { + "h": 225, + "w": 400 + }, + "full": { + "h": 1728, + "w": 3072 + } + }, + "uploaded_t": 1558470858, + "uploader": "openfoodfacts-contributors" + }, + "43": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 4096, + "w": 3072 + } + }, + "uploaded_t": 1558471482, + "uploader": "openfoodfacts-contributors" + }, + "44": { + "sizes": { + "100": { + "h": 75, + "w": 100 + }, + "400": { + "h": 300, + "w": 400 + }, + "full": { + "h": 3072, + "w": 4096 + } + }, + "uploaded_t": 1559843369, + "uploader": "openfoodfacts-contributors" + }, + "45": { + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "400": { + "h": 212, + "w": 400 + }, + "full": { + "h": 1272, + "w": 2399 + } + }, + "uploaded_t": 1561842274, + "uploader": "openfoodfacts-contributors" + }, + "46": { + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "400": { + "h": 212, + "w": 400 + }, + "full": { + "h": 1321, + "w": 2487 + } + }, + "uploaded_t": 1561842384, + "uploader": "openfoodfacts-contributors" + }, + "47": { + "sizes": { + "100": { + "h": 100, + "w": 44 + }, + "400": { + "h": 400, + "w": 175 + }, + "full": { + "h": 3440, + "w": 1509 + } + }, + "uploaded_t": 1562611385, + "uploader": "openfoodfacts-contributors" + }, + "48": { + "sizes": { + "100": { + "h": 100, + "w": 50 + }, + "400": { + "h": 400, + "w": 199 + }, + "full": { + "h": 4530, + "w": 2254 + } + }, + "uploaded_t": 1575997945, + "uploader": "jumati" + }, + "49": { + "sizes": { + "100": { + "h": 100, + "w": 82 + }, + "400": { + "h": 400, + "w": 326 + }, + "full": { + "h": 3177, + "w": 2592 + } + }, + "uploaded_t": 1575998052, + "uploader": "jumati" + }, + "50": { + "sizes": { + "100": { + "h": 64, + "w": 100 + }, + "400": { + "h": 255, + "w": 400 + }, + "full": { + "h": 1927, + "w": 3024 + } + }, + "uploaded_t": 1583112244, + "uploader": "ariesmars" + }, + "51": { + "sizes": { + "100": { + "h": 61, + "w": 100 + }, + "400": { + "h": 243, + "w": 400 + }, + "full": { + "h": 1819, + "w": 2990 + } + }, + "uploaded_t": 1583112377, + "uploader": "ariesmars" + }, + "52": { + "sizes": { + "100": { + "h": 48, + "w": 100 + }, + "400": { + "h": 193, + "w": 400 + }, + "full": { + "h": 1416, + "w": 2931 + } + }, + "uploaded_t": 1583112633, + "uploader": "ariesmars" + }, + "53": { + "sizes": { + "100": { + "h": 24, + "w": 100 + }, + "400": { + "h": 95, + "w": 400 + }, + "full": { + "h": 712, + "w": 3000 + } + }, + "uploaded_t": 1617633957, + "uploader": "zipotlan" + }, + "54": { + "sizes": { + "100": { + "h": 24, + "w": 100 + }, + "400": { + "h": 98, + "w": 400 + }, + "full": { + "h": 732, + "w": 3000 + } + }, + "uploaded_t": 1617633988, + "uploader": "zipotlan" + }, + "55": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 4032, + "w": 3024 + } + }, + "uploaded_t": 1626892432, + "uploader": "openfoodfacts-contributors" + }, + "59": { + "sizes": { + "100": { + "h": 64, + "w": 100 + }, + "400": { + "h": 255, + "w": 400 + }, + "full": { + "h": 1669, + "w": 2613 + } + }, + "uploaded_t": 1648669287, + "uploader": "franzmari" + }, + "60": { + "sizes": { + "100": { + "h": 100, + "w": 93 + }, + "400": { + "h": 400, + "w": 374 + }, + "full": { + "h": 2410, + "w": 2253 + } + }, + "uploaded_t": 1648669336, + "uploader": "franzmari" + }, + "61": { + "sizes": { + "100": { + "h": 100, + "w": 44 + }, + "400": { + "h": 400, + "w": 178 + }, + "full": { + "h": 4570, + "w": 2033 + } + }, + "uploaded_t": 1648669403, + "uploader": "franzmari" + }, + "63": { + "sizes": { + "100": { + "h": 100, + "w": 47 + }, + "400": { + "h": 400, + "w": 189 + }, + "full": { + "h": 2930, + "w": 1385 + } + }, + "uploaded_t": 1662008284, + "uploader": "maciej-lawniczak" + }, + "64": { + "sizes": { + "100": { + "h": 100, + "w": 48 + }, + "400": { + "h": 400, + "w": 192 + }, + "full": { + "h": 3030, + "w": 1456 + } + }, + "uploaded_t": 1662008321, + "uploader": "maciej-lawniczak" + }, + "65": { + "sizes": { + "100": { + "h": 54, + "w": 100 + }, + "400": { + "h": 217, + "w": 400 + }, + "full": { + "h": 861, + "w": 1586 + } + }, + "uploaded_t": 1662008384, + "uploader": "maciej-lawniczak" + }, + "66": { + "sizes": { + "100": { + "h": 62, + "w": 100 + }, + "400": { + "h": 248, + "w": 400 + }, + "full": { + "h": 833, + "w": 1345 + } + }, + "uploaded_t": 1662008410, + "uploader": "maciej-lawniczak" + }, + "67": { + "sizes": { + "100": { + "h": 100, + "w": 47 + }, + "400": { + "h": 400, + "w": 189 + }, + "full": { + "h": 2958, + "w": 1399 + } + }, + "uploaded_t": 1664622753, + "uploader": "maciej-lawniczak" + }, + "68": { + "sizes": { + "100": { + "h": 100, + "w": 48 + }, + "400": { + "h": 400, + "w": 192 + }, + "full": { + "h": 2949, + "w": 1418 + } + }, + "uploaded_t": 1664622771, + "uploader": "maciej-lawniczak" + }, + "69": { + "sizes": { + "100": { + "h": 55, + "w": 100 + }, + "400": { + "h": 222, + "w": 400 + }, + "full": { + "h": 927, + "w": 1674 + } + }, + "uploaded_t": 1664622792, + "uploader": "maciej-lawniczak" + }, + "7": { + "sizes": { + "100": { + "h": 100, + "w": 74 + }, + "400": { + "h": 400, + "w": 297 + }, + "full": { + "h": 4208, + "w": 3120 + } + }, + "uploaded_t": 1427532506, + "uploader": "kyzh" + }, + "70": { + "sizes": { + "100": { + "h": 63, + "w": 100 + }, + "400": { + "h": 254, + "w": 400 + }, + "full": { + "h": 833, + "w": 1314 + } + }, + "uploaded_t": 1664622818, + "uploader": "maciej-lawniczak" + }, + "71": { + "sizes": { + "100": { + "h": 100, + "w": 49 + }, + "400": { + "h": 400, + "w": 195 + }, + "full": { + "h": 3471, + "w": 1694 + } + }, + "uploaded_t": 1679079945, + "uploader": "mvainola" + }, + "72": { + "sizes": { + "100": { + "h": 100, + "w": 51 + }, + "400": { + "h": 400, + "w": 205 + }, + "full": { + "h": 3554, + "w": 1820 + } + }, + "uploaded_t": 1679079978, + "uploader": "mvainola" + }, + "73": { + "sizes": { + "100": { + "h": 50, + "w": 100 + }, + "400": { + "h": 201, + "w": 400 + }, + "full": { + "h": 1768, + "w": 3519 + } + }, + "uploaded_t": 1679080032, + "uploader": "mvainola" + }, + "74": { + "sizes": { + "100": { + "h": 70, + "w": 100 + }, + "400": { + "h": 279, + "w": 400 + }, + "full": { + "h": 449, + "w": 644 + } + }, + "uploaded_t": 1681720438, + "uploader": "marmotte73" + }, + "75": { + "sizes": { + "100": { + "h": 100, + "w": 45 + }, + "400": { + "h": 400, + "w": 180 + }, + "full": { + "h": 4000, + "w": 1800 + } + }, + "uploaded_t": 1688673704, + "uploader": "smoothie-app" + }, + "76": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 4032, + "w": 1860 + } + }, + "uploaded_t": 1688739620, + "uploader": "smoothie-app" + }, + "77": { + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "400": { + "h": 400, + "w": 186 + }, + "full": { + "h": 3676, + "w": 1707 + } + }, + "uploaded_t": 1693734943, + "uploader": "jo23" + }, + "78": { + "sizes": { + "100": { + "h": 100, + "w": 56 + }, + "400": { + "h": 400, + "w": 225 + }, + "full": { + "h": 1280, + "w": 720 + } + }, + "uploaded_t": 1701556368, + "uploader": "insectproductadd" + }, + "8": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 2666, + "w": 2000 + } + }, + "uploaded_t": "1454325440", + "uploader": "openfoodfacts-contributors" + }, + "80": { + "sizes": { + "100": { + "h": 100, + "w": 48 + }, + "400": { + "h": 400, + "w": 193 + }, + "full": { + "h": 3445, + "w": 1665 + } + }, + "uploaded_t": 1705825780, + "uploader": "predatorix" + }, + "81": { + "sizes": { + "100": { + "h": 46, + "w": 100 + }, + "400": { + "h": 183, + "w": 400 + }, + "full": { + "h": 624, + "w": 1366 + } + }, + "uploaded_t": 1705825799, + "uploader": "predatorix" + }, + "82": { + "sizes": { + "100": { + "h": 100, + "w": 89 + }, + "400": { + "h": 400, + "w": 354 + }, + "full": { + "h": 1362, + "w": 1207 + } + }, + "uploaded_t": 1705825824, + "uploader": "predatorix" + }, + "83": { + "sizes": { + "100": { + "h": 87, + "w": 100 + }, + "400": { + "h": 349, + "w": 400 + }, + "full": { + "h": 532, + "w": 609 + } + }, + "uploaded_t": 1705825841, + "uploader": "predatorix" + }, + "84": { + "sizes": { + "100": { + "h": 39, + "w": 100 + }, + "400": { + "h": 157, + "w": 400 + }, + "full": { + "h": 841, + "w": 2139 + } + }, + "uploaded_t": 1709963477, + "uploader": "skuma" + }, + "85": { + "sizes": { + "100": { + "h": 100, + "w": 45 + }, + "400": { + "h": 400, + "w": 180 + }, + "full": { + "h": 3264, + "w": 1469 + } + }, + "uploaded_t": 1709964815, + "uploader": "skuma" + }, + "86": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 1698, + "w": 1275 + } + }, + "uploaded_t": 1721385689, + "uploader": "macrofactor" + }, + "87": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 1698, + "w": 1275 + } + }, + "uploaded_t": 1721385701, + "uploader": "macrofactor" + }, + "88": { + "sizes": { + "100": { + "h": 100, + "w": 54 + }, + "400": { + "h": 400, + "w": 214 + }, + "full": { + "h": 4000, + "w": 2144 + } + }, + "uploaded_t": "1728562867", + "uploader": "foodless" + }, + "89": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": 1731824313, + "uploader": "fms08" + }, + "9": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 2666, + "w": 2000 + } + }, + "uploaded_t": "1454325449", + "uploader": "openfoodfacts-contributors" + }, + "90": { + "sizes": { + "100": { + "h": 100, + "w": 75 + }, + "400": { + "h": 400, + "w": 300 + }, + "full": { + "h": 3264, + "w": 2448 + } + }, + "uploaded_t": 1731824347, + "uploader": "fms08" + }, + "91": { + "sizes": { + "100": { + "h": 100, + "w": 50 + }, + "400": { + "h": 400, + "w": 201 + }, + "full": { + "h": 752, + "w": 378 + } + }, + "uploaded_t": 1733486007, + "uploader": "openfoodfacts-contributors" + }, + "92": { + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "400": { + "h": 213, + "w": 400 + }, + "full": { + "h": 1549, + "w": 2911 + } + }, + "uploaded_t": 1734557465, + "uploader": "oliwua" + }, + "93": { + "sizes": { + "100": { + "h": 100, + "w": 45 + }, + "400": { + "h": 400, + "w": 179 + }, + "full": { + "h": 3702, + "w": 1654 + } + }, + "uploaded_t": 1746370933, + "uploader": "jimmix" + }, + "94": { + "sizes": { + "100": { + "h": 46, + "w": 100 + }, + "400": { + "h": 183, + "w": 400 + }, + "full": { + "h": 1184, + "w": 2590 + } + }, + "uploaded_t": 1746370959, + "uploader": "jimmix" + }, + "95": { + "sizes": { + "100": { + "h": 100, + "w": 90 + }, + "400": { + "h": 400, + "w": 359 + }, + "full": { + "h": 1910, + "w": 1712 + } + }, + "uploaded_t": 1746370980, + "uploader": "jimmix" + }, + "96": { + "sizes": { + "100": { + "h": 42, + "w": 100 + }, + "400": { + "h": 170, + "w": 400 + }, + "full": { + "h": 983, + "w": 2316 + } + }, + "uploaded_t": 1746371003, + "uploader": "jimmix" + }, + "97": { + "sizes": { + "100": { + "h": 54, + "w": 100 + }, + "400": { + "h": 218, + "w": 400 + }, + "full": { + "h": 1647, + "w": 3024 + } + }, + "uploaded_t": 1752154542, + "uploader": "ompopo" + }, + "98": { + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "400": { + "h": 212, + "w": 400 + }, + "full": { + "h": 1427, + "w": 2692 + } + }, + "uploaded_t": 1752154560, + "uploader": "ompopo" + }, + "99": { + "sizes": { + "100": { + "h": 80, + "w": 100 + }, + "400": { + "h": 321, + "w": 400 + }, + "full": { + "h": 597, + "w": 743 + } + }, + "uploaded_t": 1752154576, + "uploader": "ompopo" + }, + "front_de": { + "imgid": 109, + "rev": 517, + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "200": { + "h": 200, + "w": 92 + }, + "400": { + "h": 400, + "w": 184 + }, + "full": { + "h": 3655, + "w": 1681 + } + } + }, + "front_en": { + "imgid": 112, + "rev": 544, + "sizes": { + "100": { + "h": 100, + "w": 51 + }, + "200": { + "h": 200, + "w": 101 + }, + "400": { + "h": 400, + "w": 203 + }, + "full": { + "h": 1389, + "w": 704 + } + } + }, + "front_es": { + "imgid": "91", + "rev": "401", + "sizes": { + "100": { + "h": 100, + "w": 47 + }, + "200": { + "h": 200, + "w": 93 + }, + "400": { + "h": 400, + "w": 187 + }, + "full": { + "h": 720, + "w": 336 + } + } + }, + "front_fi": { + "coordinates_image_size": "full", + "imgid": "91", + "rev": "445", + "sizes": { + "100": { + "h": 100, + "w": 47 + }, + "200": { + "h": 200, + "w": 93 + }, + "400": { + "h": 400, + "w": 187 + }, + "full": { + "h": 720, + "w": 336 + } + }, + "x1": -1, + "x2": 378, + "y1": -1, + "y2": 752 + }, + "front_it": { + "imgid": "93", + "rev": "417", + "sizes": { + "100": { + "h": 100, + "w": 45 + }, + "200": { + "h": 200, + "w": 89 + }, + "400": { + "h": 400, + "w": 179 + }, + "full": { + "h": 3702, + "w": 1654 + } + } + }, + "front_nb": { + "coordinates_image_size": "full", + "imgid": "91", + "rev": "437", + "sizes": { + "100": { + "h": 100, + "w": 47 + }, + "200": { + "h": 200, + "w": 93 + }, + "400": { + "h": 400, + "w": 187 + }, + "full": { + "h": 720, + "w": 336 + } + }, + "x1": -1, + "x2": 378, + "y1": -1, + "y2": 752 + }, + "ingredients_de": { + "imgid": "81", + "rev": "343", + "sizes": { + "100": { + "h": 46, + "w": 100 + }, + "200": { + "h": 91, + "w": 200 + }, + "400": { + "h": 183, + "w": 400 + }, + "full": { + "h": 624, + "w": 1366 + } + } + }, + "ingredients_en": { + "coordinates_image_size": "full", + "imgid": 68, + "normalize": "true", + "rev": 529, + "sizes": { + "100": { + "h": 35, + "w": 100 + }, + "200": { + "h": 71, + "w": 200 + }, + "400": { + "h": 142, + "w": 400 + }, + "full": { + "h": 197, + "w": 556 + } + }, + "x1": 89, + "x2": 645, + "y1": 412, + "y2": 609 + }, + "ingredients_es": { + "imgid": "54", + "rev": "229", + "sizes": { + "100": { + "h": 24, + "w": 100 + }, + "200": { + "h": 49, + "w": 200 + }, + "400": { + "h": 98, + "w": 400 + }, + "full": { + "h": 732, + "w": 3000 + } + } + }, + "ingredients_fi": { + "coordinates_image_size": "400", + "imgid": "48", + "rev": "169", + "sizes": { + "100": { + "h": 51, + "w": 100 + }, + "200": { + "h": 102, + "w": 200 + }, + "400": { + "h": 203, + "w": 400 + }, + "full": { + "h": 527, + "w": 1038 + } + }, + "x1": 4, + "x2": 95, + "y1": 106, + "y2": 153 + }, + "ingredients_fr": { + "imgid": 110, + "rev": 523, + "sizes": { + "100": { + "h": 54, + "w": 100 + }, + "200": { + "h": 107, + "w": 200 + }, + "400": { + "h": 215, + "w": 400 + }, + "full": { + "h": 1589, + "w": 2958 + } + } + }, + "ingredients_it": { + "imgid": "94", + "rev": "419", + "sizes": { + "100": { + "h": 46, + "w": 100 + }, + "200": { + "h": 91, + "w": 200 + }, + "400": { + "h": 183, + "w": 400 + }, + "full": { + "h": 1184, + "w": 2590 + } + } + }, + "ingredients_ja": { + "coordinates_image_size": "full", + "imgid": 108, + "rev": 500, + "sizes": { + "100": { + "h": 100, + "w": 78 + }, + "200": { + "h": 200, + "w": 155 + }, + "400": { + "h": 400, + "w": 310 + }, + "full": { + "h": 1794, + "w": 1391 + } + }, + "x1": -1, + "x2": 1391, + "y1": -1, + "y2": 1794 + }, + "ingredients_nb": { + "imgid": "98", + "rev": "443", + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "200": { + "h": 106, + "w": 200 + }, + "400": { + "h": 212, + "w": 400 + }, + "full": { + "h": 1427, + "w": 2692 + } + } + }, + "ingredients_pl": { + "imgid": "92", + "rev": "400", + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "200": { + "h": 106, + "w": 200 + }, + "400": { + "h": 213, + "w": 400 + }, + "full": { + "h": 1549, + "w": 2911 + } + } + }, + "ingredients_sv": { + "coordinates_image_size": "400", + "imgid": "51", + "rev": "197", + "sizes": { + "100": { + "h": 53, + "w": 100 + }, + "200": { + "h": 106, + "w": 200 + }, + "400": { + "h": 212, + "w": 400 + }, + "full": { + "h": 775, + "w": 1464 + } + }, + "x1": 1454, + "x2": 2918, + "y1": 39, + "y2": 814 + }, + "nutrition_de": { + "imgid": "82", + "rev": "345", + "sizes": { + "100": { + "h": 100, + "w": 89 + }, + "200": { + "h": 200, + "w": 177 + }, + "400": { + "h": 400, + "w": 354 + }, + "full": { + "h": 1362, + "w": 1207 + } + } + }, + "nutrition_en": { + "imgid": 113, + "rev": 546, + "sizes": { + "100": { + "h": 64, + "w": 100 + }, + "200": { + "h": 128, + "w": 200 + }, + "400": { + "h": 256, + "w": 400 + }, + "full": { + "h": 753, + "w": 1176 + } + } + }, + "nutrition_es": { + "imgid": "52", + "rev": "180", + "sizes": { + "100": { + "h": 48, + "w": 100 + }, + "200": { + "h": 97, + "w": 200 + }, + "400": { + "h": 193, + "w": 400 + }, + "full": { + "h": 1416, + "w": 2931 + } + } + }, + "nutrition_fi": { + "coordinates_image_size": "full", + "imgid": "97", + "rev": "446", + "sizes": { + "100": { + "h": 54, + "w": 100 + }, + "200": { + "h": 109, + "w": 200 + }, + "400": { + "h": 218, + "w": 400 + }, + "full": { + "h": 1647, + "w": 3024 + } + }, + "x1": -1, + "x2": 3024, + "y1": -1, + "y2": 1647 + }, + "nutrition_fr": { + "imgid": "101", + "rev": "462", + "sizes": { + "100": { + "h": 100, + "w": 46 + }, + "200": { + "h": 200, + "w": 93 + }, + "400": { + "h": 400, + "w": 185 + }, + "full": { + "h": 1280, + "w": 592 + } + } + }, + "nutrition_it": { + "imgid": "95", + "rev": "421", + "sizes": { + "100": { + "h": 100, + "w": 90 + }, + "200": { + "h": 200, + "w": 179 + }, + "400": { + "h": 400, + "w": 359 + }, + "full": { + "h": 1910, + "w": 1712 + } + } + }, + "nutrition_ja": { + "imgid": 108, + "rev": 499, + "sizes": { + "100": { + "h": 100, + "w": 78 + }, + "200": { + "h": 200, + "w": 155 + }, + "400": { + "h": 400, + "w": 310 + }, + "full": { + "h": 1794, + "w": 1391 + } + } + }, + "nutrition_nb": { + "imgid": "97", + "rev": "441", + "sizes": { + "100": { + "h": 54, + "w": 100 + }, + "200": { + "h": 109, + "w": 200 + }, + "400": { + "h": 218, + "w": 400 + }, + "full": { + "h": 1647, + "w": 3024 + } + } + }, + "nutrition_sv": { + "imgid": "52", + "rev": "201", + "sizes": { + "100": { + "h": 48, + "w": 100 + }, + "200": { + "h": 97, + "w": 200 + }, + "400": { + "h": 193, + "w": 400 + }, + "full": { + "h": 1416, + "w": 2931 + } + } + }, + "packaging_de": { + "imgid": "83", + "rev": "347", + "sizes": { + "100": { + "h": 87, + "w": 100 + }, + "200": { + "h": 175, + "w": 200 + }, + "400": { + "h": 349, + "w": 400 + }, + "full": { + "h": 532, + "w": 609 + } + } + }, + "packaging_en": { + "coordinates_image_size": "full", + "imgid": "83", + "normalize": "true", + "rev": 531, + "sizes": { + "100": { + "h": 88, + "w": 100 + }, + "200": { + "h": 177, + "w": 200 + }, + "400": { + "h": 313, + "w": 354 + }, + "full": { + "h": 313, + "w": 354 + } + }, + "white_magic": "true", + "x1": 121, + "x2": 475, + "y1": 97, + "y2": 410 + }, + "packaging_fi": { + "coordinates_image_size": "full", + "imgid": "99", + "rev": "447", + "sizes": { + "100": { + "h": 80, + "w": 100 + }, + "200": { + "h": 161, + "w": 200 + }, + "400": { + "h": 321, + "w": 400 + }, + "full": { + "h": 597, + "w": 743 + } + }, + "x1": -1, + "x2": 743, + "y1": -1, + "y2": 597 + }, + "packaging_fr": { + "coordinates_image_size": "full", + "imgid": "74", + "rev": "379", + "sizes": { + "100": { + "h": 41, + "w": 100 + }, + "200": { + "h": 83, + "w": 200 + }, + "400": { + "h": 143, + "w": 346 + }, + "full": { + "h": 143, + "w": 346 + } + }, + "x1": 74, + "x2": 420, + "y1": 85, + "y2": 228 + }, + "packaging_it": { + "imgid": "96", + "rev": "423", + "sizes": { + "100": { + "h": 42, + "w": 100 + }, + "200": { + "h": 85, + "w": 200 + }, + "400": { + "h": 170, + "w": 400 + }, + "full": { + "h": 983, + "w": 2316 + } + } + } + }, + "informers": [], + "informers_tags": [ + "openfoodfacts-contributors", + "javichu", + "tacite", + "standardanalysis", + "kiliweb", + "solveig-yuka", + "yuka.U2F3TFNaUXFyOHNLc01JUDNULzYzOXhiK2JINUJYKytMTklOSWc9PQ", + "yukafix", + "fgouget", + "foodrepo", + "marmotte73", + "tylili23", + "vaiton", + "zixianglim", + "jumati", + "ariesmars", + "dahlqvist", + "nur", + "thaialagata", + "inf", + "tolgato", + "franzmari", + "quentinbrd", + "taiko", + "angelbcn", + "kjr", + "predatorix", + "macrofactor", + "chevalstar", + "alia", + "fms08", + "moon-rabbit", + "oliwua", + "doodledoo", + "jimmix", + "ompopo", + "boterman76", + "municorn-calorie-counter-app", + "andrey-arhangel", + "thejerem76", + "graistergarden", + "foodless", + "odinh" + ], + "ingredients": [ + { + "ciqual_proxy_food_code": "16030", + "id": "en:cocoa-paste", + "is_in_taxonomy": 1, + "percent_estimate": 62.5, + "percent_max": 100, + "percent_min": 25, + "text": "Cocoa mass", + "vegan": "yes", + "vegetarian": "yes" + }, + { + "ciqual_food_code": "16030", + "id": "en:cocoa-butter", + "is_in_taxonomy": 1, + "percent_estimate": 18.75, + "percent_max": 50, + "percent_min": 0, + "text": "cocoa butter", + "vegan": "yes", + "vegetarian": "yes" + }, + { + "ciqual_food_code": "18100", + "id": "en:fat-reduced-cocoa-powder", + "is_in_taxonomy": 1, + "percent_estimate": 9.375, + "percent_max": 33.3333333333333, + "percent_min": 0, + "text": "low fat cocoa powder", + "vegan": "yes", + "vegetarian": "yes" + }, + { + "ciqual_proxy_food_code": "31016", + "ecobalyse_code": "8f075c25-9ebf-430c-b41d-51d165c6e0d8", + "id": "en:sugar", + "is_in_taxonomy": 1, + "percent_estimate": 9.375, + "percent_max": 4, + "percent_min": 0, + "text": "sugar", + "vegan": "maybe", + "vegetarian": "yes" + } + ], + "ingredients_analysis": { + "en:maybe-vegan": [ + "en:sugar" + ] + }, + "ingredients_analysis_tags": [ + "en:palm-oil-free", + "en:maybe-vegan", + "en:vegetarian" + ], + "ingredients_debug": [ + "Pâte de cacao", + ",", + null, + null, + null, + " beurre de cacao", + ",", + null, + null, + null, + " cacao maige", + ",", + null, + null, + null, + " sucre", + ",", + null, + null, + null, + " vanille", + ". ", + null, + null, + null, + "Cacao", + ":", + ":", + null, + null, + " 90% minimum." + ], + "ingredients_from_or_that_may_be_from_palm_oil_n": 0, + "ingredients_from_palm_oil_n": 0, + "ingredients_from_palm_oil_tags": [], + "ingredients_hierarchy": [ + "en:cocoa-paste", + "en:plant", + "en:cocoa", + "en:cocoa-butter", + "en:fat-reduced-cocoa-powder", + "en:cocoa-powder", + "en:sugar", + "en:added-sugar", + "en:disaccharide" + ], + "ingredients_ids_debug": [ + "pate-de-cacao", + "beurre-de-cacao", + "cacao-maige", + "sucre", + "vanille", + "cacao", + "90-minimum" + ], + "ingredients_lc": "en", + "ingredients_n": 4, + "ingredients_n_tags": [ + "4", + "1-10" + ], + "ingredients_non_nutritive_sweeteners_n": 0, + "ingredients_original_tags": [ + "en:cocoa-paste", + "en:cocoa-butter", + "en:fat-reduced-cocoa-powder", + "en:sugar" + ], + "ingredients_percent_analysis": 1, + "ingredients_sweeteners_n": 0, + "ingredients_tags": [ + "en:cocoa-paste", + "en:plant", + "en:cocoa", + "en:cocoa-butter", + "en:fat-reduced-cocoa-powder", + "en:cocoa-powder", + "en:sugar", + "en:added-sugar", + "en:disaccharide" + ], + "ingredients_text": "Cocoa mass, cocoa butter, low fat cocoa powder, sugar. May contain hazelnuts,", + "ingredients_text_de": "Kakaomasse, Kakaobutter, fettarmes Kakaopulver, Zucker", + "ingredients_text_debug": "Pâte de cacao, beurre de cacao, cacao maige, sucre, vanille. Cacao: 90% minimum.", + "ingredients_text_en": "Cocoa mass, cocoa butter, low fat cocoa powder, sugar. May contain hazelnuts,", + "ingredients_text_es": "Pasta de cacao, manteca de cacao, cacao magro en polvo, azúcar, vainilla.", + "ingredients_text_fi": "kaakaomassa, kaakaovoi, vähärasvainen kaakaojauhe, sokeri, vanilja. Saattaa sisältää hasselpähkinää, muita pähkinöitä, maitoa, soijaa. Tummassa suklaassa kaakaota vähintään 90%.", + "ingredients_text_fr": "Pâte de cacao, beurre de cacao, cacao maigre, sucre, vanille.", + "ingredients_text_it": "Pasta di cacao, burro di cacao, cacao magro in polvere, zucchero. Può contenere nocciole, mandorle, altra frutta a guscio, latte, soia.", + "ingredients_text_ja": "", + "ingredients_text_nb": "", + "ingredients_text_nl": "Cacaomassa, cacaoboter, magere cacaopoeder, suiker.", + "ingredients_text_pl": "", + "ingredients_text_sv": "kakaomassa, kakaosmör, fettreducerat kakaopulver, socker, vanilj.", + "ingredients_text_with_allergens": "Cocoa mass, cocoa butter, low fat cocoa powder, sugar. May contain hazelnuts,", + "ingredients_text_with_allergens_de": "Kakaomasse, Kakaobutter, fettarmes Kakaopulver, Zucker", + "ingredients_text_with_allergens_en": "Cocoa mass, cocoa butter, low fat cocoa powder, sugar. May contain hazelnuts,", + "ingredients_text_with_allergens_es": "Pasta de cacao, manteca de cacao, cacao magro en polvo, azúcar, vainilla.", + "ingredients_text_with_allergens_fi": "kaakaomassa, kaakaovoi, vähärasvainen kaakaojauhe, sokeri, vanilja. Saattaa sisältää hasselpähkinää, muita pähkinöitä, maitoa, soijaa. Tummassa suklaassa kaakaota vähintään 90%.", + "ingredients_text_with_allergens_fr": "Pâte de cacao, beurre de cacao, cacao maigre, sucre, vanille.", + "ingredients_text_with_allergens_it": "Pasta di cacao, burro di cacao, cacao magro in polvere, zucchero. Può contenere nocciole, mandorle, altra frutta a guscio, latte, soia.", + "ingredients_text_with_allergens_ja": "", + "ingredients_text_with_allergens_nb": "", + "ingredients_text_with_allergens_nl": "Cacaomassa, cacaoboter, magere cacaopoeder, suiker.", + "ingredients_text_with_allergens_pl": "", + "ingredients_text_with_allergens_sv": "kakaomassa, kakaosmör, fettreducerat kakaopulver, socker, vanilj.", + "ingredients_that_may_be_from_palm_oil_n": 0, + "ingredients_that_may_be_from_palm_oil_tags": [], + "ingredients_with_specified_percent_n": 0, + "ingredients_with_specified_percent_sum": 0, + "ingredients_with_unspecified_percent_n": 4, + "ingredients_with_unspecified_percent_sum": 100.0, + "ingredients_without_ciqual_codes": [], + "ingredients_without_ciqual_codes_n": 0, + "ingredients_without_ecobalyse_ids": [ + "en:cocoa-butter", + "en:cocoa-paste", + "en:fat-reduced-cocoa-powder" + ], + "ingredients_without_ecobalyse_ids_n": 3, + "interface_version_created": "20120622", + "interface_version_modified": "20150316.jqm2", + "known_ingredients_n": 4, + "labels": "Green Dot, Triman", + "labels_hierarchy": [ + "en:green-dot", + "fr:triman" + ], + "labels_lc": "en", + "labels_tags": [ + "en:green-dot", + "fr:triman" + ], + "lang": "en", + "languages": { + "en:bokmal": 3, + "en:dutch": 1, + "en:english": 7, + "en:finnish": 7, + "en:french": 7, + "en:german": 7, + "en:italian": 8, + "en:japanese": 2, + "en:polish": 1, + "en:spanish": 6, + "en:swedish": 5 + }, + "languages_codes": { + "de": 7, + "en": 7, + "es": 6, + "fi": 7, + "fr": 7, + "it": 8, + "ja": 2, + "nb": 3, + "nl": 1, + "pl": 1, + "sv": 5 + }, + "languages_hierarchy": [ + "en:bokmal", + "en:dutch", + "en:english", + "en:finnish", + "en:french", + "en:german", + "en:italian", + "en:japanese", + "en:polish", + "en:spanish", + "en:swedish" + ], + "languages_tags": [ + "en:bokmal", + "en:dutch", + "en:english", + "en:finnish", + "en:french", + "en:german", + "en:italian", + "en:japanese", + "en:polish", + "en:spanish", + "en:swedish", + "en:11", + "en:multilingual" + ], + "last_edit_dates_tags": [ + "2026-05-02", + "2026-05", + "2026" + ], + "last_editor": "macrofactor", + "last_image_dates_tags": [ + "2026-05-02", + "2026-05", + "2026" + ], + "last_image_t": 1777741927, + "last_modified_by": "macrofactor", + "last_modified_t": 1777741933, + "last_updated_t": 1777741933, + "lc": "en", + "link": "http://www.lindt.es/swf/spa/productos/excellence/altos-porcentajes/excellence-90/www.lindt.com", + "main_countries_tags": [], + "manufacturing_places": "Aachen", + "manufacturing_places_hierarchy": [ + "Aachen" + ], + "manufacturing_places_lc": "en", + "manufacturing_places_tags": [ + "Aachen" + ], + "max_imgid": 113, + "minerals_prev_tags": [], + "minerals_tags": [], + "misc_tags": [ + "en:environmental-score-changed", + "en:environmental-score-computed", + "en:environmental-score-missing-data-labels", + "en:environmental-score-missing-data-origins", + "en:environmental-score-missing-data-warning", + "en:nutrients-estimated-from-ingredients", + "en:nutriscore-2021-d-2023-d", + "en:nutriscore-2021-same-as-2023", + "en:nutriscore-computed", + "en:nutrition-all-nutriscore-values-known", + "en:nutrition-data-per-100g", + "en:nutrition-data-per-serving", + "en:nutrition-fruits-vegetables-legumes-estimate-from-ingredients", + "en:nutrition-fruits-vegetables-nuts-estimate-from-ingredients", + "en:packagings-complete", + "en:packagings-not-empty", + "en:packagings-number-of-components-2", + "en:packagings-with-all-weights", + "en:packagings-with-all-weights-complete", + "en:packagings-with-weights", + "en:main-countries-bg-unexpectedly-low-scans", + "en:main-countries-bg-unexpectedly-low-scans-10-20-percent-of-expected", + "en:main-countries-bg-unexpectedly-low-scans-and-no-data-in-country-language", + "en:main-countries-bg-product-name-not-in-country-language", + "en:main-countries-bg-ingredients-not-in-country-language", + "en:main-countries-bg-no-data-in-country-language", + "en:main-countries-ca-unexpectedly-low-scans", + "en:main-countries-ca-unexpectedly-low-scans-0-10-percent-of-expected", + "en:main-countries-cz-product-name-not-in-country-language", + "en:main-countries-cz-ingredients-not-in-country-language", + "en:main-countries-cz-no-data-in-country-language", + "en:main-countries-mc-unexpectedly-low-scans", + "en:main-countries-mc-unexpectedly-low-scans-0-10-percent-of-expected", + "en:main-countries-nl-product-name-not-in-country-language", + "en:main-countries-nl-only-1-field-in-country-language", + "en:main-countries-no-product-name-not-in-country-language", + "en:main-countries-no-ingredients-not-in-country-language", + "en:main-countries-no-no-data-in-country-language", + "en:main-countries-pl-product-name-not-in-country-language", + "en:main-countries-pl-ingredients-not-in-country-language", + "en:main-countries-pl-no-data-in-country-language", + "en:main-countries-pt-product-name-not-in-country-language", + "en:main-countries-pt-ingredients-not-in-country-language", + "en:main-countries-pt-no-data-in-country-language", + "en:main-countries-ro-product-name-not-in-country-language", + "en:main-countries-ro-ingredients-not-in-country-language", + "en:main-countries-ro-no-data-in-country-language", + "en:main-countries-sg-unexpectedly-low-scans", + "en:main-countries-sg-unexpectedly-low-scans-0-10-percent-of-expected", + "en:main-countries-ch-unexpectedly-low-scans", + "en:main-countries-ch-unexpectedly-low-scans-20-30-percent-of-expected", + "en:main-countries-tn-product-name-not-in-country-language", + "en:main-countries-tn-ingredients-not-in-country-language", + "en:main-countries-tn-no-data-in-country-language", + "en:main-countries-uk-unexpectedly-low-scans", + "en:main-countries-uk-unexpectedly-low-scans-0-10-percent-of-expected" + ], + "nova_group": 3, + "nova_group_debug": "", + "nova_groups": "3", + "nova_groups_markers": { + "3": [ + [ + "categories", + "en:chocolates" + ], + [ + "ingredients", + "en:sugar" + ], + [ + "categories", + "en:sweet-snacks" + ] + ] + }, + "nova_groups_tags": [ + "en:3-processed-foods" + ], + "nucleotides_prev_tags": [], + "nucleotides_tags": [], + "nutrient_levels": { + "fat": "high", + "salt": "low", + "saturated-fat": "high", + "sugars": "low" + }, + "nutrient_levels_tags": [ + "en:fat-in-high-quantity", + "en:saturated-fat-in-high-quantity", + "en:sugars-in-low-quantity", + "en:salt-in-low-quantity" + ], + "nutriments": { + "added-sugars": 0.4, + "added-sugars_100g": 0.4, + "added-sugars_serving": 0.04, + "added-sugars_unit": "g", + "added-sugars_value": 0.4, + "caffeine": 0.0051, + "caffeine_100g": 0.0051, + "caffeine_serving": 0.00051, + "caffeine_unit": "g", + "caffeine_value": 0.0051, + "calcium": 0.004, + "calcium_100g": 0.004, + "calcium_serving": 0.0004, + "calcium_unit": "g", + "calcium_value": 0.004, + "carbohydrates": 14, + "carbohydrates_100g": 14, + "carbohydrates_serving": 1.4, + "carbohydrates_unit": "g", + "carbohydrates_value": 14, + "choline": 0, + "choline_100g": 0, + "choline_serving": 0, + "choline_unit": "g", + "choline_value": 0, + "cocoa": 90, + "cocoa_100g": 90, + "cocoa_serving": 90, + "cocoa_unit": "%", + "cocoa_value": 90, + "copper": 0.00011, + "copper_100g": 0.00011, + "copper_serving": 1.1e-05, + "copper_unit": "g", + "copper_value": 0.00011, + "energy": 2443, + "energy-kcal": 592, + "energy-kcal_100g": 592, + "energy-kcal_serving": 59.2, + "energy-kcal_unit": "kcal", + "energy-kcal_value": 592, + "energy-kj": 2443, + "energy-kj_100g": 2443, + "energy-kj_modifier": "~", + "energy-kj_serving": 244, + "energy-kj_unit": "kJ", + "energy-kj_value": 2443, + "energy_100g": 2443, + "energy_modifier": "~", + "energy_serving": 244, + "energy_unit": "kJ", + "energy_value": 2443, + "fat": 55, + "fat_100g": 55, + "fat_serving": 5.5, + "fat_unit": "g", + "fat_value": 55, + "fiber": 0, + "fiber_100g": 0, + "fiber_serving": 0, + "fiber_unit": "g", + "fiber_value": 0, + "fruits-vegetables-legumes-estimate-from-ingredients_100g": 0, + "fruits-vegetables-nuts-estimate-from-ingredients_100g": 0, + "iron": 0, + "iron_100g": 0, + "iron_serving": 0, + "iron_unit": "g", + "iron_value": 0, + "magnesium": 0, + "magnesium_100g": 0, + "magnesium_serving": 0, + "magnesium_unit": "g", + "magnesium_value": 0, + "manganese": 0.00012, + "manganese_100g": 0.00012, + "manganese_serving": 1.2e-05, + "manganese_unit": "g", + "manganese_value": 0.00012, + "monounsaturated-fat": 1.2, + "monounsaturated-fat_100g": 1.2, + "monounsaturated-fat_serving": 0.12, + "monounsaturated-fat_unit": "g", + "monounsaturated-fat_value": 1.2, + "nova-group": 3, + "nova-group_100g": 3, + "nova-group_serving": 3, + "nova-group_unit": "", + "nova-group_value": 3, + "omega-6-fat": 0.1, + "omega-6-fat_100g": 0.1, + "omega-6-fat_serving": 0.01, + "omega-6-fat_unit": "g", + "omega-6-fat_value": 0.1, + "polyunsaturated-fat": 0.1, + "polyunsaturated-fat_100g": 0.1, + "polyunsaturated-fat_serving": 0.01, + "polyunsaturated-fat_unit": "g", + "polyunsaturated-fat_value": 0.1, + "potassium": 0.077, + "potassium_100g": 0.077, + "potassium_serving": 0.0077, + "potassium_unit": "g", + "potassium_value": 0.077, + "proteins": 10, + "proteins_100g": 10, + "proteins_serving": 1, + "proteins_unit": "g", + "proteins_value": 10, + "salt": 0.03, + "salt_100g": 0.03, + "salt_serving": 0.003, + "salt_unit": "g", + "salt_value": 0.03, + "saturated-fat": 30, + "saturated-fat_100g": 30, + "saturated-fat_serving": 3, + "saturated-fat_unit": "g", + "saturated-fat_value": 30, + "selenium": 0, + "selenium_100g": 0, + "selenium_serving": 0, + "selenium_unit": "g", + "selenium_value": 0.0, + "sodium": 0.012, + "sodium_100g": 0.012, + "sodium_serving": 0.0012, + "sodium_unit": "g", + "sodium_value": 0.012, + "starch": 0, + "starch_100g": 0, + "starch_serving": 0, + "starch_unit": "g", + "starch_value": 0, + "sugars": 4, + "sugars_100g": 4, + "sugars_serving": 0.4, + "sugars_unit": "g", + "sugars_value": 4, + "vitamin-b1": 0, + "vitamin-b1_100g": 0, + "vitamin-b1_serving": 0, + "vitamin-b1_unit": "g", + "vitamin-b1_value": 0.0, + "vitamin-b2": 1e-05, + "vitamin-b2_100g": 1e-05, + "vitamin-b2_serving": 1e-06, + "vitamin-b2_unit": "g", + "vitamin-b2_value": 1e-05, + "vitamin-b6": 0, + "vitamin-b6_100g": 0, + "vitamin-b6_serving": 0, + "vitamin-b6_unit": "g", + "vitamin-b6_value": 0.0, + "vitamin-c": 0, + "vitamin-c_100g": 0, + "vitamin-c_serving": 0, + "vitamin-c_unit": "g", + "vitamin-c_value": 0.0, + "vitamin-d": 0, + "vitamin-d_100g": 0, + "vitamin-d_serving": 0, + "vitamin-d_unit": "g", + "vitamin-d_value": 0.0, + "vitamin-e": 0, + "vitamin-e_100g": 0, + "vitamin-e_serving": 0, + "vitamin-e_unit": "g", + "vitamin-e_value": 0.0, + "vitamin-k": 0, + "vitamin-k_100g": 0, + "vitamin-k_serving": 0, + "vitamin-k_unit": "g", + "vitamin-k_value": 0.0, + "zinc": 0.0002, + "zinc_100g": 0.0002, + "zinc_serving": 2e-05, + "zinc_unit": "g", + "zinc_value": 0.0002 + }, + "nutriments_estimated": { + "alcohol_100g": 0, + "beta-carotene_100g": 2.34375e-07, + "cholesterol_100g": 0, + "fructose_100g": 0.009375, + "galactose_100g": 0, + "glucose_100g": 0.009375, + "iodine_100g": 9.65625e-07, + "lactose_100g": 0.009375, + "maltose_100g": 0.009375, + "pantothenic-acid_100g": 7.6875e-05, + "phosphorus_100g": 0.0646875, + "phylloquinone_100g": 3.65625e-07, + "polyols_100g": 0.0234375, + "sucrose_100g": 9.440625, + "vitamin-a_100g": 0, + "vitamin-b12_100g": 0, + "vitamin-b9_100g": 1.003125e-05, + "vitamin-pp_100g": 0.0001078125, + "water_100g": 0.3440625 + }, + "nutriscore": { + "2021": { + "category_available": 1, + "data": { + "energy": 2443, + "energy_points": 7, + "energy_value": 2443, + "fiber": 0, + "fiber_points": 0, + "fiber_value": 0, + "fruits_vegetables_nuts_colza_walnut_olive_oils": 0, + "fruits_vegetables_nuts_colza_walnut_olive_oils_points": 0, + "fruits_vegetables_nuts_colza_walnut_olive_oils_value": 0, + "is_beverage": 0, + "is_cheese": 0, + "is_fat": 0, + "is_water": 0, + "negative_points": 17, + "positive_points": 0, + "proteins": 10, + "proteins_points": 5, + "proteins_value": 10, + "saturated_fat": 30, + "saturated_fat_points": 10, + "saturated_fat_value": 30, + "sodium": 12, + "sodium_points": 0, + "sodium_value": 12, + "sugars": 4, + "sugars_points": 0, + "sugars_value": 4 + }, + "estimated": 0, + "grade": "d", + "nutrients_available": 1, + "nutriscore_applicable": 1, + "nutriscore_computed": 1, + "preparation": "as_sold", + "score": 17 + }, + "2023": { + "category_available": 1, + "data": { + "components": { + "negative": [ + { + "id": "energy", + "points": 7, + "points_max": 10, + "unit": "kJ", + "value": 2443 + }, + { + "id": "sugars", + "points": 1, + "points_max": 15, + "unit": "g", + "value": 4 + }, + { + "id": "saturated_fat", + "points": 10, + "points_max": 10, + "unit": "g", + "value": 30 + }, + { + "id": "salt", + "points": 0, + "points_max": 20, + "unit": "g", + "value": 0.03 + } + ], + "positive": [ + { + "id": "fiber", + "points": 0, + "points_max": 5, + "unit": "g", + "value": 0 + }, + { + "id": "fruits_vegetables_legumes", + "points": 0, + "points_max": 5, + "unit": "%", + "value": 0 + } + ] + }, + "count_proteins": 0, + "count_proteins_reason": "negative_points_greater_than_or_equal_to_11", + "is_beverage": 0, + "is_cheese": 0, + "is_fat_oil_nuts_seeds": 0, + "is_red_meat_product": 0, + "is_water": 0, + "negative_points": 18, + "negative_points_max": 55, + "positive_nutrients": [ + "fiber", + "fruits_vegetables_legumes" + ], + "positive_points": 0, + "positive_points_max": 10 + }, + "estimated": 0, + "grade": "d", + "nutrients_available": 1, + "nutriscore_applicable": 1, + "nutriscore_computed": 1, + "preparation": "as_sold", + "score": 18 + } + }, + "nutriscore_2021_tags": [ + "d" + ], + "nutriscore_2023_tags": [ + "d" + ], + "nutriscore_data": { + "components": { + "negative": [ + { + "id": "energy", + "points": 7, + "points_max": 10, + "unit": "kJ", + "value": 2443 + }, + { + "id": "sugars", + "points": 1, + "points_max": 15, + "unit": "g", + "value": 4 + }, + { + "id": "saturated_fat", + "points": 10, + "points_max": 10, + "unit": "g", + "value": 30 + }, + { + "id": "salt", + "points": 0, + "points_max": 20, + "unit": "g", + "value": 0.03 + } + ], + "positive": [ + { + "id": "fiber", + "points": 0, + "points_max": 5, + "unit": "g", + "value": 0 + }, + { + "id": "fruits_vegetables_legumes", + "points": 0, + "points_max": 5, + "unit": "%", + "value": 0 + } + ] + }, + "count_proteins": 0, + "count_proteins_reason": "negative_points_greater_than_or_equal_to_11", + "grade": "d", + "is_beverage": 0, + "is_cheese": 0, + "is_fat_oil_nuts_seeds": 0, + "is_red_meat_product": 0, + "is_water": 0, + "negative_points": 18, + "negative_points_max": 55, + "positive_nutrients": [ + "fiber", + "fruits_vegetables_legumes" + ], + "positive_points": 0, + "positive_points_max": 10, + "score": 18 + }, + "nutriscore_grade": "d", + "nutriscore_score": 18, + "nutriscore_score_opposite": -18, + "nutriscore_tags": [ + "d" + ], + "nutriscore_version": "2023", + "nutrition_data": "on", + "nutrition_data_per": "100g", + "nutrition_data_prepared_per": "100g", + "nutrition_grade_fr": "d", + "nutrition_grades": "d", + "nutrition_grades_tags": [ + "d" + ], + "nutrition_score_beverage": 0, + "nutrition_score_debug": "", + "nutrition_score_warning_fruits_vegetables_legumes_estimate_from_ingredients": 1, + "nutrition_score_warning_fruits_vegetables_legumes_estimate_from_ingredients_value": 0, + "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients": 1, + "nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value": 0, + "obsolete": "", + "obsolete_since_date": "", + "origin": "", + "origin_de": "", + "origin_en": "", + "origin_es": "", + "origin_fi": "", + "origin_fr": "Fabriqué par: Aachen Allemagne", + "origin_it": "", + "origin_ja": "", + "origin_nb": "", + "origin_nl": "", + "origin_pl": "", + "origin_sv": "", + "origins": "", + "origins_hierarchy": [], + "origins_lc": "en", + "origins_tags": [], + "other_nutritional_substances_prev_tags": [], + "other_nutritional_substances_tags": [], + "packaging": "en:Aluminium wrap,en:Box cardboard,en:Caja de cartón,en:Card-box,en:Foil-wrapper,es:Recipiente,pt:Papel de aluminio,Étui carton,Feuille aluminium", + "packaging_hierarchy": [ + "en:Aluminium wrap", + "en:Box cardboard", + "en:Caja de cartón", + "en:Card-box", + "en:Foil-wrapper", + "es:Recipiente", + "fr:Feuille aluminium", + "fr:Étui carton", + "pt:Papel de aluminio" + ], + "packaging_lc": "fr", + "packaging_materials_tags": [ + "en:aluminium", + "en:cardboard" + ], + "packaging_old": "Cardboard, Container, Packaging, Paperboard, Aluminium wrap, Caja de cartón, Box cardboard, Card-box, Foil-wrapper, pt:Papel de aluminio", + "packaging_old_before_taxonomization": "Papel de aluminio,Caja de cartón,Carton,Karton,emballage,box cardboard,Aluminium wrap, en:card-box, en:foil-wrapper", + "packaging_recycling_tags": [ + "en:recycle-in-sorting-bin" + ], + "packaging_shapes_tags": [ + "en:sheet", + "en:sleeve" + ], + "packaging_tags": [ + "en:aluminium-wrap", + "en:box-cardboard", + "en:caja-de-carton", + "en:card-box", + "en:foil-wrapper", + "es:recipiente", + "fr:feuille-aluminium", + "fr:etui-carton", + "pt:papel-de-aluminio" + ], + "packaging_text": "", + "packaging_text_de": "", + "packaging_text_en": "", + "packaging_text_es": "", + "packaging_text_fi": "", + "packaging_text_fr": "", + "packaging_text_it": "Incarto esterno in carta da riciclare, Incarto interno in alluminio da riciclare.", + "packaging_text_ja": "", + "packaging_text_nb": "", + "packaging_text_nl": "", + "packaging_text_pl": "", + "packaging_text_sv": "", + "packagings": [ + { + "food_contact": 1, + "material": { + "id": "en:aluminium" + }, + "number_of_units": 1, + "quantity_per_unit": "100 g", + "quantity_per_unit_unit": "g", + "quantity_per_unit_value": 100, + "recycling": { + "id": "en:recycle-in-sorting-bin" + }, + "shape": { + "id": "en:sheet" + }, + "weight_measured": 1.2 + }, + { + "material": { + "id": "en:cardboard" + }, + "number_of_units": 1, + "quantity_per_unit": "100 g", + "quantity_per_unit_unit": "g", + "quantity_per_unit_value": 100, + "recycling": { + "id": "en:recycle-in-sorting-bin" + }, + "shape": { + "id": "en:sleeve" + }, + "weight_measured": 10.2 + } + ], + "packagings_complete": 1, + "packagings_materials": { + "all": { + "weight": 11.4, + "weight_100g": 11.4, + "weight_percent": 100 + }, + "en:metal": { + "weight": 1.2, + "weight_100g": 1.2, + "weight_percent": 10.5263157894737 + }, + "en:paper-or-cardboard": { + "weight": 10.2, + "weight_100g": 10.2, + "weight_percent": 89.4736842105263 + } + }, + "packagings_materials_main": "en:paper-or-cardboard", + "packagings_n": 2, + "photographers": [], + "photographers_tags": [ + "openfoodfacts-contributors", + "javichu", + "kyzh", + "bcatelin", + "standardanalysis", + "keragui", + "kiliweb", + "ccrdz", + "foodrepo", + "tylili23", + "jumati", + "ariesmars", + "zipotlan", + "thaialagata", + "franzmari", + "foodvisor", + "maciej-lawniczak", + "mvainola", + "marmotte73", + "smoothie-app", + "jo23", + "insectproductadd", + "predatorix", + "skuma", + "macrofactor", + "foodless", + "fms08", + "oliwua", + "jimmix", + "ompopo", + "municorn-calorie-counter-app", + "graistergarden", + "igweni" + ], + "pnns_groups_1": "Sugary snacks", + "pnns_groups_1_tags": [ + "sugary-snacks", + "known" + ], + "pnns_groups_2": "Chocolate products", + "pnns_groups_2_tags": [ + "chocolate-products", + "known" + ], + "popularity_key": 24999951205, + "popularity_tags": [ + "top-500-scans-2019", + "top-1000-scans-2019", + "top-5000-scans-2019", + "top-10000-scans-2019", + "top-50000-scans-2019", + "top-100000-scans-2019", + "at-least-5-scans-2019", + "at-least-10-scans-2019", + "top-75-percent-scans-2019", + "top-80-percent-scans-2019", + "top-85-percent-scans-2019", + "top-90-percent-scans-2019", + "top-500-fr-scans-2019", + "top-1000-fr-scans-2019", + "top-5000-fr-scans-2019", + "top-10000-fr-scans-2019", + "top-50000-fr-scans-2019", + "top-100000-fr-scans-2019", + "top-country-fr-scans-2019", + "at-least-5-fr-scans-2019", + "at-least-10-fr-scans-2019", + "top-500-es-scans-2019", + "top-1000-es-scans-2019", + "top-5000-es-scans-2019", + "top-10000-es-scans-2019", + "top-50000-es-scans-2019", + "top-100000-es-scans-2019", + "at-least-5-es-scans-2019", + "at-least-10-es-scans-2019", + "top-500-ch-scans-2019", + "top-1000-ch-scans-2019", + "top-5000-ch-scans-2019", + "top-10000-ch-scans-2019", + "top-50000-ch-scans-2019", + "top-100000-ch-scans-2019", + "at-least-5-ch-scans-2019", + "at-least-10-ch-scans-2019", + "top-100-ma-scans-2019", + "top-500-ma-scans-2019", + "top-1000-ma-scans-2019", + "top-5000-ma-scans-2019", + "top-10000-ma-scans-2019", + "top-50000-ma-scans-2019", + "top-100000-ma-scans-2019", + "at-least-5-ma-scans-2019", + "at-least-10-ma-scans-2019", + "top-5000-de-scans-2019", + "top-10000-de-scans-2019", + "top-50000-de-scans-2019", + "top-100000-de-scans-2019", + "at-least-5-de-scans-2019", + "at-least-10-de-scans-2019", + "top-500-it-scans-2019", + "top-1000-it-scans-2019", + "top-5000-it-scans-2019", + "top-10000-it-scans-2019", + "top-50000-it-scans-2019", + "top-100000-it-scans-2019", + "at-least-5-it-scans-2019", + "at-least-10-it-scans-2019", + "top-5000-be-scans-2019", + "top-10000-be-scans-2019", + "top-50000-be-scans-2019", + "top-100000-be-scans-2019", + "at-least-5-be-scans-2019", + "top-100-gb-scans-2019", + "top-500-gb-scans-2019", + "top-1000-gb-scans-2019", + "top-5000-gb-scans-2019", + "top-10000-gb-scans-2019", + "top-50000-gb-scans-2019", + "top-100000-gb-scans-2019", + "at-least-5-gb-scans-2019", + "top-500-re-scans-2019", + "top-1000-re-scans-2019", + "top-5000-re-scans-2019", + "top-10000-re-scans-2019", + "top-50000-re-scans-2019", + "top-100000-re-scans-2019", + "at-least-5-re-scans-2019", + "top-500-mq-scans-2019", + "top-1000-mq-scans-2019", + "top-5000-mq-scans-2019", + "top-10000-mq-scans-2019", + "top-50000-mq-scans-2019", + "top-100000-mq-scans-2019", + "top-50-lb-scans-2019", + "top-100-lb-scans-2019", + "top-500-lb-scans-2019", + "top-1000-lb-scans-2019", + "top-5000-lb-scans-2019", + "top-10000-lb-scans-2019", + "top-50000-lb-scans-2019", + "top-100000-lb-scans-2019", + "top-10-iq-scans-2019", + "top-50-iq-scans-2019", + "top-100-iq-scans-2019", + "top-500-iq-scans-2019", + "top-1000-iq-scans-2019", + "top-5000-iq-scans-2019", + "top-10000-iq-scans-2019", + "top-50000-iq-scans-2019", + "top-100000-iq-scans-2019", + "top-500-nl-scans-2019", + "top-1000-nl-scans-2019", + "top-5000-nl-scans-2019", + "top-10000-nl-scans-2019", + "top-50000-nl-scans-2019", + "top-100000-nl-scans-2019", + "top-50-ae-scans-2019", + "top-100-ae-scans-2019", + "top-500-ae-scans-2019", + "top-1000-ae-scans-2019", + "top-5000-ae-scans-2019", + "top-10000-ae-scans-2019", + "top-50000-ae-scans-2019", + "top-100000-ae-scans-2019", + "top-5000-pt-scans-2019", + "top-10000-pt-scans-2019", + "top-50000-pt-scans-2019", + "top-100000-pt-scans-2019", + "top-100-jp-scans-2019", + "top-500-jp-scans-2019", + "top-1000-jp-scans-2019", + "top-5000-jp-scans-2019", + "top-10000-jp-scans-2019", + "top-50000-jp-scans-2019", + "top-100000-jp-scans-2019", + "top-100-sa-scans-2019", + "top-500-sa-scans-2019", + "top-1000-sa-scans-2019", + "top-5000-sa-scans-2019", + "top-10000-sa-scans-2019", + "top-50000-sa-scans-2019", + "top-100000-sa-scans-2019", + "top-500-pe-scans-2019", + "top-1000-pe-scans-2019", + "top-5000-pe-scans-2019", + "top-10000-pe-scans-2019", + "top-50000-pe-scans-2019", + "top-100000-pe-scans-2019", + "top-1000-us-scans-2019", + "top-5000-us-scans-2019", + "top-10000-us-scans-2019", + "top-50000-us-scans-2019", + "top-100000-us-scans-2019", + "top-5000-th-scans-2019", + "top-10000-th-scans-2019", + "top-50000-th-scans-2019", + "top-100000-th-scans-2019", + "top-500-hk-scans-2019", + "top-1000-hk-scans-2019", + "top-5000-hk-scans-2019", + "top-10000-hk-scans-2019", + "top-50000-hk-scans-2019", + "top-100000-hk-scans-2019", + "top-500-mu-scans-2019", + "top-1000-mu-scans-2019", + "top-5000-mu-scans-2019", + "top-10000-mu-scans-2019", + "top-50000-mu-scans-2019", + "top-100000-mu-scans-2019", + "top-500-sg-scans-2019", + "top-1000-sg-scans-2019", + "top-5000-sg-scans-2019", + "top-10000-sg-scans-2019", + "top-50000-sg-scans-2019", + "top-100000-sg-scans-2019", + "top-5000-gf-scans-2019", + "top-10000-gf-scans-2019", + "top-50000-gf-scans-2019", + "top-100000-gf-scans-2019", + "top-5000-at-scans-2019", + "top-10000-at-scans-2019", + "top-50000-at-scans-2019", + "top-100000-at-scans-2019", + "top-500-tn-scans-2019", + "top-1000-tn-scans-2019", + "top-5000-tn-scans-2019", + "top-10000-tn-scans-2019", + "top-50000-tn-scans-2019", + "top-100000-tn-scans-2019", + "top-1000-ie-scans-2019", + "top-5000-ie-scans-2019", + "top-10000-ie-scans-2019", + "top-50000-ie-scans-2019", + "top-100000-ie-scans-2019", + "top-500-fi-scans-2019", + "top-1000-fi-scans-2019", + "top-5000-fi-scans-2019", + "top-10000-fi-scans-2019", + "top-50000-fi-scans-2019", + "top-100000-fi-scans-2019", + "top-500-cz-scans-2019", + "top-1000-cz-scans-2019", + "top-5000-cz-scans-2019", + "top-10000-cz-scans-2019", + "top-50000-cz-scans-2019", + "top-100000-cz-scans-2019", + "top-10000-lu-scans-2019", + "top-50000-lu-scans-2019", + "top-100000-lu-scans-2019", + "top-5000-ad-scans-2019", + "top-10000-ad-scans-2019", + "top-50000-ad-scans-2019", + "top-100000-ad-scans-2019", + "top-500-eg-scans-2019", + "top-1000-eg-scans-2019", + "top-5000-eg-scans-2019", + "top-10000-eg-scans-2019", + "top-50000-eg-scans-2019", + "top-100000-eg-scans-2019", + "top-5000-gp-scans-2019", + "top-10000-gp-scans-2019", + "top-50000-gp-scans-2019", + "top-100000-gp-scans-2019", + "top-1000-dz-scans-2019", + "top-5000-dz-scans-2019", + "top-10000-dz-scans-2019", + "top-50000-dz-scans-2019", + "top-100000-dz-scans-2019", + "top-500-tg-scans-2019", + "top-1000-tg-scans-2019", + "top-5000-tg-scans-2019", + "top-10000-tg-scans-2019", + "top-50000-tg-scans-2019", + "top-100000-tg-scans-2019", + "top-100-scans-2020", + "top-500-scans-2020", + "top-1000-scans-2020", + "top-5000-scans-2020", + "top-10000-scans-2020", + "top-50000-scans-2020", + "top-100000-scans-2020", + "at-least-5-scans-2020", + "at-least-10-scans-2020", + "top-75-percent-scans-2020", + "top-80-percent-scans-2020", + "top-85-percent-scans-2020", + "top-90-percent-scans-2020", + "top-500-fr-scans-2020", + "top-1000-fr-scans-2020", + "top-5000-fr-scans-2020", + "top-10000-fr-scans-2020", + "top-50000-fr-scans-2020", + "top-100000-fr-scans-2020", + "top-country-fr-scans-2020", + "at-least-5-fr-scans-2020", + "at-least-10-fr-scans-2020", + "top-500-es-scans-2020", + "top-1000-es-scans-2020", + "top-5000-es-scans-2020", + "top-10000-es-scans-2020", + "top-50000-es-scans-2020", + "top-100000-es-scans-2020", + "at-least-5-es-scans-2020", + "at-least-10-es-scans-2020", + "top-500-de-scans-2020", + "top-1000-de-scans-2020", + "top-5000-de-scans-2020", + "top-10000-de-scans-2020", + "top-50000-de-scans-2020", + "top-100000-de-scans-2020", + "at-least-5-de-scans-2020", + "at-least-10-de-scans-2020", + "top-500-ch-scans-2020", + "top-1000-ch-scans-2020", + "top-5000-ch-scans-2020", + "top-10000-ch-scans-2020", + "top-50000-ch-scans-2020", + "top-100000-ch-scans-2020", + "at-least-5-ch-scans-2020", + "at-least-10-ch-scans-2020", + "top-100-it-scans-2020", + "top-500-it-scans-2020", + "top-1000-it-scans-2020", + "top-5000-it-scans-2020", + "top-10000-it-scans-2020", + "top-50000-it-scans-2020", + "top-100000-it-scans-2020", + "at-least-5-it-scans-2020", + "at-least-10-it-scans-2020", + "top-100-ma-scans-2020", + "top-500-ma-scans-2020", + "top-1000-ma-scans-2020", + "top-5000-ma-scans-2020", + "top-10000-ma-scans-2020", + "top-50000-ma-scans-2020", + "top-100000-ma-scans-2020", + "at-least-5-ma-scans-2020", + "at-least-10-ma-scans-2020", + "top-50-gb-scans-2020", + "top-100-gb-scans-2020", + "top-500-gb-scans-2020", + "top-1000-gb-scans-2020", + "top-5000-gb-scans-2020", + "top-10000-gb-scans-2020", + "top-50000-gb-scans-2020", + "top-100000-gb-scans-2020", + "at-least-5-gb-scans-2020", + "at-least-10-gb-scans-2020", + "top-100-dz-scans-2020", + "top-500-dz-scans-2020", + "top-1000-dz-scans-2020", + "top-5000-dz-scans-2020", + "top-10000-dz-scans-2020", + "top-50000-dz-scans-2020", + "top-100000-dz-scans-2020", + "at-least-5-dz-scans-2020", + "top-5000-be-scans-2020", + "top-10000-be-scans-2020", + "top-50000-be-scans-2020", + "top-100000-be-scans-2020", + "at-least-5-be-scans-2020", + "top-50-pf-scans-2020", + "top-100-pf-scans-2020", + "top-500-pf-scans-2020", + "top-1000-pf-scans-2020", + "top-5000-pf-scans-2020", + "top-10000-pf-scans-2020", + "top-50000-pf-scans-2020", + "top-100000-pf-scans-2020", + "at-least-5-pf-scans-2020", + "top-100-nl-scans-2020", + "top-500-nl-scans-2020", + "top-1000-nl-scans-2020", + "top-5000-nl-scans-2020", + "top-10000-nl-scans-2020", + "top-50000-nl-scans-2020", + "top-100000-nl-scans-2020", + "at-least-5-nl-scans-2020", + "top-100-nc-scans-2020", + "top-500-nc-scans-2020", + "top-1000-nc-scans-2020", + "top-5000-nc-scans-2020", + "top-10000-nc-scans-2020", + "top-50000-nc-scans-2020", + "top-100000-nc-scans-2020", + "top-500-gp-scans-2020", + "top-1000-gp-scans-2020", + "top-5000-gp-scans-2020", + "top-10000-gp-scans-2020", + "top-50000-gp-scans-2020", + "top-100000-gp-scans-2020", + "top-1000-re-scans-2020", + "top-5000-re-scans-2020", + "top-10000-re-scans-2020", + "top-50000-re-scans-2020", + "top-100000-re-scans-2020", + "top-10-cz-scans-2020", + "top-50-cz-scans-2020", + "top-100-cz-scans-2020", + "top-500-cz-scans-2020", + "top-1000-cz-scans-2020", + "top-5000-cz-scans-2020", + "top-10000-cz-scans-2020", + "top-50000-cz-scans-2020", + "top-100000-cz-scans-2020", + "top-1000-mx-scans-2020", + "top-5000-mx-scans-2020", + "top-10000-mx-scans-2020", + "top-50000-mx-scans-2020", + "top-100000-mx-scans-2020", + "top-500-lu-scans-2020", + "top-1000-lu-scans-2020", + "top-5000-lu-scans-2020", + "top-10000-lu-scans-2020", + "top-50000-lu-scans-2020", + "top-100000-lu-scans-2020", + "top-100-ie-scans-2020", + "top-500-ie-scans-2020", + "top-1000-ie-scans-2020", + "top-5000-ie-scans-2020", + "top-10000-ie-scans-2020", + "top-50000-ie-scans-2020", + "top-100000-ie-scans-2020", + "top-500-tn-scans-2020", + "top-1000-tn-scans-2020", + "top-5000-tn-scans-2020", + "top-10000-tn-scans-2020", + "top-50000-tn-scans-2020", + "top-100000-tn-scans-2020", + "top-100-mu-scans-2020", + "top-500-mu-scans-2020", + "top-1000-mu-scans-2020", + "top-5000-mu-scans-2020", + "top-10000-mu-scans-2020", + "top-50000-mu-scans-2020", + "top-100000-mu-scans-2020", + "top-5000-pt-scans-2020", + "top-10000-pt-scans-2020", + "top-50000-pt-scans-2020", + "top-100000-pt-scans-2020", + "top-500-ca-scans-2020", + "top-1000-ca-scans-2020", + "top-5000-ca-scans-2020", + "top-10000-ca-scans-2020", + "top-50000-ca-scans-2020", + "top-100000-ca-scans-2020", + "top-50-ly-scans-2020", + "top-100-ly-scans-2020", + "top-500-ly-scans-2020", + "top-1000-ly-scans-2020", + "top-5000-ly-scans-2020", + "top-10000-ly-scans-2020", + "top-50000-ly-scans-2020", + "top-100000-ly-scans-2020", + "top-50-nz-scans-2020", + "top-100-nz-scans-2020", + "top-500-nz-scans-2020", + "top-1000-nz-scans-2020", + "top-5000-nz-scans-2020", + "top-10000-nz-scans-2020", + "top-50000-nz-scans-2020", + "top-100000-nz-scans-2020", + "top-500-hu-scans-2020", + "top-1000-hu-scans-2020", + "top-5000-hu-scans-2020", + "top-10000-hu-scans-2020", + "top-50000-hu-scans-2020", + "top-100000-hu-scans-2020", + "top-5000-at-scans-2020", + "top-10000-at-scans-2020", + "top-50000-at-scans-2020", + "top-100000-at-scans-2020", + "top-5000-us-scans-2020", + "top-10000-us-scans-2020", + "top-50000-us-scans-2020", + "top-100000-us-scans-2020", + "top-5000-mq-scans-2020", + "top-10000-mq-scans-2020", + "top-50000-mq-scans-2020", + "top-100000-mq-scans-2020", + "top-500-iq-scans-2020", + "top-1000-iq-scans-2020", + "top-5000-iq-scans-2020", + "top-10000-iq-scans-2020", + "top-50000-iq-scans-2020", + "top-100000-iq-scans-2020", + "top-5000-ar-scans-2020", + "top-10000-ar-scans-2020", + "top-50000-ar-scans-2020", + "top-100000-ar-scans-2020", + "top-50-qa-scans-2020", + "top-100-qa-scans-2020", + "top-500-qa-scans-2020", + "top-1000-qa-scans-2020", + "top-5000-qa-scans-2020", + "top-10000-qa-scans-2020", + "top-50000-qa-scans-2020", + "top-100000-qa-scans-2020", + "top-5000-ae-scans-2020", + "top-10000-ae-scans-2020", + "top-50000-ae-scans-2020", + "top-100000-ae-scans-2020", + "top-5000-rs-scans-2020", + "top-10000-rs-scans-2020", + "top-50000-rs-scans-2020", + "top-100000-rs-scans-2020", + "top-1000-ci-scans-2020", + "top-5000-ci-scans-2020", + "top-10000-ci-scans-2020", + "top-50000-ci-scans-2020", + "top-100000-ci-scans-2020", + "top-5000-se-scans-2020", + "top-10000-se-scans-2020", + "top-50000-se-scans-2020", + "top-100000-se-scans-2020", + "top-10-ps-scans-2020", + "top-50-ps-scans-2020", + "top-100-ps-scans-2020", + "top-500-ps-scans-2020", + "top-1000-ps-scans-2020", + "top-5000-ps-scans-2020", + "top-10000-ps-scans-2020", + "top-50000-ps-scans-2020", + "top-100000-ps-scans-2020", + "top-1000-in-scans-2020", + "top-5000-in-scans-2020", + "top-10000-in-scans-2020", + "top-50000-in-scans-2020", + "top-100000-in-scans-2020", + "top-5000-sn-scans-2020", + "top-10000-sn-scans-2020", + "top-50000-sn-scans-2020", + "top-100000-sn-scans-2020", + "top-500-sk-scans-2020", + "top-1000-sk-scans-2020", + "top-5000-sk-scans-2020", + "top-10000-sk-scans-2020", + "top-50000-sk-scans-2020", + "top-100000-sk-scans-2020", + "top-100-jo-scans-2020", + "top-500-jo-scans-2020", + "top-1000-jo-scans-2020", + "top-5000-jo-scans-2020", + "top-10000-jo-scans-2020", + "top-50000-jo-scans-2020", + "top-100000-jo-scans-2020", + "top-500-je-scans-2020", + "top-1000-je-scans-2020", + "top-5000-je-scans-2020", + "top-10000-je-scans-2020", + "top-50000-je-scans-2020", + "top-100000-je-scans-2020", + "top-50-scans-2021", + "top-100-scans-2021", + "top-500-scans-2021", + "top-1000-scans-2021", + "top-5000-scans-2021", + "top-10000-scans-2021", + "top-50000-scans-2021", + "top-100000-scans-2021", + "at-least-5-scans-2021", + "at-least-10-scans-2021", + "top-75-percent-scans-2021", + "top-80-percent-scans-2021", + "top-85-percent-scans-2021", + "top-90-percent-scans-2021", + "top-500-fr-scans-2021", + "top-1000-fr-scans-2021", + "top-5000-fr-scans-2021", + "top-10000-fr-scans-2021", + "top-50000-fr-scans-2021", + "top-100000-fr-scans-2021", + "top-country-fr-scans-2021", + "at-least-5-fr-scans-2021", + "at-least-10-fr-scans-2021", + "top-500-es-scans-2021", + "top-1000-es-scans-2021", + "top-5000-es-scans-2021", + "top-10000-es-scans-2021", + "top-50000-es-scans-2021", + "top-100000-es-scans-2021", + "at-least-5-es-scans-2021", + "at-least-10-es-scans-2021", + "top-1000-de-scans-2021", + "top-5000-de-scans-2021", + "top-10000-de-scans-2021", + "top-50000-de-scans-2021", + "top-100000-de-scans-2021", + "at-least-5-de-scans-2021", + "at-least-10-de-scans-2021", + "top-50-gb-scans-2021", + "top-100-gb-scans-2021", + "top-500-gb-scans-2021", + "top-1000-gb-scans-2021", + "top-5000-gb-scans-2021", + "top-10000-gb-scans-2021", + "top-50000-gb-scans-2021", + "top-100000-gb-scans-2021", + "at-least-5-gb-scans-2021", + "at-least-10-gb-scans-2021", + "top-50-dz-scans-2021", + "top-100-dz-scans-2021", + "top-500-dz-scans-2021", + "top-1000-dz-scans-2021", + "top-5000-dz-scans-2021", + "top-10000-dz-scans-2021", + "top-50000-dz-scans-2021", + "top-100000-dz-scans-2021", + "at-least-5-dz-scans-2021", + "at-least-10-dz-scans-2021", + "top-500-it-scans-2021", + "top-1000-it-scans-2021", + "top-5000-it-scans-2021", + "top-10000-it-scans-2021", + "top-50000-it-scans-2021", + "top-100000-it-scans-2021", + "at-least-5-it-scans-2021", + "at-least-10-it-scans-2021", + "top-1000-ch-scans-2021", + "top-5000-ch-scans-2021", + "top-10000-ch-scans-2021", + "top-50000-ch-scans-2021", + "top-100000-ch-scans-2021", + "at-least-5-ch-scans-2021", + "at-least-10-ch-scans-2021", + "top-500-ro-scans-2021", + "top-1000-ro-scans-2021", + "top-5000-ro-scans-2021", + "top-10000-ro-scans-2021", + "top-50000-ro-scans-2021", + "top-100000-ro-scans-2021", + "at-least-5-ro-scans-2021", + "top-500-ma-scans-2021", + "top-1000-ma-scans-2021", + "top-5000-ma-scans-2021", + "top-10000-ma-scans-2021", + "top-50000-ma-scans-2021", + "top-100000-ma-scans-2021", + "at-least-5-ma-scans-2021", + "top-500-mx-scans-2021", + "top-1000-mx-scans-2021", + "top-5000-mx-scans-2021", + "top-10000-mx-scans-2021", + "top-50000-mx-scans-2021", + "top-100000-mx-scans-2021", + "at-least-5-mx-scans-2021", + "top-500-re-scans-2021", + "top-1000-re-scans-2021", + "top-5000-re-scans-2021", + "top-10000-re-scans-2021", + "top-50000-re-scans-2021", + "top-100000-re-scans-2021", + "at-least-5-re-scans-2021", + "top-500-pt-scans-2021", + "top-1000-pt-scans-2021", + "top-5000-pt-scans-2021", + "top-10000-pt-scans-2021", + "top-50000-pt-scans-2021", + "top-100000-pt-scans-2021", + "at-least-5-pt-scans-2021", + "top-5000-be-scans-2021", + "top-10000-be-scans-2021", + "top-50000-be-scans-2021", + "top-100000-be-scans-2021", + "at-least-5-be-scans-2021", + "top-500-ca-scans-2021", + "top-1000-ca-scans-2021", + "top-5000-ca-scans-2021", + "top-10000-ca-scans-2021", + "top-50000-ca-scans-2021", + "top-100000-ca-scans-2021", + "at-least-5-ca-scans-2021", + "top-500-us-scans-2021", + "top-1000-us-scans-2021", + "top-5000-us-scans-2021", + "top-10000-us-scans-2021", + "top-50000-us-scans-2021", + "top-100000-us-scans-2021", + "top-500-at-scans-2021", + "top-1000-at-scans-2021", + "top-5000-at-scans-2021", + "top-10000-at-scans-2021", + "top-50000-at-scans-2021", + "top-100000-at-scans-2021", + "top-100-bg-scans-2021", + "top-500-bg-scans-2021", + "top-1000-bg-scans-2021", + "top-5000-bg-scans-2021", + "top-10000-bg-scans-2021", + "top-50000-bg-scans-2021", + "top-100000-bg-scans-2021", + "top-100-mu-scans-2021", + "top-500-mu-scans-2021", + "top-1000-mu-scans-2021", + "top-5000-mu-scans-2021", + "top-10000-mu-scans-2021", + "top-50000-mu-scans-2021", + "top-100000-mu-scans-2021", + "top-500-ci-scans-2021", + "top-1000-ci-scans-2021", + "top-5000-ci-scans-2021", + "top-10000-ci-scans-2021", + "top-50000-ci-scans-2021", + "top-100000-ci-scans-2021", + "top-500-gp-scans-2021", + "top-1000-gp-scans-2021", + "top-5000-gp-scans-2021", + "top-10000-gp-scans-2021", + "top-50000-gp-scans-2021", + "top-100000-gp-scans-2021", + "top-500-se-scans-2021", + "top-1000-se-scans-2021", + "top-5000-se-scans-2021", + "top-10000-se-scans-2021", + "top-50000-se-scans-2021", + "top-100000-se-scans-2021", + "top-500-tn-scans-2021", + "top-1000-tn-scans-2021", + "top-5000-tn-scans-2021", + "top-10000-tn-scans-2021", + "top-50000-tn-scans-2021", + "top-100000-tn-scans-2021", + "top-5000-pl-scans-2021", + "top-10000-pl-scans-2021", + "top-50000-pl-scans-2021", + "top-100000-pl-scans-2021", + "top-500-sa-scans-2021", + "top-1000-sa-scans-2021", + "top-5000-sa-scans-2021", + "top-10000-sa-scans-2021", + "top-50000-sa-scans-2021", + "top-100000-sa-scans-2021", + "top-500-mq-scans-2021", + "top-1000-mq-scans-2021", + "top-5000-mq-scans-2021", + "top-10000-mq-scans-2021", + "top-50000-mq-scans-2021", + "top-100000-mq-scans-2021", + "top-500-cz-scans-2021", + "top-1000-cz-scans-2021", + "top-5000-cz-scans-2021", + "top-10000-cz-scans-2021", + "top-50000-cz-scans-2021", + "top-100000-cz-scans-2021", + "top-500-uy-scans-2021", + "top-1000-uy-scans-2021", + "top-5000-uy-scans-2021", + "top-10000-uy-scans-2021", + "top-50000-uy-scans-2021", + "top-100000-uy-scans-2021", + "top-500-ae-scans-2021", + "top-1000-ae-scans-2021", + "top-5000-ae-scans-2021", + "top-10000-ae-scans-2021", + "top-50000-ae-scans-2021", + "top-100000-ae-scans-2021", + "top-500-my-scans-2021", + "top-1000-my-scans-2021", + "top-5000-my-scans-2021", + "top-10000-my-scans-2021", + "top-50000-my-scans-2021", + "top-100000-my-scans-2021", + "top-1000-fi-scans-2021", + "top-5000-fi-scans-2021", + "top-10000-fi-scans-2021", + "top-50000-fi-scans-2021", + "top-100000-fi-scans-2021", + "top-500-hk-scans-2021", + "top-1000-hk-scans-2021", + "top-5000-hk-scans-2021", + "top-10000-hk-scans-2021", + "top-50000-hk-scans-2021", + "top-100000-hk-scans-2021", + "top-500-mt-scans-2021", + "top-1000-mt-scans-2021", + "top-5000-mt-scans-2021", + "top-10000-mt-scans-2021", + "top-50000-mt-scans-2021", + "top-100000-mt-scans-2021", + "top-100-ir-scans-2021", + "top-500-ir-scans-2021", + "top-1000-ir-scans-2021", + "top-5000-ir-scans-2021", + "top-10000-ir-scans-2021", + "top-50000-ir-scans-2021", + "top-100000-ir-scans-2021", + "top-500-ad-scans-2021", + "top-1000-ad-scans-2021", + "top-5000-ad-scans-2021", + "top-10000-ad-scans-2021", + "top-50000-ad-scans-2021", + "top-100000-ad-scans-2021", + "top-500-kw-scans-2021", + "top-1000-kw-scans-2021", + "top-5000-kw-scans-2021", + "top-10000-kw-scans-2021", + "top-50000-kw-scans-2021", + "top-100000-kw-scans-2021", + "top-5000-il-scans-2021", + "top-10000-il-scans-2021", + "top-50000-il-scans-2021", + "top-100000-il-scans-2021", + "top-500-in-scans-2021", + "top-1000-in-scans-2021", + "top-5000-in-scans-2021", + "top-10000-in-scans-2021", + "top-50000-in-scans-2021", + "top-100000-in-scans-2021", + "top-5000-au-scans-2021", + "top-10000-au-scans-2021", + "top-50000-au-scans-2021", + "top-100000-au-scans-2021", + "top-500-br-scans-2021", + "top-1000-br-scans-2021", + "top-5000-br-scans-2021", + "top-10000-br-scans-2021", + "top-50000-br-scans-2021", + "top-100000-br-scans-2021", + "top-5000-lu-scans-2021", + "top-10000-lu-scans-2021", + "top-50000-lu-scans-2021", + "top-100000-lu-scans-2021", + "top-500-si-scans-2021", + "top-1000-si-scans-2021", + "top-5000-si-scans-2021", + "top-10000-si-scans-2021", + "top-50000-si-scans-2021", + "top-100000-si-scans-2021", + "top-5000-gr-scans-2021", + "top-10000-gr-scans-2021", + "top-50000-gr-scans-2021", + "top-100000-gr-scans-2021", + "top-5000-nl-scans-2021", + "top-10000-nl-scans-2021", + "top-50000-nl-scans-2021", + "top-100000-nl-scans-2021", + "top-5000-th-scans-2021", + "top-10000-th-scans-2021", + "top-50000-th-scans-2021", + "top-100000-th-scans-2021", + "top-5000-ie-scans-2021", + "top-10000-ie-scans-2021", + "top-50000-ie-scans-2021", + "top-100000-ie-scans-2021", + "top-500-is-scans-2021", + "top-1000-is-scans-2021", + "top-5000-is-scans-2021", + "top-10000-is-scans-2021", + "top-50000-is-scans-2021", + "top-100000-is-scans-2021", + "top-50-scans-2022", + "top-100-scans-2022", + "top-500-scans-2022", + "top-1000-scans-2022", + "top-5000-scans-2022", + "top-10000-scans-2022", + "top-50000-scans-2022", + "top-100000-scans-2022", + "at-least-5-scans-2022", + "at-least-10-scans-2022", + "top-75-percent-scans-2022", + "top-80-percent-scans-2022", + "top-85-percent-scans-2022", + "top-90-percent-scans-2022", + "top-500-fr-scans-2022", + "top-1000-fr-scans-2022", + "top-5000-fr-scans-2022", + "top-10000-fr-scans-2022", + "top-50000-fr-scans-2022", + "top-100000-fr-scans-2022", + "top-country-fr-scans-2022", + "at-least-5-fr-scans-2022", + "at-least-10-fr-scans-2022", + "top-500-es-scans-2022", + "top-1000-es-scans-2022", + "top-5000-es-scans-2022", + "top-10000-es-scans-2022", + "top-50000-es-scans-2022", + "top-100000-es-scans-2022", + "at-least-5-es-scans-2022", + "at-least-10-es-scans-2022", + "top-1000-de-scans-2022", + "top-5000-de-scans-2022", + "top-10000-de-scans-2022", + "top-50000-de-scans-2022", + "top-100000-de-scans-2022", + "at-least-5-de-scans-2022", + "at-least-10-de-scans-2022", + "top-50-gb-scans-2022", + "top-100-gb-scans-2022", + "top-500-gb-scans-2022", + "top-1000-gb-scans-2022", + "top-5000-gb-scans-2022", + "top-10000-gb-scans-2022", + "top-50000-gb-scans-2022", + "top-100000-gb-scans-2022", + "at-least-5-gb-scans-2022", + "at-least-10-gb-scans-2022", + "top-500-it-scans-2022", + "top-1000-it-scans-2022", + "top-5000-it-scans-2022", + "top-10000-it-scans-2022", + "top-50000-it-scans-2022", + "top-100000-it-scans-2022", + "at-least-5-it-scans-2022", + "at-least-10-it-scans-2022", + "top-500-ma-scans-2022", + "top-1000-ma-scans-2022", + "top-5000-ma-scans-2022", + "top-10000-ma-scans-2022", + "top-50000-ma-scans-2022", + "top-100000-ma-scans-2022", + "at-least-5-ma-scans-2022", + "at-least-10-ma-scans-2022", + "top-500-dz-scans-2022", + "top-1000-dz-scans-2022", + "top-5000-dz-scans-2022", + "top-10000-dz-scans-2022", + "top-50000-dz-scans-2022", + "top-100000-dz-scans-2022", + "at-least-5-dz-scans-2022", + "top-50-ru-scans-2022", + "top-100-ru-scans-2022", + "top-500-ru-scans-2022", + "top-1000-ru-scans-2022", + "top-5000-ru-scans-2022", + "top-10000-ru-scans-2022", + "top-50000-ru-scans-2022", + "top-100000-ru-scans-2022", + "top-5000-be-scans-2022", + "top-10000-be-scans-2022", + "top-50000-be-scans-2022", + "top-100000-be-scans-2022", + "top-500-nl-scans-2022", + "top-1000-nl-scans-2022", + "top-5000-nl-scans-2022", + "top-10000-nl-scans-2022", + "top-50000-nl-scans-2022", + "top-100000-nl-scans-2022", + "top-50-lu-scans-2022", + "top-100-lu-scans-2022", + "top-500-lu-scans-2022", + "top-1000-lu-scans-2022", + "top-5000-lu-scans-2022", + "top-10000-lu-scans-2022", + "top-50000-lu-scans-2022", + "top-100000-lu-scans-2022", + "top-500-at-scans-2022", + "top-1000-at-scans-2022", + "top-5000-at-scans-2022", + "top-10000-at-scans-2022", + "top-50000-at-scans-2022", + "top-100000-at-scans-2022", + "top-5000-ro-scans-2022", + "top-10000-ro-scans-2022", + "top-50000-ro-scans-2022", + "top-100000-ro-scans-2022", + "top-5000-ch-scans-2022", + "top-10000-ch-scans-2022", + "top-50000-ch-scans-2022", + "top-100000-ch-scans-2022", + "top-5000-us-scans-2022", + "top-10000-us-scans-2022", + "top-50000-us-scans-2022", + "top-100000-us-scans-2022", + "top-500-sk-scans-2022", + "top-1000-sk-scans-2022", + "top-5000-sk-scans-2022", + "top-10000-sk-scans-2022", + "top-50000-sk-scans-2022", + "top-100000-sk-scans-2022", + "top-5000-pt-scans-2022", + "top-10000-pt-scans-2022", + "top-50000-pt-scans-2022", + "top-100000-pt-scans-2022", + "top-500-tn-scans-2022", + "top-1000-tn-scans-2022", + "top-5000-tn-scans-2022", + "top-10000-tn-scans-2022", + "top-50000-tn-scans-2022", + "top-100000-tn-scans-2022", + "top-500-se-scans-2022", + "top-1000-se-scans-2022", + "top-5000-se-scans-2022", + "top-10000-se-scans-2022", + "top-50000-se-scans-2022", + "top-100000-se-scans-2022", + "top-5000-re-scans-2022", + "top-10000-re-scans-2022", + "top-50000-re-scans-2022", + "top-100000-re-scans-2022", + "top-1000-ae-scans-2022", + "top-5000-ae-scans-2022", + "top-10000-ae-scans-2022", + "top-50000-ae-scans-2022", + "top-100000-ae-scans-2022", + "top-500-si-scans-2022", + "top-1000-si-scans-2022", + "top-5000-si-scans-2022", + "top-10000-si-scans-2022", + "top-50000-si-scans-2022", + "top-100000-si-scans-2022", + "top-1000-th-scans-2022", + "top-5000-th-scans-2022", + "top-10000-th-scans-2022", + "top-50000-th-scans-2022", + "top-100000-th-scans-2022", + "top-500-ng-scans-2022", + "top-1000-ng-scans-2022", + "top-5000-ng-scans-2022", + "top-10000-ng-scans-2022", + "top-50000-ng-scans-2022", + "top-100000-ng-scans-2022", + "top-5000-in-scans-2022", + "top-10000-in-scans-2022", + "top-50000-in-scans-2022", + "top-100000-in-scans-2022", + "top-1000-ie-scans-2022", + "top-5000-ie-scans-2022", + "top-10000-ie-scans-2022", + "top-50000-ie-scans-2022", + "top-100000-ie-scans-2022", + "top-1000-za-scans-2022", + "top-5000-za-scans-2022", + "top-10000-za-scans-2022", + "top-50000-za-scans-2022", + "top-100000-za-scans-2022", + "top-5000-ar-scans-2022", + "top-10000-ar-scans-2022", + "top-50000-ar-scans-2022", + "top-100000-ar-scans-2022", + "top-5000-sn-scans-2022", + "top-10000-sn-scans-2022", + "top-50000-sn-scans-2022", + "top-100000-sn-scans-2022", + "top-500-qa-scans-2022", + "top-1000-qa-scans-2022", + "top-5000-qa-scans-2022", + "top-10000-qa-scans-2022", + "top-50000-qa-scans-2022", + "top-100000-qa-scans-2022", + "top-500-hk-scans-2022", + "top-1000-hk-scans-2022", + "top-5000-hk-scans-2022", + "top-10000-hk-scans-2022", + "top-50000-hk-scans-2022", + "top-100000-hk-scans-2022", + "top-5000-pl-scans-2022", + "top-10000-pl-scans-2022", + "top-50000-pl-scans-2022", + "top-100000-pl-scans-2022", + "top-5000-cz-scans-2022", + "top-10000-cz-scans-2022", + "top-50000-cz-scans-2022", + "top-100000-cz-scans-2022", + "top-1000-ua-scans-2022", + "top-5000-ua-scans-2022", + "top-10000-ua-scans-2022", + "top-50000-ua-scans-2022", + "top-100000-ua-scans-2022", + "top-500-al-scans-2022", + "top-1000-al-scans-2022", + "top-5000-al-scans-2022", + "top-10000-al-scans-2022", + "top-50000-al-scans-2022", + "top-100000-al-scans-2022", + "top-10000-hu-scans-2022", + "top-50000-hu-scans-2022", + "top-100000-hu-scans-2022", + "top-5000-ci-scans-2022", + "top-10000-ci-scans-2022", + "top-50000-ci-scans-2022", + "top-100000-ci-scans-2022", + "top-5000-no-scans-2022", + "top-10000-no-scans-2022", + "top-50000-no-scans-2022", + "top-100000-no-scans-2022", + "top-500-kw-scans-2022", + "top-1000-kw-scans-2022", + "top-5000-kw-scans-2022", + "top-10000-kw-scans-2022", + "top-50000-kw-scans-2022", + "top-100000-kw-scans-2022", + "top-50-scans-2023", + "top-100-scans-2023", + "top-500-scans-2023", + "top-1000-scans-2023", + "top-5000-scans-2023", + "top-10000-scans-2023", + "top-50000-scans-2023", + "top-100000-scans-2023", + "at-least-5-scans-2023", + "at-least-10-scans-2023", + "top-75-percent-scans-2023", + "top-80-percent-scans-2023", + "top-85-percent-scans-2023", + "top-90-percent-scans-2023", + "top-100-fr-scans-2023", + "top-500-fr-scans-2023", + "top-1000-fr-scans-2023", + "top-5000-fr-scans-2023", + "top-10000-fr-scans-2023", + "top-50000-fr-scans-2023", + "top-100000-fr-scans-2023", + "top-country-fr-scans-2023", + "at-least-5-fr-scans-2023", + "at-least-10-fr-scans-2023", + "top-100-gb-scans-2023", + "top-500-gb-scans-2023", + "top-1000-gb-scans-2023", + "top-5000-gb-scans-2023", + "top-10000-gb-scans-2023", + "top-50000-gb-scans-2023", + "top-100000-gb-scans-2023", + "at-least-5-gb-scans-2023", + "at-least-10-gb-scans-2023", + "top-1000-es-scans-2023", + "top-5000-es-scans-2023", + "top-10000-es-scans-2023", + "top-50000-es-scans-2023", + "top-100000-es-scans-2023", + "at-least-5-es-scans-2023", + "at-least-10-es-scans-2023", + "top-100-it-scans-2023", + "top-500-it-scans-2023", + "top-1000-it-scans-2023", + "top-5000-it-scans-2023", + "top-10000-it-scans-2023", + "top-50000-it-scans-2023", + "top-100000-it-scans-2023", + "at-least-5-it-scans-2023", + "at-least-10-it-scans-2023", + "top-500-de-scans-2023", + "top-1000-de-scans-2023", + "top-5000-de-scans-2023", + "top-10000-de-scans-2023", + "top-50000-de-scans-2023", + "top-100000-de-scans-2023", + "at-least-5-de-scans-2023", + "at-least-10-de-scans-2023", + "top-500-bg-scans-2023", + "top-1000-bg-scans-2023", + "top-5000-bg-scans-2023", + "top-10000-bg-scans-2023", + "top-50000-bg-scans-2023", + "top-100000-bg-scans-2023", + "at-least-5-bg-scans-2023", + "at-least-10-bg-scans-2023", + "top-1000-ma-scans-2023", + "top-5000-ma-scans-2023", + "top-10000-ma-scans-2023", + "top-50000-ma-scans-2023", + "top-100000-ma-scans-2023", + "at-least-5-ma-scans-2023", + "at-least-10-ma-scans-2023", + "top-5000-ro-scans-2023", + "top-10000-ro-scans-2023", + "top-50000-ro-scans-2023", + "top-100000-ro-scans-2023", + "at-least-5-ro-scans-2023", + "at-least-10-ro-scans-2023", + "top-5000-be-scans-2023", + "top-10000-be-scans-2023", + "top-50000-be-scans-2023", + "top-100000-be-scans-2023", + "top-50-dk-scans-2023", + "top-100-dk-scans-2023", + "top-500-dk-scans-2023", + "top-1000-dk-scans-2023", + "top-5000-dk-scans-2023", + "top-10000-dk-scans-2023", + "top-50000-dk-scans-2023", + "top-100000-dk-scans-2023", + "top-5000-ch-scans-2023", + "top-10000-ch-scans-2023", + "top-50000-ch-scans-2023", + "top-100000-ch-scans-2023", + "top-500-hr-scans-2023", + "top-1000-hr-scans-2023", + "top-5000-hr-scans-2023", + "top-10000-hr-scans-2023", + "top-50000-hr-scans-2023", + "top-100000-hr-scans-2023", + "top-1000-ie-scans-2023", + "top-5000-ie-scans-2023", + "top-10000-ie-scans-2023", + "top-50000-ie-scans-2023", + "top-100000-ie-scans-2023", + "top-500-se-scans-2023", + "top-1000-se-scans-2023", + "top-5000-se-scans-2023", + "top-10000-se-scans-2023", + "top-50000-se-scans-2023", + "top-100000-se-scans-2023", + "top-5000-pt-scans-2023", + "top-10000-pt-scans-2023", + "top-50000-pt-scans-2023", + "top-100000-pt-scans-2023", + "top-50-jp-scans-2023", + "top-100-jp-scans-2023", + "top-500-jp-scans-2023", + "top-1000-jp-scans-2023", + "top-5000-jp-scans-2023", + "top-10000-jp-scans-2023", + "top-50000-jp-scans-2023", + "top-100000-jp-scans-2023", + "top-500-fi-scans-2023", + "top-1000-fi-scans-2023", + "top-5000-fi-scans-2023", + "top-10000-fi-scans-2023", + "top-50000-fi-scans-2023", + "top-100000-fi-scans-2023", + "top-5000-pl-scans-2023", + "top-10000-pl-scans-2023", + "top-50000-pl-scans-2023", + "top-100000-pl-scans-2023", + "top-1000-ua-scans-2023", + "top-5000-ua-scans-2023", + "top-10000-ua-scans-2023", + "top-50000-ua-scans-2023", + "top-100000-ua-scans-2023", + "top-5000-nl-scans-2023", + "top-10000-nl-scans-2023", + "top-50000-nl-scans-2023", + "top-100000-nl-scans-2023", + "top-500-mq-scans-2023", + "top-1000-mq-scans-2023", + "top-5000-mq-scans-2023", + "top-10000-mq-scans-2023", + "top-50000-mq-scans-2023", + "top-100000-mq-scans-2023", + "top-100-il-scans-2023", + "top-500-il-scans-2023", + "top-1000-il-scans-2023", + "top-5000-il-scans-2023", + "top-10000-il-scans-2023", + "top-50000-il-scans-2023", + "top-100000-il-scans-2023", + "top-500-re-scans-2023", + "top-1000-re-scans-2023", + "top-5000-re-scans-2023", + "top-10000-re-scans-2023", + "top-50000-re-scans-2023", + "top-100000-re-scans-2023", + "top-1000-tn-scans-2023", + "top-5000-tn-scans-2023", + "top-10000-tn-scans-2023", + "top-50000-tn-scans-2023", + "top-100000-tn-scans-2023", + "top-100-sg-scans-2023", + "top-500-sg-scans-2023", + "top-1000-sg-scans-2023", + "top-5000-sg-scans-2023", + "top-10000-sg-scans-2023", + "top-50000-sg-scans-2023", + "top-100000-sg-scans-2023", + "top-5000-dz-scans-2023", + "top-10000-dz-scans-2023", + "top-50000-dz-scans-2023", + "top-100000-dz-scans-2023", + "top-1000-hk-scans-2023", + "top-5000-hk-scans-2023", + "top-10000-hk-scans-2023", + "top-50000-hk-scans-2023", + "top-100000-hk-scans-2023", + "top-50-mc-scans-2023", + "top-100-mc-scans-2023", + "top-500-mc-scans-2023", + "top-1000-mc-scans-2023", + "top-5000-mc-scans-2023", + "top-10000-mc-scans-2023", + "top-50000-mc-scans-2023", + "top-100000-mc-scans-2023", + "top-5000-sk-scans-2023", + "top-10000-sk-scans-2023", + "top-50000-sk-scans-2023", + "top-100000-sk-scans-2023", + "top-5000-cy-scans-2023", + "top-10000-cy-scans-2023", + "top-50000-cy-scans-2023", + "top-100000-cy-scans-2023", + "top-5000-at-scans-2023", + "top-10000-at-scans-2023", + "top-50000-at-scans-2023", + "top-100000-at-scans-2023", + "top-500-ae-scans-2023", + "top-1000-ae-scans-2023", + "top-5000-ae-scans-2023", + "top-10000-ae-scans-2023", + "top-50000-ae-scans-2023", + "top-100000-ae-scans-2023", + "top-1000-gp-scans-2023", + "top-5000-gp-scans-2023", + "top-10000-gp-scans-2023", + "top-50000-gp-scans-2023", + "top-100000-gp-scans-2023", + "top-5000-gr-scans-2023", + "top-10000-gr-scans-2023", + "top-50000-gr-scans-2023", + "top-100000-gr-scans-2023", + "top-1000-th-scans-2023", + "top-5000-th-scans-2023", + "top-10000-th-scans-2023", + "top-50000-th-scans-2023", + "top-100000-th-scans-2023", + "top-500-za-scans-2023", + "top-1000-za-scans-2023", + "top-5000-za-scans-2023", + "top-10000-za-scans-2023", + "top-50000-za-scans-2023", + "top-100000-za-scans-2023", + "top-500-cg-scans-2023", + "top-1000-cg-scans-2023", + "top-5000-cg-scans-2023", + "top-10000-cg-scans-2023", + "top-50000-cg-scans-2023", + "top-100000-cg-scans-2023", + "top-10000-ru-scans-2023", + "top-50000-ru-scans-2023", + "top-100000-ru-scans-2023", + "top-1000-in-scans-2023", + "top-5000-in-scans-2023", + "top-10000-in-scans-2023", + "top-50000-in-scans-2023", + "top-100000-in-scans-2023", + "top-10000-cz-scans-2023", + "top-50000-cz-scans-2023", + "top-100000-cz-scans-2023", + "top-50000-us-scans-2023", + "top-100000-us-scans-2023", + "top-50-scans-2024", + "top-100-scans-2024", + "top-500-scans-2024", + "top-1000-scans-2024", + "top-5000-scans-2024", + "top-10000-scans-2024", + "top-50000-scans-2024", + "top-100000-scans-2024", + "at-least-5-scans-2024", + "at-least-10-scans-2024", + "top-75-percent-scans-2024", + "top-80-percent-scans-2024", + "top-85-percent-scans-2024", + "top-90-percent-scans-2024", + "top-50-gb-scans-2024", + "top-100-gb-scans-2024", + "top-500-gb-scans-2024", + "top-1000-gb-scans-2024", + "top-5000-gb-scans-2024", + "top-10000-gb-scans-2024", + "top-50000-gb-scans-2024", + "top-100000-gb-scans-2024", + "top-country-gb-scans-2024", + "at-least-5-gb-scans-2024", + "at-least-10-gb-scans-2024", + "top-50-fr-scans-2024", + "top-100-fr-scans-2024", + "top-500-fr-scans-2024", + "top-1000-fr-scans-2024", + "top-5000-fr-scans-2024", + "top-10000-fr-scans-2024", + "top-50000-fr-scans-2024", + "top-100000-fr-scans-2024", + "at-least-5-fr-scans-2024", + "at-least-10-fr-scans-2024", + "top-1000-ma-scans-2024", + "top-5000-ma-scans-2024", + "top-10000-ma-scans-2024", + "top-50000-ma-scans-2024", + "top-100000-ma-scans-2024", + "at-least-5-ma-scans-2024", + "at-least-10-ma-scans-2024", + "top-100-it-scans-2024", + "top-500-it-scans-2024", + "top-1000-it-scans-2024", + "top-5000-it-scans-2024", + "top-10000-it-scans-2024", + "top-50000-it-scans-2024", + "top-100000-it-scans-2024", + "at-least-5-it-scans-2024", + "at-least-10-it-scans-2024", + "top-500-es-scans-2024", + "top-1000-es-scans-2024", + "top-5000-es-scans-2024", + "top-10000-es-scans-2024", + "top-50000-es-scans-2024", + "top-100000-es-scans-2024", + "at-least-5-es-scans-2024", + "at-least-10-es-scans-2024", + "top-500-de-scans-2024", + "top-1000-de-scans-2024", + "top-5000-de-scans-2024", + "top-10000-de-scans-2024", + "top-50000-de-scans-2024", + "top-100000-de-scans-2024", + "at-least-5-de-scans-2024", + "at-least-10-de-scans-2024", + "top-500-ro-scans-2024", + "top-1000-ro-scans-2024", + "top-5000-ro-scans-2024", + "top-10000-ro-scans-2024", + "top-50000-ro-scans-2024", + "top-100000-ro-scans-2024", + "at-least-5-ro-scans-2024", + "at-least-10-ro-scans-2024", + "top-50-ie-scans-2024", + "top-100-ie-scans-2024", + "top-500-ie-scans-2024", + "top-1000-ie-scans-2024", + "top-5000-ie-scans-2024", + "top-10000-ie-scans-2024", + "top-50000-ie-scans-2024", + "top-100000-ie-scans-2024", + "at-least-5-ie-scans-2024", + "at-least-10-ie-scans-2024", + "top-100-nl-scans-2024", + "top-500-nl-scans-2024", + "top-1000-nl-scans-2024", + "top-5000-nl-scans-2024", + "top-10000-nl-scans-2024", + "top-50000-nl-scans-2024", + "top-100000-nl-scans-2024", + "at-least-5-nl-scans-2024", + "at-least-10-nl-scans-2024", + "top-50-cz-scans-2024", + "top-100-cz-scans-2024", + "top-500-cz-scans-2024", + "top-1000-cz-scans-2024", + "top-5000-cz-scans-2024", + "top-10000-cz-scans-2024", + "top-50000-cz-scans-2024", + "top-100000-cz-scans-2024", + "at-least-5-cz-scans-2024", + "top-100-at-scans-2024", + "top-500-at-scans-2024", + "top-1000-at-scans-2024", + "top-5000-at-scans-2024", + "top-10000-at-scans-2024", + "top-50000-at-scans-2024", + "top-100000-at-scans-2024", + "at-least-5-at-scans-2024", + "top-500-tn-scans-2024", + "top-1000-tn-scans-2024", + "top-5000-tn-scans-2024", + "top-10000-tn-scans-2024", + "top-50000-tn-scans-2024", + "top-100000-tn-scans-2024", + "at-least-5-tn-scans-2024", + "top-5000-be-scans-2024", + "top-10000-be-scans-2024", + "top-50000-be-scans-2024", + "top-100000-be-scans-2024", + "at-least-5-be-scans-2024", + "top-5000-bg-scans-2024", + "top-10000-bg-scans-2024", + "top-50000-bg-scans-2024", + "top-100000-bg-scans-2024", + "at-least-5-bg-scans-2024", + "top-100-re-scans-2024", + "top-500-re-scans-2024", + "top-1000-re-scans-2024", + "top-5000-re-scans-2024", + "top-10000-re-scans-2024", + "top-50000-re-scans-2024", + "top-100000-re-scans-2024", + "at-least-5-re-scans-2024", + "top-1000-dz-scans-2024", + "top-5000-dz-scans-2024", + "top-10000-dz-scans-2024", + "top-50000-dz-scans-2024", + "top-100000-dz-scans-2024", + "top-5000-pl-scans-2024", + "top-10000-pl-scans-2024", + "top-50000-pl-scans-2024", + "top-100000-pl-scans-2024", + "top-500-sk-scans-2024", + "top-1000-sk-scans-2024", + "top-5000-sk-scans-2024", + "top-10000-sk-scans-2024", + "top-50000-sk-scans-2024", + "top-100000-sk-scans-2024", + "top-100-lb-scans-2024", + "top-500-lb-scans-2024", + "top-1000-lb-scans-2024", + "top-5000-lb-scans-2024", + "top-10000-lb-scans-2024", + "top-50000-lb-scans-2024", + "top-100000-lb-scans-2024", + "top-100-cy-scans-2024", + "top-500-cy-scans-2024", + "top-1000-cy-scans-2024", + "top-5000-cy-scans-2024", + "top-10000-cy-scans-2024", + "top-50000-cy-scans-2024", + "top-100000-cy-scans-2024", + "top-500-dk-scans-2024", + "top-1000-dk-scans-2024", + "top-5000-dk-scans-2024", + "top-10000-dk-scans-2024", + "top-50000-dk-scans-2024", + "top-100000-dk-scans-2024", + "top-500-no-scans-2024", + "top-1000-no-scans-2024", + "top-5000-no-scans-2024", + "top-10000-no-scans-2024", + "top-50000-no-scans-2024", + "top-100000-no-scans-2024", + "top-50-sg-scans-2024", + "top-100-sg-scans-2024", + "top-500-sg-scans-2024", + "top-1000-sg-scans-2024", + "top-5000-sg-scans-2024", + "top-10000-sg-scans-2024", + "top-50000-sg-scans-2024", + "top-100000-sg-scans-2024", + "top-5000-pt-scans-2024", + "top-10000-pt-scans-2024", + "top-50000-pt-scans-2024", + "top-100000-pt-scans-2024", + "top-1000-se-scans-2024", + "top-5000-se-scans-2024", + "top-10000-se-scans-2024", + "top-50000-se-scans-2024", + "top-100000-se-scans-2024", + "top-500-il-scans-2024", + "top-1000-il-scans-2024", + "top-5000-il-scans-2024", + "top-10000-il-scans-2024", + "top-50000-il-scans-2024", + "top-100000-il-scans-2024", + "top-500-sa-scans-2024", + "top-1000-sa-scans-2024", + "top-5000-sa-scans-2024", + "top-10000-sa-scans-2024", + "top-50000-sa-scans-2024", + "top-100000-sa-scans-2024", + "top-5000-fi-scans-2024", + "top-10000-fi-scans-2024", + "top-50000-fi-scans-2024", + "top-100000-fi-scans-2024", + "top-50-hk-scans-2024", + "top-100-hk-scans-2024", + "top-500-hk-scans-2024", + "top-1000-hk-scans-2024", + "top-5000-hk-scans-2024", + "top-10000-hk-scans-2024", + "top-50000-hk-scans-2024", + "top-100000-hk-scans-2024", + "top-500-lu-scans-2024", + "top-1000-lu-scans-2024", + "top-5000-lu-scans-2024", + "top-10000-lu-scans-2024", + "top-50000-lu-scans-2024", + "top-100000-lu-scans-2024", + "top-500-th-scans-2024", + "top-1000-th-scans-2024", + "top-5000-th-scans-2024", + "top-10000-th-scans-2024", + "top-50000-th-scans-2024", + "top-100000-th-scans-2024", + "top-100-mu-scans-2024", + "top-500-mu-scans-2024", + "top-1000-mu-scans-2024", + "top-5000-mu-scans-2024", + "top-10000-mu-scans-2024", + "top-50000-mu-scans-2024", + "top-100000-mu-scans-2024", + "top-5000-ua-scans-2024", + "top-10000-ua-scans-2024", + "top-50000-ua-scans-2024", + "top-100000-ua-scans-2024", + "top-10000-ch-scans-2024", + "top-50000-ch-scans-2024", + "top-100000-ch-scans-2024", + "top-500-md-scans-2024", + "top-1000-md-scans-2024", + "top-5000-md-scans-2024", + "top-10000-md-scans-2024", + "top-50000-md-scans-2024", + "top-100000-md-scans-2024", + "top-50000-us-scans-2024", + "top-100000-us-scans-2024", + "top-500-mz-scans-2024", + "top-1000-mz-scans-2024", + "top-5000-mz-scans-2024", + "top-10000-mz-scans-2024", + "top-50000-mz-scans-2024", + "top-100000-mz-scans-2024", + "top-5000-si-scans-2024", + "top-10000-si-scans-2024", + "top-50000-si-scans-2024", + "top-100000-si-scans-2024", + "top-5000-gr-scans-2024", + "top-10000-gr-scans-2024", + "top-50000-gr-scans-2024", + "top-100000-gr-scans-2024", + "top-1000-id-scans-2024", + "top-5000-id-scans-2024", + "top-10000-id-scans-2024", + "top-50000-id-scans-2024", + "top-100000-id-scans-2024", + "top-5000-hu-scans-2024", + "top-10000-hu-scans-2024", + "top-50000-hu-scans-2024", + "top-100000-hu-scans-2024", + "top-500-mt-scans-2024", + "top-1000-mt-scans-2024", + "top-5000-mt-scans-2024", + "top-10000-mt-scans-2024", + "top-50000-mt-scans-2024", + "top-100000-mt-scans-2024", + "top-500-mc-scans-2024", + "top-1000-mc-scans-2024", + "top-5000-mc-scans-2024", + "top-10000-mc-scans-2024", + "top-50000-mc-scans-2024", + "top-100000-mc-scans-2024", + "top-100-np-scans-2024", + "top-500-np-scans-2024", + "top-1000-np-scans-2024", + "top-5000-np-scans-2024", + "top-10000-np-scans-2024", + "top-50000-np-scans-2024", + "top-100000-np-scans-2024", + "top-100-cg-scans-2024", + "top-500-cg-scans-2024", + "top-1000-cg-scans-2024", + "top-5000-cg-scans-2024", + "top-10000-cg-scans-2024", + "top-50000-cg-scans-2024", + "top-100000-cg-scans-2024", + "top-100-gf-scans-2024", + "top-500-gf-scans-2024", + "top-1000-gf-scans-2024", + "top-5000-gf-scans-2024", + "top-10000-gf-scans-2024", + "top-50000-gf-scans-2024", + "top-100000-gf-scans-2024", + "top-500-bd-scans-2024", + "top-1000-bd-scans-2024", + "top-5000-bd-scans-2024", + "top-10000-bd-scans-2024", + "top-50000-bd-scans-2024", + "top-100000-bd-scans-2024", + "top-5000-gp-scans-2024", + "top-10000-gp-scans-2024", + "top-50000-gp-scans-2024", + "top-100000-gp-scans-2024", + "top-5000-ae-scans-2024", + "top-10000-ae-scans-2024", + "top-50000-ae-scans-2024", + "top-100000-ae-scans-2024", + "top-500-ly-scans-2024", + "top-1000-ly-scans-2024", + "top-5000-ly-scans-2024", + "top-10000-ly-scans-2024", + "top-50000-ly-scans-2024", + "top-100000-ly-scans-2024", + "top-5000-mq-scans-2024", + "top-10000-mq-scans-2024", + "top-50000-mq-scans-2024", + "top-100000-mq-scans-2024", + "top-500-br-scans-2024", + "top-1000-br-scans-2024", + "top-5000-br-scans-2024", + "top-10000-br-scans-2024", + "top-50000-br-scans-2024", + "top-100000-br-scans-2024", + "top-500-uy-scans-2024", + "top-1000-uy-scans-2024", + "top-5000-uy-scans-2024", + "top-10000-uy-scans-2024", + "top-50000-uy-scans-2024", + "top-100000-uy-scans-2024", + "top-50-scans-2025", + "top-100-scans-2025", + "top-500-scans-2025", + "top-1000-scans-2025", + "top-5000-scans-2025", + "top-10000-scans-2025", + "top-50000-scans-2025", + "top-100000-scans-2025", + "at-least-5-scans-2025", + "at-least-10-scans-2025", + "top-75-percent-scans-2025", + "top-80-percent-scans-2025", + "top-85-percent-scans-2025", + "top-90-percent-scans-2025", + "top-50-fr-scans-2025", + "top-100-fr-scans-2025", + "top-500-fr-scans-2025", + "top-1000-fr-scans-2025", + "top-5000-fr-scans-2025", + "top-10000-fr-scans-2025", + "top-50000-fr-scans-2025", + "top-100000-fr-scans-2025", + "top-country-fr-scans-2025", + "at-least-5-fr-scans-2025", + "at-least-10-fr-scans-2025", + "top-50-gb-scans-2025", + "top-100-gb-scans-2025", + "top-500-gb-scans-2025", + "top-1000-gb-scans-2025", + "top-5000-gb-scans-2025", + "top-10000-gb-scans-2025", + "top-50000-gb-scans-2025", + "top-100000-gb-scans-2025", + "at-least-5-gb-scans-2025", + "at-least-10-gb-scans-2025", + "top-1000-ma-scans-2025", + "top-5000-ma-scans-2025", + "top-10000-ma-scans-2025", + "top-50000-ma-scans-2025", + "top-100000-ma-scans-2025", + "at-least-5-ma-scans-2025", + "at-least-10-ma-scans-2025", + "top-500-it-scans-2025", + "top-1000-it-scans-2025", + "top-5000-it-scans-2025", + "top-10000-it-scans-2025", + "top-50000-it-scans-2025", + "top-100000-it-scans-2025", + "at-least-5-it-scans-2025", + "at-least-10-it-scans-2025", + "top-1000-es-scans-2025", + "top-5000-es-scans-2025", + "top-10000-es-scans-2025", + "top-50000-es-scans-2025", + "top-100000-es-scans-2025", + "at-least-5-es-scans-2025", + "at-least-10-es-scans-2025", + "top-500-de-scans-2025", + "top-1000-de-scans-2025", + "top-5000-de-scans-2025", + "top-10000-de-scans-2025", + "top-50000-de-scans-2025", + "top-100000-de-scans-2025", + "at-least-5-de-scans-2025", + "at-least-10-de-scans-2025", + "top-100-nl-scans-2025", + "top-500-nl-scans-2025", + "top-1000-nl-scans-2025", + "top-5000-nl-scans-2025", + "top-10000-nl-scans-2025", + "top-50000-nl-scans-2025", + "top-100000-nl-scans-2025", + "at-least-5-nl-scans-2025", + "at-least-10-nl-scans-2025", + "top-500-ro-scans-2025", + "top-1000-ro-scans-2025", + "top-5000-ro-scans-2025", + "top-10000-ro-scans-2025", + "top-50000-ro-scans-2025", + "top-100000-ro-scans-2025", + "at-least-5-ro-scans-2025", + "at-least-10-ro-scans-2025", + "top-50-ie-scans-2025", + "top-100-ie-scans-2025", + "top-500-ie-scans-2025", + "top-1000-ie-scans-2025", + "top-5000-ie-scans-2025", + "top-10000-ie-scans-2025", + "top-50000-ie-scans-2025", + "top-100000-ie-scans-2025", + "at-least-5-ie-scans-2025", + "at-least-10-ie-scans-2025", + "top-1000-be-scans-2025", + "top-5000-be-scans-2025", + "top-10000-be-scans-2025", + "top-50000-be-scans-2025", + "top-100000-be-scans-2025", + "at-least-5-be-scans-2025", + "at-least-10-be-scans-2025", + "top-5000-pt-scans-2025", + "top-10000-pt-scans-2025", + "top-50000-pt-scans-2025", + "top-100000-pt-scans-2025", + "at-least-5-pt-scans-2025", + "top-100-re-scans-2025", + "top-500-re-scans-2025", + "top-1000-re-scans-2025", + "top-5000-re-scans-2025", + "top-10000-re-scans-2025", + "top-50000-re-scans-2025", + "top-100000-re-scans-2025", + "at-least-5-re-scans-2025", + "top-500-at-scans-2025", + "top-1000-at-scans-2025", + "top-5000-at-scans-2025", + "top-10000-at-scans-2025", + "top-50000-at-scans-2025", + "top-100000-at-scans-2025", + "at-least-5-at-scans-2025", + "top-500-se-scans-2025", + "top-1000-se-scans-2025", + "top-5000-se-scans-2025", + "top-10000-se-scans-2025", + "top-50000-se-scans-2025", + "top-100000-se-scans-2025", + "at-least-5-se-scans-2025", + "top-5000-pl-scans-2025", + "top-10000-pl-scans-2025", + "top-50000-pl-scans-2025", + "top-100000-pl-scans-2025", + "at-least-5-pl-scans-2025", + "top-500-sk-scans-2025", + "top-1000-sk-scans-2025", + "top-5000-sk-scans-2025", + "top-10000-sk-scans-2025", + "top-50000-sk-scans-2025", + "top-100000-sk-scans-2025", + "top-500-no-scans-2025", + "top-1000-no-scans-2025", + "top-5000-no-scans-2025", + "top-10000-no-scans-2025", + "top-50000-no-scans-2025", + "top-100000-no-scans-2025", + "top-100-md-scans-2025", + "top-500-md-scans-2025", + "top-1000-md-scans-2025", + "top-5000-md-scans-2025", + "top-10000-md-scans-2025", + "top-50000-md-scans-2025", + "top-100000-md-scans-2025", + "top-50-ae-scans-2025", + "top-100-ae-scans-2025", + "top-500-ae-scans-2025", + "top-1000-ae-scans-2025", + "top-5000-ae-scans-2025", + "top-10000-ae-scans-2025", + "top-50000-ae-scans-2025", + "top-100000-ae-scans-2025", + "top-5000-dz-scans-2025", + "top-10000-dz-scans-2025", + "top-50000-dz-scans-2025", + "top-100000-dz-scans-2025", + "top-5000-ch-scans-2025", + "top-10000-ch-scans-2025", + "top-50000-ch-scans-2025", + "top-100000-ch-scans-2025", + "top-500-fi-scans-2025", + "top-1000-fi-scans-2025", + "top-5000-fi-scans-2025", + "top-10000-fi-scans-2025", + "top-50000-fi-scans-2025", + "top-100000-fi-scans-2025", + "top-10-hk-scans-2025", + "top-50-hk-scans-2025", + "top-100-hk-scans-2025", + "top-500-hk-scans-2025", + "top-1000-hk-scans-2025", + "top-5000-hk-scans-2025", + "top-10000-hk-scans-2025", + "top-50000-hk-scans-2025", + "top-100000-hk-scans-2025", + "top-500-sa-scans-2025", + "top-1000-sa-scans-2025", + "top-5000-sa-scans-2025", + "top-10000-sa-scans-2025", + "top-50000-sa-scans-2025", + "top-100000-sa-scans-2025", + "top-500-dk-scans-2025", + "top-1000-dk-scans-2025", + "top-5000-dk-scans-2025", + "top-10000-dk-scans-2025", + "top-50000-dk-scans-2025", + "top-100000-dk-scans-2025", + "top-50000-us-scans-2025", + "top-100000-us-scans-2025", + "top-5000-cz-scans-2025", + "top-10000-cz-scans-2025", + "top-50000-cz-scans-2025", + "top-100000-cz-scans-2025", + "top-500-za-scans-2025", + "top-1000-za-scans-2025", + "top-5000-za-scans-2025", + "top-10000-za-scans-2025", + "top-50000-za-scans-2025", + "top-100000-za-scans-2025", + "top-100-mu-scans-2025", + "top-500-mu-scans-2025", + "top-1000-mu-scans-2025", + "top-5000-mu-scans-2025", + "top-10000-mu-scans-2025", + "top-50000-mu-scans-2025", + "top-100000-mu-scans-2025", + "top-500-ad-scans-2025", + "top-1000-ad-scans-2025", + "top-5000-ad-scans-2025", + "top-10000-ad-scans-2025", + "top-50000-ad-scans-2025", + "top-100000-ad-scans-2025", + "top-5000-bg-scans-2025", + "top-10000-bg-scans-2025", + "top-50000-bg-scans-2025", + "top-100000-bg-scans-2025", + "top-1000-hu-scans-2025", + "top-5000-hu-scans-2025", + "top-10000-hu-scans-2025", + "top-50000-hu-scans-2025", + "top-100000-hu-scans-2025", + "top-5000-tn-scans-2025", + "top-10000-tn-scans-2025", + "top-50000-tn-scans-2025", + "top-100000-tn-scans-2025", + "top-1000-lu-scans-2025", + "top-5000-lu-scans-2025", + "top-10000-lu-scans-2025", + "top-50000-lu-scans-2025", + "top-100000-lu-scans-2025", + "top-5000-ua-scans-2025", + "top-10000-ua-scans-2025", + "top-50000-ua-scans-2025", + "top-100000-ua-scans-2025", + "top-500-cm-scans-2025", + "top-1000-cm-scans-2025", + "top-5000-cm-scans-2025", + "top-10000-cm-scans-2025", + "top-50000-cm-scans-2025", + "top-100000-cm-scans-2025", + "top-500-je-scans-2025", + "top-1000-je-scans-2025", + "top-5000-je-scans-2025", + "top-10000-je-scans-2025", + "top-50000-je-scans-2025", + "top-100000-je-scans-2025", + "top-500-bj-scans-2025", + "top-1000-bj-scans-2025", + "top-5000-bj-scans-2025", + "top-10000-bj-scans-2025", + "top-50000-bj-scans-2025", + "top-100000-bj-scans-2025", + "top-500-mr-scans-2025", + "top-1000-mr-scans-2025", + "top-5000-mr-scans-2025", + "top-10000-mr-scans-2025", + "top-50000-mr-scans-2025", + "top-100000-mr-scans-2025", + "top-500-ci-scans-2025", + "top-1000-ci-scans-2025", + "top-5000-ci-scans-2025", + "top-10000-ci-scans-2025", + "top-50000-ci-scans-2025", + "top-100000-ci-scans-2025", + "top-100-yt-scans-2025", + "top-500-yt-scans-2025", + "top-1000-yt-scans-2025", + "top-5000-yt-scans-2025", + "top-10000-yt-scans-2025", + "top-50000-yt-scans-2025", + "top-100000-yt-scans-2025", + "top-1000-gp-scans-2025", + "top-5000-gp-scans-2025", + "top-10000-gp-scans-2025", + "top-50000-gp-scans-2025", + "top-100000-gp-scans-2025", + "top-5000-si-scans-2025", + "top-10000-si-scans-2025", + "top-50000-si-scans-2025", + "top-100000-si-scans-2025", + "top-500-pa-scans-2025", + "top-1000-pa-scans-2025", + "top-5000-pa-scans-2025", + "top-10000-pa-scans-2025", + "top-50000-pa-scans-2025", + "top-100000-pa-scans-2025", + "top-1000-il-scans-2025", + "top-5000-il-scans-2025", + "top-10000-il-scans-2025", + "top-50000-il-scans-2025", + "top-100000-il-scans-2025", + "top-5000-ee-scans-2025", + "top-10000-ee-scans-2025", + "top-50000-ee-scans-2025", + "top-100000-ee-scans-2025", + "top-1000-om-scans-2025", + "top-5000-om-scans-2025", + "top-10000-om-scans-2025", + "top-50000-om-scans-2025", + "top-100000-om-scans-2025", + "top-5000-al-scans-2025", + "top-10000-al-scans-2025", + "top-50000-al-scans-2025", + "top-100000-al-scans-2025", + "top-1000-pf-scans-2025", + "top-5000-pf-scans-2025", + "top-10000-pf-scans-2025", + "top-50000-pf-scans-2025", + "top-100000-pf-scans-2025" + ], + "product": {}, + "product_name": "Edelbitter-Schokolade", + "product_name_de": "Edelbitterschokolade Mild 90%", + "product_name_en": "Edelbitter-Schokolade", + "product_name_es": "Excellence chocolate 90% cacao", + "product_name_fi": "Excellence: 90% cocoa Dark Supreme", + "product_name_fr": "Excellence Noir Prodigieux 90% Cacao", + "product_name_it": "Fondente Prodigioso 90% Cacao", + "product_name_ja": "", + "product_name_nb": "", + "product_name_nl": "", + "product_name_pl": "", + "product_name_sv": "90% Cocoa", + "product_quantity": 100, + "product_quantity_unit": "g", + "product_type": "food", + "purchase_places": "Burlington, Deutschland, España, France, Italia, Madrid, Montargis, Oakville, République tchèque, Singapore, Toronto, Würzburg", + "purchase_places_hierarchy": [ + "Burlington", + "Deutschland", + "España", + "France", + "Italia", + "Madrid", + "Montargis", + "Oakville", + "République tchèque", + "Singapore", + "Toronto", + "Würzburg" + ], + "purchase_places_lc": "en", + "purchase_places_tags": [ + "Burlington", + "Deutschland", + "España", + "France", + "Italia", + "Madrid", + "Montargis", + "Oakville", + "République tchèque", + "Singapore", + "Toronto", + "Würzburg" + ], + "quantity": "100 g", + "removed_countries_tags": [], + "rev": 546, + "scans_n": 1264, + "schema_version": 999, + "scores": {}, + "selected_images": { + "front": { + "display": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_de.517.400.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.400.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_es.401.400.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_fi.445.400.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_it.417.400.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_nb.437.400.jpg" + }, + "small": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_de.517.200.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.200.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_es.401.200.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_fi.445.200.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_it.417.200.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_nb.437.200.jpg" + }, + "thumb": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_de.517.100.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_en.544.100.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_es.401.100.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_fi.445.100.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_it.417.100.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/front_nb.437.100.jpg" + } + }, + "ingredients": { + "display": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_de.343.400.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_en.529.400.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_es.229.400.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_fi.169.400.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_fr.523.400.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_it.419.400.jpg", + "ja": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_ja.500.400.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_nb.443.400.jpg", + "pl": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_pl.400.400.jpg", + "sv": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_sv.197.400.jpg" + }, + "small": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_de.343.200.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_en.529.200.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_es.229.200.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_fi.169.200.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_fr.523.200.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_it.419.200.jpg", + "ja": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_ja.500.200.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_nb.443.200.jpg", + "pl": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_pl.400.200.jpg", + "sv": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_sv.197.200.jpg" + }, + "thumb": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_de.343.100.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_en.529.100.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_es.229.100.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_fi.169.100.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_fr.523.100.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_it.419.100.jpg", + "ja": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_ja.500.100.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_nb.443.100.jpg", + "pl": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_pl.400.100.jpg", + "sv": "https://images.openfoodfacts.net/images/products/304/692/002/9759/ingredients_sv.197.100.jpg" + } + }, + "nutrition": { + "display": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_de.345.400.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_en.546.400.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_es.180.400.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_fi.446.400.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_fr.462.400.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_it.421.400.jpg", + "ja": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_ja.499.400.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_nb.441.400.jpg", + "sv": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_sv.201.400.jpg" + }, + "small": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_de.345.200.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_en.546.200.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_es.180.200.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_fi.446.200.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_fr.462.200.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_it.421.200.jpg", + "ja": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_ja.499.200.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_nb.441.200.jpg", + "sv": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_sv.201.200.jpg" + }, + "thumb": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_de.345.100.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_en.546.100.jpg", + "es": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_es.180.100.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_fi.446.100.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_fr.462.100.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_it.421.100.jpg", + "ja": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_ja.499.100.jpg", + "nb": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_nb.441.100.jpg", + "sv": "https://images.openfoodfacts.net/images/products/304/692/002/9759/nutrition_sv.201.100.jpg" + } + }, + "packaging": { + "display": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_de.347.400.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_en.531.400.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_fi.447.400.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_fr.379.400.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_it.423.400.jpg" + }, + "small": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_de.347.200.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_en.531.200.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_fi.447.200.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_fr.379.200.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_it.423.200.jpg" + }, + "thumb": { + "de": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_de.347.100.jpg", + "en": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_en.531.100.jpg", + "fi": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_fi.447.100.jpg", + "fr": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_fr.379.100.jpg", + "it": "https://images.openfoodfacts.net/images/products/304/692/002/9759/packaging_it.423.100.jpg" + } + } + }, + "serving_quantity": 10, + "serving_quantity_unit": "g", + "serving_size": "1 square (10 g)", + "sortkey": 1608126304, + "sources": [ + { + "fields": [ + "countries", + "ingredients_text_it" + ], + "id": "openfood-ch", + "images": [], + "import_t": 1548767357, + "manufacturer": "0", + "name": "FoodRepo", + "source_licence": "Creative Commons Attribution 4.0 International License", + "source_licence_url": "https://creativecommons.org/licenses/by/4.0/", + "url": "https://www.foodrepo.org/ch/products/985" + } + ], + "states": "To be completed, Nutrition facts completed, Ingredients completed, Expiration date completed, Packaging code to be completed, Characteristics to be completed, Origins to be completed, Categories completed, Brands completed, Packaging completed, Quantity completed, Product name completed, Photos validated, Packaging photo selected, Nutrition photo selected, Ingredients photo selected, Front photo selected, Photos uploaded", + "states_hierarchy": [ + "en:to-be-completed", + "en:nutrition-facts-completed", + "en:ingredients-completed", + "en:expiration-date-completed", + "en:packaging-code-to-be-completed", + "en:characteristics-to-be-completed", + "en:origins-to-be-completed", + "en:categories-completed", + "en:brands-completed", + "en:packaging-completed", + "en:quantity-completed", + "en:product-name-completed", + "en:photos-validated", + "en:packaging-photo-selected", + "en:nutrition-photo-selected", + "en:ingredients-photo-selected", + "en:front-photo-selected", + "en:photos-uploaded" + ], + "states_tags": [ + "en:to-be-completed", + "en:nutrition-facts-completed", + "en:ingredients-completed", + "en:expiration-date-completed", + "en:packaging-code-to-be-completed", + "en:characteristics-to-be-completed", + "en:origins-to-be-completed", + "en:categories-completed", + "en:brands-completed", + "en:packaging-completed", + "en:quantity-completed", + "en:product-name-completed", + "en:photos-validated", + "en:packaging-photo-selected", + "en:nutrition-photo-selected", + "en:ingredients-photo-selected", + "en:front-photo-selected", + "en:photos-uploaded" + ], + "stores": "COOP, Carrefour, Consum, El Corte Inglés, Esselunga, Géant, Lindt, Magasins U, Marché U, Meny, Walmart, carrefour.fr, kupsch", + "stores_hierarchy": [ + "COOP", + "Carrefour", + "Consum", + "El Corte Inglés", + "Esselunga", + "Géant", + "Lindt", + "Magasins U", + "Marché U", + "Meny", + "Walmart", + "carrefour.fr", + "kupsch" + ], + "stores_lc": "en", + "stores_tags": [ + "COOP", + "Carrefour", + "Consum", + "El Corte Inglés", + "Esselunga", + "Géant", + "Lindt", + "Magasins U", + "Marché U", + "Meny", + "Walmart", + "carrefour.fr", + "kupsch" + ], + "teams": "stakano,chocolatine,swipe-studio,pain-au-chocolat,bodysupport", + "teams_tags": [ + "stakano", + "chocolatine", + "swipe-studio", + "pain-au-chocolat", + "bodysupport" + ], + "traces": "nuts", + "traces_from_ingredients": "hazelnuts", + "traces_from_user": "(en) ", + "traces_hierarchy": [ + "en:nuts" + ], + "traces_lc": "en", + "traces_tags": [ + "en:nuts" + ], + "unique_scans_n": 1193, + "unknown_ingredients_n": 0, + "unknown_nutrients_tags": [], + "update_key": "key_1748337248", + "vitamins_prev_tags": [], + "vitamins_tags": [], + "weighers_tags": [ + "marmotte73" + ], + "weighters_tags": [ + "marmotte73" + ] + }, + "result": { + "id": "product_found", + "lc_name": "Product found", + "name": "Product found" + }, + "status": "success", + "warnings": [] + } + } +} diff --git a/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_barcode_not_found.json b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_barcode_not_found.json new file mode 100644 index 000000000..c526240ba --- /dev/null +++ b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_barcode_not_found.json @@ -0,0 +1,45 @@ +{ + "request": { + "urlPathPattern": "/openfoodfacts/api/v3/product/?!3046920029759(?=/|$))$.json", + "method": "GET" + }, + "response": { + "status": 404, + "headers": { + "Content-Type": "application/json" + }, + "delayDistribution": { + "type": "lognormal", + "median": 5000, + "sigma": 0.4 + }, + "jsonBody": { + "code": "304692002975000", + "errors": [ + { + "field": { + "id": "code", + "value": "304692002975000" + }, + "impact": { + "id": "failure", + "lc_name": "Failure", + "name": "Failure" + }, + "message": { + "id": "product_not_found", + "lc_name": "", + "name": "" + } + } + ], + "result": { + "id": "product_not_found", + "lc_name": "Product not found", + "name": "Product not found" + }, + "status": "failure", + "warnings": [] + } + } +} diff --git a/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_search.json b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_search.json new file mode 100644 index 000000000..db6759746 --- /dev/null +++ b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_search.json @@ -0,0 +1,49 @@ +{ + "request": { + "urlPathPattern": "/openfoodfacts/search", + "method": "GET", + "queryParameters": { + "q": { + "matches": "beshbarmak" + }, + "page_size": { + "matches": ".*" + } + } + }, + "response": { + "transformers": ["response-template"], + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "delayDistribution": { + "type": "lognormal", + "median": 5000, + "sigma": 0.4 + }, + "jsonBody": { + "count": 1, + "page": 1, + "page_count": 1, + "page_size": "{{request.query.page_size}}", + "hits": [ + { + "code": "8901764042706", + "product_name": "Thums Up", + "generic_name": "Indian cola soft drink", + "brands": "cola", + "categories": "Beverages, Colas", + "countries": "India", + "quantity": "600ml", + "nutrition_grades": "e", + "nova_groups": "4", + "url": "https://world.openfoodfacts.net/product/8901764042706/thums-up", + "image_url": "https://images.openfoodfacts.org/images/products/890/176/404/2706/front_en.400.jpg", + "image_front_url": "https://images.openfoodfacts.org/images/products/890/176/404/2706/front_en.400.jpg" + } + ], + "skip": 0 + } + } +} diff --git a/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_search_not_found.json b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_search_not_found.json new file mode 100644 index 000000000..08ea053f2 --- /dev/null +++ b/software/plugins/external-item-search/dev/services/mappings/openfoodfacts/openfoodfacts_search_not_found.json @@ -0,0 +1,34 @@ +{ + "request": { + "urlPathPattern": "/openfoodfacts/search", + "method": "GET", + "queryParameters": { + "q": { + "matches": "^(?!beshbarmak$).+" + }, + "page_size": { + "matches": ".*" + } + } + }, + "response": { + "transformers": ["response-template"], + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "delayDistribution": { + "type": "lognormal", + "median": 5000, + "sigma": 0.4 + }, + "jsonBody": { + "count": 0, + "page": 1, + "page_count": 0, + "page_size": "{{request.query.page_size}}", + "hits": [], + "skip": 0 + } + } +} diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/interfaces/ItemLookupRestInterface.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/interfaces/ItemLookupRestInterface.java index 034a110ad..6af94330d 100644 --- a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/interfaces/ItemLookupRestInterface.java +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/interfaces/ItemLookupRestInterface.java @@ -12,9 +12,6 @@ import jakarta.ws.rs.core.MediaType; import lombok.extern.slf4j.Slf4j; import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.enums.SchemaType; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.eclipse.microprofile.openapi.annotations.tags.Tags; diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/ExtItemLookupService.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/ExtItemLookupService.java index 5962c6105..de67cf42b 100644 --- a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/ExtItemLookupService.java +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/ExtItemLookupService.java @@ -12,14 +12,20 @@ import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.ItemSearchService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.barcodeLookup.BarcodeLookupService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.dataKick.DatakickService; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.openfoodfacts.OpenFoodFactsService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.rebrickable.RebrickableService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.upcItemDb.UpcItemDbService; import tech.ebp.oqm.plugin.extItemSearch.model.ExtItemLookupProviderInfo; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.LookupMethod; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.LookupService; -import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.LookupSource; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; @ApplicationScoped @Slf4j @@ -43,12 +49,14 @@ public ExtItemLookupService( DatakickService datakickService, RebrickableService rebrickableService, BarcodeLookupService barcodeLookupService, - UpcItemDbService upcItemDbService + UpcItemDbService upcItemDbService, + OpenFoodFactsService openFoodFactsService ) { this.searchServices.add(datakickService); this.searchServices.add(rebrickableService); this.searchServices.add(barcodeLookupService); this.searchServices.add(upcItemDbService); + this.searchServices.add(openFoodFactsService); } public Set getSearchServices() { diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/dataKick/DataKickLookupClient.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/dataKick/DataKickLookupClient.java index d6469e705..2918fba28 100644 --- a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/dataKick/DataKickLookupClient.java +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/dataKick/DataKickLookupClient.java @@ -1,19 +1,14 @@ package tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.dataKick; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import io.opentelemetry.instrumentation.annotations.WithSpan; import io.quarkus.cache.CacheResult; -import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; -import java.util.concurrent.CompletionStage; - @Path("/api/items/") @RegisterRestClient(configKey = "datakick") public interface DataKickLookupClient { diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsLookupClient.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsLookupClient.java new file mode 100644 index 000000000..23124217e --- /dev/null +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsLookupClient.java @@ -0,0 +1,21 @@ +package tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.openfoodfacts; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.quarkus.cache.CacheResult; +import io.smallrye.mutiny.Uni; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +@RegisterRestClient(configKey = "openfoodfacts") +@RegisterClientHeaders(OpenFoodFactsUserAgentHeadersFactory.class) +public interface OpenFoodFactsLookupClient { + @WithSpan + @GET + @Path("/api/v3/product/{barcode}") + @CacheResult(cacheName = "openfoodfacts-product") + Uni getProduct(@PathParam("barcode") String barcode); +} diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsSearchClient.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsSearchClient.java new file mode 100644 index 000000000..b80d5b3bd --- /dev/null +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsSearchClient.java @@ -0,0 +1,24 @@ +package tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.openfoodfacts; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.quarkus.cache.CacheResult; +import io.smallrye.mutiny.Uni; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +@RegisterRestClient(configKey = "openfoodfacts-search") +@RegisterClientHeaders(OpenFoodFactsUserAgentHeadersFactory.class) +public interface OpenFoodFactsSearchClient { + @WithSpan + @GET + @Path("/search") + @CacheResult(cacheName = "openfoodfacts-search") + Uni search( + @QueryParam("page_size") int pageSize, + @QueryParam("q") String query + ); +} diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsService.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsService.java new file mode 100644 index 000000000..a69542f3e --- /dev/null +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsService.java @@ -0,0 +1,287 @@ +package tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.openfoodfacts; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import io.smallrye.mutiny.Multi; +import jakarta.enterprise.context.ApplicationScoped; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.jboss.resteasy.reactive.ClientWebApplicationException; +import tech.ebp.oqm.plugin.extItemSearch.model.ExtItemLookupProviderInfo; +import tech.ebp.oqm.plugin.extItemSearch.model.lookupResult.ExtItemLookupResult; +import tech.ebp.oqm.plugin.extItemSearch.model.lookupResult.LookupResult; +import tech.ebp.oqm.plugin.extItemSearch.model.lookupResult.LookupResultNoResults; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.ItemSearchService; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.LookupMethod; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.LookupService; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.LookupSource; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.utils.ResultMappingUtils; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@ApplicationScoped +@Slf4j +public class OpenFoodFactsService extends ItemSearchService { + + private final OpenFoodFactsLookupClient openFoodFactsLookupClient; + private final OpenFoodFactsSearchClient openFoodFactsSearchClient; + private final int responseSize; + + public OpenFoodFactsService( + @RestClient OpenFoodFactsLookupClient openFoodFactsLookupClient, + @RestClient OpenFoodFactsSearchClient openFoodFactsSearchClient, + @ConfigProperty(name = "productLookup.providers.openfoodfacts.enabled", defaultValue = "true") boolean enabled, + @ConfigProperty(name = "productLookup.providers.openfoodfacts.responseSize", defaultValue = "10") int responseSize) { + super( + enabled, + LookupService.OPENFOODFACTS, + ExtItemLookupProviderInfo. + builder() + .displayName("Open Food Facts") + .description("Open database of food products") + .cost("free") + .acceptsContributions(true) + .homepage(URI.create("https://openfoodfacts.github.io"))); + this.openFoodFactsLookupClient = openFoodFactsLookupClient; + this.openFoodFactsSearchClient = openFoodFactsSearchClient; + this.responseSize = responseSize; + } + + @Override + protected Optional handleClientError(LookupSource source, LookupMethod method, ClientWebApplicationException e) { + if (e.getResponse().getStatus() == 404) { + return Optional.of( + this.setupResponseBuilder(LookupResultNoResults.builder(), source, method) + .detail("No items found.") + .build() + ); + } + return Optional.empty(); + } + + @Override + protected Multi performSearch(LookupSource source, LookupMethod lookupMethod, String term) { + if(source != LookupSource.OPENFOODFACTS) { + return Multi.createFrom().empty(); + } + return switch (source) { + case OPENFOODFACTS -> + switch (lookupMethod) { + case BARCODE -> this.openFoodFactsLookupClient.getProduct(term) + .map(result -> this.partJsonToResult(source, lookupMethod, result)) + .onFailure().recoverWithItem(e -> this.handleError(source, lookupMethod, e)) + .toMulti(); + case TEXT -> this.openFoodFactsSearchClient.search(responseSize, term) + .map(result -> this.searchJsonToResults(source, lookupMethod, result)) + .onFailure().recoverWithItem(e -> this.handleErrorRetCollection(source, lookupMethod, e)) + .onItem().transformToMulti(collection -> Multi.createFrom().iterable(collection)); + default -> throw new IllegalArgumentException("Invalid lookup method: " + lookupMethod); + }; + default -> throw new IllegalArgumentException("Invalid lookup source: " + source); + }; + } + + private LookupResult partJsonToResult(LookupSource source, LookupMethod method, ObjectNode results) { + log.debug("Data from OpenFoodFacts: {}", results.toPrettyString()); + ExtItemLookupResult.Builder resultBuilder = this.setupResponseBuilder(ExtItemLookupResult.builder(), source, method); + + if (results.get("product") != null && results.get("product").isObject()) { + results = (ObjectNode) results.get("product"); + } + + List images = new ArrayList<>(); + Map links = new HashMap<>(); + Map identifiers = new HashMap<>(); + Map attributes = new HashMap<>(); + String description = ""; + String name = ""; + + for (Map.Entry currentMap : results.properties()) { + String currentKey = currentMap.getKey(); + JsonNode currentVal = currentMap.getValue(); + + if (ResultMappingUtils.isFieldEmpty(currentVal)) { + continue; + } + + switch (currentKey) { + case "product_name" -> { + name = currentVal.asText(); + resultBuilder.name(name); + resultBuilder.unifiedName(name); + } + case "generic_name", "ingredients_text" -> { + if (description.isBlank()) { + description = currentVal.asText(); + } else { + attributes.put(currentKey, currentVal.asText()); + } + } + case "code", "_id" -> identifiers.put(currentKey, currentVal.asText()); + case "url", "link" -> links.put("openfoodfacts", currentVal.asText()); + case "image_url", + "image_small_url", + "image_thumb_url", + "image_front_url", + "image_front_small_url", + "image_front_thumb_url", + "image_ingredients_url", + "image_ingredients_small_url", + "image_ingredients_thumb_url", + "image_nutrition_url", + "image_nutrition_small_url", + "image_nutrition_thumb_url", + "image_packaging_url", + "image_packaging_small_url", + "image_packaging_thumb_url" -> images.add(currentVal.asText()); + case "images", "selected_images" -> collectImageUrls(currentVal, images); + case "brands", + "categories", + "countries", + "origins", + "stores", + "quantity", + "product_quantity", + "product_type", + "packaging_text", + "nova_group", + "nutrition_grade_fr", + "nutrition_grades" -> attributes.put(currentKey, currentVal.asText()); + default -> putAttribute(attributes, currentKey, currentVal); + } + + } + + if (description.isBlank()) { + description = firstNonBlank( + name, + identifiers.get("code"), + identifiers.get("_id") + ); + } + + if (name.isBlank()) { + name = firstNonBlank( + description, + identifiers.get("code"), + identifiers.get("_id") + ); + } + + if (name.isBlank()) { + name = "OpenFoodFacts item"; + } + + if (description.isBlank()) { + description = name; + } + + resultBuilder + .name(name) + .unifiedName(firstNonBlank(name, description, identifiers.get("code"), identifiers.get("_id"))) + .description(description) + .identifiers(identifiers) + .links(links) + .images(images) + .attributes(attributes); + + return resultBuilder.build(); + } + + private Collection searchJsonToResults(LookupSource source, LookupMethod method, ObjectNode results) { + log.debug("Search data from OpenFoodFacts: {}", results.toPrettyString()); + + JsonNode productsNode = firstArrayNode(results, "hits", "products"); + if (ResultMappingUtils.isFieldEmpty(productsNode)) { + return List.of( + this.setupResponseBuilder(LookupResultNoResults.builder(), source, method) + .detail("No items found.") + .build() + ); + } + + List output = new ArrayList<>(); + for (JsonNode product : productsNode) { + if (product != null && product.isObject()) { + output.add(this.partJsonToResult(source, method, (ObjectNode) product)); + } + } + + if (output.isEmpty()) { + return List.of( + this.setupResponseBuilder(LookupResultNoResults.builder(), source, method) + .detail("No items found.") + .build() + ); + } + + return output; + } + + private static JsonNode firstArrayNode(ObjectNode results, String... fields) { + for (String field : fields) { + JsonNode node = results.get(field); + if (node != null && node.isArray()) { + return node; + } + } + return null; + } + + private static void putAttribute(Map attributes, String key, JsonNode value) { + if (value == null || value.isNull()) { + return; + } + + if (value.isTextual() || value.isNumber() || value.isBoolean()) { + attributes.put(key, value.asText()); + return; + } + + attributes.put(key, value.toString()); + } + + private static void collectImageUrls(JsonNode node, List images) { + if (node == null || node.isNull()) { + return; + } + + if (node.isTextual()) { + String url = node.asText(); + if (!url.isBlank() && url.startsWith("http")) { + images.add(url); + } + return; + } + + if (node.isArray()) { + for (JsonNode curNode : node) { + collectImageUrls(curNode, images); + } + return; + } + + if (node.isObject()) { + for (Iterator iter = node.elements(); iter.hasNext(); ) { + collectImageUrls(iter.next(), images); + } + } + } + + private static String firstNonBlank(String... values) { + for (String value : values) { + if (value != null && !value.isBlank()) { + return value; + } + } + return ""; + } +} diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsUserAgentHeadersFactory.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsUserAgentHeadersFactory.java new file mode 100644 index 000000000..4243bdd15 --- /dev/null +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/openfoodfacts/OpenFoodFactsUserAgentHeadersFactory.java @@ -0,0 +1,34 @@ +package tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.openfoodfacts; + +import jakarta.enterprise.context.ApplicationScoped; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.rest.client.ext.ClientHeadersFactory; +import jakarta.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.core.MultivaluedMap; + +@ApplicationScoped +public class OpenFoodFactsUserAgentHeadersFactory implements ClientHeadersFactory { + + private final String userAgent; + + public OpenFoodFactsUserAgentHeadersFactory( + @ConfigProperty(name = "service.gitLink") + String appName, + @ConfigProperty(name = "service.version") + String appVersion, + @ConfigProperty(name = "service.email", defaultValue = "openquartermaster.com") + String contactEmail + ) { + this.userAgent = appName + "/" + appVersion + " (" + contactEmail + ")"; + } + + @Override + public MultivaluedMap update( + MultivaluedMap incomingHeaders, + MultivaluedMap clientOutgoingHeaders + ) { + MultivaluedMap headers = new MultivaluedHashMap<>(clientOutgoingHeaders); + headers.add("User-Agent", this.userAgent); + return headers; + } +} diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/rebrickable/RebrickableService.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/rebrickable/RebrickableService.java index 654a43273..3113a56ce 100644 --- a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/rebrickable/RebrickableService.java +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/providers/rebrickable/RebrickableService.java @@ -85,7 +85,7 @@ public boolean isEnabled() { public LookupResult partJsonToResult(LookupSource source, LookupMethod method, ObjectNode results) { log.info("Search result: {}", results); ExtItemLookupResult.Builder resultBuilder = this.setupResponseBuilder(ExtItemLookupResult.builder(), source, method); - + List images = new ArrayList<>(); Map links = new HashMap<>(); Map identifiers = new HashMap<>(); diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupService.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupService.java index b21a05a93..7da801703 100644 --- a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupService.java +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupService.java @@ -3,6 +3,7 @@ import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.ItemSearchService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.barcodeLookup.BarcodeLookupService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.dataKick.DatakickService; +import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.openfoodfacts.OpenFoodFactsService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.rebrickable.RebrickableService; import tech.ebp.oqm.plugin.extItemSearch.service.extItemSearchService.providers.upcItemDb.UpcItemDbService; @@ -30,12 +31,17 @@ public enum LookupService { List.of(LookupSource.UPC_ITEM_DB), List.of(LookupMethod.BARCODE) ), - ; - + OPENFOODFACTS( + OpenFoodFactsService.class, + List.of(LookupSource.OPENFOODFACTS), + List.of(LookupMethod.BARCODE, LookupMethod.TEXT) + ) + ; + public final Class searchClass; public final Collection supportedSources; public final Collection supportedMethods; - + LookupService( Class searchClass, Collection supportedSources, diff --git a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupSource.java b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupSource.java index d7c3a81a4..7f9f6db6c 100644 --- a/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupSource.java +++ b/software/plugins/external-item-search/src/main/java/tech/ebp/oqm/plugin/extItemSearch/service/extItemSearchService/utils/LookupSource.java @@ -5,6 +5,5 @@ public enum LookupSource { DATAKICK, REBRICKABLE, UPC_ITEM_DB, - ; - + OPENFOODFACTS } diff --git a/software/plugins/external-item-search/src/main/resources/application.yml b/software/plugins/external-item-search/src/main/resources/application.yml index 1fc9a926d..02c0e86fb 100644 --- a/software/plugins/external-item-search/src/main/resources/application.yml +++ b/software/plugins/external-item-search/src/main/resources/application.yml @@ -16,6 +16,8 @@ productLookup: upcitemdb: enabled: true apiKey: " " + openfoodfacts: + enabled: true quarkus: container-image: @@ -41,6 +43,12 @@ quarkus: rebrickable: url: https://rebrickable.com scope: jakarta.inject.Singleton + openfoodfacts: + url: https://world.openfoodfacts.net + scope: jakarta.inject.Singleton + openfoodfacts-search: + url: https://search.openfoodfacts.net + scope: jakarta.inject.Singleton smallrye-openapi: info-title: External Item Search API info-version: ${quarkus.application.version} @@ -98,3 +106,7 @@ quarkus: scope: jakarta.inject.Singleton rebrickable: url: http://localhost:${quarkus.wiremock.devservices.port}/rebrickable/ + openfoodfacts: + url: http://localhost:${quarkus.wiremock.devservices.port}/openfoodfacts/ + openfoodfacts-search: + url: http://localhost:${quarkus.wiremock.devservices.port}/openfoodfacts/ diff --git a/software/plugins/external-item-search/src/test/resources/application.yaml b/software/plugins/external-item-search/src/test/resources/application.yaml index 5b1ed6e6a..df0219b7b 100644 --- a/software/plugins/external-item-search/src/test/resources/application.yaml +++ b/software/plugins/external-item-search/src/test/resources/application.yaml @@ -11,6 +11,10 @@ productLookup: barcodelookup-com: url: http://localhost:${quarkus.wiremock.devservices.port}/barcodelookup/ apiKey: devKey + openfoodfacts: + url: http://localhost:${quarkus.wiremock.devservices.port}/openfoodfacts/ + openfoodfacts-search: + url: http://localhost:${quarkus.wiremock.devservices.port}/openfoodfacts/ quarkus: http: