From efa39b4263f22aba06cef08a33be031933bea98c Mon Sep 17 00:00:00 2001
From: Diego Rey Mendez <diegoreymendez@users.noreply.github.com>
Date: Fri, 17 Nov 2023 02:34:27 +0100
Subject: [PATCH 01/40] Updates BSK (#2173)

---
 DuckDuckGo.xcodeproj/project.pbxproj                          | 2 +-
 .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index df675a8b52..41659805c7 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9143,7 +9143,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 84.1.0;
+				version = 84.1.1;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 5c2f7dbb33..a9e3205a3a 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "641018cef1a3a13e9fdeb490b18639d1cb25569f",
-          "version": "84.1.0"
+          "revision": "b97c451037f7a24aef6389be8252df301d2294cd",
+          "version": "84.1.1"
         }
       },
       {

From 1809630cc4f44899bdb8dc61104f7d5cf3459718 Mon Sep 17 00:00:00 2001
From: Lorenzo Mattei <lore.mattei@gmail.com>
Date: Fri, 17 Nov 2023 12:55:21 +0100
Subject: [PATCH 02/40] Update email protection e2e test to match the new UI
 (#2170)

---
 .maestro/release_tests/emailprotection.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.maestro/release_tests/emailprotection.yaml b/.maestro/release_tests/emailprotection.yaml
index 67b41ef000..e4cc61fba4 100644
--- a/.maestro/release_tests/emailprotection.yaml
+++ b/.maestro/release_tests/emailprotection.yaml
@@ -17,7 +17,7 @@ tags:
 - scroll
 - scroll
 - assertVisible: Email Protection
-- tapOn: Email Protection, Block email trackers and hide your address
+- tapOn: Email Protection
 - assertVisible:
     id: searchEntry
 - assertVisible: https://duckduckgo.com/email/

From 3bddbca2ca7d0f0b6c0553136fb82fe694944280 Mon Sep 17 00:00:00 2001
From: Christopher Brind <brindy@duckduckgo.com>
Date: Fri, 17 Nov 2023 12:32:11 +0000
Subject: [PATCH 03/40] fix pass kit related crash on iPad (#2171)

---
 DuckDuckGo/FilePreviewHelper.swift    | 5 ++++-
 DuckDuckGo/PassKitPreviewHelper.swift | 5 +++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/DuckDuckGo/FilePreviewHelper.swift b/DuckDuckGo/FilePreviewHelper.swift
index f13b508379..f8f4009311 100644
--- a/DuckDuckGo/FilePreviewHelper.swift
+++ b/DuckDuckGo/FilePreviewHelper.swift
@@ -33,7 +33,10 @@ struct FilePreviewHelper {
     
     static func canAutoPreviewMIMEType(_ mimeType: MIMEType) -> Bool {
         switch mimeType {
-        case .reality, .usdz, .passbook, .calendar:
+        case .passbook:
+            return UIDevice.current.userInterfaceIdiom == .phone
+
+        case .reality, .usdz, .calendar:
             return true
         default:
             return false
diff --git a/DuckDuckGo/PassKitPreviewHelper.swift b/DuckDuckGo/PassKitPreviewHelper.swift
index 6b95cbe2e6..3a734eee03 100644
--- a/DuckDuckGo/PassKitPreviewHelper.swift
+++ b/DuckDuckGo/PassKitPreviewHelper.swift
@@ -34,8 +34,9 @@ class PassKitPreviewHelper: FilePreview {
         do {
             let data = try Data(contentsOf: self.filePath)
             let pass = try PKPass(data: data)
-            let controller = PKAddPassesViewController(pass: pass)!
-            viewController?.present(controller, animated: true)
+            if let controller = PKAddPassesViewController(pass: pass) {
+                viewController?.present(controller, animated: true)
+            }
         } catch {
             os_log("Can't present passkit: %s", type: .debug, error.localizedDescription)
         }

From a70e29e68c5639bf72e88db7d7c2edc8a3620e06 Mon Sep 17 00:00:00 2001
From: Federico Cappelli <fcappelli@duckduckgo.com>
Date: Tue, 21 Nov 2023 12:10:03 +0000
Subject: [PATCH 04/40] Removed unarchiveTopLevelObjectWithData deprecation
 (#2176)

Task/Issue URL: https://app.asana.com/0/414709148257752/1205990984763603/f

Description:

I replaced the deprecated (iOS 12) API unarchiveTopLevelObjectWithData maintaining the use of non-secure coding in order to achieve backward compatibility with the already saved Tabs.

All functions that can throw errors are now correctly handled and in case of an error, a log is added.
---
 .../TabsModelPersistenceExtension.swift       | 28 +++++++++++++++----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/DuckDuckGo/TabsModelPersistenceExtension.swift b/DuckDuckGo/TabsModelPersistenceExtension.swift
index 184799ffe5..a7a046b890 100644
--- a/DuckDuckGo/TabsModelPersistenceExtension.swift
+++ b/DuckDuckGo/TabsModelPersistenceExtension.swift
@@ -18,6 +18,8 @@
 //
 
 import Foundation
+import Core
+import Common
 
 extension TabsModel {
 
@@ -26,8 +28,21 @@ extension TabsModel {
     }
 
     public static func get() -> TabsModel? {
-        guard let data = UserDefaults.app.object(forKey: Constants.key) as? Data else { return nil }
-        return try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? TabsModel
+        guard let data = UserDefaults.app.object(forKey: Constants.key) as? Data else {
+            return nil
+        }
+        var tabsModel: TabsModel?
+        do {
+            let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
+            unarchiver.requiresSecureCoding = false
+            tabsModel = unarchiver.decodeObject(of: self, forKey: NSKeyedArchiveRootObjectKey)
+            if let error = unarchiver.error {
+                throw error
+            }
+        } catch {
+            os_log("Something went wrong unarchiving TabsModel %@", log: .generalLog, type: .error, error.localizedDescription)
+        }
+        return tabsModel
     }
 
     public static func clear() {
@@ -35,8 +50,11 @@ extension TabsModel {
     }
 
     func save() {
-        guard let data = try? NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false) else { return }
-        UserDefaults.app.set(data, forKey: Constants.key)
+        do {
+            let data = try NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false)
+            UserDefaults.app.set(data, forKey: Constants.key)
+        } catch {
+            os_log("Something went wrong archiving TabsModel %@", log: .generalLog, type: .error, error.localizedDescription)
+        }
     }
-    
 }

From 2329ac832e3598018c7113ec9f200a894c1bccb3 Mon Sep 17 00:00:00 2001
From: Christopher Brind <brindy@duckduckgo.com>
Date: Tue, 21 Nov 2023 12:36:40 +0000
Subject: [PATCH 05/40] remove redundant orientation detection (#2178)

Task/Issue URL: https://app.asana.com/0/414709148257752/1205887735214021/f
Tech Design URL:
CC:

Description:

Fix text selection bug.
---
 DuckDuckGo/MainViewController.swift | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift
index bbc4f9f9d3..66785d4359 100644
--- a/DuckDuckGo/MainViewController.swift
+++ b/DuckDuckGo/MainViewController.swift
@@ -250,7 +250,6 @@ class MainViewController: UIViewController {
         registerForApplicationEvents()
         registerForCookiesManagedNotification()
         registerForSettingsChangeNotifications()
-        registerForOrientationChangeNotification()
 
         tabManager.cleanupTabsFaviconCache()
 
@@ -276,17 +275,6 @@ class MainViewController: UIViewController {
         super.performSegue(withIdentifier: identifier, sender: sender)
     }
 
-    func registerForOrientationChangeNotification() {
-        NotificationCenter.default.addObserver(self,
-                                               selector: #selector(orientationDidChange),
-                                               name: UIDevice.orientationDidChangeNotification,
-                                               object: nil)
-    }
-
-    @objc func orientationDidChange() {
-        onAddressBarPositionChanged()
-    }
-
     func loadSuggestionTray() {
         let storyboard = UIStoryboard(name: "SuggestionTray", bundle: nil)
 

From 34c216338e2aa575f9036391292922ce87df1bfd Mon Sep 17 00:00:00 2001
From: Maxim Tsoy <maks.tsoy@gmail.com>
Date: Tue, 21 Nov 2023 14:10:59 +0100
Subject: [PATCH 06/40] Bump autoconsent to 6.4.0 (#2174)

---
 DuckDuckGo/Autoconsent/autoconsent-bundle.js | 2 +-
 package-lock.json                            | 8 ++++----
 package.json                                 | 2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/DuckDuckGo/Autoconsent/autoconsent-bundle.js b/DuckDuckGo/Autoconsent/autoconsent-bundle.js
index 7a95df5f7e..549a4a732c 100644
--- a/DuckDuckGo/Autoconsent/autoconsent-bundle.js
+++ b/DuckDuckGo/Autoconsent/autoconsent-bundle.js
@@ -1 +1 @@
-!function(){"use strict";var e=class e{static setBase(t){e.base=t}static findElement(t,o=null,c=!1){let i=null;return i=null!=o?Array.from(o.querySelectorAll(t.selector)):null!=e.base?Array.from(e.base.querySelectorAll(t.selector)):Array.from(document.querySelectorAll(t.selector)),null!=t.textFilter&&(i=i.filter((e=>{const o=e.textContent.toLowerCase();if(Array.isArray(t.textFilter)){let e=!1;for(const c of t.textFilter)if(-1!==o.indexOf(c.toLowerCase())){e=!0;break}return e}if(null!=t.textFilter)return-1!==o.indexOf(t.textFilter.toLowerCase())}))),null!=t.styleFilters&&(i=i.filter((e=>{const o=window.getComputedStyle(e);let c=!0;for(const e of t.styleFilters){const t=o[e.option];c=e.negated?c&&t!==e.value:c&&t===e.value}return c}))),null!=t.displayFilter&&(i=i.filter((e=>t.displayFilter?0!==e.offsetHeight:0===e.offsetHeight))),null!=t.iframeFilter&&(i=i.filter((()=>t.iframeFilter?window.location!==window.parent.location:window.location===window.parent.location))),null!=t.childFilter&&(i=i.filter((o=>{const c=e.base;e.setBase(o);const i=e.find(t.childFilter);return e.setBase(c),null!=i.target}))),c?i:(i.length>1&&console.warn("Multiple possible targets: ",i,t,o),i[0])}static find(t,o=!1){const c=[];if(null!=t.parent){const i=e.findElement(t.parent,null,o);if(null!=i){if(i instanceof Array)return i.forEach((i=>{const n=e.findElement(t.target,i,o);n instanceof Array?n.forEach((e=>{c.push({parent:i,target:e})})):c.push({parent:i,target:n})})),c;{const n=e.findElement(t.target,i,o);n instanceof Array?n.forEach((e=>{c.push({parent:i,target:e})})):c.push({parent:i,target:n})}}}else{const i=e.findElement(t.target,null,o);i instanceof Array?i.forEach((e=>{c.push({parent:null,target:e})})):c.push({parent:null,target:i})}return 0===c.length&&c.push({parent:null,target:null}),o?c:(1!==c.length&&console.warn("Multiple results found, even though multiple false",c),c[0])}};e.base=null;var t=e;function o(e){const o=t.find(e);return"css"===e.type?!!o.target:"checkbox"===e.type?!!o.target&&o.target.checked:void 0}async function c(e,a){switch(e.type){case"click":return async function(e){const o=t.find(e);null!=o.target&&o.target.click();return n(i)}(e);case"list":return async function(e,t){for(const o of e.actions)await c(o,t)}(e,a);case"consent":return async function(e,t){for(const i of e.consents){const e=-1!==t.indexOf(i.type);if(i.matcher&&i.toggleAction){o(i.matcher)!==e&&await c(i.toggleAction)}else e?await c(i.trueAction):await c(i.falseAction)}}(e,a);case"ifcss":return async function(e,o){const i=t.find(e);i.target?e.falseAction&&await c(e.falseAction,o):e.trueAction&&await c(e.trueAction,o)}(e,a);case"waitcss":return async function(e){await new Promise((o=>{let c=e.retries||10;const i=e.waitTime||250,n=()=>{const a=t.find(e);(e.negated&&a.target||!e.negated&&!a.target)&&c>0?(c-=1,setTimeout(n,i)):o()};n()}))}(e);case"foreach":return async function(e,o){const i=t.find(e,!0),n=t.base;for(const n of i)n.target&&(t.setBase(n.target),await c(e.action,o));t.setBase(n)}(e,a);case"hide":return async function(e){const o=t.find(e);o.target&&o.target.classList.add("Autoconsent-Hidden")}(e);case"slide":return async function(e){const o=t.find(e),c=t.find(e.dragTarget);if(o.target){const e=o.target.getBoundingClientRect(),t=c.target.getBoundingClientRect();let i=t.top-e.top,n=t.left-e.left;"y"===this.config.axis.toLowerCase()&&(n=0),"x"===this.config.axis.toLowerCase()&&(i=0);const a=window.screenX+e.left+e.width/2,s=window.screenY+e.top+e.height/2,r=e.left+e.width/2,p=e.top+e.height/2,l=document.createEvent("MouseEvents");l.initMouseEvent("mousedown",!0,!0,window,0,a,s,r,p,!1,!1,!1,!1,0,o.target);const d=document.createEvent("MouseEvents");d.initMouseEvent("mousemove",!0,!0,window,0,a+n,s+i,r+n,p+i,!1,!1,!1,!1,0,o.target);const u=document.createEvent("MouseEvents");u.initMouseEvent("mouseup",!0,!0,window,0,a+n,s+i,r+n,p+i,!1,!1,!1,!1,0,o.target),o.target.dispatchEvent(l),await this.waitTimeout(10),o.target.dispatchEvent(d),await this.waitTimeout(10),o.target.dispatchEvent(u)}}(e);case"close":return async function(){window.close()}();case"wait":return async function(e){await n(e.waitTime)}(e);case"eval":return async function(e){return console.log("eval!",e.code),new Promise((t=>{try{e.async?(window.eval(e.code),setTimeout((()=>{t(window.eval("window.__consentCheckResult"))}),e.timeout||250)):t(window.eval(e.code))}catch(o){console.warn("eval error",o,e.code),t(!1)}}))}(e);default:throw"Unknown action type: "+e.type}}var i=0;function n(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function a(e="autoconsent-css-rules"){const t=`style#${e}`,o=document.querySelector(t);if(o&&o instanceof HTMLStyleElement)return o;{const t=document.head||document.getElementsByTagName("head")[0]||document.documentElement,o=document.createElement("style");return o.id=e,t.appendChild(o),o}}function s(e,t,o="display"){const c="opacity"===o?"opacity: 0":"display: none",i=`${t.join(",")} { ${c} !important; z-index: -1 !important; pointer-events: none !important; } `;return e instanceof HTMLStyleElement&&(e.innerText+=i,t.length>0)}async function r(e,t,o){const c=await e();return!c&&t>0?new Promise((c=>{setTimeout((async()=>{c(r(e,t-1,o))}),o)})):Promise.resolve(c)}function p(e){if(!e)return!1;if(null!==e.offsetParent)return!0;{const t=window.getComputedStyle(e);if("fixed"===t.position&&"none"!==t.display)return!0}return!1}function l(e,t=!1){const o=_(e);return o.length>0&&(t?o.forEach((e=>e.click())):o[0].click()),o.length>0}function d(e){return _(e).length>0}function u(e,t){const o=_(e),c=new Array(o.length);return o.forEach(((e,t)=>{c[t]=p(e)})),"none"===t?c.every((e=>!e)):0!==c.length&&("any"===t?c.some((e=>e)):c.every((e=>e)))}function m(e,t=1e4){return r((()=>_(e).length>0),Math.ceil(t/200),200)}async function h(e,t=1e4,o=!1){return await m(e,t),l(e,o)}function k(e){return new Promise((t=>{setTimeout((()=>{t(!0)}),e)}))}function b(e,t=document){if(e.startsWith("aria/"))return[];if(e.startsWith("xpath/")){const o=e.slice(6),c=document.evaluate(o,t,null,XPathResult.ANY_TYPE,null);let i=null;const n=[];for(;i=c.iterateNext();)n.push(i);return n}return e.startsWith("text/")||e.startsWith("pierce/")?[]:t.shadowRoot?Array.from(t.shadowRoot.querySelectorAll(e)):Array.from(t.querySelectorAll(e))}function _(e){return"string"==typeof e?b(e):function(e){let t,o=document;for(const c of e){if(t=b(c,o),0===t.length)return[];o=t[0]}return t}(e)}function g(){return crypto&&void 0!==crypto.randomUUID?crypto.randomUUID():Math.random().toString()}var y=class{constructor(e,t=1e3){this.id=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),this.timer=window.setTimeout((()=>{this.reject(new Error("timeout"))}),t)}},w={pending:new Map,sendContentMessage:null};var C={EVAL_0:()=>console.log(1),EVAL_CONSENTMANAGER_1:()=>window.__cmp&&"object"==typeof __cmp("getCMPData"),EVAL_CONSENTMANAGER_2:()=>!__cmp("consentStatus").userChoiceExists,EVAL_CONSENTMANAGER_3:()=>__cmp("setConsent",0),EVAL_CONSENTMANAGER_4:()=>__cmp("setConsent",1),EVAL_CONSENTMANAGER_5:()=>__cmp("consentStatus").userChoiceExists,EVAL_COOKIEBOT_1:()=>!0!==window.CookieConsent.hasResponse,EVAL_COOKIEBOT_2:()=>window.Cookiebot.dialog.submitConsent(),EVAL_COOKIEBOT_3:()=>endCookieProcess(),EVAL_COOKIEBOT_4:()=>!0===window.CookieConsent.declined,EVAL_KLARO_1:()=>klaro.getManager().config.services.every((e=>e.required||!klaro.getManager().consents[e.name])),EVAL_ONETRUST_1:()=>window.OnetrustActiveGroups.split(",").filter((e=>e.length>0)).length<=1,EVAL_TRUSTARC_TOP:()=>window&&window.truste&&"0"===window.truste.eu.bindMap.prefCookie,EVAL_ADROLL_0:()=>!document.cookie.includes("__adroll_fpc"),EVAL_AFFINITY_SERIF_COM_0:()=>document.cookie.includes("serif_manage_cookies_viewed")&&!document.cookie.includes("serif_allow_analytics"),EVAL_AXEPTIO_0:()=>document.cookie.includes("axeptio_authorized_vendors=%2C%2C"),EVAL_BING_0:()=>document.cookie.includes("AL=0")&&document.cookie.includes("AD=0")&&document.cookie.includes("SM=0"),EVAL_BORLABS_0:()=>!JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("borlabs-cookie"))).split("=",2)[1])).consents.statistics,EVAL_BUNDESREGIERUNG_DE_0:()=>document.cookie.match("cookie-allow-tracking=0"),EVAL_CANVA_0:()=>!document.cookie.includes("gtm_fpc_engagement_event"),EVAL_CLICKIO_0:()=>document.cookie.includes("__lxG__consent__v2_daisybit="),EVAL_CLINCH_0:()=>document.cookie.includes("ctc_rejected=1"),EVAL_COINBASE_0:()=>JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent.length<=1,EVAL_COMPLIANZ_BANNER_0:()=>document.cookie.includes("cmplz_banner-status=dismissed"),EVAL_COMPLIANZ_CATEGORIES_0:()=>!!document.cookie.match(/cmplz_[^=]+=deny/),EVAL_COMPLIANZ_OPTIN_0:()=>!!document.cookie.match(/cookieconsent_preferences_disabled=[^;]+/),EVAL_COOKIE_LAW_INFO_0:()=>CLI.disableAllCookies()||CLI.reject_close()||!0,EVAL_COOKIE_LAW_INFO_1:()=>-1===document.cookie.indexOf("cookielawinfo-checkbox-non-necessary=yes"),EVAL_COOKIE_MANAGER_POPUP_0:()=>!1===JSON.parse(document.cookie.split(";").find((e=>e.trim().startsWith("CookieLevel"))).split("=")[1]).social,EVAL_COOKIEALERT_0:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_1:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_2:()=>!0===window.CookieConsent.declined,EVAL_COOKIEFIRST_0:()=>{return!1===(e=JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("cookiefirst"))).trim()).split("=")[1])).performance&&!1===e.functional&&!1===e.advertising;var e},EVAL_COOKIEFIRST_1:()=>document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((e=>"true"==e.getAttribute("aria-checked")&&e.click()))||!0,EVAL_COOKIEINFORMATION_0:()=>CookieInformation.declineAllCategories()||!0,EVAL_COOKIEINFORMATION_1:()=>CookieInformation.submitAllCategories()||!0,EVAL_COOKIEINFORMATION_2:()=>document.cookie.includes("CookieInformationConsent="),EVAL_DAILYMOTION_0:()=>!!document.cookie.match("dm-euconsent-v2"),EVAL_DSGVO_0:()=>!document.cookie.includes("sp_dsgvo_cookie_settings"),EVAL_DUNELM_0:()=>document.cookie.includes("cc_functional=0")&&document.cookie.includes("cc_targeting=0"),EVAL_ETSY_0:()=>document.querySelectorAll(".gdpr-overlay-body input").forEach((e=>{e.checked=!1}))||!0,EVAL_ETSY_1:()=>document.querySelector(".gdpr-overlay-view button[data-wt-overlay-close]").click()||!0,EVAL_EU_COOKIE_COMPLIANCE_0:()=>-1===document.cookie.indexOf("cookie-agreed=2"),EVAL_EU_COOKIE_LAW_0:()=>!document.cookie.includes("euCookie"),EVAL_EZOIC_0:()=>ezCMP.handleAcceptAllClick(),EVAL_EZOIC_1:()=>!!document.cookie.match(/ezCMPCookieConsent=[^;]+\|2=0\|3=0\|4=0/),EVAL_GOOGLE_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_IUBENDA_0:()=>document.querySelectorAll(".purposes-item input[type=checkbox]:not([disabled])").forEach((e=>{e.checked&&e.click()}))||!0,EVAL_IUBENDA_1:()=>!!document.cookie.match(/_iub_cs-\d+=/),EVAL_JQUERY_COOKIEBAR_0:()=>!document.cookie.includes("cookies-state=accepted"),EVAL_MEDIAVINE_0:()=>document.querySelectorAll('[data-name="mediavine-gdpr-cmp"] input[type=checkbox]').forEach((e=>e.checked&&e.click()))||!0,EVAL_MICROSOFT_0:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Reject|Ablehnen")))[0].click()||!0,EVAL_MICROSOFT_1:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Accept|Annehmen")))[0].click()||!0,EVAL_MICROSOFT_2:()=>!!document.cookie.match("MSCC"),EVAL_MOOVE_0:()=>document.querySelectorAll("#moove_gdpr_cookie_modal input").forEach((e=>{e.disabled||"moove_gdpr_strict_cookies"===e.name||(e.checked=!1)}))||!0,EVAL_ONENINETWO_0:()=>document.cookie.includes("CC_ADVERTISING=NO")&&document.cookie.includes("CC_ANALYTICS=NO"),EVAL_PAYPAL_0:()=>!0===document.cookie.includes("cookie_prefs"),EVAL_PRIMEBOX_0:()=>!document.cookie.includes("cb-enabled=accepted"),EVAL_PUBTECH_0:()=>document.cookie.includes("euconsent-v2")&&(document.cookie.match(/.YAAAAAAAAAAA/)||document.cookie.match(/.aAAAAAAAAAAA/)||document.cookie.match(/.YAAACFgAAAAA/)),EVAL_REDDIT_0:()=>document.cookie.includes("eu_cookie={%22opted%22:true%2C%22nonessential%22:false}"),EVAL_SIBBO_0:()=>!!window.localStorage.getItem("euconsent-v2"),EVAL_SIRDATA_0:()=>document.cookie.includes("euconsent-v2"),EVAL_SNIGEL_0:()=>!!document.cookie.match("snconsent"),EVAL_STEAMPOWERED_0:()=>2===JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>e.trim().startsWith("cookieSettings"))).split("=")[1])).preference_state,EVAL_TARTEAUCITRON_0:()=>tarteaucitron.userInterface.respondAll(!1)||!0,EVAL_TARTEAUCITRON_1:()=>tarteaucitron.userInterface.respondAll(!0)||!0,EVAL_TARTEAUCITRON_2:()=>document.cookie.match(/tarteaucitron=[^;]*/)[0].includes("false"),EVAL_TEALIUM_0:()=>void 0!==window.utag&&"object"==typeof utag.gdpr,EVAL_TEALIUM_1:()=>utag.gdpr.setConsentValue(!1)||!0,EVAL_TEALIUM_2:()=>utag.gdpr.setConsentValue(!0)||!0,EVAL_TEALIUM_3:()=>1!==utag.gdpr.getConsentState(),EVAL_TESTCMP_0:()=>"button_clicked"===window.results.results[0],EVAL_TESTCMP_COSMETIC_0:()=>"banner_hidden"===window.results.results[0],EVAL_THEFREEDICTIONARY_0:()=>cmpUi.showPurposes()||cmpUi.rejectAll()||!0,EVAL_THEFREEDICTIONARY_1:()=>cmpUi.allowAll()||!0,EVAL_THEVERGE_0:()=>document.cookie.includes("_duet_gdpr_acknowledged=1"),EVAL_UBUNTU_COM_0:()=>"_cookies_accepted=essential"===document.cookie,EVAL_UK_COOKIE_CONSENT_0:()=>!document.cookie.includes("catAccCookies"),EVAL_USERCENTRICS_API_0:()=>"object"==typeof UC_UI,EVAL_USERCENTRICS_API_1:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_2:()=>!!UC_UI.denyAllConsents(),EVAL_USERCENTRICS_API_3:()=>!!UC_UI.acceptAllConsents(),EVAL_USERCENTRICS_API_4:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_5:()=>!0===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_API_6:()=>!1===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_BUTTON_0:()=>JSON.parse(localStorage.getItem("usercentrics")).consents.every((e=>e.isEssential||!e.consentStatus)),EVAL_WAITROSE_0:()=>Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e=>e.click()))||!0,EVAL_WAITROSE_1:()=>document.cookie.includes("wtr_cookies_advertising=0")&&document.cookie.includes("wtr_cookies_analytics=0"),EVAL_WP_COOKIE_NOTICE_0:()=>document.cookie.includes("wpl_viewed_cookie=no"),EVAL_XING_0:()=>document.cookie.includes("userConsent=%7B%22marketing%22%3Afalse"),EVAL_YOUTUBE_DESKTOP_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_YOUTUBE_MOBILE_0:()=>!!document.cookie.match(/SOCS=CAE/)};var v={main:!0,frame:!1,urlPattern:""},f=class{constructor(e){this.runContext=v,this.autoconsent=e}get hasSelfTest(){throw new Error("Not Implemented")}get isIntermediate(){throw new Error("Not Implemented")}get isCosmetic(){throw new Error("Not Implemented")}mainWorldEval(e){const t=C[e];if(!t)return console.warn("Snippet not found",e),Promise.resolve(!1);if(this.autoconsent.config.isMainWorld){let e=!1;try{e=!!t.call(globalThis)}catch(e){}return Promise.resolve(e)}return function(e){const t=g();w.sendContentMessage({type:"eval",id:t,code:e});const o=new y(t);return w.pending.set(o.id,o),o.promise}(function(e){const t=e.toString();return t.substring(t.indexOf("=>")+2)}(t)).catch((e=>!1))}checkRunContext(){const e={...v,...this.runContext},t=window.top===window;return!(t&&!e.main)&&(!(!t&&!e.frame)&&!(e.urlPattern&&!window.location.href.match(e.urlPattern)))}detectCmp(){throw new Error("Not Implemented")}async detectPopup(){return!1}optOut(){throw new Error("Not Implemented")}optIn(){throw new Error("Not Implemented")}openCmp(){throw new Error("Not Implemented")}async test(){return Promise.resolve(!0)}},A=class extends f{constructor(e,t){super(t),this.config=e,this.name=e.name,this.runContext=e.runContext||v}get hasSelfTest(){return!!this.config.test}get isIntermediate(){return!!this.config.intermediate}get isCosmetic(){return!!this.config.cosmetic}get prehideSelectors(){return this.config.prehideSelectors}async detectCmp(){return!!this.config.detectCmp&&this._runRulesParallel(this.config.detectCmp)}async detectPopup(){return!!this.config.detectPopup&&this._runRulesSequentially(this.config.detectPopup)}async optOut(){return!!this.config.optOut&&this._runRulesSequentially(this.config.optOut)}async optIn(){return!!this.config.optIn&&this._runRulesSequentially(this.config.optIn)}async openCmp(){return!!this.config.openCmp&&this._runRulesSequentially(this.config.openCmp)}async test(){return this.hasSelfTest?this._runRulesSequentially(this.config.test):super.test()}async evaluateRuleStep(e){const t=[];if(e.exists&&t.push(d(e.exists)),e.visible&&t.push(u(e.visible,e.check)),e.eval){const o=this.mainWorldEval(e.eval);t.push(o)}var o,c;if(e.waitFor&&t.push(m(e.waitFor,e.timeout)),e.waitForVisible&&t.push(function(e,t=1e4,o="any"){return r((()=>u(e,o)),Math.ceil(t/200),200)}(e.waitForVisible,e.timeout,e.check)),e.click&&t.push(l(e.click,e.all)),e.waitForThenClick&&t.push(h(e.waitForThenClick,e.timeout,e.all)),e.wait&&t.push(k(e.wait)),e.hide&&t.push((o=e.hide,c=e.method,s(a(),o,c))),e.if){if(!e.if.exists&&!e.if.visible)return console.error("invalid conditional rule",e.if),!1;await this.evaluateRuleStep(e.if)?t.push(this._runRulesSequentially(e.then)):e.else&&t.push(this._runRulesSequentially(e.else))}if(e.any){for(const t of e.any)if(await this.evaluateRuleStep(t))return!0;return!1}if(0===t.length)return!1;return(await Promise.all(t)).reduce(((e,t)=>e&&t),!0)}async _runRulesParallel(e){const t=e.map((e=>this.evaluateRuleStep(e)));return(await Promise.all(t)).every((e=>!!e))}async _runRulesSequentially(e){for(const t of e){if(!await this.evaluateRuleStep(t)&&!t.optional)return!1}return!0}},E=class{constructor(e,t){this.name=e,this.config=t,this.methods=new Map,this.runContext=v,this.isCosmetic=!1,t.methods.forEach((e=>{e.action&&this.methods.set(e.name,e.action)})),this.hasSelfTest=!1}get isIntermediate(){return!1}checkRunContext(){return!0}async detectCmp(){return this.config.detectors.map((e=>o(e.presentMatcher))).some((e=>!!e))}async detectPopup(){return this.config.detectors.map((e=>o(e.showingMatcher))).some((e=>!!e))}async executeAction(e,t){return!this.methods.has(e)||c(this.methods.get(e),t)}async optOut(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",[]),await this.executeAction("SAVE_CONSENT"),!0}async optIn(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",["D","A","B","E","F","X"]),await this.executeAction("SAVE_CONSENT"),!0}async openCmp(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),!0}async test(){return!0}},O="#truste-show-consent",x="#truste-consent-track",S=[class extends f{constructor(e){super(e),this.name="TrustArc-top",this.prehideSelectors=[".trustarc-banner-container",`.truste_popframe,.truste_overlay,.truste_box_overlay,${x}`],this.runContext={main:!0,frame:!1},this._shortcutButton=null,this._optInDone=!1}get hasSelfTest(){return!1}get isIntermediate(){return!this._optInDone&&!this._shortcutButton}get isCosmetic(){return!1}async detectCmp(){const e=d(`${O},${x}`);return e&&(this._shortcutButton=document.querySelector("#truste-consent-required")),e}async detectPopup(){return u(`#truste-consent-content,#trustarc-banner-overlay,${x}`,"all")}openFrame(){l(O)}async optOut(){return this._shortcutButton?(this._shortcutButton.click(),!0):(s(a(),[".truste_popframe",".truste_overlay",".truste_box_overlay",x]),l(O),setTimeout((()=>{a().remove()}),1e4),!0)}async optIn(){return this._optInDone=!0,l("#truste-consent-button")}async openCmp(){return!0}async test(){return await this.mainWorldEval("EVAL_TRUSTARC_TOP")}},class extends f{constructor(){super(...arguments),this.name="TrustArc-frame",this.runContext={main:!1,frame:!0,urlPattern:"^https://consent-pref\\.trustarc\\.com/\\?"}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return!0}async detectPopup(){return u("#defaultpreferencemanager","any")&&u(".mainContent","any")}async navigateToSettings(){return await r((async()=>d(".shp")||u(".advance","any")||d(".switch span:first-child")),10,500),d(".shp")&&l(".shp"),await m(".prefPanel",5e3),u(".advance","any")&&l(".advance"),await r((()=>u(".switch span:first-child","any")),5,1e3)}async optOut(){return await r((()=>"complete"===document.readyState),20,100),await m(".mainContent[aria-hidden=false]",5e3),!!l(".rejectAll")||(d(".prefPanel")&&await m('.prefPanel[style="visibility: visible;"]',3e3),l("#catDetails0")?(l(".submit"),!0):(l(".required")||(await this.navigateToSettings(),l(".switch span:nth-child(1):not(.active)",!0),l(".submit"),m("#gwt-debug-close_id",3e5).then((()=>{l("#gwt-debug-close_id")}))),!0))}async optIn(){return l(".call")||(await this.navigateToSettings(),l(".switch span:nth-child(2)",!0),l(".submit"),m("#gwt-debug-close_id",3e5).then((()=>{l("#gwt-debug-close_id")}))),!0}},class extends f{constructor(){super(...arguments),this.name="Cybotcookiebot",this.prehideSelectors=["#CybotCookiebotDialog,#dtcookie-container,#cookiebanner,#cb-cookieoverlay"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("#CybotCookiebotDialogBodyLevelButtonPreferences")}async detectPopup(){return d("#CybotCookiebotDialog,#dtcookie-container,#cookiebanner,#cb-cookiebanner")}async optOut(){return l(".cookie-alert-extended-detail-link")?(await m(".cookie-alert-configuration",2e3),l(".cookie-alert-configuration-input:checked",!0),l(".cookie-alert-extended-button-secondary"),!0):d("#dtcookie-container")?l(".h-dtcookie-decline"):(l(".cookiebot__button--settings")||l("#CybotCookiebotDialogBodyButtonDecline")||(l(".cookiebanner__link--details"),l('.CybotCookiebotDialogBodyLevelButton:checked:enabled,input[id*="CybotCookiebotDialogBodyLevelButton"]:checked:enabled',!0),l("#CybotCookiebotDialogBodyButtonDecline"),l("input[id^=CybotCookiebotDialogBodyLevelButton]:checked",!0),d("#CybotCookiebotDialogBodyButtonAcceptSelected")?l("#CybotCookiebotDialogBodyButtonAcceptSelected"):l("#CybotCookiebotDialogBodyLevelButtonAccept,#CybotCookiebotDialogBodyButtonAccept,#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowallSelection",!0),await this.mainWorldEval("EVAL_COOKIEBOT_1")&&(await this.mainWorldEval("EVAL_COOKIEBOT_2"),await k(500)),d("#cb-confirmedSettings")&&await this.mainWorldEval("EVAL_COOKIEBOT_3")),!0)}async optIn(){return d("#dtcookie-container")?l(".h-dtcookie-accept"):(l(".CybotCookiebotDialogBodyLevelButton:not(:checked):enabled",!0),l("#CybotCookiebotDialogBodyLevelButtonAccept"),l("#CybotCookiebotDialogBodyButtonAccept"),!0)}async test(){return this.mainWorldEval("EVAL_COOKIEBOT_4")}},class extends f{constructor(){super(...arguments),this.name="Sourcepoint-frame",this.prehideSelectors=["div[id^='sp_message_container_'],.message-overlay","#sp_privacy_manager_container"],this.ccpaNotice=!1,this.ccpaPopup=!1,this.runContext={main:!1,frame:!0}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){const e=new URL(location.href);return e.searchParams.has("message_id")&&"ccpa-notice.sp-prod.net"===e.hostname?(this.ccpaNotice=!0,!0):"ccpa-pm.sp-prod.net"===e.hostname?(this.ccpaPopup=!0,!0):("/index.html"===e.pathname||"/privacy-manager/index.html"===e.pathname)&&(e.searchParams.has("message_id")||e.searchParams.has("requestUUID")||e.searchParams.has("consentUUID"))}async detectPopup(){return!!this.ccpaNotice||(this.ccpaPopup?await m(".priv-save-btn",2e3):(await m(".sp_choice_type_11,.sp_choice_type_12,.sp_choice_type_13,.sp_choice_type_ACCEPT_ALL",2e3),!d(".sp_choice_type_9")))}async optIn(){return await m(".sp_choice_type_11,.sp_choice_type_ACCEPT_ALL",2e3),!!l(".sp_choice_type_11")||!!l(".sp_choice_type_ACCEPT_ALL")}isManagerOpen(){return"/privacy-manager/index.html"===location.pathname}async optOut(){if(this.ccpaPopup){const e=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.neutral.on .right");for(const t of e)t.click();const t=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.switch-bg.on");for(const e of t)e.click();return l(".priv-save-btn")}if(!this.isManagerOpen()){if(!await m(".sp_choice_type_12,.sp_choice_type_13"))return!1;if(!d(".sp_choice_type_12"))return l(".sp_choice_type_13");l(".sp_choice_type_12"),await r((()=>this.isManagerOpen()),200,100)}await m(".type-modal",2e4);try{const e=".sp_choice_type_REJECT_ALL",t=".reject-toggle",o=await Promise.race([m(e,2e3).then((e=>e?0:-1)),m(t,2e3).then((e=>e?1:-1)),m(".pm-features",2e3).then((e=>e?2:-1))]);if(0===o)return await k(1e3),l(e);1===o?l(t):2===o&&(await m(".pm-features",1e4),l(".checked > span",!0),l(".chevron"))}catch(e){}return l(".sp_choice_type_SAVE_AND_EXIT")}},class extends f{constructor(){super(...arguments),this.name="consentmanager.net",this.prehideSelectors=["#cmpbox,#cmpbox2"],this.apiAvailable=!1}get hasSelfTest(){return this.apiAvailable}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.apiAvailable=await this.mainWorldEval("EVAL_CONSENTMANAGER_1"),!!this.apiAvailable||d("#cmpbox")}async detectPopup(){return this.apiAvailable?(await k(500),await this.mainWorldEval("EVAL_CONSENTMANAGER_2")):u("#cmpbox .cmpmore","any")}async optOut(){return await k(500),this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_3"):!!l(".cmpboxbtnno")||(d(".cmpwelcomeprpsbtn")?(l(".cmpwelcomeprpsbtn > a[aria-checked=true]",!0),l(".cmpboxbtnsave"),!0):(l(".cmpboxbtncustom"),await m(".cmptblbox",2e3),l(".cmptdchoice > a[aria-checked=true]",!0),l(".cmpboxbtnyescustomchoices"),!0))}async optIn(){return this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_4"):l(".cmpboxbtnyes")}async test(){if(this.apiAvailable)return await this.mainWorldEval("EVAL_CONSENTMANAGER_5")}},class extends f{constructor(){super(...arguments),this.name="Evidon"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("#_evidon_banner")}async detectPopup(){return u("#_evidon_banner","any")}async optOut(){return l("#_evidon-decline-button")||(s(a(),["#evidon-prefdiag-overlay","#evidon-prefdiag-background"]),l("#_evidon-option-button"),await m("#evidon-prefdiag-overlay",5e3),l("#evidon-prefdiag-decline")),!0}async optIn(){return l("#_evidon-accept-button")}},class extends f{constructor(){super(...arguments),this.name="Onetrust",this.prehideSelectors=["#onetrust-banner-sdk,#onetrust-consent-sdk,.onetrust-pc-dark-filter,.js-consent-banner"],this.runContext={urlPattern:"^(?!.*https://www\\.nba\\.com/)"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("#onetrust-banner-sdk")}async detectPopup(){return u("#onetrust-banner-sdk","all")}async optOut(){return d("#onetrust-pc-btn-handler")?l("#onetrust-pc-btn-handler"):l(".ot-sdk-show-settings,button.js-cookie-settings"),await m("#onetrust-consent-sdk",2e3),await k(1e3),l("#onetrust-consent-sdk input.category-switch-handler:checked,.js-editor-toggle-state:checked",!0),await k(1e3),await m(".save-preference-btn-handler,.js-consent-save",2e3),l(".save-preference-btn-handler,.js-consent-save"),await r((()=>u("#onetrust-banner-sdk","none")),10,500),!0}async optIn(){return l("#onetrust-accept-btn-handler,.js-accept-cookies")}async test(){return await this.mainWorldEval("EVAL_ONETRUST_1")}},class extends f{constructor(){super(...arguments),this.name="Klaro",this.prehideSelectors=[".klaro"],this.settingsOpen=!1}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d(".klaro > .cookie-modal")?(this.settingsOpen=!0,!0):d(".klaro > .cookie-notice")}async detectPopup(){return u(".klaro > .cookie-notice,.klaro > .cookie-modal","any")}async optOut(){return!!l(".klaro .cn-decline")||(this.settingsOpen||(l(".klaro .cn-learn-more"),await m(".klaro > .cookie-modal",2e3),this.settingsOpen=!0),!!l(".klaro .cn-decline")||(l(".cm-purpose:not(.cm-toggle-all) > input:not(.half-checked)",!0),l(".cm-btn-accept")))}async optIn(){return!!l(".klaro .cm-btn-accept-all")||(this.settingsOpen?(l(".cm-purpose:not(.cm-toggle-all) > input.half-checked",!0),l(".cm-btn-accept")):l(".klaro .cookie-notice .cm-btn-success"))}async test(){return await this.mainWorldEval("EVAL_KLARO_1")}},class extends f{constructor(){super(...arguments),this.name="Uniconsent"}get prehideSelectors(){return[".unic",".modal:has(.unic)"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d(".unic .unic-box,.unic .unic-bar")}async detectPopup(){return u(".unic .unic-box,.unic .unic-bar","any")}async optOut(){if(await m(".unic button",1e3),document.querySelectorAll(".unic button").forEach((e=>{const t=e.textContent;(t.includes("Manage Options")||t.includes("Optionen verwalten"))&&e.click()})),await m(".unic input[type=checkbox]",1e3)){await m(".unic button",1e3),document.querySelectorAll(".unic input[type=checkbox]").forEach((e=>{e.checked&&e.click()}));for(const e of document.querySelectorAll(".unic button")){const t=e.textContent;for(const o of["Confirm Choices","Save Choices","Auswahl speichern"])if(t.includes(o))return e.click(),await k(500),!0}}return!1}async optIn(){return h(".unic #unic-agree")}async test(){await k(1e3);return!d(".unic .unic-box,.unic .unic-bar")}},class extends f{constructor(){super(...arguments),this.prehideSelectors=[".cmp-root"],this.name="Conversant"}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d(".cmp-root .cmp-receptacle")}async detectPopup(){return u(".cmp-root .cmp-receptacle","any")}async optOut(){if(!await h(".cmp-main-button:not(.cmp-main-button--primary)"))return!1;if(!await m(".cmp-view-tab-tabs"))return!1;await h(".cmp-view-tab-tabs > :first-child"),await h(".cmp-view-tab-tabs > .cmp-view-tab--active:first-child");for(const e of Array.from(document.querySelectorAll(".cmp-accordion-item"))){e.querySelector(".cmp-accordion-item-title").click(),await r((()=>!!e.querySelector(".cmp-accordion-item-content.cmp-active")),10,50);const t=e.querySelector(".cmp-accordion-item-content.cmp-active");t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-deny:not(.cmp-toggle-deny--active)").forEach((e=>e.click())),t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-checkbox:not(.cmp-toggle-checkbox--active)").forEach((e=>e.click()))}return await l(".cmp-main-button:not(.cmp-main-button--primary)"),!0}async optIn(){return h(".cmp-main-button.cmp-main-button--primary")}async test(){return document.cookie.includes("cmp-data=0")}},class extends f{constructor(){super(...arguments),this.name="tiktok.com",this.runContext={urlPattern:"tiktok"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}getShadowRoot(){const e=document.querySelector("tiktok-cookie-banner");return e?e.shadowRoot:null}async detectCmp(){return d("tiktok-cookie-banner")}async detectPopup(){return p(this.getShadowRoot().querySelector(".tiktok-cookie-banner"))}async optOut(){const e=this.getShadowRoot().querySelector(".button-wrapper button:first-child");return!!e&&(e.click(),!0)}async optIn(){const e=this.getShadowRoot().querySelector(".button-wrapper button:last-child");return!!e&&(e.click(),!0)}async test(){const e=document.cookie.match(/cookie-consent=([^;]+)/);if(!e)return!1;const t=JSON.parse(decodeURIComponent(e[1]));return Object.values(t).every((e=>"boolean"!=typeof e||!1===e))}},class extends f{constructor(){super(...arguments),this.runContext={urlPattern:"^https://(www\\.)?airbnb\\.[^/]+/"},this.prehideSelectors=["div[data-testid=main-cookies-banner-container]",'div:has(> div:first-child):has(> div:last-child):has(> section [data-testid="strictly-necessary-cookies"])']}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("div[data-testid=main-cookies-banner-container]")}async detectPopup(){return u("div[data-testid=main-cookies-banner-container","any")}async optOut(){let e;for(await h("div[data-testid=main-cookies-banner-container] button._snbhip0");e=document.querySelector("[data-testid=modal-container] button[aria-checked=true]:not([disabled])");)e.click();return h("button[data-testid=save-btn]")}async optIn(){return h("div[data-testid=main-cookies-banner-container] button._148dgdpk")}async test(){return await r((()=>!!document.cookie.match("OptanonAlertBoxClosed")),20,200)}}];var I=[{name:"192.com",detectCmp:[{exists:".ont-cookies"}],detectPopup:[{visible:".ont-cookies"}],optIn:[{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-ok2"}],optOut:[{click:".ont-cookes-btn-manage"},{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-choose"}],test:[{eval:"EVAL_ONENINETWO_0"}]},{name:"1password-com",cosmetic:!0,prehideSelectors:['footer #footer-root [aria-label="Cookie Consent"]'],detectCmp:[{exists:'footer #footer-root [aria-label="Cookie Consent"]'}],detectPopup:[{visible:'footer #footer-root [aria-label="Cookie Consent"]'}],optIn:[{click:'footer #footer-root [aria-label="Cookie Consent"] button'}],optOut:[{hide:['footer #footer-root [aria-label="Cookie Consent"]']}]},{name:"Adroll",prehideSelectors:["#adroll_consent_container"],detectCmp:[{exists:"#adroll_consent_container"}],detectPopup:[{visible:"#adroll_consent_container"}],optIn:[{waitForThenClick:"#adroll_consent_accept"}],optOut:[{waitForThenClick:"#adroll_consent_reject"}],test:[{eval:"EVAL_ADROLL_0"}]},{name:"affinity.serif.com",detectCmp:[{exists:".c-cookie-banner button[data-qa='allow-all-cookies']"}],detectPopup:[{visible:".c-cookie-banner"}],optIn:[{click:'button[data-qa="allow-all-cookies"]'}],optOut:[{click:'button[data-qa="manage-cookies"]'},{waitFor:'.c-cookie-banner ~ [role="dialog"]'},{waitForThenClick:'.c-cookie-banner ~ [role="dialog"] input[type="checkbox"][value="true"]',all:!0},{click:'.c-cookie-banner ~ [role="dialog"] .c-modal__action button'}],test:[{wait:500},{eval:"EVAL_AFFINITY_SERIF_COM_0"}]},{name:"agolde.com",cosmetic:!0,prehideSelectors:["#modal-1 div[data-micromodal-close]"],detectCmp:[{exists:"#modal-1 div[aria-labelledby=modal-1-title]"}],detectPopup:[{exists:"#modal-1 div[data-micromodal-close]"}],optIn:[{click:'button[aria-label="Close modal"]'}],optOut:[{hide:["#modal-1 div[data-micromodal-close]"]}]},{name:"altium.com",cosmetic:!0,prehideSelectors:[".altium-privacy-bar"],detectCmp:[{exists:".altium-privacy-bar"}],detectPopup:[{exists:".altium-privacy-bar"}],optIn:[{click:"a.altium-privacy-bar__btn"}],optOut:[{hide:[".altium-privacy-bar"]}]},{name:"amazon.com",prehideSelectors:['span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'],detectCmp:[{exists:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],detectPopup:[{visible:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],optIn:[{waitForVisible:"#sp-cc-accept"},{wait:500},{click:"#sp-cc-accept"}],optOut:[{waitForVisible:"#sp-cc-rejectall-link"},{wait:500},{click:"#sp-cc-rejectall-link"}]},{name:"aquasana.com",cosmetic:!0,prehideSelectors:["#consent-tracking"],detectCmp:[{exists:"#consent-tracking"}],detectPopup:[{exists:"#consent-tracking"}],optIn:[{click:"#accept_consent"}],optOut:[{hide:["#consent-tracking"]}]},{name:"arzt-auskunft.de",prehideSelectors:["#cookiescript_injected"],detectCmp:[{exists:"#cookiescript_injected"}],detectPopup:[{visible:"#cookiescript_injected"}],optOut:[{click:"#cookiescript_reject"}],optIn:[{click:"#cookiescript_accept"}]},{name:"athlinks-com",runContext:{urlPattern:"^https://(www\\.)?athlinks\\.com/"},cosmetic:!0,prehideSelectors:["#footer-container ~ div"],detectCmp:[{exists:"#footer-container ~ div"}],detectPopup:[{visible:"#footer-container > div"}],optIn:[{click:"#footer-container ~ div button"}],optOut:[{hide:["#footer-container ~ div"]}]},{name:"ausopen.com",cosmetic:!0,detectCmp:[{exists:".gdpr-popup__message"}],detectPopup:[{visible:".gdpr-popup__message"}],optOut:[{hide:[".gdpr-popup__message"]}],optIn:[{click:".gdpr-popup__message button"}]},{name:"automattic-cmp-optout",prehideSelectors:['form[class*="cookie-banner"][method="post"]'],detectCmp:[{exists:'form[class*="cookie-banner"][method="post"]'}],detectPopup:[{visible:'form[class*="cookie-banner"][method="post"]'}],optIn:[{click:'a[class*="accept-all-button"]'}],optOut:[{click:'form[class*="cookie-banner"] div[class*="simple-options"] a[class*="customize-button"]'},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:'a[class*="accept-selection-button"]'}]},{name:"aws.amazon.com",prehideSelectors:["#awsccc-cb-content","#awsccc-cs-container","#awsccc-cs-modalOverlay","#awsccc-cs-container-inner"],detectCmp:[{exists:"#awsccc-cb-content"}],detectPopup:[{visible:"#awsccc-cb-content"}],optIn:[{click:"button[data-id=awsccc-cb-btn-accept"}],optOut:[{click:"button[data-id=awsccc-cb-btn-customize]"},{waitFor:"input[aria-checked]"},{click:"input[aria-checked=true]",all:!0,optional:!0},{click:"button[data-id=awsccc-cs-btn-save]"}]},{name:"axeptio",prehideSelectors:[".axeptio_widget"],detectCmp:[{exists:".axeptio_widget"}],detectPopup:[{visible:".axeptio_widget"}],optIn:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_acceptAll"}],optOut:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_dismiss"}],test:[{eval:"EVAL_AXEPTIO_0"}]},{name:"baden-wuerttemberg.de",prehideSelectors:[".cookie-alert.t-dark"],cosmetic:!0,detectCmp:[{exists:".cookie-alert.t-dark"}],detectPopup:[{visible:".cookie-alert.t-dark"}],optIn:[{click:".cookie-alert__form input:not([disabled]):not([checked])"},{click:".cookie-alert__button button"}],optOut:[{hide:[".cookie-alert.t-dark"]}]},{name:"bbb.org",runContext:{urlPattern:"^https://www\\.bbb\\.org/"},cosmetic:!0,prehideSelectors:['div[aria-label="use of cookies on bbb.org"]'],detectCmp:[{exists:'div[aria-label="use of cookies on bbb.org"]'}],detectPopup:[{visible:'div[aria-label="use of cookies on bbb.org"]'}],optIn:[{click:'div[aria-label="use of cookies on bbb.org"] button.bds-button-unstyled span.visually-hidden'}],optOut:[{hide:['div[aria-label="use of cookies on bbb.org"]']}]},{name:"bing.com",prehideSelectors:["#bnp_container"],detectCmp:[{exists:"#bnp_cookie_banner"}],detectPopup:[{visible:"#bnp_cookie_banner"}],optIn:[{click:"#bnp_btn_accept"}],optOut:[{click:"#bnp_btn_preference"},{click:"#mcp_savesettings"}],test:[{eval:"EVAL_BING_0"}]},{name:"borlabs",detectCmp:[{exists:"._brlbs-block-content"}],detectPopup:[{visible:"._brlbs-bar-wrap,._brlbs-box-wrap"}],optIn:[{click:"a[data-cookie-accept-all]"}],optOut:[{click:"a[data-cookie-individual]"},{waitForVisible:".cookie-preference"},{click:"input[data-borlabs-cookie-checkbox]:checked",all:!0,optional:!0},{click:"#CookiePrefSave"},{wait:500}],prehideSelectors:["#BorlabsCookieBox"],test:[{eval:"EVAL_BORLABS_0"}]},{name:"bundesregierung.de",prehideSelectors:[".bpa-cookie-banner"],detectCmp:[{exists:".bpa-cookie-banner"}],detectPopup:[{visible:".bpa-cookie-banner .bpa-module-full-hero"}],optIn:[{click:".bpa-accept-all-button"}],optOut:[{wait:500,comment:"click is not immediately recognized"},{waitForThenClick:".bpa-close-button"}],test:[{eval:"EVAL_BUNDESREGIERUNG_DE_0"}]},{name:"burpee.com",cosmetic:!0,prehideSelectors:["#notice-cookie-block"],detectCmp:[{exists:"#notice-cookie-block"}],detectPopup:[{exists:"#html-body #notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{hide:["#html-body #notice-cookie-block","#notice-cookie"]}]},{name:"canva.com",prehideSelectors:['div[role="dialog"] a[data-anchor-id="cookie-policy"]'],detectCmp:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],detectPopup:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],optIn:[{click:'div[role="dialog"] button:nth-child(1)'}],optOut:[{if:{exists:'div[role="dialog"] button:nth-child(3)'},then:[{click:'div[role="dialog"] button:nth-child(2)'}],else:[{click:'div[role="dialog"] button:nth-child(2)'},{waitFor:'div[role="dialog"] a[data-anchor-id="privacy-policy"]'},{click:'div[role="dialog"] button:nth-child(2)'},{click:'div[role="dialog"] div:last-child button:only-child'}]}],test:[{eval:"EVAL_CANVA_0"}]},{name:"cc_banner",cosmetic:!0,prehideSelectors:[".cc_banner-wrapper"],detectCmp:[{exists:".cc_banner-wrapper"}],detectPopup:[{visible:".cc_banner"}],optIn:[{click:".cc_btn_accept_all"}],optOut:[{hide:[".cc_banner-wrapper"]}]},{comment:"https://www.civicuk.com/cookie-control/",name:"civic-cookie-control",prehideSelectors:["#ccc-module,#ccc-overlay"],detectCmp:[{exists:"#ccc-module"}],detectPopup:[{visible:"#ccc"},{visible:"#ccc-module"}],optOut:[{click:"#ccc-reject-settings"}],optIn:[{click:"#ccc-recommended-settings"}]},{name:"click.io",prehideSelectors:["#cl-consent"],detectCmp:[{exists:"#cl-consent"}],detectPopup:[{visible:"#cl-consent"}],optIn:[{waitForThenClick:'#cl-consent [data-role="b_agree"]'}],optOut:[{waitFor:'#cl-consent [data-role="b_options"]'},{wait:500},{click:'#cl-consent [data-role="b_options"]'},{waitFor:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]'},{click:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]',all:!0},{click:'[data-role="b_save"]'}],test:[{eval:"EVAL_CLICKIO_0",comment:"TODO: this only checks if we interacted at all"}]},{name:"clinch",intermediate:!1,runContext:{frame:!1,main:!0},prehideSelectors:[".consent-modal[role=dialog]"],detectCmp:[{exists:".consent-modal[role=dialog]"}],detectPopup:[{visible:".consent-modal[role=dialog]"}],optIn:[{click:"#consent_agree"}],optOut:[{click:"#manage_cookie_preferences"},{click:"#cookie_consent_preferences input:checked",all:!0,optional:!0},{click:"#consent_save"}],test:[{eval:"EVAL_CLINCH_0"}]},{name:"clustrmaps.com",runContext:{urlPattern:"^https://(www\\.)?clustrmaps\\.com/"},cosmetic:!0,prehideSelectors:["#gdpr-cookie-message"],detectCmp:[{exists:"#gdpr-cookie-message"}],detectPopup:[{visible:"#gdpr-cookie-message"}],optIn:[{click:"button#gdpr-cookie-accept"}],optOut:[{hide:["#gdpr-cookie-message"]}]},{name:"coinbase",intermediate:!1,runContext:{frame:!0,main:!0,urlPattern:"^https://(www|help)\\.coinbase\\.com"},prehideSelectors:[],detectCmp:[{exists:"div[class^=CookieBannerContent__Container]"}],detectPopup:[{visible:"div[class^=CookieBannerContent__Container]"}],optIn:[{click:"div[class^=CookieBannerContent__CTA] :nth-last-child(1)"}],optOut:[{click:"button[class^=CookieBannerContent__Settings]"},{click:"div[class^=CookiePreferencesModal__CategoryContainer] input:checked",all:!0,optional:!0},{click:"div[class^=CookiePreferencesModal__ButtonContainer] > button"}],test:[{eval:"EVAL_COINBASE_0"}]},{name:"Complianz banner",prehideSelectors:["#cmplz-cookiebanner-container"],detectCmp:[{exists:"#cmplz-cookiebanner-container .cmplz-cookiebanner"}],detectPopup:[{visible:"#cmplz-cookiebanner-container .cmplz-cookiebanner",check:"any"}],optIn:[{waitForThenClick:".cmplz-cookiebanner .cmplz-accept"}],optOut:[{waitForThenClick:".cmplz-cookiebanner .cmplz-deny"}],test:[{eval:"EVAL_COMPLIANZ_BANNER_0"}]},{name:"Complianz categories",prehideSelectors:['.cc-type-categories[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{click:".cc-dismiss"}],test:[{eval:"EVAL_COMPLIANZ_CATEGORIES_0"}]},{name:"Complianz notice",prehideSelectors:['.cc-type-info[aria-describedby="cookieconsent:desc"]'],cosmetic:!0,detectCmp:[{exists:'.cc-type-info[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-info[aria-describedby="cookieconsent:desc"]'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{hide:['[aria-describedby="cookieconsent:desc"]']}]},{name:"Complianz optin",prehideSelectors:['.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{click:".cc-settings"},{waitForVisible:'[aria-label="cookies preferences popup"]'},{click:'[aria-label="cookies preferences popup"] input[type=checkbox]:not([disabled]):checked',all:!0,optional:!0},{click:'[aria-label="cookies preferences popup"] [aria-label="Accept Selected"], [aria-label="cookies preferences popup"] [aria-label="Save my choice"], .cc-btn-accept-selected, .cc-deny',optional:!0}],test:[{eval:"EVAL_COMPLIANZ_OPTIN_0"}]},{name:"cookie-law-info",prehideSelectors:["#cookie-law-info-bar"],detectCmp:[{exists:"#cookie-law-info-bar"}],detectPopup:[{visible:"#cookie-law-info-bar"}],optIn:[{click:'[data-cli_action="accept_all"]'}],optOut:[{hide:["#cookie-law-info-bar"]},{eval:"EVAL_COOKIE_LAW_INFO_0"}],test:[{eval:"EVAL_COOKIE_LAW_INFO_1"}]},{name:"cookie-manager-popup",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,detectCmp:[{exists:"#notice-cookie-block #allow-functional-cookies, #notice-cookie-block #btn-cookie-settings"}],detectPopup:[{visible:"#notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{if:{exists:"#allow-functional-cookies"},then:[{click:"#allow-functional-cookies"}],else:[{waitForThenClick:"#btn-cookie-settings"},{waitForVisible:".modal-body"},{click:'.modal-body input:checked, .switch[data-switch="on"]',all:!0,optional:!0},{click:'[role="dialog"] .modal-footer button'}]}],prehideSelectors:["#btn-cookie-settings"],test:[{eval:"EVAL_COOKIE_MANAGER_POPUP_0"}]},{name:"cookie-notice",prehideSelectors:["#cookie-notice"],cosmetic:!0,detectCmp:[{visible:"#cookie-notice .cookie-notice-container"}],detectPopup:[{visible:"#cookie-notice"}],optIn:[{click:"#cn-accept-cookie"}],optOut:[{hide:["#cookie-notice"]}]},{name:"cookiealert",intermediate:!1,prehideSelectors:[],runContext:{frame:!0,main:!0},detectCmp:[{exists:".cookie-alert-extended"}],detectPopup:[{visible:".cookie-alert-extended-modal"}],optIn:[{click:"button[data-controller='cookie-alert/extended/button/accept']"},{eval:"EVAL_COOKIEALERT_0"}],optOut:[{click:"a[data-controller='cookie-alert/extended/detail-link']"},{click:".cookie-alert-configuration-input:checked",all:!0,optional:!0},{click:"button[data-controller='cookie-alert/extended/button/configuration']"},{eval:"EVAL_COOKIEALERT_0"}],test:[{eval:"EVAL_COOKIEALERT_2"}]},{name:"cookiefirst.com",prehideSelectors:["#cookiefirst-root,.cookiefirst-root,[aria-labelledby=cookie-preference-panel-title]"],detectCmp:[{exists:"#cookiefirst-root,.cookiefirst-root"}],detectPopup:[{visible:"#cookiefirst-root,.cookiefirst-root"}],optIn:[{click:"button[data-cookiefirst-action=accept]"}],optOut:[{if:{exists:"button[data-cookiefirst-action=adjust]"},then:[{click:"button[data-cookiefirst-action=adjust]"},{waitForVisible:"[data-cookiefirst-widget=modal]",timeout:1e3},{eval:"EVAL_COOKIEFIRST_1"},{wait:1e3},{click:"button[data-cookiefirst-action=save]"}],else:[{click:"button[data-cookiefirst-action=reject]"}]}],test:[{eval:"EVAL_COOKIEFIRST_0"}]},{name:"Cookie Information Banner",prehideSelectors:["#cookie-information-template-wrapper"],detectCmp:[{exists:"#cookie-information-template-wrapper"}],detectPopup:[{visible:"#cookie-information-template-wrapper"}],optIn:[{eval:"EVAL_COOKIEINFORMATION_1"}],optOut:[{hide:["#cookie-information-template-wrapper"],comment:"some templates don't hide the banner automatically"},{eval:"EVAL_COOKIEINFORMATION_0"}],test:[{eval:"EVAL_COOKIEINFORMATION_2"}]},{name:"corona-in-zahlen.de",prehideSelectors:[".cookiealert"],detectCmp:[{exists:".cookiealert"}],detectPopup:[{visible:".cookiealert"}],optOut:[{click:".configurecookies"},{click:".confirmcookies"}],optIn:[{click:".acceptcookies"}]},{name:"crossfit-com",cosmetic:!0,prehideSelectors:['body #modal > div > div[class^="_wrapper_"]'],detectCmp:[{exists:'body #modal > div > div[class^="_wrapper_"]'}],detectPopup:[{visible:'body #modal > div > div[class^="_wrapper_"]'}],optIn:[{click:'button[aria-label="accept cookie policy"]'}],optOut:[{hide:['body #modal > div > div[class^="_wrapper_"]']}]},{name:"dailymotion-us",cosmetic:!0,prehideSelectors:['div[class*="CookiePopup__desktopContainer"]:has(div[class*="CookiePopup"])'],detectCmp:[{exists:'div[class*="CookiePopup__desktopContainer"]'}],detectPopup:[{visible:'div[class*="CookiePopup__desktopContainer"]'}],optIn:[{click:'div[class*="CookiePopup__desktopContainer"] > button > span'}],optOut:[{hide:['div[class*="CookiePopup__desktopContainer"]']}]},{name:"dailymotion.com",runContext:{urlPattern:"^https://(www\\.)?dailymotion\\.com/"},prehideSelectors:['div[class*="Overlay__container"]:has(div[class*="TCF2Popup"])'],detectCmp:[{exists:'div[class*="TCF2Popup"]'}],detectPopup:[{visible:'[class*="TCF2Popup"] a[href^="https://www.dailymotion.com/legal/cookiemanagement"]'}],optIn:[{waitForThenClick:'button[class*="TCF2Popup__button"]:not([class*="TCF2Popup__personalize"])'}],optOut:[{waitForThenClick:'button[class*="TCF2ContinueWithoutAcceptingButton"]'}],test:[{eval:"EVAL_DAILYMOTION_0"}]},{name:"deepl.com",prehideSelectors:[".dl_cookieBanner_container"],detectCmp:[{exists:".dl_cookieBanner_container"}],detectPopup:[{visible:".dl_cookieBanner_container"}],optOut:[{click:".dl_cookieBanner--buttonSelected"}],optIn:[{click:".dl_cookieBanner--buttonAll"}]},{name:"delta.com",runContext:{urlPattern:"^https://www\\.delta\\.com/"},cosmetic:!0,prehideSelectors:["ngc-cookie-banner"],detectCmp:[{exists:"div.cookie-footer-container"}],detectPopup:[{visible:"div.cookie-footer-container"}],optIn:[{click:" button.cookie-close-icon"}],optOut:[{hide:["div.cookie-footer-container"]}]},{name:"dmgmedia-us",prehideSelectors:["#mol-ads-cmp-iframe, div.mol-ads-cmp > form > div"],detectCmp:[{exists:"div.mol-ads-cmp > form > div"}],detectPopup:[{waitForVisible:"div.mol-ads-cmp > form > div"}],optIn:[{waitForThenClick:"button.mol-ads-cmp--btn-primary"}],optOut:[{waitForThenClick:"div.mol-ads-ccpa--message > u > a"},{waitForVisible:".mol-ads-cmp--modal-dialog"},{waitForThenClick:"a.mol-ads-cmp-footer-privacy"},{waitForThenClick:"button.mol-ads-cmp--btn-secondary"}]},{name:"dmgmedia",prehideSelectors:['[data-project="mol-fe-cmp"]'],detectCmp:[{exists:'[data-project="mol-fe-cmp"]'}],detectPopup:[{visible:'[data-project="mol-fe-cmp"]'}],optIn:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=primary]'}],optOut:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=basic]'},{waitForVisible:'[data-project="mol-fe-cmp"] div[class*="tabContent"]'},{waitForThenClick:'[data-project="mol-fe-cmp"] div[class*="toggle"][class*="enabled"]',all:!0},{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=white]'}]},{name:"Drupal",detectCmp:[{exists:"#drupalorg-crosssite-gdpr"}],detectPopup:[{visible:"#drupalorg-crosssite-gdpr"}],optOut:[{click:".no"}],optIn:[{click:".yes"}]},{name:"WP DSGVO Tools",link:"https://wordpress.org/plugins/shapepress-dsgvo/",prehideSelectors:[".sp-dsgvo"],cosmetic:!0,detectCmp:[{exists:".sp-dsgvo.sp-dsgvo-popup-overlay"}],detectPopup:[{visible:".sp-dsgvo.sp-dsgvo-popup-overlay",check:"any"}],optIn:[{click:".sp-dsgvo-privacy-btn-accept-all",all:!0}],optOut:[{hide:[".sp-dsgvo.sp-dsgvo-popup-overlay"]}],test:[{eval:"EVAL_DSGVO_0"}]},{name:"dunelm.com",prehideSelectors:["div[data-testid=cookie-consent-modal-backdrop]"],detectCmp:[{exists:"div[data-testid=cookie-consent-message-contents]"}],detectPopup:[{visible:"div[data-testid=cookie-consent-message-contents]"}],optIn:[{click:'[data-testid="cookie-consent-allow-all"]'}],optOut:[{click:"button[data-testid=cookie-consent-adjust-settings]"},{click:"button[data-testid=cookie-consent-preferences-save]"}],test:[{eval:"EVAL_DUNELM_0"}]},{name:"etsy",prehideSelectors:["#gdpr-single-choice-overlay","#gdpr-privacy-settings"],detectCmp:[{exists:"#gdpr-single-choice-overlay"}],detectPopup:[{visible:"#gdpr-single-choice-overlay"}],optOut:[{click:"button[data-gdpr-open-full-settings]"},{waitForVisible:".gdpr-overlay-body input",timeout:3e3},{wait:1e3},{eval:"EVAL_ETSY_0"},{eval:"EVAL_ETSY_1"}],optIn:[{click:"button[data-gdpr-single-choice-accept]"}]},{name:"eu-cookie-compliance-banner",detectCmp:[{exists:".eu-cookie-compliance-banner-info"}],detectPopup:[{exists:".eu-cookie-compliance-popup-open"}],optIn:[{click:".agree-button"}],optOut:[{click:".decline-button,.eu-cookie-compliance-save-preferences-button",optional:!0},{hide:[".eu-cookie-compliance-banner-info","#sliding-popup"]}],test:[{eval:"EVAL_EU_COOKIE_COMPLIANCE_0"}]},{name:"EU Cookie Law",prehideSelectors:[".pea_cook_wrapper,.pea_cook_more_info_popover"],cosmetic:!0,detectCmp:[{exists:".pea_cook_wrapper"}],detectPopup:[{wait:500},{visible:".pea_cook_wrapper"}],optIn:[{click:"#pea_cook_btn"}],optOut:[{hide:[".pea_cook_wrapper"]}],test:[{eval:"EVAL_EU_COOKIE_LAW_0"}]},{name:"EZoic",prehideSelectors:["#ez-cookie-dialog-wrapper"],detectCmp:[{exists:"#ez-cookie-dialog-wrapper"}],detectPopup:[{visible:"#ez-cookie-dialog-wrapper"}],optIn:[{click:"#ez-accept-all",optional:!0},{eval:"EVAL_EZOIC_0",optional:!0}],optOut:[{wait:500},{click:"#ez-manage-settings"},{waitFor:"#ez-cookie-dialog input[type=checkbox]"},{click:"#ez-cookie-dialog input[type=checkbox][checked]",all:!0},{click:"#ez-save-settings"}],test:[{eval:"EVAL_EZOIC_1"}]},{name:"facebook",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?facebook\\.com/"},prehideSelectors:['div[data-testid="cookie-policy-manage-dialog"]'],detectCmp:[{exists:'div[data-testid="cookie-policy-manage-dialog"]'}],detectPopup:[{visible:'div[data-testid="cookie-policy-manage-dialog"]'}],optIn:[{waitForThenClick:'button[data-cookiebanner="accept_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}],optOut:[{waitForThenClick:'button[data-cookiebanner="accept_only_essential_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}]},{name:"funding-choices",prehideSelectors:[".fc-consent-root,.fc-dialog-container,.fc-dialog-overlay,.fc-dialog-content"],detectCmp:[{exists:".fc-consent-root"}],detectPopup:[{exists:".fc-dialog-container"}],optOut:[{click:".fc-cta-do-not-consent,.fc-cta-manage-options"},{click:".fc-preference-consent:checked,.fc-preference-legitimate-interest:checked",all:!0,optional:!0},{click:".fc-confirm-choices",optional:!0}],optIn:[{click:".fc-cta-consent"}]},{name:"geeks-for-geeks",runContext:{urlPattern:"^https://www\\.geeksforgeeks\\.org/"},cosmetic:!0,prehideSelectors:[".cookie-consent"],detectCmp:[{exists:".cookie-consent"}],detectPopup:[{visible:".cookie-consent"}],optIn:[{click:".cookie-consent button.consent-btn"}],optOut:[{hide:[".cookie-consent"]}]},{name:"generic-cosmetic",cosmetic:!0,prehideSelectors:["#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"],detectCmp:[{exists:"#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"}],detectPopup:[{visible:"#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"}],optIn:[],optOut:[{hide:["#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"]}]},{name:"google-consent-standalone",prehideSelectors:[],detectCmp:[{exists:'a[href^="https://policies.google.com/technologies/cookies"'},{exists:'form[action^="https://consent."][action$=".com/save"]'}],detectPopup:[{visible:'a[href^="https://policies.google.com/technologies/cookies"'}],optIn:[{waitForThenClick:'form[action^="https://consent."][action$=".com/save"]:has(input[name=set_eom][value=false]) button'}],optOut:[{waitForThenClick:'form[action^="https://consent."][action$=".com/save"]:has(input[name=set_eom][value=true]) button'}]},{name:"google.com",prehideSelectors:[".HTjtHe#xe7COe"],detectCmp:[{exists:".HTjtHe#xe7COe"},{exists:'.HTjtHe#xe7COe a[href^="https://policies.google.com/technologies/cookies"]'}],detectPopup:[{visible:".HTjtHe#xe7COe button#W0wltc"}],optIn:[{waitForThenClick:".HTjtHe#xe7COe button#L2AGLb"}],optOut:[{waitForThenClick:".HTjtHe#xe7COe button#W0wltc"}],test:[{eval:"EVAL_GOOGLE_0"}]},{name:"gov.uk",detectCmp:[{exists:"#global-cookie-message"}],detectPopup:[{exists:"#global-cookie-message"}],optIn:[{click:"button[data-accept-cookies=true]"}],optOut:[{click:"button[data-reject-cookies=true],#reject-cookies"},{click:"button[data-hide-cookie-banner=true],#hide-cookie-decision"}]},{name:"healthline-media",prehideSelectors:["#modal-host > div.no-hash > div.window-wrapper"],detectCmp:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],detectPopup:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],optIn:[{click:"#modal-host > div.no-hash > div.window-wrapper > div:last-child button"}],optOut:[{if:{exists:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'},then:[{click:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'}],else:[{waitForVisible:"div#__next"},{click:"#__next div:nth-child(1) > button:first-child"}]}]},{name:"hl.co.uk",prehideSelectors:[".cookieModalContent","#cookie-banner-overlay"],detectCmp:[{exists:"#cookie-banner-overlay"}],detectPopup:[{exists:"#cookie-banner-overlay"}],optIn:[{click:"#acceptCookieButton"}],optOut:[{click:"#manageCookie"},{hide:[".cookieSettingsModal"]},{waitFor:"#AOCookieToggle"},{click:"#AOCookieToggle[aria-pressed=true]",optional:!0},{waitFor:"#TPCookieToggle"},{click:"#TPCookieToggle[aria-pressed=true]",optional:!0},{click:"#updateCookieButton"}]},{name:"hubspot",detectCmp:[{exists:"#hs-eu-cookie-confirmation"}],detectPopup:[{visible:"#hs-eu-cookie-confirmation"}],optIn:[{click:"#hs-eu-confirmation-button"}],optOut:[{click:"#hs-eu-decline-button"}]},{name:"indeed.com",cosmetic:!0,prehideSelectors:["#CookiePrivacyNotice"],detectCmp:[{exists:"#CookiePrivacyNotice"}],detectPopup:[{visible:"#CookiePrivacyNotice"}],optIn:[{click:"#CookiePrivacyNotice button[data-gnav-element-name=CookiePrivacyNoticeOk]"}],optOut:[{hide:["#CookiePrivacyNotice"]}]},{name:"ionos.de",prehideSelectors:[".privacy-consent--backdrop",".privacy-consent--modal"],detectCmp:[{exists:".privacy-consent--modal"}],detectPopup:[{visible:".privacy-consent--modal"}],optIn:[{click:"#selectAll"}],optOut:[{click:".footer-config-link"},{click:"#confirmSelection"}]},{name:"itopvpn.com",cosmetic:!0,prehideSelectors:[".pop-cookie"],detectCmp:[{exists:".pop-cookie"}],detectPopup:[{exists:".pop-cookie"}],optIn:[{click:"#_pcookie"}],optOut:[{hide:[".pop-cookie"]}]},{name:"iubenda",prehideSelectors:["#iubenda-cs-banner"],detectCmp:[{exists:"#iubenda-cs-banner"}],detectPopup:[{visible:".iubenda-cs-accept-btn"}],optIn:[{click:".iubenda-cs-accept-btn"}],optOut:[{click:".iubenda-cs-customize-btn"},{eval:"EVAL_IUBENDA_0"},{click:"#iubFooterBtn"}],test:[{eval:"EVAL_IUBENDA_1"}]},{name:"johnlewis.com",prehideSelectors:["div[class^=pecr-cookie-banner-]"],detectCmp:[{exists:"div[class^=pecr-cookie-banner-]"}],detectPopup:[{exists:"div[class^=pecr-cookie-banner-]"}],optOut:[{click:"button[data-test^=manage-cookies]"},{wait:"500"},{click:"label[data-test^=toggle][class*=checked]:not([class*=disabled])",all:!0,optional:!0},{click:"button[data-test=save-preferences]"}],optIn:[{click:"button[data-test=allow-all]"}]},{name:"jquery.cookieBar",comment:"https://github.com/kovarp/jquery.cookieBar",prehideSelectors:[".cookie-bar"],cosmetic:!0,detectCmp:[{exists:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons"}],detectPopup:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"any"}],optIn:[{click:".cookie-bar .cookie-bar__btn"}],optOut:[{hide:[".cookie-bar"]}],test:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"none"},{eval:"EVAL_JQUERY_COOKIEBAR_0"}]},{name:"justwatch.com",prehideSelectors:[".consent-banner"],detectCmp:[{exists:".consent-banner .consent-banner__actions"}],detectPopup:[{visible:".consent-banner .consent-banner__actions"}],optIn:[{click:".consent-banner__actions button.basic-button.primary"}],optOut:[{click:".consent-banner__actions button.basic-button.secondary"},{waitForThenClick:".consent-modal__footer button.basic-button.secondary"},{waitForThenClick:".consent-modal ion-content > div > a:nth-child(9)"},{click:"label.consent-switch input[type=checkbox]:checked",all:!0,optional:!0},{waitForVisible:".consent-modal__footer button.basic-button.primary"},{click:".consent-modal__footer button.basic-button.primary"}]},{name:"ketch",runContext:{frame:!1,main:!0},intermediate:!1,prehideSelectors:["#lanyard_root div[role='dialog']"],detectCmp:[{exists:"#lanyard_root div[role='dialog']"}],detectPopup:[{visible:"#lanyard_root div[role='dialog']"}],optIn:[{if:{exists:"#lanyard_root button[class='confirmButton']"},then:[{waitForThenClick:"#lanyard_root div[class^='buttons'] > :nth-child(2)"},{click:"#lanyard_root button[class='confirmButton']"}],else:[{waitForThenClick:"#lanyard_root div[class^='buttons'] > :nth-child(2)"}]}],optOut:[{click:"#lanyard_root button[class^='link']",optional:!0},{if:{exists:"#lanyard_root button[class*='confirmButton']"},then:[{waitForThenClick:"#lanyard_root button[class*='rejectButton']"},{click:"#lanyard_root button[class*='confirmButton']"}],else:[{click:"#lanyard_root div[class^='buttons'] > :nth-child(1)",optional:!0},{waitForThenClick:"#lanyard_root input:checked"},{click:"#consentsTab > div:nth-child(2) > div > div[class^='actions'] > button:nth-child(1)"}]}],test:[]},{name:"kleinanzeigen-de",runContext:{urlPattern:"^https?://(www\\.)?kleinanzeigen\\.de"},prehideSelectors:["#gdpr-banner-container"],detectCmp:[{any:[{exists:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{exists:"#ConsentManagementPage"}]}],detectPopup:[{any:[{visible:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{visible:"#ConsentManagementPage"}]}],optIn:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-accept]"}],else:[{click:"#ConsentManagementPage .Button-primary"}]}],optOut:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"}],else:[{click:"#ConsentManagementPage .Button-secondary"}]}]},{name:"linkedin.com",prehideSelectors:[".artdeco-global-alert[type=COOKIE_CONSENT]"],detectCmp:[{exists:".artdeco-global-alert[type=COOKIE_CONSENT]"}],detectPopup:[{visible:".artdeco-global-alert[type=COOKIE_CONSENT]"}],optIn:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"}],optOut:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"}],test:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT]",check:"none"}]},{name:"macpaw.com",cosmetic:!0,prehideSelectors:['div[data-banner="cookies"]'],detectCmp:[{exists:'div[data-banner="cookies"]'}],detectPopup:[{exists:'div[data-banner="cookies"]'}],optIn:[{click:'button[data-banner-close="cookies"]'}],optOut:[{hide:['div[data-banner="cookies"]']}]},{name:"marksandspencer.com",cosmetic:!0,detectCmp:[{exists:".navigation-cookiebbanner"}],detectPopup:[{visible:".navigation-cookiebbanner"}],optOut:[{hide:[".navigation-cookiebbanner"]}],optIn:[{click:".navigation-cookiebbanner__submit"}]},{name:"mediamarkt.de",prehideSelectors:["div[aria-labelledby=pwa-consent-layer-title]","div[class^=StyledConsentLayerWrapper-]"],detectCmp:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],detectPopup:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],optOut:[{click:"button[data-test^=pwa-consent-layer-deny-all]"}],optIn:[{click:"button[data-test^=pwa-consent-layer-accept-all"}]},{name:"Mediavine",prehideSelectors:['[data-name="mediavine-gdpr-cmp"]'],detectCmp:[{exists:'[data-name="mediavine-gdpr-cmp"]'}],detectPopup:[{wait:500},{visible:'[data-name="mediavine-gdpr-cmp"]'}],optIn:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [format="primary"]'}],optOut:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [data-view="manageSettings"]'},{waitFor:'[data-name="mediavine-gdpr-cmp"] input[type=checkbox]'},{eval:"EVAL_MEDIAVINE_0",optional:!0},{click:'[data-name="mediavine-gdpr-cmp"] [format="secondary"]'}]},{name:"microsoft.com",prehideSelectors:["#wcpConsentBannerCtrl"],detectCmp:[{exists:"#wcpConsentBannerCtrl"}],detectPopup:[{exists:"#wcpConsentBannerCtrl"}],optOut:[{eval:"EVAL_MICROSOFT_0"}],optIn:[{eval:"EVAL_MICROSOFT_1"}],test:[{eval:"EVAL_MICROSOFT_2"}]},{name:"midway-usa",runContext:{urlPattern:"^https://www\\.midwayusa\\.com/"},cosmetic:!0,prehideSelectors:["#cookie-container"],detectCmp:[{exists:['div[aria-label="Cookie Policy Banner"]']}],detectPopup:[{visible:"#cookie-container"}],optIn:[{click:"button#cookie-btn"}],optOut:[{hide:['div[aria-label="Cookie Policy Banner"]']}]},{name:"moneysavingexpert.com",detectCmp:[{exists:"dialog[data-testid=accept-our-cookies-dialog]"}],detectPopup:[{visible:"dialog[data-testid=accept-our-cookies-dialog]"}],optIn:[{click:"#banner-accept"}],optOut:[{click:"#banner-manage"},{click:"#pc-confirm"}]},{name:"monzo.com",prehideSelectors:[".cookie-alert, cookie-alert__content"],detectCmp:[{exists:'div.cookie-alert[role="dialog"]'},{exists:'a[href*="monzo"]'}],detectPopup:[{visible:".cookie-alert__content"}],optIn:[{click:".js-accept-cookie-policy"}],optOut:[{click:".js-decline-cookie-policy"}]},{name:"Moove",prehideSelectors:["#moove_gdpr_cookie_info_bar"],detectCmp:[{exists:"#moove_gdpr_cookie_info_bar"}],detectPopup:[{visible:"#moove_gdpr_cookie_info_bar"}],optIn:[{waitForThenClick:".moove-gdpr-infobar-allow-all"}],optOut:[{if:{exists:"#moove_gdpr_cookie_info_bar .change-settings-button"},then:[{click:"#moove_gdpr_cookie_info_bar .change-settings-button"},{waitForVisible:"#moove_gdpr_cookie_modal"},{eval:"EVAL_MOOVE_0"},{click:".moove-gdpr-modal-save-settings"}],else:[{hide:["#moove_gdpr_cookie_info_bar"]}]}],test:[{visible:"#moove_gdpr_cookie_info_bar",check:"none"}]},{name:"national-lottery.co.uk",detectCmp:[{exists:".cuk_cookie_consent"}],detectPopup:[{visible:".cuk_cookie_consent",check:"any"}],optOut:[{click:".cuk_cookie_consent_manage_pref"},{click:".cuk_cookie_consent_save_pref"},{click:".cuk_cookie_consent_close"}],optIn:[{click:".cuk_cookie_consent_accept_all"}]},{name:"nba.com",runContext:{urlPattern:"^https://(www\\.)?nba.com/"},cosmetic:!0,prehideSelectors:["#onetrust-banner-sdk"],detectCmp:[{exists:"#onetrust-banner-sdk"}],detectPopup:[{visible:"#onetrust-banner-sdk"}],optIn:[{click:"#onetrust-accept-btn-handler"}],optOut:[{hide:["#onetrust-banner-sdk"]}]},{name:"netflix.de",detectCmp:[{exists:"#cookie-disclosure"}],detectPopup:[{visible:".cookie-disclosure-message",check:"any"}],optIn:[{click:".btn-accept"}],optOut:[{hide:["#cookie-disclosure"]},{click:".btn-reject"}]},{name:"nhs.uk",prehideSelectors:["#nhsuk-cookie-banner"],detectCmp:[{exists:"#nhsuk-cookie-banner"}],detectPopup:[{exists:"#nhsuk-cookie-banner"}],optOut:[{click:"#nhsuk-cookie-banner__link_accept"}],optIn:[{click:"#nhsuk-cookie-banner__link_accept_analytics"}]},{name:"notice-cookie",prehideSelectors:[".button--notice"],cosmetic:!0,detectCmp:[{exists:".notice--cookie"}],detectPopup:[{visible:".notice--cookie"}],optIn:[{click:".button--notice"}],optOut:[{hide:[".notice--cookie"]}]},{name:"nrk.no",cosmetic:!0,prehideSelectors:[".nrk-masthead__info-banner--cookie"],detectCmp:[{exists:".nrk-masthead__info-banner--cookie"}],detectPopup:[{exists:".nrk-masthead__info-banner--cookie"}],optIn:[{click:"div.nrk-masthead__info-banner--cookie button > span:has(+ svg.nrk-close)"}],optOut:[{hide:[".nrk-masthead__info-banner--cookie"]}]},{name:"obi.de",prehideSelectors:[".disc-cp--active"],detectCmp:[{exists:".disc-cp-modal__modal"}],detectPopup:[{visible:".disc-cp-modal__modal"}],optIn:[{click:".js-disc-cp-accept-all"}],optOut:[{click:".js-disc-cp-deny-all"}]},{name:"onlyFans.com",prehideSelectors:["div.b-cookies-informer"],detectCmp:[{exists:"div.b-cookies-informer"}],detectPopup:[{exists:"div.b-cookies-informer"}],optIn:[{click:"div.b-cookies-informer__nav > button:nth-child(2)"}],optOut:[{click:"div.b-cookies-informer__nav > button:nth-child(1)"},{click:'div.b-cookies-informer__switchers > div:nth-child(2) > div[at-attr="checkbox"] > span.b-input-radio__container > input[type="checkbox"]'},{click:"div.b-cookies-informer__nav > button"}]},{name:"osano",prehideSelectors:[".osano-cm-window"],cosmetic:!0,detectCmp:[{exists:".osano-cm-window"}],detectPopup:[{visible:".osano-cm-dialog"}],optIn:[{click:".osano-cm-accept-all",optional:!0}],optOut:[{hide:[".osano-cm-window"]}]},{name:"otto.de",prehideSelectors:[".cookieBanner--visibility"],detectCmp:[{exists:".cookieBanner--visibility"}],detectPopup:[{visible:".cookieBanner__wrapper"}],optIn:[{click:".js_cookieBannerPermissionButton"}],optOut:[{click:".js_cookieBannerProhibitionButton"}]},{name:"paypal-us",prehideSelectors:["#ccpaCookieContent_wrapper, article.ppvx_modal--overpanel"],detectCmp:[{exists:"#ccpaCookieBanner, .privacy-modal-content"}],detectPopup:[{exists:"#ccpaCookieBanner, .privacy-modal-content"}],optIn:[{click:"#acceptAllButton"}],optOut:[{if:{exists:"a#manageCookiesLink"},then:[{click:"a#manageCookiesLink"}],else:[{waitForVisible:".privacy-modal-content #formContent"},{click:"#formContent .cookiepref-11m2iee-checkbox_base input:checked",all:!0,optional:!0},{click:".confirmCookie #submitCookiesBtn"}]}]},{name:"paypal.com",prehideSelectors:["#gdprCookieBanner"],detectCmp:[{exists:"#gdprCookieBanner"}],detectPopup:[{visible:"#gdprCookieContent_wrapper"}],optIn:[{click:"#acceptAllButton"}],optOut:[{wait:200},{click:".gdprCookieBanner_decline-button"}],test:[{wait:500},{eval:"EVAL_PAYPAL_0"}]},{name:"pinetools.com",cosmetic:!0,prehideSelectors:["#aviso_cookies"],detectCmp:[{exists:"#aviso_cookies"}],detectPopup:[{exists:".lang_en #aviso_cookies"}],optIn:[{click:"#aviso_cookies .a_boton_cerrar"}],optOut:[{hide:["#aviso_cookies"]}]},{name:"pmc",cosmetic:!0,prehideSelectors:["#pmc-pp-tou--notice"],detectCmp:[{exists:"#pmc-pp-tou--notice"}],detectPopup:[{visible:"#pmc-pp-tou--notice"}],optIn:[{click:"span.pmc-pp-tou--notice-close-btn"}],optOut:[{hide:["#pmc-pp-tou--notice"]}]},{name:"pornhub.com",runContext:{urlPattern:"^https://(www\\.)?pornhub\\.com/"},cosmetic:!0,prehideSelectors:[".cookiesBanner"],detectCmp:[{exists:".cookiesBanner"}],detectPopup:[{visible:".cookiesBanner"}],optIn:[{click:".cookiesBanner .okButton"}],optOut:[{hide:[".cookiesBanner"]}]},{name:"pornpics.com",cosmetic:!0,prehideSelectors:["#cookie-contract"],detectCmp:[{exists:"#cookie-contract"}],detectPopup:[{visible:"#cookie-contract"}],optIn:[{click:"#cookie-contract .icon-cross"}],optOut:[{hide:["#cookie-contract"]}]},{name:"PrimeBox CookieBar",prehideSelectors:["#cookie-bar"],detectCmp:[{exists:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy"}],detectPopup:[{visible:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy",check:"any"}],optIn:[{waitForThenClick:"#cookie-bar .cb-enable"}],optOut:[{click:"#cookie-bar .cb-disable",optional:!0},{hide:["#cookie-bar"]}],test:[{eval:"EVAL_PRIMEBOX_0"}]},{name:"privacymanager.io",prehideSelectors:["#gdpr-consent-tool-wrapper",'iframe[src^="https://cmp-consent-tool.privacymanager.io"]'],runContext:{urlPattern:"^https://cmp-consent-tool\\.privacymanager\\.io/",main:!1,frame:!0},detectCmp:[{exists:"button#save"}],detectPopup:[{visible:"button#save"}],optIn:[{click:"button#save"}],optOut:[{if:{exists:"#denyAll"},then:[{click:"#denyAll"},{waitForThenClick:".okButton"}],else:[{waitForThenClick:"#manageSettings"},{waitFor:".purposes-overview-list"},{waitFor:"button#saveAndExit"},{click:"span[role=checkbox][aria-checked=true]",all:!0,optional:!0},{click:"button#saveAndExit"}]}]},{name:"pubtech",prehideSelectors:["#pubtech-cmp"],detectCmp:[{exists:"#pubtech-cmp"}],detectPopup:[{visible:"#pubtech-cmp #pt-actions"}],optIn:[{if:{exists:"#pt-accept-all"},then:[{click:"#pubtech-cmp #pt-actions #pt-accept-all"}],else:[{click:"#pubtech-cmp #pt-actions button:nth-of-type(2)"}]}],optOut:[{click:"#pubtech-cmp #pt-close"}],test:[{eval:"EVAL_PUBTECH_0"}]},{name:"quantcast",prehideSelectors:["#qc-cmp2-main,#qc-cmp2-container"],detectCmp:[{exists:"#qc-cmp2-container"}],detectPopup:[{visible:"#qc-cmp2-ui"}],optOut:[{click:'.qc-cmp2-summary-buttons > button[mode="secondary"]'},{waitFor:"#qc-cmp2-ui"},{click:'.qc-cmp2-toggle-switch > button[aria-checked="true"]',all:!0,optional:!0},{click:'.qc-cmp2-main button[aria-label="REJECT ALL"]',optional:!0},{waitForThenClick:'.qc-cmp2-main button[aria-label="SAVE & EXIT"],.qc-cmp2-buttons-desktop > button[mode="primary"]',timeout:5e3}],optIn:[{click:'.qc-cmp2-summary-buttons > button[mode="primary"]'}]},{name:"reddit.com",runContext:{urlPattern:"^https://www\\.reddit\\.com/"},prehideSelectors:['section:has(a[href^="https://www.reddit.com/policies/cookies"])'],detectCmp:[{exists:'section:has(a[href^="https://www.reddit.com/policies/cookies"])'}],detectPopup:[{visible:'section:has(a[href^="https://www.reddit.com/policies/cookies"])'}],optIn:[{waitForThenClick:"section:has(a[href^=\"https://www.reddit.com/policies/cookies\"]) section[class^='_'] > section:first-child form button"}],optOut:[{waitForThenClick:"section:has(a[href^=\"https://www.reddit.com/policies/cookies\"]) section[class^='_'] > section:last-child form button"}],test:[{eval:"EVAL_REDDIT_0"}]},{name:"samsung.com",runContext:{urlPattern:"^https://www\\.samsung\\.com/"},cosmetic:!0,prehideSelectors:["div.cookie-bar"],detectCmp:[{exists:"div.cookie-bar"}],detectPopup:[{visible:"div.cookie-bar"}],optIn:[{click:"div.cookie-bar__manage > a"}],optOut:[{hide:["div.cookie-bar"]}]},{name:"sibbo",prehideSelectors:["sibbo-cmp-layout"],detectCmp:[{exists:"sibbo-cmp-layout"}],detectPopup:[{visible:"sibbo-cmp-layout"}],optIn:[{click:"sibbo-cmp-layout [data-accept-all]"}],optOut:[{click:'.sibbo-panel__aside__buttons a[data-nav="purposes"]'},{click:'.sibbo-panel__main__header__actions a[data-focusable="reject-all"]'},{if:{exists:"[data-view=purposes] .sibbo-panel__main__footer__actions [data-save-and-exit]"},then:[],else:[{waitFor:'.sibbo-panel__main__footer__actions a[data-focusable="next"]:not(.sibbo-cmp-button--disabled)'},{click:'.sibbo-panel__main__footer__actions a[data-focusable="next"]'},{click:'.sibbo-panel__main div[data-view="purposesLegInt"] a[data-focusable="reject-all"]'}]},{waitFor:".sibbo-panel__main__footer__actions [data-save-and-exit]:not(.sibbo-cmp-button--disabled)"},{click:".sibbo-panel__main__footer__actions [data-save-and-exit]:not(.sibbo-cmp-button--disabled)"}],test:[{eval:"EVAL_SIBBO_0"}]},{name:"similarweb.com",cosmetic:!0,prehideSelectors:[".app-cookies-notification"],detectCmp:[{exists:".app-cookies-notification"}],detectPopup:[{exists:".app-layout .app-cookies-notification"}],optIn:[{click:"button.app-cookies-notification__dismiss"}],optOut:[{hide:[".app-layout .app-cookies-notification"]}]},{name:"Sirdata",prehideSelectors:["#sd-cmp"],detectCmp:[{exists:"#sd-cmp"}],detectPopup:[{visible:"#sd-cmp"}],optIn:[{waitForThenClick:"#sd-cmp .sd-cmp-3cRQ2"}],optOut:[{waitForThenClick:"#sd-cmp .sd-cmp-1pO44"}],test:[{eval:"EVAL_SIRDATA_0"}]},{name:"snigel",detectCmp:[{exists:".snigel-cmp-framework"}],detectPopup:[{visible:".snigel-cmp-framework"}],optOut:[{click:"#sn-b-custom"},{click:"#sn-b-save"}],test:[{eval:"EVAL_SNIGEL_0"}],optIn:[{click:".snigel-cmp-framework #accept-choices"}]},{name:"steampowered.com",detectCmp:[{exists:".cookiepreferences_popup"},{visible:".cookiepreferences_popup"}],detectPopup:[{visible:".cookiepreferences_popup"}],optOut:[{click:"#rejectAllButton"}],optIn:[{click:"#acceptAllButton"}],test:[{wait:1e3},{eval:"EVAL_STEAMPOWERED_0"}]},{name:"takealot.com",cosmetic:!0,prehideSelectors:['div[class^="cookies-banner-module_cookie-banner_"]'],detectCmp:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],detectPopup:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],optIn:[{click:'button[class*="cookies-banner-module_dismiss-button_"]'}],optOut:[{hide:['div[class^="cookies-banner-module_cookie-banner_"]']}]},{name:"tarteaucitron.js",prehideSelectors:["#tarteaucitronRoot"],detectCmp:[{exists:"#tarteaucitronRoot"}],detectPopup:[{visible:"#tarteaucitronRoot #tarteaucitronAlertSmall,#tarteaucitronRoot #tarteaucitronAlertBig",check:"any"}],optIn:[{eval:"EVAL_TARTEAUCITRON_1"}],optOut:[{eval:"EVAL_TARTEAUCITRON_0"}],test:[{eval:"EVAL_TARTEAUCITRON_2",comment:"sometimes there are required categories, so we check that at least something is false"}]},{name:"Tealium",prehideSelectors:["#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs,#consent-layer"],detectCmp:[{visible:"#__tealiumGDPRecModal"},{eval:"EVAL_TEALIUM_0"}],detectPopup:[{visible:"#__tealiumGDPRecModal"}],optOut:[{waitForThenClick:"#cm-acceptNone,.js-accept-essential-cookies",timeout:1e3},{eval:"EVAL_TEALIUM_1"}],optIn:[{hide:["#__tealiumGDPRecModal"]},{eval:"EVAL_TEALIUM_2"}],test:[{eval:"EVAL_TEALIUM_3"}]},{name:"Termly",prehideSelectors:["#termly-code-snippet-support"],detectCmp:[{exists:"#termly-code-snippet-support"}],detectPopup:[{visible:"#termly-code-snippet-support div"}],optIn:[{waitForThenClick:'[data-tid="banner-accept"]'}],optOut:[{if:{exists:'[data-tid="banner-decline"]'},then:[{click:'[data-tid="banner-decline"]'}],else:[{click:".t-preference-button"},{wait:500},{if:{exists:".t-declineAllButton"},then:[{click:".t-declineAllButton"}],else:[{waitForThenClick:".t-preference-modal input[type=checkbox][checked]:not([disabled])",all:!0},{waitForThenClick:".t-saveButton"}]}]}]},{name:"Test page cosmetic CMP",cosmetic:!0,prehideSelectors:["#privacy-test-page-cmp-test-prehide"],detectCmp:[{exists:"#privacy-test-page-cmp-test-banner"}],detectPopup:[{visible:"#privacy-test-page-cmp-test-banner"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{hide:["#privacy-test-page-cmp-test-banner"]}],test:[{wait:500},{eval:"EVAL_TESTCMP_COSMETIC_0"}]},{name:"Test page CMP",prehideSelectors:["#reject-all"],detectCmp:[{exists:"#privacy-test-page-cmp-test"}],detectPopup:[{visible:"#privacy-test-page-cmp-test"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{waitFor:"#reject-all"},{click:"#reject-all"}],test:[{eval:"EVAL_TESTCMP_0"}]},{name:"thalia.de",prehideSelectors:[".consent-banner-box"],detectCmp:[{exists:"consent-banner[component=consent-banner]"}],detectPopup:[{visible:".consent-banner-box"}],optIn:[{click:".button-zustimmen"}],optOut:[{click:"button[data-consent=disagree]"}]},{name:"thefreedictionary.com",prehideSelectors:["#cmpBanner"],detectCmp:[{exists:"#cmpBanner"}],detectPopup:[{visible:"#cmpBanner"}],optIn:[{eval:"EVAL_THEFREEDICTIONARY_1"}],optOut:[{eval:"EVAL_THEFREEDICTIONARY_0"}]},{name:"theverge",runContext:{frame:!1,main:!0,urlPattern:"^https://(www)?\\.theverge\\.com"},intermediate:!1,prehideSelectors:[".duet--cta--cookie-banner"],detectCmp:[{exists:".duet--cta--cookie-banner"}],detectPopup:[{visible:".duet--cta--cookie-banner"}],optIn:[{click:".duet--cta--cookie-banner button.tracking-12",all:!1}],optOut:[{click:".duet--cta--cookie-banner button.tracking-12 > span"}],test:[{eval:"EVAL_THEVERGE_0"}]},{name:"tidbits-com",cosmetic:!0,prehideSelectors:["#eu_cookie_law_widget-2"],detectCmp:[{exists:"#eu_cookie_law_widget-2"}],detectPopup:[{visible:"#eu_cookie_law_widget-2"}],optIn:[{click:"#eu-cookie-law form > input.accept"}],optOut:[{hide:["#eu_cookie_law_widget-2"]}]},{name:"tractor-supply",runContext:{urlPattern:"^https://www\\.tractorsupply\\.com/"},cosmetic:!0,prehideSelectors:[".tsc-cookie-banner"],detectCmp:[{exists:".tsc-cookie-banner"}],detectPopup:[{visible:".tsc-cookie-banner"}],optIn:[{click:"#cookie-banner-cancel"}],optOut:[{hide:[".tsc-cookie-banner"]}]},{name:"trader-joes-com",cosmetic:!0,prehideSelectors:['div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'],detectCmp:[{exists:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],detectPopup:[{visible:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],optIn:[{click:'div[class^="CookiesAlert_cookiesAlert__container__"] button'}],optOut:[{hide:['div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]']}]},{name:"true-car",runContext:{urlPattern:"^https://www\\.truecar\\.com/"},cosmetic:!0,prehideSelectors:[['div[aria-labelledby="cookie-banner-heading"]']],detectCmp:[{exists:'div[aria-labelledby="cookie-banner-heading"]'}],detectPopup:[{visible:'div[aria-labelledby="cookie-banner-heading"]'}],optIn:[{click:'div[aria-labelledby="cookie-banner-heading"] > button[aria-label="Close"]'}],optOut:[{hide:['div[aria-labelledby="cookie-banner-heading"]']}]},{name:"truyo",prehideSelectors:["#truyo-consent-module"],detectCmp:[{exists:"#truyo-cookieBarContent"}],detectPopup:[{visible:"#truyo-consent-module"}],optIn:[{click:"button#acceptAllCookieButton"}],optOut:[{click:"button#declineAllCookieButton"}]},{name:"tumblr-com",cosmetic:!0,prehideSelectors:["#cmp-app-container"],detectCmp:[{exists:"#cmp-app-container"}],detectPopup:[{visible:"#cmp-app-container"}],optIn:[{click:"#tumblr #cmp-app-container div.components-modal__frame > iframe > html body > div > div > div.cmp__dialog-footer > div > button.components-button.white-space-normal.is-primary"}],optOut:[{hide:["#cmp-app-container"]}]},{name:"twitch.tv",runContext:{urlPattern:"^https?://(www\\.)?twitch\\.tv"},prehideSelectors:["div:has(> .consent-banner .consent-banner__content--gdpr-v2),.ReactModalPortal:has([data-a-target=consent-modal-save])"],detectCmp:[{exists:".consent-banner .consent-banner__content--gdpr-v2"}],detectPopup:[{visible:".consent-banner .consent-banner__content--gdpr-v2"}],optIn:[{click:'button[data-a-target="consent-banner-accept"]'}],optOut:[{hide:["div:has(> .consent-banner .consent-banner__content--gdpr-v2)"]},{click:'button[data-a-target="consent-banner-manage-preferences"]'},{waitFor:"input[type=checkbox][data-a-target=tw-checkbox]"},{click:"input[type=checkbox][data-a-target=tw-checkbox][checked]:not([disabled])",all:!0,optional:!0},{waitForThenClick:"[data-a-target=consent-modal-save]"},{waitForVisible:".ReactModalPortal:has([data-a-target=consent-modal-save])",check:"none"}]},{name:"twitter",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?twitter\\.com/"},prehideSelectors:['[data-testid="BottomBar"]'],detectCmp:[{exists:'[data-testid="BottomBar"] div'}],detectPopup:[{visible:'[data-testid="BottomBar"] div'}],optIn:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>span[role=button]) > div:last-child > div[role=button]:first-child'}],optOut:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>span[role=button]) > div:last-child > div[role=button]:last-child'}],TODOtest:[{eval:"EVAL_document.cookie.includes('d_prefs=MjoxLGNvbnNlbnRfdmVyc2lvbjoy')"}]},{name:"ubuntu.com",prehideSelectors:["dialog.cookie-policy"],detectCmp:[{any:[{exists:"dialog.cookie-policy header"},{exists:'xpath///*[@id="modal"]/div/header'}]}],detectPopup:[{any:[{visible:"dialog header"},{visible:'xpath///*[@id="modal"]/div/header'}]}],optIn:[{any:[{waitForThenClick:"#cookie-policy-button-accept"},{waitForThenClick:'xpath///*[@id="cookie-policy-button-accept"]'}]}],optOut:[{any:[{waitForThenClick:"button.p-button"},{waitForThenClick:'xpath///*[@id="cookie-policy-content"]/p[4]/button[2]'}]},{waitForThenClick:".p-switch__input:checked",optional:!0,all:!0},{any:[{waitForThenClick:"div > button"},{waitForThenClick:'xpath///*[@id="modal"]/div/button'}]}],test:[{eval:"EVAL_UBUNTU_COM_0"}]},{name:"UK Cookie Consent",prehideSelectors:["#catapult-cookie-bar"],cosmetic:!0,detectCmp:[{exists:"#catapult-cookie-bar"}],detectPopup:[{exists:".has-cookie-bar #catapult-cookie-bar"}],optIn:[{click:"#catapultCookie"}],optOut:[{hide:["#catapult-cookie-bar"]}],test:[{eval:"EVAL_UK_COOKIE_CONSENT_0"}]},{name:"urbanarmorgear-com",cosmetic:!0,prehideSelectors:['div[class^="Layout__CookieBannerContainer-"]'],detectCmp:[{exists:'div[class^="Layout__CookieBannerContainer-"]'}],detectPopup:[{visible:'div[class^="Layout__CookieBannerContainer-"]'}],optIn:[{click:'button[class^="CookieBanner__AcceptButton"]'}],optOut:[{hide:['div[class^="Layout__CookieBannerContainer-"]']}]},{name:"usercentrics-api",detectCmp:[{exists:"#usercentrics-root"}],detectPopup:[{eval:"EVAL_USERCENTRICS_API_0"},{exists:["#usercentrics-root","[data-testid=uc-container]"]}],optIn:[{eval:"EVAL_USERCENTRICS_API_3"},{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_5"}],optOut:[{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_2"}],test:[{eval:"EVAL_USERCENTRICS_API_6"}]},{name:"usercentrics-button",detectCmp:[{exists:"#usercentrics-button"}],detectPopup:[{visible:"#usercentrics-button #uc-btn-accept-banner"}],optIn:[{click:"#usercentrics-button #uc-btn-accept-banner"}],optOut:[{click:"#usercentrics-button #uc-btn-deny-banner"}],test:[{eval:"EVAL_USERCENTRICS_BUTTON_0"}]},{name:"uswitch.com",prehideSelectors:["#cookie-banner-wrapper"],detectCmp:[{exists:"#cookie-banner-wrapper"}],detectPopup:[{visible:"#cookie-banner-wrapper"}],optIn:[{click:"#cookie_banner_accept_mobile"}],optOut:[{click:"#cookie_banner_save"}]},{name:"vodafone.de",runContext:{urlPattern:"^https://www\\.vodafone\\.de/"},prehideSelectors:[".dip-consent,.dip-consent-container"],detectCmp:[{exists:".dip-consent-container"}],detectPopup:[{visible:".dip-consent-content"}],optOut:[{click:'.dip-consent-btn[tabindex="2"]'}],optIn:[{click:'.dip-consent-btn[tabindex="1"]'}]},{name:"waitrose.com",prehideSelectors:["div[aria-labelledby=CookieAlertModalHeading]","section[data-test=initial-waitrose-cookie-consent-banner]","section[data-test=cookie-consent-modal]"],detectCmp:[{exists:"section[data-test=initial-waitrose-cookie-consent-banner]"}],detectPopup:[{visible:"section[data-test=initial-waitrose-cookie-consent-banner]"}],optIn:[{click:"button[data-test=accept-all]"}],optOut:[{click:"button[data-test=manage-cookies]"},{wait:200},{eval:"EVAL_WAITROSE_0"},{click:"button[data-test=submit]"}],test:[{eval:"EVAL_WAITROSE_1"}]},{name:"wetransfer.com",detectCmp:[{exists:".welcome__cookie-notice"}],detectPopup:[{visible:".welcome__cookie-notice"}],optIn:[{click:".welcome__button--accept"}],optOut:[{click:".welcome__button--decline"}]},{name:"whitepages.com",runContext:{urlPattern:"^https://www\\.whitepages\\.com/"},cosmetic:!0,prehideSelectors:[".cookie-wrapper, .cookie-overlay"],detectCmp:[{exists:".cookie-wrapper"}],detectPopup:[{visible:".cookie-overlay"}],optIn:[{click:'button[aria-label="Got it"]'}],optOut:[{hide:[".cookie-wrapper"]}]},{name:"woo-commerce-com",prehideSelectors:[".wccom-comp-privacy-banner .wccom-privacy-banner"],detectCmp:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],detectPopup:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],optIn:[{click:".wccom-privacy-banner__content-buttons button.is-primary"}],optOut:[{click:".wccom-privacy-banner__content-buttons button.is-secondary"},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:"div.wccom-modal__footer > button"}]},{name:"WP Cookie Notice for GDPR",comment:"https://wordpress.org/plugins/gdpr-cookie-consent/",prehideSelectors:["#gdpr-cookie-consent-bar"],detectCmp:[{exists:"#gdpr-cookie-consent-bar"}],detectPopup:[{visible:"#gdpr-cookie-consent-bar"}],optIn:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_accept"}],optOut:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_reject"}],test:[{eval:"EVAL_WP_COOKIE_NOTICE_0"}]},{name:"wpcc",cosmetic:!0,prehideSelectors:[".wpcc-container"],detectCmp:[{exists:".wpcc-container"}],detectPopup:[{exists:".wpcc-container .wpcc-message"}],optIn:[{click:".wpcc-compliance .wpcc-btn"}],optOut:[{hide:[".wpcc-container"]}]},{name:"xhamster-eu",prehideSelectors:[".cookies-modal"],detectCmp:[{exists:".cookies-modal"}],detectPopup:[{exists:".cookies-modal"}],optIn:[{click:"button.cmd-button-accept-all"}],optOut:[{click:"button.cmd-button-reject-all"}]},{name:"xhamster-us",runContext:{urlPattern:"^https://(www\\.)?xhamster\\d?\\.com"},cosmetic:!0,prehideSelectors:[".cookie-announce"],detectCmp:[{exists:".cookie-announce"}],detectPopup:[{visible:".cookie-announce .announce-text"}],optIn:[{click:".cookie-announce button.xh-button"}],optOut:[{hide:[".cookie-announce"]}]},{name:"xing.com",detectCmp:[{exists:"div[class^=cookie-consent-CookieConsent]"}],detectPopup:[{exists:"div[class^=cookie-consent-CookieConsent]"}],optIn:[{click:"#consent-accept-button"}],optOut:[{click:"#consent-settings-button"},{click:".consent-banner-button-accept-overlay"}],test:[{eval:"EVAL_XING_0"}]},{name:"xnxx-com",cosmetic:!0,prehideSelectors:["#cookies-use-alert"],detectCmp:[{exists:"#cookies-use-alert"}],detectPopup:[{visible:"#cookies-use-alert"}],optIn:[{click:"#cookies-use-alert .close"}],optOut:[{hide:["#cookies-use-alert"]}]},{name:"youporn.com",cosmetic:!0,prehideSelectors:[".euCookieModal, #js_euCookieModal"],detectCmp:[{exists:".euCookieModal"}],detectPopup:[{exists:".euCookieModal, #js_euCookieModal"}],optIn:[{click:'button[name="user_acceptCookie"]'}],optOut:[{hide:[".euCookieModal"]}]},{name:"youtube-desktop",prehideSelectors:["tp-yt-iron-overlay-backdrop.opened","ytd-consent-bump-v2-lightbox"],detectCmp:[{exists:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"},{exists:'ytd-consent-bump-v2-lightbox tp-yt-paper-dialog a[href^="https://consent.youtube.com/"]'}],detectPopup:[{visible:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"}],optIn:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child button"},{wait:500}],optOut:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_DESKTOP_0"}]},{name:"youtube-mobile",prehideSelectors:[".consent-bump-v2-lightbox"],detectCmp:[{exists:"ytm-consent-bump-v2-renderer"}],detectPopup:[{visible:"ytm-consent-bump-v2-renderer"}],optIn:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:first-child button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:first-child button"},{wait:500}],optOut:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:nth-child(2) button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:nth-child(2) button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_MOBILE_0"}]}],P={"didomi.io":{detectors:[{presentMatcher:{target:{selector:"#didomi-host, #didomi-notice"},type:"css"},showingMatcher:{target:{selector:"body.didomi-popup-open, .didomi-notice-banner"},type:"css"}}],methods:[{action:{target:{selector:".didomi-popup-notice-buttons .didomi-button:not(.didomi-button-highlight), .didomi-notice-banner .didomi-learn-more-button"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{retries:50,target:{selector:"#didomi-purpose-cookies"},type:"waitcss",waitTime:50},{consents:[{description:"Share (everything) with others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:last-child"},type:"click"},type:"X"},{description:"Information storage and access",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:last-child"},type:"click"},type:"D"},{description:"Content selection, offers and marketing",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:last-child"},type:"click"},type:"E"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:last-child"},type:"click"},type:"B"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:last-child"},type:"click"},type:"B"},{description:"Ad and content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection",falseAction:{parent:{childFilter:{target:{selector:"#didomi-purpose-pub-ciblee"}},selector:".didomi-consent-popup-data-processing, .didomi-components-accordion-label-container"},target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - basics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - partners and subsidiaries",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:last-child"},type:"click"},type:"F"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:last-child"},type:"click"},type:"A"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:last-child"},type:"click"},type:"A"},{description:"Content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:last-child"},type:"click"},type:"E"},{description:"Ad delivery",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:last-child"},type:"click"},type:"F"}],type:"consent"},{action:{consents:[{matcher:{childFilter:{target:{selector:":not(.didomi-components-radio__option--selected)"}},type:"css"},trueAction:{target:{selector:":nth-child(2)"},type:"click"},falseAction:{target:{selector:":first-child"},type:"click"},type:"X"}],type:"consent"},target:{selector:".didomi-components-radio"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".didomi-consent-popup-footer .didomi-consent-popup-actions"},target:{selector:".didomi-components-button:first-child"},type:"click"},name:"SAVE_CONSENT"}]},oil:{detectors:[{presentMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"},showingMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".as-js-advanced-settings"},type:"click"},{retries:"10",target:{selector:".as-oil-cpc__purpose-container"},type:"waitcss",waitTime:"250"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{consents:[{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"D"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"B"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:".as-oil__btn-optin"},type:"click"},name:"SAVE_CONSENT"},{action:{target:{selector:"div.as-oil"},type:"hide"},name:"HIDE_CMP"}]},optanon:{detectors:[{presentMatcher:{target:{selector:"#optanon-menu, .optanon-alert-box-wrapper"},type:"css"},showingMatcher:{target:{displayFilter:!0,selector:".optanon-alert-box-wrapper"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".optanon-alert-box-wrapper .optanon-toggle-display, a[onclick*='OneTrust.ToggleInfoDisplay()'], a[onclick*='Optanon.ToggleInfoDisplay()']"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".preference-menu-item #Your-privacy"},type:"click"},{target:{selector:"#optanon-vendor-consent-text"},type:"click"},{action:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},target:{selector:"#optanon-vendor-consent-list .vendor-item"},type:"foreach"},{target:{selector:".vendor-consent-back-link"},type:"click"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"D"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".optanon-save-settings-button"},target:{selector:".optanon-white-button-middle"},type:"click"},name:"SAVE_CONSENT"},{action:{actions:[{target:{selector:"#optanon-popup-wrapper"},type:"hide"},{target:{selector:"#optanon-popup-bg"},type:"hide"},{target:{selector:".optanon-alert-box-wrapper"},type:"hide"}],type:"list"},name:"HIDE_CMP"}]},quantcast2:{detectors:[{presentMatcher:{target:{selector:"[data-tracking-opt-in-overlay]"},type:"css"},showingMatcher:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"css"}}],methods:[{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{type:"wait",waitTime:500},{action:{actions:[{target:{selector:"div",textFilter:["Information storage and access"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"D"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Personalization"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Ad selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Content selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"E"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Measurement"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"B"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Other Partners"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},type:"ifcss"}],type:"list"},parent:{childFilter:{target:{selector:"input"}},selector:"[data-tracking-opt-in-overlay] > div > div"},target:{childFilter:{target:{selector:"input"}},selector:":scope > div"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-save]"},type:"click"},name:"SAVE_CONSENT"}]},springer:{detectors:[{presentMatcher:{parent:null,target:{selector:".cmp-app_gdpr"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".cmp-popup_popup"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".cmp-intro_rejectAll"},type:"click"},{type:"wait",waitTime:250},{target:{selector:".cmp-purposes_purposeItem:not(.cmp-purposes_selectedPurpose)"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{consents:[{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"D"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"}],type:"consent"},name:"DO_CONSENT"},{action:{target:{selector:".cmp-details_save"},type:"click"},name:"SAVE_CONSENT"}]},wordpressgdpr:{detectors:[{presentMatcher:{parent:null,target:{selector:".wpgdprc-consent-bar"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".wpgdprc-consent-bar"},type:"css"}}],methods:[{action:{parent:null,target:{selector:".wpgdprc-consent-bar .wpgdprc-consent-bar__settings",textFilter:null},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Eyeota"},type:"click"},{consents:[{description:"Eyeota Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Advertising"},type:"click"},{consents:[{description:"Advertising Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{parent:null,target:{selector:".wpgdprc-button",textFilter:"Save my settings"},type:"click"},name:"SAVE_CONSENT"}]}},T={autoconsent:I,consentomatic:P},F=Object.freeze({__proto__:null,autoconsent:I,consentomatic:P,default:T});const L=new class{constructor(e,t=null,o=null){if(this.id=g(),this.rules=[],this.foundCmp=null,this.state={lifecycle:"loading",prehideOn:!1,findCmpAttempts:0,detectedCmps:[],detectedPopups:[],selfTest:null},w.sendContentMessage=e,this.sendContentMessage=e,this.rules=[],this.updateState({lifecycle:"loading"}),this.addDynamicRules(),t)this.initialize(t,o);else{o&&this.parseDeclarativeRules(o);e({type:"init",url:window.location.href}),this.updateState({lifecycle:"waitingForInitResponse"})}}initialize(e,t){if(this.config=e,e.enabled){if(t&&this.parseDeclarativeRules(t),this.rules=function(e,t){return e.filter((e=>(!t.disabledCmps||!t.disabledCmps.includes(e.name))&&(t.enableCosmeticRules||!e.isCosmetic)))}(this.rules,e),e.enablePrehide)if(document.documentElement)this.prehideElements();else{const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.prehideElements()};window.addEventListener("DOMContentLoaded",e)}if("loading"===document.readyState){const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.start()};window.addEventListener("DOMContentLoaded",e)}else this.start();this.updateState({lifecycle:"initialized"})}}addDynamicRules(){S.forEach((e=>{this.rules.push(new e(this))}))}parseDeclarativeRules(e){Object.keys(e.consentomatic).forEach((t=>{this.addConsentomaticCMP(t,e.consentomatic[t])})),e.autoconsent.forEach((e=>{this.addDeclarativeCMP(e)}))}addDeclarativeCMP(e){this.rules.push(new A(e,this))}addConsentomaticCMP(e,t){this.rules.push(new E(`com_${e}`,t))}start(){window.requestIdleCallback?window.requestIdleCallback((()=>this._start()),{timeout:500}):this._start()}async _start(){this.updateState({lifecycle:"started"});const e=await this.findCmp(this.config.detectRetries);if(this.updateState({detectedCmps:e.map((e=>e.name))}),0===e.length)return this.config.enablePrehide&&this.undoPrehide(),this.updateState({lifecycle:"nothingDetected"}),!1;this.updateState({lifecycle:"cmpDetected"});let t=await this.detectPopups(e.filter((e=>!e.isCosmetic)));if(0===t.length&&(t=await this.detectPopups(e.filter((e=>e.isCosmetic)))),0===t.length)return this.config.enablePrehide&&this.undoPrehide(),!1;if(this.updateState({lifecycle:"openPopupDetected"}),t.length>1){const e={msg:"Found multiple CMPs, check the detection rules.",cmps:t.map((e=>e.name))};this.sendContentMessage({type:"autoconsentError",details:e})}return this.foundCmp=t[0],"optOut"===this.config.autoAction?await this.doOptOut():"optIn"!==this.config.autoAction||await this.doOptIn()}async findCmp(e){this.updateState({findCmpAttempts:this.state.findCmpAttempts+1});const t=[];for(const e of this.rules)try{if(!e.checkRunContext())continue;await e.detectCmp()&&(this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:e.name}),t.push(e))}catch(e){}return 0===t.length&&e>0?(await k(500),this.findCmp(e-1)):t}async detectPopups(e){const t=[],o=e.map((e=>this.waitForPopup(e).then((o=>{o&&(this.updateState({detectedPopups:this.state.detectedPopups.concat([e.name])}),this.sendContentMessage({type:"popupFound",cmp:e.name,url:location.href}),t.push(e))})).catch((e=>null))));return await Promise.all(o),t}async doOptOut(){let e;return this.updateState({lifecycle:"runningOptOut"}),e=!!this.foundCmp&&await this.foundCmp.optOut(),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optOutResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:e,scheduleSelfTest:this.foundCmp&&this.foundCmp.hasSelfTest,url:location.href}),e&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:e?"optOutSucceeded":"optOutFailed"}),e}async doOptIn(){let e;return this.updateState({lifecycle:"runningOptIn"}),e=!!this.foundCmp&&await this.foundCmp.optIn(),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optInResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:e,scheduleSelfTest:!1,url:location.href}),e&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:e?"optInSucceeded":"optInFailed"}),e}async doSelfTest(){let e;return e=!!this.foundCmp&&await this.foundCmp.test(),this.sendContentMessage({type:"selfTestResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:e,url:location.href}),this.updateState({selfTest:e}),e}async waitForPopup(e,t=5,o=500){const c=await e.detectPopup().catch((e=>!1));return!c&&t>0?(await k(o),this.waitForPopup(e,t-1,o)):c}prehideElements(){const e=this.rules.reduce(((e,t)=>t.prehideSelectors?[...e,...t.prehideSelectors]:e),["#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"]);return this.updateState({prehideOn:!0}),setTimeout((()=>{this.config.enablePrehide&&this.state.prehideOn&&!["runningOptOut","runningOptIn"].includes(this.state.lifecycle)&&this.undoPrehide()}),this.config.prehideTimeout||2e3),function(e){return s(a("autoconsent-prehide"),e,"opacity")}(e)}undoPrehide(){return this.updateState({prehideOn:!1}),function(){const e=a("autoconsent-prehide");return e&&e.remove(),!!e}()}updateState(e){Object.assign(this.state,e),this.sendContentMessage({type:"report",instanceId:this.id,url:window.location.href,mainFrame:window.top===window.self,state:this.state})}async receiveMessageCallback(e){switch(e.type){case"initResp":this.initialize(e.config,e.rules);break;case"optIn":await this.doOptIn();break;case"optOut":await this.doOptOut();break;case"selfTest":await this.doSelfTest();break;case"evalResp":!function(e,t){const o=w.pending.get(e);o?(w.pending.delete(e),o.timer&&window.clearTimeout(o.timer),o.resolve(t)):console.warn("no eval #",e)}(e.id,e.result)}}}((e=>{window.webkit.messageHandlers[e.type]&&window.webkit.messageHandlers[e.type].postMessage(e).then((e=>{L.receiveMessageCallback(e)}))}),null,F);window.autoconsentMessageCallback=e=>{L.receiveMessageCallback(e)}}();
+!function(){"use strict";var e=class e{static setBase(t){e.base=t}static findElement(t,o=null,c=!1){let i=null;return i=null!=o?Array.from(o.querySelectorAll(t.selector)):null!=e.base?Array.from(e.base.querySelectorAll(t.selector)):Array.from(document.querySelectorAll(t.selector)),null!=t.textFilter&&(i=i.filter((e=>{const o=e.textContent.toLowerCase();if(Array.isArray(t.textFilter)){let e=!1;for(const c of t.textFilter)if(-1!==o.indexOf(c.toLowerCase())){e=!0;break}return e}if(null!=t.textFilter)return-1!==o.indexOf(t.textFilter.toLowerCase())}))),null!=t.styleFilters&&(i=i.filter((e=>{const o=window.getComputedStyle(e);let c=!0;for(const e of t.styleFilters){const t=o[e.option];c=e.negated?c&&t!==e.value:c&&t===e.value}return c}))),null!=t.displayFilter&&(i=i.filter((e=>t.displayFilter?0!==e.offsetHeight:0===e.offsetHeight))),null!=t.iframeFilter&&(i=i.filter((()=>t.iframeFilter?window.location!==window.parent.location:window.location===window.parent.location))),null!=t.childFilter&&(i=i.filter((o=>{const c=e.base;e.setBase(o);const i=e.find(t.childFilter);return e.setBase(c),null!=i.target}))),c?i:(i.length>1&&console.warn("Multiple possible targets: ",i,t,o),i[0])}static find(t,o=!1){const c=[];if(null!=t.parent){const i=e.findElement(t.parent,null,o);if(null!=i){if(i instanceof Array)return i.forEach((i=>{const n=e.findElement(t.target,i,o);n instanceof Array?n.forEach((e=>{c.push({parent:i,target:e})})):c.push({parent:i,target:n})})),c;{const n=e.findElement(t.target,i,o);n instanceof Array?n.forEach((e=>{c.push({parent:i,target:e})})):c.push({parent:i,target:n})}}}else{const i=e.findElement(t.target,null,o);i instanceof Array?i.forEach((e=>{c.push({parent:null,target:e})})):c.push({parent:null,target:i})}return 0===c.length&&c.push({parent:null,target:null}),o?c:(1!==c.length&&console.warn("Multiple results found, even though multiple false",c),c[0])}};e.base=null;var t=e;function o(e){const o=t.find(e);return"css"===e.type?!!o.target:"checkbox"===e.type?!!o.target&&o.target.checked:void 0}async function c(e,a){switch(e.type){case"click":return async function(e){const o=t.find(e);null!=o.target&&o.target.click();return n(i)}(e);case"list":return async function(e,t){for(const o of e.actions)await c(o,t)}(e,a);case"consent":return async function(e,t){for(const i of e.consents){const e=-1!==t.indexOf(i.type);if(i.matcher&&i.toggleAction){o(i.matcher)!==e&&await c(i.toggleAction)}else e?await c(i.trueAction):await c(i.falseAction)}}(e,a);case"ifcss":return async function(e,o){const i=t.find(e);i.target?e.falseAction&&await c(e.falseAction,o):e.trueAction&&await c(e.trueAction,o)}(e,a);case"waitcss":return async function(e){await new Promise((o=>{let c=e.retries||10;const i=e.waitTime||250,n=()=>{const a=t.find(e);(e.negated&&a.target||!e.negated&&!a.target)&&c>0?(c-=1,setTimeout(n,i)):o()};n()}))}(e);case"foreach":return async function(e,o){const i=t.find(e,!0),n=t.base;for(const n of i)n.target&&(t.setBase(n.target),await c(e.action,o));t.setBase(n)}(e,a);case"hide":return async function(e){const o=t.find(e);o.target&&o.target.classList.add("Autoconsent-Hidden")}(e);case"slide":return async function(e){const o=t.find(e),c=t.find(e.dragTarget);if(o.target){const e=o.target.getBoundingClientRect(),t=c.target.getBoundingClientRect();let i=t.top-e.top,n=t.left-e.left;"y"===this.config.axis.toLowerCase()&&(n=0),"x"===this.config.axis.toLowerCase()&&(i=0);const a=window.screenX+e.left+e.width/2,s=window.screenY+e.top+e.height/2,r=e.left+e.width/2,l=e.top+e.height/2,p=document.createEvent("MouseEvents");p.initMouseEvent("mousedown",!0,!0,window,0,a,s,r,l,!1,!1,!1,!1,0,o.target);const d=document.createEvent("MouseEvents");d.initMouseEvent("mousemove",!0,!0,window,0,a+n,s+i,r+n,l+i,!1,!1,!1,!1,0,o.target);const u=document.createEvent("MouseEvents");u.initMouseEvent("mouseup",!0,!0,window,0,a+n,s+i,r+n,l+i,!1,!1,!1,!1,0,o.target),o.target.dispatchEvent(p),await this.waitTimeout(10),o.target.dispatchEvent(d),await this.waitTimeout(10),o.target.dispatchEvent(u)}}(e);case"close":return async function(){window.close()}();case"wait":return async function(e){await n(e.waitTime)}(e);case"eval":return async function(e){return console.log("eval!",e.code),new Promise((t=>{try{e.async?(window.eval(e.code),setTimeout((()=>{t(window.eval("window.__consentCheckResult"))}),e.timeout||250)):t(window.eval(e.code))}catch(o){console.warn("eval error",o,e.code),t(!1)}}))}(e);default:throw"Unknown action type: "+e.type}}var i=0;function n(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function a(e="autoconsent-css-rules"){const t=`style#${e}`,o=document.querySelector(t);if(o&&o instanceof HTMLStyleElement)return o;{const t=document.head||document.getElementsByTagName("head")[0]||document.documentElement,o=document.createElement("style");return o.id=e,t.appendChild(o),o}}function s(e,t,o="display"){const c="opacity"===o?"opacity: 0":"display: none",i=`${t.join(",")} { ${c} !important; z-index: -1 !important; pointer-events: none !important; } `;return e instanceof HTMLStyleElement&&(e.innerText+=i,t.length>0)}async function r(e,t,o){const c=await e();return!c&&t>0?new Promise((c=>{setTimeout((async()=>{c(r(e,t-1,o))}),o)})):Promise.resolve(c)}function l(e){if(!e)return!1;if(null!==e.offsetParent)return!0;{const t=window.getComputedStyle(e);if("fixed"===t.position&&"none"!==t.display)return!0}return!1}function p(e,t=!1){const o=g(e);return o.length>0&&(t?o.forEach((e=>e.click())):o[0].click()),o.length>0}function d(e){return g(e).length>0}function u(e,t){const o=g(e),c=new Array(o.length);return o.forEach(((e,t)=>{c[t]=l(e)})),"none"===t?c.every((e=>!e)):0!==c.length&&("any"===t?c.some((e=>e)):c.every((e=>e)))}function m(e,t=1e4){return r((()=>g(e).length>0),Math.ceil(t/200),200)}function h(e,t=1e4,o="any"){return r((()=>u(e,o)),Math.ceil(t/200),200)}async function k(e,t=1e4,o=!1){return await m(e,t),p(e,o)}function b(e){return new Promise((t=>{setTimeout((()=>{t(!0)}),e)}))}function _(e,t=document){if(e.startsWith("aria/"))return[];if(e.startsWith("xpath/")){const o=e.slice(6),c=document.evaluate(o,t,null,XPathResult.ANY_TYPE,null);let i=null;const n=[];for(;i=c.iterateNext();)n.push(i);return n}return e.startsWith("text/")||e.startsWith("pierce/")?[]:t.shadowRoot?Array.from(t.shadowRoot.querySelectorAll(e)):Array.from(t.querySelectorAll(e))}function g(e){return"string"==typeof e?_(e):function(e){let t,o=document;for(const c of e){if(t=_(c,o),0===t.length)return[];o=t[0]}return t}(e)}function y(){return crypto&&void 0!==crypto.randomUUID?crypto.randomUUID():Math.random().toString()}var w=class{constructor(e,t=1e3){this.id=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),this.timer=window.setTimeout((()=>{this.reject(new Error("timeout"))}),t)}},C={pending:new Map,sendContentMessage:null};var v={EVAL_0:()=>console.log(1),EVAL_CONSENTMANAGER_1:()=>window.__cmp&&"object"==typeof __cmp("getCMPData"),EVAL_CONSENTMANAGER_2:()=>!__cmp("consentStatus").userChoiceExists,EVAL_CONSENTMANAGER_3:()=>__cmp("setConsent",0),EVAL_CONSENTMANAGER_4:()=>__cmp("setConsent",1),EVAL_CONSENTMANAGER_5:()=>__cmp("consentStatus").userChoiceExists,EVAL_COOKIEBOT_1:()=>!0!==window.CookieConsent.hasResponse,EVAL_COOKIEBOT_2:()=>window.Cookiebot.dialog.submitConsent(),EVAL_COOKIEBOT_3:()=>endCookieProcess(),EVAL_COOKIEBOT_4:()=>!0===window.CookieConsent.declined,EVAL_KLARO_1:()=>klaro.getManager().config.services.every((e=>e.required||!klaro.getManager().consents[e.name])),EVAL_ONETRUST_1:()=>window.OnetrustActiveGroups.split(",").filter((e=>e.length>0)).length<=1,EVAL_TRUSTARC_TOP:()=>window&&window.truste&&"0"===window.truste.eu.bindMap.prefCookie,EVAL_ADROLL_0:()=>!document.cookie.includes("__adroll_fpc"),EVAL_ALMACMP_0:()=>document.cookie.includes('"name":"Google","consent":false'),EVAL_AFFINITY_SERIF_COM_0:()=>document.cookie.includes("serif_manage_cookies_viewed")&&!document.cookie.includes("serif_allow_analytics"),EVAL_AXEPTIO_0:()=>document.cookie.includes("axeptio_authorized_vendors=%2C%2C"),EVAL_BING_0:()=>document.cookie.includes("AL=0")&&document.cookie.includes("AD=0")&&document.cookie.includes("SM=0"),EVAL_BORLABS_0:()=>!JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("borlabs-cookie"))).split("=",2)[1])).consents.statistics,EVAL_BUNDESREGIERUNG_DE_0:()=>document.cookie.match("cookie-allow-tracking=0"),EVAL_CANVA_0:()=>!document.cookie.includes("gtm_fpc_engagement_event"),EVAL_CC_BANNER2_0:()=>!!document.cookie.match(/sncc=[^;]+D%3Dtrue/),EVAL_CLICKIO_0:()=>document.cookie.includes("__lxG__consent__v2_daisybit="),EVAL_CLINCH_0:()=>document.cookie.includes("ctc_rejected=1"),EVAL_COINBASE_0:()=>JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent.length<=1,EVAL_COMPLIANZ_BANNER_0:()=>document.cookie.includes("cmplz_banner-status=dismissed"),EVAL_COMPLIANZ_CATEGORIES_0:()=>!!document.cookie.match(/cmplz_[^=]+=deny/),EVAL_COMPLIANZ_OPTIN_0:()=>!!document.cookie.match(/cookieconsent_preferences_disabled=[^;]+/),EVAL_COOKIE_LAW_INFO_0:()=>CLI.disableAllCookies()||CLI.reject_close()||!0,EVAL_COOKIE_LAW_INFO_1:()=>-1===document.cookie.indexOf("cookielawinfo-checkbox-non-necessary=yes"),EVAL_COOKIE_MANAGER_POPUP_0:()=>!1===JSON.parse(document.cookie.split(";").find((e=>e.trim().startsWith("CookieLevel"))).split("=")[1]).social,EVAL_COOKIEALERT_0:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_1:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_2:()=>!0===window.CookieConsent.declined,EVAL_COOKIEFIRST_0:()=>{return!1===(e=JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("cookiefirst"))).trim()).split("=")[1])).performance&&!1===e.functional&&!1===e.advertising;var e},EVAL_COOKIEFIRST_1:()=>document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((e=>"true"==e.getAttribute("aria-checked")&&e.click()))||!0,EVAL_COOKIEINFORMATION_0:()=>CookieInformation.declineAllCategories()||!0,EVAL_COOKIEINFORMATION_1:()=>CookieInformation.submitAllCategories()||!0,EVAL_COOKIEINFORMATION_2:()=>document.cookie.includes("CookieInformationConsent="),EVAL_DAILYMOTION_0:()=>!!document.cookie.match("dm-euconsent-v2"),EVAL_DSGVO_0:()=>!document.cookie.includes("sp_dsgvo_cookie_settings"),EVAL_DUNELM_0:()=>document.cookie.includes("cc_functional=0")&&document.cookie.includes("cc_targeting=0"),EVAL_ETSY_0:()=>document.querySelectorAll(".gdpr-overlay-body input").forEach((e=>{e.checked=!1}))||!0,EVAL_ETSY_1:()=>document.querySelector(".gdpr-overlay-view button[data-wt-overlay-close]").click()||!0,EVAL_EU_COOKIE_COMPLIANCE_0:()=>-1===document.cookie.indexOf("cookie-agreed=2"),EVAL_EU_COOKIE_LAW_0:()=>!document.cookie.includes("euCookie"),EVAL_EZOIC_0:()=>ezCMP.handleAcceptAllClick(),EVAL_EZOIC_1:()=>!!document.cookie.match(/ezCMPCookieConsent=[^;]+\|2=0\|3=0\|4=0/),EVAL_GOOGLE_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_IUBENDA_0:()=>document.querySelectorAll(".purposes-item input[type=checkbox]:not([disabled])").forEach((e=>{e.checked&&e.click()}))||!0,EVAL_IUBENDA_1:()=>!!document.cookie.match(/_iub_cs-\d+=/),EVAL_JQUERY_COOKIEBAR_0:()=>!document.cookie.includes("cookies-state=accepted"),EVAL_MEDIAVINE_0:()=>document.querySelectorAll('[data-name="mediavine-gdpr-cmp"] input[type=checkbox]').forEach((e=>e.checked&&e.click()))||!0,EVAL_MICROSOFT_0:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Reject|Ablehnen")))[0].click()||!0,EVAL_MICROSOFT_1:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Accept|Annehmen")))[0].click()||!0,EVAL_MICROSOFT_2:()=>!!document.cookie.match("MSCC"),EVAL_MOOVE_0:()=>document.querySelectorAll("#moove_gdpr_cookie_modal input").forEach((e=>{e.disabled||"moove_gdpr_strict_cookies"===e.name||(e.checked=!1)}))||!0,EVAL_ONENINETWO_0:()=>document.cookie.includes("CC_ADVERTISING=NO")&&document.cookie.includes("CC_ANALYTICS=NO"),EVAL_PAYPAL_0:()=>!0===document.cookie.includes("cookie_prefs"),EVAL_PRIMEBOX_0:()=>!document.cookie.includes("cb-enabled=accepted"),EVAL_PUBTECH_0:()=>document.cookie.includes("euconsent-v2")&&(document.cookie.match(/.YAAAAAAAAAAA/)||document.cookie.match(/.aAAAAAAAAAAA/)||document.cookie.match(/.YAAACFgAAAAA/)),EVAL_REDDIT_0:()=>document.cookie.includes("eu_cookie={%22opted%22:true%2C%22nonessential%22:false}"),EVAL_SIBBO_0:()=>!!window.localStorage.getItem("euconsent-v2"),EVAL_SIRDATA_0:()=>document.cookie.includes("euconsent-v2"),EVAL_SNIGEL_0:()=>!!document.cookie.match("snconsent"),EVAL_STEAMPOWERED_0:()=>2===JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>e.trim().startsWith("cookieSettings"))).split("=")[1])).preference_state,EVAL_TAKEALOT_0:()=>document.body.classList.remove("freeze")||(document.body.style="")||!0,EVAL_TARTEAUCITRON_0:()=>tarteaucitron.userInterface.respondAll(!1)||!0,EVAL_TARTEAUCITRON_1:()=>tarteaucitron.userInterface.respondAll(!0)||!0,EVAL_TARTEAUCITRON_2:()=>document.cookie.match(/tarteaucitron=[^;]*/)[0].includes("false"),EVAL_TEALIUM_0:()=>void 0!==window.utag&&"object"==typeof utag.gdpr,EVAL_TEALIUM_1:()=>utag.gdpr.setConsentValue(!1)||!0,EVAL_TEALIUM_2:()=>utag.gdpr.setConsentValue(!0)||!0,EVAL_TEALIUM_3:()=>1!==utag.gdpr.getConsentState(),EVAL_TESTCMP_0:()=>"button_clicked"===window.results.results[0],EVAL_TESTCMP_COSMETIC_0:()=>"banner_hidden"===window.results.results[0],EVAL_THEFREEDICTIONARY_0:()=>cmpUi.showPurposes()||cmpUi.rejectAll()||!0,EVAL_THEFREEDICTIONARY_1:()=>cmpUi.allowAll()||!0,EVAL_THEVERGE_0:()=>document.cookie.includes("_duet_gdpr_acknowledged=1"),EVAL_UBUNTU_COM_0:()=>"_cookies_accepted=essential"===document.cookie,EVAL_UK_COOKIE_CONSENT_0:()=>!document.cookie.includes("catAccCookies"),EVAL_USERCENTRICS_API_0:()=>"object"==typeof UC_UI,EVAL_USERCENTRICS_API_1:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_2:()=>!!UC_UI.denyAllConsents(),EVAL_USERCENTRICS_API_3:()=>!!UC_UI.acceptAllConsents(),EVAL_USERCENTRICS_API_4:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_5:()=>!0===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_API_6:()=>!1===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_BUTTON_0:()=>JSON.parse(localStorage.getItem("usercentrics")).consents.every((e=>e.isEssential||!e.consentStatus)),EVAL_WAITROSE_0:()=>Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e=>e.click()))||!0,EVAL_WAITROSE_1:()=>document.cookie.includes("wtr_cookies_advertising=0")&&document.cookie.includes("wtr_cookies_analytics=0"),EVAL_WP_COOKIE_NOTICE_0:()=>document.cookie.includes("wpl_viewed_cookie=no"),EVAL_XING_0:()=>document.cookie.includes("userConsent=%7B%22marketing%22%3Afalse"),EVAL_YOUTUBE_DESKTOP_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_YOUTUBE_MOBILE_0:()=>!!document.cookie.match(/SOCS=CAE/)};var f={main:!0,frame:!1,urlPattern:""},A=class{constructor(e){this.runContext=f,this.autoconsent=e}get hasSelfTest(){throw new Error("Not Implemented")}get isIntermediate(){throw new Error("Not Implemented")}get isCosmetic(){throw new Error("Not Implemented")}mainWorldEval(e){const t=v[e];if(!t)return console.warn("Snippet not found",e),Promise.resolve(!1);if(this.autoconsent.config.isMainWorld){let e=!1;try{e=!!t.call(globalThis)}catch(e){}return Promise.resolve(e)}return function(e){const t=y();C.sendContentMessage({type:"eval",id:t,code:e});const o=new w(t);return C.pending.set(o.id,o),o.promise}(function(e){const t=e.toString();return t.substring(t.indexOf("=>")+2)}(t)).catch((e=>!1))}checkRunContext(){const e={...f,...this.runContext},t=window.top===window;return!(t&&!e.main)&&(!(!t&&!e.frame)&&!(e.urlPattern&&!window.location.href.match(e.urlPattern)))}detectCmp(){throw new Error("Not Implemented")}async detectPopup(){return!1}optOut(){throw new Error("Not Implemented")}optIn(){throw new Error("Not Implemented")}openCmp(){throw new Error("Not Implemented")}async test(){return Promise.resolve(!0)}},E=class extends A{constructor(e,t){super(t),this.config=e,this.name=e.name,this.runContext=e.runContext||f}get hasSelfTest(){return!!this.config.test}get isIntermediate(){return!!this.config.intermediate}get isCosmetic(){return!!this.config.cosmetic}get prehideSelectors(){return this.config.prehideSelectors}async detectCmp(){return!!this.config.detectCmp&&this._runRulesParallel(this.config.detectCmp)}async detectPopup(){return!!this.config.detectPopup&&this._runRulesSequentially(this.config.detectPopup)}async optOut(){return!!this.config.optOut&&this._runRulesSequentially(this.config.optOut)}async optIn(){return!!this.config.optIn&&this._runRulesSequentially(this.config.optIn)}async openCmp(){return!!this.config.openCmp&&this._runRulesSequentially(this.config.openCmp)}async test(){return this.hasSelfTest?this._runRulesSequentially(this.config.test):super.test()}async evaluateRuleStep(e){const t=[];if(e.exists&&t.push(d(e.exists)),e.visible&&t.push(u(e.visible,e.check)),e.eval){const o=this.mainWorldEval(e.eval);t.push(o)}var o,c;if(e.waitFor&&t.push(m(e.waitFor,e.timeout)),e.waitForVisible&&t.push(h(e.waitForVisible,e.timeout,e.check)),e.click&&t.push(p(e.click,e.all)),e.waitForThenClick&&t.push(k(e.waitForThenClick,e.timeout,e.all)),e.wait&&t.push(b(e.wait)),e.hide&&t.push((o=e.hide,c=e.method,s(a(),o,c))),e.if){if(!e.if.exists&&!e.if.visible)return console.error("invalid conditional rule",e.if),!1;await this.evaluateRuleStep(e.if)?t.push(this._runRulesSequentially(e.then)):e.else&&t.push(this._runRulesSequentially(e.else))}if(e.any){for(const t of e.any)if(await this.evaluateRuleStep(t))return!0;return!1}if(0===t.length)return!1;return(await Promise.all(t)).reduce(((e,t)=>e&&t),!0)}async _runRulesParallel(e){const t=e.map((e=>this.evaluateRuleStep(e)));return(await Promise.all(t)).every((e=>!!e))}async _runRulesSequentially(e){for(const t of e){if(!await this.evaluateRuleStep(t)&&!t.optional)return!1}return!0}},O=class{constructor(e,t){this.name=e,this.config=t,this.methods=new Map,this.runContext=f,this.isCosmetic=!1,t.methods.forEach((e=>{e.action&&this.methods.set(e.name,e.action)})),this.hasSelfTest=!1}get isIntermediate(){return!1}checkRunContext(){return!0}async detectCmp(){return this.config.detectors.map((e=>o(e.presentMatcher))).some((e=>!!e))}async detectPopup(){return this.config.detectors.map((e=>o(e.showingMatcher))).some((e=>!!e))}async executeAction(e,t){return!this.methods.has(e)||c(this.methods.get(e),t)}async optOut(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",[]),await this.executeAction("SAVE_CONSENT"),!0}async optIn(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",["D","A","B","E","F","X"]),await this.executeAction("SAVE_CONSENT"),!0}async openCmp(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),!0}async test(){return!0}},x="#truste-show-consent",S="#truste-consent-track",I=[class extends A{constructor(e){super(e),this.name="TrustArc-top",this.prehideSelectors=[".trustarc-banner-container",`.truste_popframe,.truste_overlay,.truste_box_overlay,${S}`],this.runContext={main:!0,frame:!1},this._shortcutButton=null,this._optInDone=!1}get hasSelfTest(){return!1}get isIntermediate(){return!this._optInDone&&!this._shortcutButton}get isCosmetic(){return!1}async detectCmp(){const e=d(`${x},${S}`);return e&&(this._shortcutButton=document.querySelector("#truste-consent-required")),e}async detectPopup(){return u(`#truste-consent-content,#trustarc-banner-overlay,${S}`,"all")}openFrame(){p(x)}async optOut(){return this._shortcutButton?(this._shortcutButton.click(),!0):(s(a(),[".truste_popframe",".truste_overlay",".truste_box_overlay",S]),p(x),setTimeout((()=>{a().remove()}),1e4),!0)}async optIn(){return this._optInDone=!0,p("#truste-consent-button")}async openCmp(){return!0}async test(){return await this.mainWorldEval("EVAL_TRUSTARC_TOP")}},class extends A{constructor(){super(...arguments),this.name="TrustArc-frame",this.runContext={main:!1,frame:!0,urlPattern:"^https://consent-pref\\.trustarc\\.com/\\?"}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return!0}async detectPopup(){return u("#defaultpreferencemanager","any")&&u(".mainContent","any")}async navigateToSettings(){return await r((async()=>d(".shp")||u(".advance","any")||d(".switch span:first-child")),10,500),d(".shp")&&p(".shp"),await m(".prefPanel",5e3),u(".advance","any")&&p(".advance"),await r((()=>u(".switch span:first-child","any")),5,1e3)}async optOut(){return await r((()=>"complete"===document.readyState),20,100),await m(".mainContent[aria-hidden=false]",5e3),!!p(".rejectAll")||(d(".prefPanel")&&await m('.prefPanel[style="visibility: visible;"]',3e3),p("#catDetails0")?(p(".submit"),waitForThenClick("#gwt-debug-close_id",5e3),!0):p(".required")?(waitForThenClick("#gwt-debug-close_id",5e3),!0):(await this.navigateToSettings(),p(".switch span:nth-child(1):not(.active)",!0),p(".submit"),waitForThenClick("#gwt-debug-close_id",3e5),!0))}async optIn(){return p(".call")||(await this.navigateToSettings(),p(".switch span:nth-child(2)",!0),p(".submit"),m("#gwt-debug-close_id",3e5).then((()=>{p("#gwt-debug-close_id")}))),!0}},class extends A{constructor(){super(...arguments),this.name="Cybotcookiebot",this.prehideSelectors=["#CybotCookiebotDialog,#dtcookie-container,#cookiebanner,#cb-cookieoverlay"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("#CybotCookiebotDialogBodyLevelButtonPreferences")}async detectPopup(){return d("#CybotCookiebotDialog,#dtcookie-container,#cookiebanner,#cb-cookiebanner")}async optOut(){return p(".cookie-alert-extended-detail-link")?(await m(".cookie-alert-configuration",2e3),p(".cookie-alert-configuration-input:checked",!0),p(".cookie-alert-extended-button-secondary"),!0):d("#dtcookie-container")?p(".h-dtcookie-decline"):(p(".cookiebot__button--settings")||p("#CybotCookiebotDialogBodyButtonDecline")||(p(".cookiebanner__link--details"),p('.CybotCookiebotDialogBodyLevelButton:checked:enabled,input[id*="CybotCookiebotDialogBodyLevelButton"]:checked:enabled',!0),p("#CybotCookiebotDialogBodyButtonDecline"),p("input[id^=CybotCookiebotDialogBodyLevelButton]:checked",!0),d("#CybotCookiebotDialogBodyButtonAcceptSelected")?p("#CybotCookiebotDialogBodyButtonAcceptSelected"):p("#CybotCookiebotDialogBodyLevelButtonAccept,#CybotCookiebotDialogBodyButtonAccept,#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowallSelection",!0),await this.mainWorldEval("EVAL_COOKIEBOT_1")&&(await this.mainWorldEval("EVAL_COOKIEBOT_2"),await b(500)),d("#cb-confirmedSettings")&&await this.mainWorldEval("EVAL_COOKIEBOT_3")),!0)}async optIn(){return d("#dtcookie-container")?p(".h-dtcookie-accept"):(p(".CybotCookiebotDialogBodyLevelButton:not(:checked):enabled",!0),p("#CybotCookiebotDialogBodyLevelButtonAccept"),p("#CybotCookiebotDialogBodyButtonAccept"),!0)}async test(){return this.mainWorldEval("EVAL_COOKIEBOT_4")}},class extends A{constructor(){super(...arguments),this.name="Sourcepoint-frame",this.prehideSelectors=["div[id^='sp_message_container_'],.message-overlay","#sp_privacy_manager_container"],this.ccpaNotice=!1,this.ccpaPopup=!1,this.runContext={main:!1,frame:!0}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){const e=new URL(location.href);return e.searchParams.has("message_id")&&"ccpa-notice.sp-prod.net"===e.hostname?(this.ccpaNotice=!0,!0):"ccpa-pm.sp-prod.net"===e.hostname?(this.ccpaPopup=!0,!0):("/index.html"===e.pathname||"/privacy-manager/index.html"===e.pathname)&&(e.searchParams.has("message_id")||e.searchParams.has("requestUUID")||e.searchParams.has("consentUUID"))}async detectPopup(){return!!this.ccpaNotice||(this.ccpaPopup?await m(".priv-save-btn",2e3):(await m(".sp_choice_type_11,.sp_choice_type_12,.sp_choice_type_13,.sp_choice_type_ACCEPT_ALL",2e3),!d(".sp_choice_type_9")))}async optIn(){return await m(".sp_choice_type_11,.sp_choice_type_ACCEPT_ALL",2e3),!!p(".sp_choice_type_11")||!!p(".sp_choice_type_ACCEPT_ALL")}isManagerOpen(){return"/privacy-manager/index.html"===location.pathname}async optOut(){if(this.ccpaPopup){const e=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.neutral.on .right");for(const t of e)t.click();const t=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.switch-bg.on");for(const e of t)e.click();return p(".priv-save-btn")}if(!this.isManagerOpen()){if(!await m(".sp_choice_type_12,.sp_choice_type_13"))return!1;if(!d(".sp_choice_type_12"))return p(".sp_choice_type_13");p(".sp_choice_type_12"),await r((()=>this.isManagerOpen()),200,100)}await m(".type-modal",2e4);try{const e=".sp_choice_type_REJECT_ALL",t=".reject-toggle",o=await Promise.race([m(e,2e3).then((e=>e?0:-1)),m(t,2e3).then((e=>e?1:-1)),m(".pm-features",2e3).then((e=>e?2:-1))]);if(0===o)return await b(1e3),p(e);1===o?p(t):2===o&&(await m(".pm-features",1e4),p(".checked > span",!0),p(".chevron"))}catch(e){}return p(".sp_choice_type_SAVE_AND_EXIT")}},class extends A{constructor(){super(...arguments),this.name="consentmanager.net",this.prehideSelectors=["#cmpbox,#cmpbox2"],this.apiAvailable=!1}get hasSelfTest(){return this.apiAvailable}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.apiAvailable=await this.mainWorldEval("EVAL_CONSENTMANAGER_1"),!!this.apiAvailable||d("#cmpbox")}async detectPopup(){return this.apiAvailable?(await b(500),await this.mainWorldEval("EVAL_CONSENTMANAGER_2")):u("#cmpbox .cmpmore","any")}async optOut(){return await b(500),this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_3"):!!p(".cmpboxbtnno")||(d(".cmpwelcomeprpsbtn")?(p(".cmpwelcomeprpsbtn > a[aria-checked=true]",!0),p(".cmpboxbtnsave"),!0):(p(".cmpboxbtncustom"),await m(".cmptblbox",2e3),p(".cmptdchoice > a[aria-checked=true]",!0),p(".cmpboxbtnyescustomchoices"),!0))}async optIn(){return this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_4"):p(".cmpboxbtnyes")}async test(){if(this.apiAvailable)return await this.mainWorldEval("EVAL_CONSENTMANAGER_5")}},class extends A{constructor(){super(...arguments),this.name="Evidon"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("#_evidon_banner")}async detectPopup(){return u("#_evidon_banner","any")}async optOut(){return p("#_evidon-decline-button")||(s(a(),["#evidon-prefdiag-overlay","#evidon-prefdiag-background"]),p("#_evidon-option-button"),await m("#evidon-prefdiag-overlay",5e3),p("#evidon-prefdiag-decline")),!0}async optIn(){return p("#_evidon-accept-button")}},class extends A{constructor(){super(...arguments),this.name="Onetrust",this.prehideSelectors=["#onetrust-banner-sdk,#onetrust-consent-sdk,.onetrust-pc-dark-filter,.js-consent-banner"],this.runContext={urlPattern:"^(?!.*https://www\\.nba\\.com/)"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("#onetrust-banner-sdk")}async detectPopup(){return u("#onetrust-banner-sdk","all")}async optOut(){return u("#onetrust-reject-all-handler,.js-reject-cookies","any")?p("#onetrust-reject-all-handler,.js-reject-cookies"):(d("#onetrust-pc-btn-handler")?p("#onetrust-pc-btn-handler"):p(".ot-sdk-show-settings,button.js-cookie-settings"),await m("#onetrust-consent-sdk",2e3),await b(1e3),p("#onetrust-consent-sdk input.category-switch-handler:checked,.js-editor-toggle-state:checked",!0),await b(1e3),await m(".save-preference-btn-handler,.js-consent-save",2e3),p(".save-preference-btn-handler,.js-consent-save"),await h("#onetrust-banner-sdk",5e3,"none"),!0)}async optIn(){return p("#onetrust-accept-btn-handler,.js-accept-cookies")}async test(){return await r((()=>this.mainWorldEval("EVAL_ONETRUST_1")),10,500)}},class extends A{constructor(){super(...arguments),this.name="Klaro",this.prehideSelectors=[".klaro"],this.settingsOpen=!1}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d(".klaro > .cookie-modal")?(this.settingsOpen=!0,!0):d(".klaro > .cookie-notice")}async detectPopup(){return u(".klaro > .cookie-notice,.klaro > .cookie-modal","any")}async optOut(){return!!p(".klaro .cn-decline")||(this.settingsOpen||(p(".klaro .cn-learn-more"),await m(".klaro > .cookie-modal",2e3),this.settingsOpen=!0),!!p(".klaro .cn-decline")||(p(".cm-purpose:not(.cm-toggle-all) > input:not(.half-checked)",!0),p(".cm-btn-accept")))}async optIn(){return!!p(".klaro .cm-btn-accept-all")||(this.settingsOpen?(p(".cm-purpose:not(.cm-toggle-all) > input.half-checked",!0),p(".cm-btn-accept")):p(".klaro .cookie-notice .cm-btn-success"))}async test(){return await this.mainWorldEval("EVAL_KLARO_1")}},class extends A{constructor(){super(...arguments),this.name="Uniconsent"}get prehideSelectors(){return[".unic",".modal:has(.unic)"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d(".unic .unic-box,.unic .unic-bar")}async detectPopup(){return u(".unic .unic-box,.unic .unic-bar","any")}async optOut(){if(await m(".unic button",1e3),document.querySelectorAll(".unic button").forEach((e=>{const t=e.textContent;(t.includes("Manage Options")||t.includes("Optionen verwalten"))&&e.click()})),await m(".unic input[type=checkbox]",1e3)){await m(".unic button",1e3),document.querySelectorAll(".unic input[type=checkbox]").forEach((e=>{e.checked&&e.click()}));for(const e of document.querySelectorAll(".unic button")){const t=e.textContent;for(const o of["Confirm Choices","Save Choices","Auswahl speichern"])if(t.includes(o))return e.click(),await b(500),!0}}return!1}async optIn(){return k(".unic #unic-agree")}async test(){await b(1e3);return!d(".unic .unic-box,.unic .unic-bar")}},class extends A{constructor(){super(...arguments),this.prehideSelectors=[".cmp-root"],this.name="Conversant"}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d(".cmp-root .cmp-receptacle")}async detectPopup(){return u(".cmp-root .cmp-receptacle","any")}async optOut(){if(!await k(".cmp-main-button:not(.cmp-main-button--primary)"))return!1;if(!await m(".cmp-view-tab-tabs"))return!1;await k(".cmp-view-tab-tabs > :first-child"),await k(".cmp-view-tab-tabs > .cmp-view-tab--active:first-child");for(const e of Array.from(document.querySelectorAll(".cmp-accordion-item"))){e.querySelector(".cmp-accordion-item-title").click(),await r((()=>!!e.querySelector(".cmp-accordion-item-content.cmp-active")),10,50);const t=e.querySelector(".cmp-accordion-item-content.cmp-active");t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-deny:not(.cmp-toggle-deny--active)").forEach((e=>e.click())),t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-checkbox:not(.cmp-toggle-checkbox--active)").forEach((e=>e.click()))}return await p(".cmp-main-button:not(.cmp-main-button--primary)"),!0}async optIn(){return k(".cmp-main-button.cmp-main-button--primary")}async test(){return document.cookie.includes("cmp-data=0")}},class extends A{constructor(){super(...arguments),this.name="tiktok.com",this.runContext={urlPattern:"tiktok"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}getShadowRoot(){const e=document.querySelector("tiktok-cookie-banner");return e?e.shadowRoot:null}async detectCmp(){return d("tiktok-cookie-banner")}async detectPopup(){return l(this.getShadowRoot().querySelector(".tiktok-cookie-banner"))}async optOut(){const e=this.getShadowRoot().querySelector(".button-wrapper button:first-child");return!!e&&(e.click(),!0)}async optIn(){const e=this.getShadowRoot().querySelector(".button-wrapper button:last-child");return!!e&&(e.click(),!0)}async test(){const e=document.cookie.match(/cookie-consent=([^;]+)/);if(!e)return!1;const t=JSON.parse(decodeURIComponent(e[1]));return Object.values(t).every((e=>"boolean"!=typeof e||!1===e))}},class extends A{constructor(){super(...arguments),this.runContext={urlPattern:"^https://(www\\.)?airbnb\\.[^/]+/"},this.prehideSelectors=["div[data-testid=main-cookies-banner-container]",'div:has(> div:first-child):has(> div:last-child):has(> section [data-testid="strictly-necessary-cookies"])']}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return d("div[data-testid=main-cookies-banner-container]")}async detectPopup(){return u("div[data-testid=main-cookies-banner-container","any")}async optOut(){let e;for(await k("div[data-testid=main-cookies-banner-container] button._snbhip0");e=document.querySelector("[data-testid=modal-container] button[aria-checked=true]:not([disabled])");)e.click();return k("button[data-testid=save-btn]")}async optIn(){return k("div[data-testid=main-cookies-banner-container] button._148dgdpk")}async test(){return await r((()=>!!document.cookie.match("OptanonAlertBoxClosed")),20,200)}}];var P=[{name:"192.com",detectCmp:[{exists:".ont-cookies"}],detectPopup:[{visible:".ont-cookies"}],optIn:[{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-ok2"}],optOut:[{click:".ont-cookes-btn-manage"},{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-choose"}],test:[{eval:"EVAL_ONENINETWO_0"}]},{name:"1password-com",cosmetic:!0,prehideSelectors:['footer #footer-root [aria-label="Cookie Consent"]'],detectCmp:[{exists:'footer #footer-root [aria-label="Cookie Consent"]'}],detectPopup:[{visible:'footer #footer-root [aria-label="Cookie Consent"]'}],optIn:[{click:'footer #footer-root [aria-label="Cookie Consent"] button'}],optOut:[{hide:['footer #footer-root [aria-label="Cookie Consent"]']}]},{name:"activobank.pt",runContext:{urlPattern:"^https://(www\\.)?activobank\\.pt"},prehideSelectors:["aside#cookies,.overlay-cookies"],detectCmp:[{exists:"#cookies .cookies-btn"}],detectPopup:[{visible:"#cookies #submitCookies"}],optIn:[{waitForThenClick:"#cookies #submitCookies"}],optOut:[{waitForThenClick:"#cookies #rejectCookies"}]},{name:"Adroll",prehideSelectors:["#adroll_consent_container"],detectCmp:[{exists:"#adroll_consent_container"}],detectPopup:[{visible:"#adroll_consent_container"}],optIn:[{waitForThenClick:"#adroll_consent_accept"}],optOut:[{waitForThenClick:"#adroll_consent_reject"}],test:[{eval:"EVAL_ADROLL_0"}]},{name:"affinity.serif.com",detectCmp:[{exists:".c-cookie-banner button[data-qa='allow-all-cookies']"}],detectPopup:[{visible:".c-cookie-banner"}],optIn:[{click:'button[data-qa="allow-all-cookies"]'}],optOut:[{click:'button[data-qa="manage-cookies"]'},{waitFor:'.c-cookie-banner ~ [role="dialog"]'},{waitForThenClick:'.c-cookie-banner ~ [role="dialog"] input[type="checkbox"][value="true"]',all:!0},{click:'.c-cookie-banner ~ [role="dialog"] .c-modal__action button'}],test:[{wait:500},{eval:"EVAL_AFFINITY_SERIF_COM_0"}]},{name:"agolde.com",cosmetic:!0,prehideSelectors:["#modal-1 div[data-micromodal-close]"],detectCmp:[{exists:"#modal-1 div[aria-labelledby=modal-1-title]"}],detectPopup:[{exists:"#modal-1 div[data-micromodal-close]"}],optIn:[{click:'button[aria-label="Close modal"]'}],optOut:[{hide:["#modal-1 div[data-micromodal-close]"]}]},{name:"almacmp",prehideSelectors:["#alma-cmpv2-container"],detectCmp:[{exists:"#alma-cmpv2-container"}],detectPopup:[{visible:"#alma-cmpv2-container #almacmp-modal-layer1"}],optIn:[{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer1 #almacmp-modalConfirmBtn"}],optOut:[{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer1 #almacmp-modalSettingBtn"},{waitFor:"#alma-cmpv2-container #almacmp-modal-layer2"},{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer2 #almacmp-reject-all-layer2"}],test:[{eval:"EVAL_ALMACMP_0"}]},{name:"altium.com",cosmetic:!0,prehideSelectors:[".altium-privacy-bar"],detectCmp:[{exists:".altium-privacy-bar"}],detectPopup:[{exists:".altium-privacy-bar"}],optIn:[{click:"a.altium-privacy-bar__btn"}],optOut:[{hide:[".altium-privacy-bar"]}]},{name:"amazon.com",prehideSelectors:['span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'],detectCmp:[{exists:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],detectPopup:[{visible:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],optIn:[{waitForVisible:"#sp-cc-accept"},{wait:500},{click:"#sp-cc-accept"}],optOut:[{waitForVisible:"#sp-cc-rejectall-link"},{wait:500},{click:"#sp-cc-rejectall-link"}]},{name:"aquasana.com",cosmetic:!0,prehideSelectors:["#consent-tracking"],detectCmp:[{exists:"#consent-tracking"}],detectPopup:[{exists:"#consent-tracking"}],optIn:[{click:"#accept_consent"}],optOut:[{hide:["#consent-tracking"]}]},{name:"arzt-auskunft.de",prehideSelectors:["#cookiescript_injected"],detectCmp:[{exists:"#cookiescript_injected"}],detectPopup:[{visible:"#cookiescript_injected"}],optOut:[{click:"#cookiescript_reject"}],optIn:[{click:"#cookiescript_accept"}]},{name:"athlinks-com",runContext:{urlPattern:"^https://(www\\.)?athlinks\\.com/"},cosmetic:!0,prehideSelectors:["#footer-container ~ div"],detectCmp:[{exists:"#footer-container ~ div"}],detectPopup:[{visible:"#footer-container > div"}],optIn:[{click:"#footer-container ~ div button"}],optOut:[{hide:["#footer-container ~ div"]}]},{name:"ausopen.com",cosmetic:!0,detectCmp:[{exists:".gdpr-popup__message"}],detectPopup:[{visible:".gdpr-popup__message"}],optOut:[{hide:[".gdpr-popup__message"]}],optIn:[{click:".gdpr-popup__message button"}]},{name:"automattic-cmp-optout",prehideSelectors:['form[class*="cookie-banner"][method="post"]'],detectCmp:[{exists:'form[class*="cookie-banner"][method="post"]'}],detectPopup:[{visible:'form[class*="cookie-banner"][method="post"]'}],optIn:[{click:'a[class*="accept-all-button"]'}],optOut:[{click:'form[class*="cookie-banner"] div[class*="simple-options"] a[class*="customize-button"]'},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:'a[class*="accept-selection-button"]'}]},{name:"aws.amazon.com",prehideSelectors:["#awsccc-cb-content","#awsccc-cs-container","#awsccc-cs-modalOverlay","#awsccc-cs-container-inner"],detectCmp:[{exists:"#awsccc-cb-content"}],detectPopup:[{visible:"#awsccc-cb-content"}],optIn:[{click:"button[data-id=awsccc-cb-btn-accept"}],optOut:[{click:"button[data-id=awsccc-cb-btn-customize]"},{waitFor:"input[aria-checked]"},{click:"input[aria-checked=true]",all:!0,optional:!0},{click:"button[data-id=awsccc-cs-btn-save]"}]},{name:"axeptio",prehideSelectors:[".axeptio_widget"],detectCmp:[{exists:".axeptio_widget"}],detectPopup:[{visible:".axeptio_widget"}],optIn:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_acceptAll"}],optOut:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_dismiss"}],test:[{eval:"EVAL_AXEPTIO_0"}]},{name:"baden-wuerttemberg.de",prehideSelectors:[".cookie-alert.t-dark"],cosmetic:!0,detectCmp:[{exists:".cookie-alert.t-dark"}],detectPopup:[{visible:".cookie-alert.t-dark"}],optIn:[{click:".cookie-alert__form input:not([disabled]):not([checked])"},{click:".cookie-alert__button button"}],optOut:[{hide:[".cookie-alert.t-dark"]}]},{name:"bbb.org",runContext:{urlPattern:"^https://www\\.bbb\\.org/"},cosmetic:!0,prehideSelectors:['div[aria-label="use of cookies on bbb.org"]'],detectCmp:[{exists:'div[aria-label="use of cookies on bbb.org"]'}],detectPopup:[{visible:'div[aria-label="use of cookies on bbb.org"]'}],optIn:[{click:'div[aria-label="use of cookies on bbb.org"] button.bds-button-unstyled span.visually-hidden'}],optOut:[{hide:['div[aria-label="use of cookies on bbb.org"]']}]},{name:"bing.com",prehideSelectors:["#bnp_container"],detectCmp:[{exists:"#bnp_cookie_banner"}],detectPopup:[{visible:"#bnp_cookie_banner"}],optIn:[{click:"#bnp_btn_accept"}],optOut:[{click:"#bnp_btn_preference"},{click:"#mcp_savesettings"}],test:[{eval:"EVAL_BING_0"}]},{name:"borlabs",detectCmp:[{exists:"._brlbs-block-content"}],detectPopup:[{visible:"._brlbs-bar-wrap,._brlbs-box-wrap"}],optIn:[{click:"a[data-cookie-accept-all]"}],optOut:[{click:"a[data-cookie-individual]"},{waitForVisible:".cookie-preference"},{click:"input[data-borlabs-cookie-checkbox]:checked",all:!0,optional:!0},{click:"#CookiePrefSave"},{wait:500}],prehideSelectors:["#BorlabsCookieBox"],test:[{eval:"EVAL_BORLABS_0"}]},{name:"bundesregierung.de",prehideSelectors:[".bpa-cookie-banner"],detectCmp:[{exists:".bpa-cookie-banner"}],detectPopup:[{visible:".bpa-cookie-banner .bpa-module-full-hero"}],optIn:[{click:".bpa-accept-all-button"}],optOut:[{wait:500,comment:"click is not immediately recognized"},{waitForThenClick:".bpa-close-button"}],test:[{eval:"EVAL_BUNDESREGIERUNG_DE_0"}]},{name:"burpee.com",cosmetic:!0,prehideSelectors:["#notice-cookie-block"],detectCmp:[{exists:"#notice-cookie-block"}],detectPopup:[{exists:"#html-body #notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{hide:["#html-body #notice-cookie-block","#notice-cookie"]}]},{name:"canva.com",prehideSelectors:['div[role="dialog"] a[data-anchor-id="cookie-policy"]'],detectCmp:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],detectPopup:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],optIn:[{click:'div[role="dialog"] button:nth-child(1)'}],optOut:[{if:{exists:'div[role="dialog"] button:nth-child(3)'},then:[{click:'div[role="dialog"] button:nth-child(2)'}],else:[{click:'div[role="dialog"] button:nth-child(2)'},{waitFor:'div[role="dialog"] a[data-anchor-id="privacy-policy"]'},{click:'div[role="dialog"] button:nth-child(2)'},{click:'div[role="dialog"] div:last-child button:only-child'}]}],test:[{eval:"EVAL_CANVA_0"}]},{name:"cc-banner-springer",prehideSelectors:[".cc-banner[data-cc-banner]"],detectCmp:[{exists:".cc-banner[data-cc-banner]"}],detectPopup:[{visible:".cc-banner[data-cc-banner]"}],optIn:[{waitForThenClick:".cc-banner[data-cc-banner] button[data-cc-action=accept]"}],optOut:[{if:{exists:".cc-banner[data-cc-banner] button[data-cc-action=reject]"},then:[{click:".cc-banner[data-cc-banner] button[data-cc-action=reject]"}],else:[{waitForThenClick:".cc-banner[data-cc-banner] button[data-cc-action=preferences]"},{waitFor:".cc-preferences[data-cc-preferences]"},{click:".cc-preferences[data-cc-preferences] input[type=radio][data-cc-action=toggle-category][value=off]",all:!0},{if:{exists:".cc-preferences[data-cc-preferences] button[data-cc-action=reject]"},then:[{click:".cc-preferences[data-cc-preferences] button[data-cc-action=reject]"}],else:[{click:".cc-preferences[data-cc-preferences] button[data-cc-action=save]"}]}]}],test:[{eval:"EVAL_CC_BANNER2_0"}]},{name:"cc_banner",cosmetic:!0,prehideSelectors:[".cc_banner-wrapper"],detectCmp:[{exists:".cc_banner-wrapper"}],detectPopup:[{visible:".cc_banner"}],optIn:[{click:".cc_btn_accept_all"}],optOut:[{hide:[".cc_banner-wrapper"]}]},{comment:"https://www.civicuk.com/cookie-control/",name:"civic-cookie-control",prehideSelectors:["#ccc-module,#ccc-overlay"],detectCmp:[{exists:"#ccc-module"}],detectPopup:[{visible:"#ccc"},{visible:"#ccc-module"}],optOut:[{click:"#ccc-reject-settings"}],optIn:[{click:"#ccc-recommended-settings"}]},{name:"click.io",prehideSelectors:["#cl-consent"],detectCmp:[{exists:"#cl-consent"}],detectPopup:[{visible:"#cl-consent"}],optIn:[{waitForThenClick:'#cl-consent [data-role="b_agree"]'}],optOut:[{waitFor:'#cl-consent [data-role="b_options"]'},{wait:500},{click:'#cl-consent [data-role="b_options"]'},{waitFor:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]'},{click:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]',all:!0},{click:'[data-role="b_save"]'}],test:[{eval:"EVAL_CLICKIO_0",comment:"TODO: this only checks if we interacted at all"}]},{name:"clinch",intermediate:!1,runContext:{frame:!1,main:!0},prehideSelectors:[".consent-modal[role=dialog]"],detectCmp:[{exists:".consent-modal[role=dialog]"}],detectPopup:[{visible:".consent-modal[role=dialog]"}],optIn:[{click:"#consent_agree"}],optOut:[{click:"#manage_cookie_preferences"},{click:"#cookie_consent_preferences input:checked",all:!0,optional:!0},{click:"#consent_save"}],test:[{eval:"EVAL_CLINCH_0"}]},{name:"clustrmaps.com",runContext:{urlPattern:"^https://(www\\.)?clustrmaps\\.com/"},cosmetic:!0,prehideSelectors:["#gdpr-cookie-message"],detectCmp:[{exists:"#gdpr-cookie-message"}],detectPopup:[{visible:"#gdpr-cookie-message"}],optIn:[{click:"button#gdpr-cookie-accept"}],optOut:[{hide:["#gdpr-cookie-message"]}]},{name:"coinbase",intermediate:!1,runContext:{frame:!0,main:!0,urlPattern:"^https://(www|help)\\.coinbase\\.com"},prehideSelectors:[],detectCmp:[{exists:"div[class^=CookieBannerContent__Container]"}],detectPopup:[{visible:"div[class^=CookieBannerContent__Container]"}],optIn:[{click:"div[class^=CookieBannerContent__CTA] :nth-last-child(1)"}],optOut:[{click:"button[class^=CookieBannerContent__Settings]"},{click:"div[class^=CookiePreferencesModal__CategoryContainer] input:checked",all:!0,optional:!0},{click:"div[class^=CookiePreferencesModal__ButtonContainer] > button"}],test:[{eval:"EVAL_COINBASE_0"}]},{name:"Complianz banner",prehideSelectors:["#cmplz-cookiebanner-container"],detectCmp:[{exists:"#cmplz-cookiebanner-container .cmplz-cookiebanner"}],detectPopup:[{visible:"#cmplz-cookiebanner-container .cmplz-cookiebanner",check:"any"}],optIn:[{waitForThenClick:".cmplz-cookiebanner .cmplz-accept"}],optOut:[{waitForThenClick:".cmplz-cookiebanner .cmplz-deny"}],test:[{eval:"EVAL_COMPLIANZ_BANNER_0"}]},{name:"Complianz categories",prehideSelectors:['.cc-type-categories[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{click:".cc-dismiss"}],test:[{eval:"EVAL_COMPLIANZ_CATEGORIES_0"}]},{name:"Complianz notice",prehideSelectors:['.cc-type-info[aria-describedby="cookieconsent:desc"]'],cosmetic:!0,detectCmp:[{exists:'.cc-type-info[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-info[aria-describedby="cookieconsent:desc"]'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{hide:['[aria-describedby="cookieconsent:desc"]']}]},{name:"Complianz optin",prehideSelectors:['.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{click:".cc-settings"},{waitForVisible:'[aria-label="cookies preferences popup"]'},{click:'[aria-label="cookies preferences popup"] input[type=checkbox]:not([disabled]):checked',all:!0,optional:!0},{click:'[aria-label="cookies preferences popup"] [aria-label="Accept Selected"], [aria-label="cookies preferences popup"] [aria-label="Save my choice"], .cc-btn-accept-selected, .cc-deny',optional:!0}],test:[{eval:"EVAL_COMPLIANZ_OPTIN_0"}]},{name:"cookie-law-info",prehideSelectors:["#cookie-law-info-bar"],detectCmp:[{exists:"#cookie-law-info-bar"}],detectPopup:[{visible:"#cookie-law-info-bar"}],optIn:[{click:'[data-cli_action="accept_all"]'}],optOut:[{hide:["#cookie-law-info-bar"]},{eval:"EVAL_COOKIE_LAW_INFO_0"}],test:[{eval:"EVAL_COOKIE_LAW_INFO_1"}]},{name:"cookie-manager-popup",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,detectCmp:[{exists:"#notice-cookie-block #allow-functional-cookies, #notice-cookie-block #btn-cookie-settings"}],detectPopup:[{visible:"#notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{if:{exists:"#allow-functional-cookies"},then:[{click:"#allow-functional-cookies"}],else:[{waitForThenClick:"#btn-cookie-settings"},{waitForVisible:".modal-body"},{click:'.modal-body input:checked, .switch[data-switch="on"]',all:!0,optional:!0},{click:'[role="dialog"] .modal-footer button'}]}],prehideSelectors:["#btn-cookie-settings"],test:[{eval:"EVAL_COOKIE_MANAGER_POPUP_0"}]},{name:"cookie-notice",prehideSelectors:["#cookie-notice"],cosmetic:!0,detectCmp:[{visible:"#cookie-notice .cookie-notice-container"}],detectPopup:[{visible:"#cookie-notice"}],optIn:[{click:"#cn-accept-cookie"}],optOut:[{hide:["#cookie-notice"]}]},{name:"cookiealert",intermediate:!1,prehideSelectors:[],runContext:{frame:!0,main:!0},detectCmp:[{exists:".cookie-alert-extended"}],detectPopup:[{visible:".cookie-alert-extended-modal"}],optIn:[{click:"button[data-controller='cookie-alert/extended/button/accept']"},{eval:"EVAL_COOKIEALERT_0"}],optOut:[{click:"a[data-controller='cookie-alert/extended/detail-link']"},{click:".cookie-alert-configuration-input:checked",all:!0,optional:!0},{click:"button[data-controller='cookie-alert/extended/button/configuration']"},{eval:"EVAL_COOKIEALERT_0"}],test:[{eval:"EVAL_COOKIEALERT_2"}]},{name:"cookiefirst.com",prehideSelectors:["#cookiefirst-root,.cookiefirst-root,[aria-labelledby=cookie-preference-panel-title]"],detectCmp:[{exists:"#cookiefirst-root,.cookiefirst-root"}],detectPopup:[{visible:"#cookiefirst-root,.cookiefirst-root"}],optIn:[{click:"button[data-cookiefirst-action=accept]"}],optOut:[{if:{exists:"button[data-cookiefirst-action=adjust]"},then:[{click:"button[data-cookiefirst-action=adjust]"},{waitForVisible:"[data-cookiefirst-widget=modal]",timeout:1e3},{eval:"EVAL_COOKIEFIRST_1"},{wait:1e3},{click:"button[data-cookiefirst-action=save]"}],else:[{click:"button[data-cookiefirst-action=reject]"}]}],test:[{eval:"EVAL_COOKIEFIRST_0"}]},{name:"Cookie Information Banner",prehideSelectors:["#cookie-information-template-wrapper"],detectCmp:[{exists:"#cookie-information-template-wrapper"}],detectPopup:[{visible:"#cookie-information-template-wrapper"}],optIn:[{eval:"EVAL_COOKIEINFORMATION_1"}],optOut:[{hide:["#cookie-information-template-wrapper"],comment:"some templates don't hide the banner automatically"},{eval:"EVAL_COOKIEINFORMATION_0"}],test:[{eval:"EVAL_COOKIEINFORMATION_2"}]},{name:"corona-in-zahlen.de",prehideSelectors:[".cookiealert"],detectCmp:[{exists:".cookiealert"}],detectPopup:[{visible:".cookiealert"}],optOut:[{click:".configurecookies"},{click:".confirmcookies"}],optIn:[{click:".acceptcookies"}]},{name:"crossfit-com",cosmetic:!0,prehideSelectors:['body #modal > div > div[class^="_wrapper_"]'],detectCmp:[{exists:'body #modal > div > div[class^="_wrapper_"]'}],detectPopup:[{visible:'body #modal > div > div[class^="_wrapper_"]'}],optIn:[{click:'button[aria-label="accept cookie policy"]'}],optOut:[{hide:['body #modal > div > div[class^="_wrapper_"]']}]},{name:"dailymotion-us",cosmetic:!0,prehideSelectors:['div[class*="CookiePopup__desktopContainer"]:has(div[class*="CookiePopup"])'],detectCmp:[{exists:'div[class*="CookiePopup__desktopContainer"]'}],detectPopup:[{visible:'div[class*="CookiePopup__desktopContainer"]'}],optIn:[{click:'div[class*="CookiePopup__desktopContainer"] > button > span'}],optOut:[{hide:['div[class*="CookiePopup__desktopContainer"]']}]},{name:"dailymotion.com",runContext:{urlPattern:"^https://(www\\.)?dailymotion\\.com/"},prehideSelectors:['div[class*="Overlay__container"]:has(div[class*="TCF2Popup"])'],detectCmp:[{exists:'div[class*="TCF2Popup"]'}],detectPopup:[{visible:'[class*="TCF2Popup"] a[href^="https://www.dailymotion.com/legal/cookiemanagement"]'}],optIn:[{waitForThenClick:'button[class*="TCF2Popup__button"]:not([class*="TCF2Popup__personalize"])'}],optOut:[{waitForThenClick:'button[class*="TCF2ContinueWithoutAcceptingButton"]'}],test:[{eval:"EVAL_DAILYMOTION_0"}]},{name:"deepl.com",prehideSelectors:[".dl_cookieBanner_container"],detectCmp:[{exists:".dl_cookieBanner_container"}],detectPopup:[{visible:".dl_cookieBanner_container"}],optOut:[{click:".dl_cookieBanner--buttonSelected"}],optIn:[{click:".dl_cookieBanner--buttonAll"}]},{name:"delta.com",runContext:{urlPattern:"^https://www\\.delta\\.com/"},cosmetic:!0,prehideSelectors:["ngc-cookie-banner"],detectCmp:[{exists:"div.cookie-footer-container"}],detectPopup:[{visible:"div.cookie-footer-container"}],optIn:[{click:" button.cookie-close-icon"}],optOut:[{hide:["div.cookie-footer-container"]}]},{name:"dmgmedia-us",prehideSelectors:["#mol-ads-cmp-iframe, div.mol-ads-cmp > form > div"],detectCmp:[{exists:"div.mol-ads-cmp > form > div"}],detectPopup:[{waitForVisible:"div.mol-ads-cmp > form > div"}],optIn:[{waitForThenClick:"button.mol-ads-cmp--btn-primary"}],optOut:[{waitForThenClick:"div.mol-ads-ccpa--message > u > a"},{waitForVisible:".mol-ads-cmp--modal-dialog"},{waitForThenClick:"a.mol-ads-cmp-footer-privacy"},{waitForThenClick:"button.mol-ads-cmp--btn-secondary"}]},{name:"dmgmedia",prehideSelectors:['[data-project="mol-fe-cmp"]'],detectCmp:[{exists:'[data-project="mol-fe-cmp"]'}],detectPopup:[{visible:'[data-project="mol-fe-cmp"]'}],optIn:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=primary]'}],optOut:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=basic]'},{waitForVisible:'[data-project="mol-fe-cmp"] div[class*="tabContent"]'},{waitForThenClick:'[data-project="mol-fe-cmp"] div[class*="toggle"][class*="enabled"]',all:!0},{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=white]'}]},{name:"Drupal",detectCmp:[{exists:"#drupalorg-crosssite-gdpr"}],detectPopup:[{visible:"#drupalorg-crosssite-gdpr"}],optOut:[{click:".no"}],optIn:[{click:".yes"}]},{name:"WP DSGVO Tools",link:"https://wordpress.org/plugins/shapepress-dsgvo/",prehideSelectors:[".sp-dsgvo"],cosmetic:!0,detectCmp:[{exists:".sp-dsgvo.sp-dsgvo-popup-overlay"}],detectPopup:[{visible:".sp-dsgvo.sp-dsgvo-popup-overlay",check:"any"}],optIn:[{click:".sp-dsgvo-privacy-btn-accept-all",all:!0}],optOut:[{hide:[".sp-dsgvo.sp-dsgvo-popup-overlay"]}],test:[{eval:"EVAL_DSGVO_0"}]},{name:"dunelm.com",prehideSelectors:["div[data-testid=cookie-consent-modal-backdrop]"],detectCmp:[{exists:"div[data-testid=cookie-consent-message-contents]"}],detectPopup:[{visible:"div[data-testid=cookie-consent-message-contents]"}],optIn:[{click:'[data-testid="cookie-consent-allow-all"]'}],optOut:[{click:"button[data-testid=cookie-consent-adjust-settings]"},{click:"button[data-testid=cookie-consent-preferences-save]"}],test:[{eval:"EVAL_DUNELM_0"}]},{name:"etsy",prehideSelectors:["#gdpr-single-choice-overlay","#gdpr-privacy-settings"],detectCmp:[{exists:"#gdpr-single-choice-overlay"}],detectPopup:[{visible:"#gdpr-single-choice-overlay"}],optOut:[{click:"button[data-gdpr-open-full-settings]"},{waitForVisible:".gdpr-overlay-body input",timeout:3e3},{wait:1e3},{eval:"EVAL_ETSY_0"},{eval:"EVAL_ETSY_1"}],optIn:[{click:"button[data-gdpr-single-choice-accept]"}]},{name:"eu-cookie-compliance-banner",detectCmp:[{exists:".eu-cookie-compliance-banner-info"}],detectPopup:[{exists:".eu-cookie-compliance-popup-open"}],optIn:[{click:".agree-button"}],optOut:[{click:".decline-button,.eu-cookie-compliance-save-preferences-button",optional:!0},{hide:[".eu-cookie-compliance-banner-info","#sliding-popup"]}],test:[{eval:"EVAL_EU_COOKIE_COMPLIANCE_0"}]},{name:"EU Cookie Law",prehideSelectors:[".pea_cook_wrapper,.pea_cook_more_info_popover"],cosmetic:!0,detectCmp:[{exists:".pea_cook_wrapper"}],detectPopup:[{wait:500},{visible:".pea_cook_wrapper"}],optIn:[{click:"#pea_cook_btn"}],optOut:[{hide:[".pea_cook_wrapper"]}],test:[{eval:"EVAL_EU_COOKIE_LAW_0"}]},{name:"EZoic",prehideSelectors:["#ez-cookie-dialog-wrapper"],detectCmp:[{exists:"#ez-cookie-dialog-wrapper"}],detectPopup:[{visible:"#ez-cookie-dialog-wrapper"}],optIn:[{click:"#ez-accept-all",optional:!0},{eval:"EVAL_EZOIC_0",optional:!0}],optOut:[{wait:500},{click:"#ez-manage-settings"},{waitFor:"#ez-cookie-dialog input[type=checkbox]"},{click:"#ez-cookie-dialog input[type=checkbox][checked]",all:!0},{click:"#ez-save-settings"}],test:[{eval:"EVAL_EZOIC_1"}]},{name:"facebook",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?facebook\\.com/"},prehideSelectors:['div[data-testid="cookie-policy-manage-dialog"]'],detectCmp:[{exists:'div[data-testid="cookie-policy-manage-dialog"]'}],detectPopup:[{visible:'div[data-testid="cookie-policy-manage-dialog"]'}],optIn:[{waitForThenClick:'button[data-cookiebanner="accept_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}],optOut:[{waitForThenClick:'button[data-cookiebanner="accept_only_essential_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}]},{name:"funding-choices",prehideSelectors:[".fc-consent-root,.fc-dialog-container,.fc-dialog-overlay,.fc-dialog-content"],detectCmp:[{exists:".fc-consent-root"}],detectPopup:[{exists:".fc-dialog-container"}],optOut:[{click:".fc-cta-do-not-consent,.fc-cta-manage-options"},{click:".fc-preference-consent:checked,.fc-preference-legitimate-interest:checked",all:!0,optional:!0},{click:".fc-confirm-choices",optional:!0}],optIn:[{click:".fc-cta-consent"}]},{name:"geeks-for-geeks",runContext:{urlPattern:"^https://www\\.geeksforgeeks\\.org/"},cosmetic:!0,prehideSelectors:[".cookie-consent"],detectCmp:[{exists:".cookie-consent"}],detectPopup:[{visible:".cookie-consent"}],optIn:[{click:".cookie-consent button.consent-btn"}],optOut:[{hide:[".cookie-consent"]}]},{name:"generic-cosmetic",cosmetic:!0,prehideSelectors:["#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"],detectCmp:[{exists:"#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"}],detectPopup:[{visible:"#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"}],optIn:[],optOut:[{hide:["#js-cookie-banner,.js-cookie-banner,.cookie-banner,#cookie-banner"]}]},{name:"google-consent-standalone",prehideSelectors:[],detectCmp:[{exists:'a[href^="https://policies.google.com/technologies/cookies"'},{exists:'form[action^="https://consent."][action$=".com/save"]'}],detectPopup:[{visible:'a[href^="https://policies.google.com/technologies/cookies"'}],optIn:[{waitForThenClick:'form[action^="https://consent."][action$=".com/save"]:has(input[name=set_eom][value=false]) button'}],optOut:[{waitForThenClick:'form[action^="https://consent."][action$=".com/save"]:has(input[name=set_eom][value=true]) button'}]},{name:"google.com",prehideSelectors:[".HTjtHe#xe7COe"],detectCmp:[{exists:".HTjtHe#xe7COe"},{exists:'.HTjtHe#xe7COe a[href^="https://policies.google.com/technologies/cookies"]'}],detectPopup:[{visible:".HTjtHe#xe7COe button#W0wltc"}],optIn:[{waitForThenClick:".HTjtHe#xe7COe button#L2AGLb"}],optOut:[{waitForThenClick:".HTjtHe#xe7COe button#W0wltc"}],test:[{eval:"EVAL_GOOGLE_0"}]},{name:"gov.uk",detectCmp:[{exists:"#global-cookie-message"}],detectPopup:[{exists:"#global-cookie-message"}],optIn:[{click:"button[data-accept-cookies=true]"}],optOut:[{click:"button[data-reject-cookies=true],#reject-cookies"},{click:"button[data-hide-cookie-banner=true],#hide-cookie-decision"}]},{name:"healthline-media",prehideSelectors:["#modal-host > div.no-hash > div.window-wrapper"],detectCmp:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],detectPopup:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],optIn:[{click:"#modal-host > div.no-hash > div.window-wrapper > div:last-child button"}],optOut:[{if:{exists:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'},then:[{click:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'}],else:[{waitForVisible:"div#__next"},{click:"#__next div:nth-child(1) > button:first-child"}]}]},{name:"hl.co.uk",prehideSelectors:[".cookieModalContent","#cookie-banner-overlay"],detectCmp:[{exists:"#cookie-banner-overlay"}],detectPopup:[{exists:"#cookie-banner-overlay"}],optIn:[{click:"#acceptCookieButton"}],optOut:[{click:"#manageCookie"},{hide:[".cookieSettingsModal"]},{waitFor:"#AOCookieToggle"},{click:"#AOCookieToggle[aria-pressed=true]",optional:!0},{waitFor:"#TPCookieToggle"},{click:"#TPCookieToggle[aria-pressed=true]",optional:!0},{click:"#updateCookieButton"}]},{name:"hubspot",detectCmp:[{exists:"#hs-eu-cookie-confirmation"}],detectPopup:[{visible:"#hs-eu-cookie-confirmation"}],optIn:[{click:"#hs-eu-confirmation-button"}],optOut:[{click:"#hs-eu-decline-button"}]},{name:"indeed.com",cosmetic:!0,prehideSelectors:["#CookiePrivacyNotice"],detectCmp:[{exists:"#CookiePrivacyNotice"}],detectPopup:[{visible:"#CookiePrivacyNotice"}],optIn:[{click:"#CookiePrivacyNotice button[data-gnav-element-name=CookiePrivacyNoticeOk]"}],optOut:[{hide:["#CookiePrivacyNotice"]}]},{name:"ionos.de",prehideSelectors:[".privacy-consent--backdrop",".privacy-consent--modal"],detectCmp:[{exists:".privacy-consent--modal"}],detectPopup:[{visible:".privacy-consent--modal"}],optIn:[{click:"#selectAll"}],optOut:[{click:".footer-config-link"},{click:"#confirmSelection"}]},{name:"itopvpn.com",cosmetic:!0,prehideSelectors:[".pop-cookie"],detectCmp:[{exists:".pop-cookie"}],detectPopup:[{exists:".pop-cookie"}],optIn:[{click:"#_pcookie"}],optOut:[{hide:[".pop-cookie"]}]},{name:"iubenda",prehideSelectors:["#iubenda-cs-banner"],detectCmp:[{exists:"#iubenda-cs-banner"}],detectPopup:[{visible:".iubenda-cs-accept-btn"}],optIn:[{click:".iubenda-cs-accept-btn"}],optOut:[{click:".iubenda-cs-customize-btn"},{eval:"EVAL_IUBENDA_0"},{click:"#iubFooterBtn"}],test:[{eval:"EVAL_IUBENDA_1"}]},{name:"johnlewis.com",prehideSelectors:["div[class^=pecr-cookie-banner-]"],detectCmp:[{exists:"div[class^=pecr-cookie-banner-]"}],detectPopup:[{exists:"div[class^=pecr-cookie-banner-]"}],optOut:[{click:"button[data-test^=manage-cookies]"},{wait:"500"},{click:"label[data-test^=toggle][class*=checked]:not([class*=disabled])",all:!0,optional:!0},{click:"button[data-test=save-preferences]"}],optIn:[{click:"button[data-test=allow-all]"}]},{name:"jquery.cookieBar",comment:"https://github.com/kovarp/jquery.cookieBar",prehideSelectors:[".cookie-bar"],cosmetic:!0,detectCmp:[{exists:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons"}],detectPopup:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"any"}],optIn:[{click:".cookie-bar .cookie-bar__btn"}],optOut:[{hide:[".cookie-bar"]}],test:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"none"},{eval:"EVAL_JQUERY_COOKIEBAR_0"}]},{name:"justwatch.com",prehideSelectors:[".consent-banner"],detectCmp:[{exists:".consent-banner .consent-banner__actions"}],detectPopup:[{visible:".consent-banner .consent-banner__actions"}],optIn:[{click:".consent-banner__actions button.basic-button.primary"}],optOut:[{click:".consent-banner__actions button.basic-button.secondary"},{waitForThenClick:".consent-modal__footer button.basic-button.secondary"},{waitForThenClick:".consent-modal ion-content > div > a:nth-child(9)"},{click:"label.consent-switch input[type=checkbox]:checked",all:!0,optional:!0},{waitForVisible:".consent-modal__footer button.basic-button.primary"},{click:".consent-modal__footer button.basic-button.primary"}]},{name:"ketch",runContext:{frame:!1,main:!0},intermediate:!1,prehideSelectors:["#lanyard_root div[role='dialog']"],detectCmp:[{exists:"#lanyard_root div[role='dialog']"}],detectPopup:[{visible:"#lanyard_root div[role='dialog']"}],optIn:[{if:{exists:"#lanyard_root button[class='confirmButton']"},then:[{waitForThenClick:"#lanyard_root div[class^='buttons'] > :nth-child(2)"},{click:"#lanyard_root button[class='confirmButton']"}],else:[{waitForThenClick:"#lanyard_root div[class^='buttons'] > :nth-child(2)"}]}],optOut:[{click:"#lanyard_root button[class^='link']",optional:!0},{if:{exists:"#lanyard_root button[class*='confirmButton']"},then:[{waitForThenClick:"#lanyard_root button[class*='rejectButton']"},{click:"#lanyard_root button[class*='confirmButton']"}],else:[{click:"#lanyard_root div[class^='buttons'] > :nth-child(1)",optional:!0},{waitForThenClick:"#lanyard_root input:checked"},{click:"#consentsTab > div:nth-child(2) > div > div[class^='actions'] > button:nth-child(1)"}]}],test:[]},{name:"kleinanzeigen-de",runContext:{urlPattern:"^https?://(www\\.)?kleinanzeigen\\.de"},prehideSelectors:["#gdpr-banner-container"],detectCmp:[{any:[{exists:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{exists:"#ConsentManagementPage"}]}],detectPopup:[{any:[{visible:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{visible:"#ConsentManagementPage"}]}],optIn:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-accept]"}],else:[{click:"#ConsentManagementPage .Button-primary"}]}],optOut:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"}],else:[{click:"#ConsentManagementPage .Button-secondary"}]}]},{name:"linkedin.com",prehideSelectors:[".artdeco-global-alert[type=COOKIE_CONSENT]"],detectCmp:[{exists:".artdeco-global-alert[type=COOKIE_CONSENT]"}],detectPopup:[{visible:".artdeco-global-alert[type=COOKIE_CONSENT]"}],optIn:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"}],optOut:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"}],test:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT]",check:"none"}]},{name:"macpaw.com",cosmetic:!0,prehideSelectors:['div[data-banner="cookies"]'],detectCmp:[{exists:'div[data-banner="cookies"]'}],detectPopup:[{exists:'div[data-banner="cookies"]'}],optIn:[{click:'button[data-banner-close="cookies"]'}],optOut:[{hide:['div[data-banner="cookies"]']}]},{name:"marksandspencer.com",cosmetic:!0,detectCmp:[{exists:".navigation-cookiebbanner"}],detectPopup:[{visible:".navigation-cookiebbanner"}],optOut:[{hide:[".navigation-cookiebbanner"]}],optIn:[{click:".navigation-cookiebbanner__submit"}]},{name:"mediamarkt.de",prehideSelectors:["div[aria-labelledby=pwa-consent-layer-title]","div[class^=StyledConsentLayerWrapper-]"],detectCmp:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],detectPopup:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],optOut:[{click:"button[data-test^=pwa-consent-layer-deny-all]"}],optIn:[{click:"button[data-test^=pwa-consent-layer-accept-all"}]},{name:"Mediavine",prehideSelectors:['[data-name="mediavine-gdpr-cmp"]'],detectCmp:[{exists:'[data-name="mediavine-gdpr-cmp"]'}],detectPopup:[{wait:500},{visible:'[data-name="mediavine-gdpr-cmp"]'}],optIn:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [format="primary"]'}],optOut:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [data-view="manageSettings"]'},{waitFor:'[data-name="mediavine-gdpr-cmp"] input[type=checkbox]'},{eval:"EVAL_MEDIAVINE_0",optional:!0},{click:'[data-name="mediavine-gdpr-cmp"] [format="secondary"]'}]},{name:"microsoft.com",prehideSelectors:["#wcpConsentBannerCtrl"],detectCmp:[{exists:"#wcpConsentBannerCtrl"}],detectPopup:[{exists:"#wcpConsentBannerCtrl"}],optOut:[{eval:"EVAL_MICROSOFT_0"}],optIn:[{eval:"EVAL_MICROSOFT_1"}],test:[{eval:"EVAL_MICROSOFT_2"}]},{name:"midway-usa",runContext:{urlPattern:"^https://www\\.midwayusa\\.com/"},cosmetic:!0,prehideSelectors:["#cookie-container"],detectCmp:[{exists:['div[aria-label="Cookie Policy Banner"]']}],detectPopup:[{visible:"#cookie-container"}],optIn:[{click:"button#cookie-btn"}],optOut:[{hide:['div[aria-label="Cookie Policy Banner"]']}]},{name:"moneysavingexpert.com",detectCmp:[{exists:"dialog[data-testid=accept-our-cookies-dialog]"}],detectPopup:[{visible:"dialog[data-testid=accept-our-cookies-dialog]"}],optIn:[{click:"#banner-accept"}],optOut:[{click:"#banner-manage"},{click:"#pc-confirm"}]},{name:"monzo.com",prehideSelectors:[".cookie-alert, cookie-alert__content"],detectCmp:[{exists:'div.cookie-alert[role="dialog"]'},{exists:'a[href*="monzo"]'}],detectPopup:[{visible:".cookie-alert__content"}],optIn:[{click:".js-accept-cookie-policy"}],optOut:[{click:".js-decline-cookie-policy"}]},{name:"Moove",prehideSelectors:["#moove_gdpr_cookie_info_bar"],detectCmp:[{exists:"#moove_gdpr_cookie_info_bar"}],detectPopup:[{visible:"#moove_gdpr_cookie_info_bar"}],optIn:[{waitForThenClick:".moove-gdpr-infobar-allow-all"}],optOut:[{if:{exists:"#moove_gdpr_cookie_info_bar .change-settings-button"},then:[{click:"#moove_gdpr_cookie_info_bar .change-settings-button"},{waitForVisible:"#moove_gdpr_cookie_modal"},{eval:"EVAL_MOOVE_0"},{click:".moove-gdpr-modal-save-settings"}],else:[{hide:["#moove_gdpr_cookie_info_bar"]}]}],test:[{visible:"#moove_gdpr_cookie_info_bar",check:"none"}]},{name:"national-lottery.co.uk",detectCmp:[{exists:".cuk_cookie_consent"}],detectPopup:[{visible:".cuk_cookie_consent",check:"any"}],optOut:[{click:".cuk_cookie_consent_manage_pref"},{click:".cuk_cookie_consent_save_pref"},{click:".cuk_cookie_consent_close"}],optIn:[{click:".cuk_cookie_consent_accept_all"}]},{name:"nba.com",runContext:{urlPattern:"^https://(www\\.)?nba.com/"},cosmetic:!0,prehideSelectors:["#onetrust-banner-sdk"],detectCmp:[{exists:"#onetrust-banner-sdk"}],detectPopup:[{visible:"#onetrust-banner-sdk"}],optIn:[{click:"#onetrust-accept-btn-handler"}],optOut:[{hide:["#onetrust-banner-sdk"]}]},{name:"netflix.de",detectCmp:[{exists:"#cookie-disclosure"}],detectPopup:[{visible:".cookie-disclosure-message",check:"any"}],optIn:[{click:".btn-accept"}],optOut:[{hide:["#cookie-disclosure"]},{click:".btn-reject"}]},{name:"nhs.uk",prehideSelectors:["#nhsuk-cookie-banner"],detectCmp:[{exists:"#nhsuk-cookie-banner"}],detectPopup:[{exists:"#nhsuk-cookie-banner"}],optOut:[{click:"#nhsuk-cookie-banner__link_accept"}],optIn:[{click:"#nhsuk-cookie-banner__link_accept_analytics"}]},{name:"notice-cookie",prehideSelectors:[".button--notice"],cosmetic:!0,detectCmp:[{exists:".notice--cookie"}],detectPopup:[{visible:".notice--cookie"}],optIn:[{click:".button--notice"}],optOut:[{hide:[".notice--cookie"]}]},{name:"nrk.no",cosmetic:!0,prehideSelectors:[".nrk-masthead__info-banner--cookie"],detectCmp:[{exists:".nrk-masthead__info-banner--cookie"}],detectPopup:[{exists:".nrk-masthead__info-banner--cookie"}],optIn:[{click:"div.nrk-masthead__info-banner--cookie button > span:has(+ svg.nrk-close)"}],optOut:[{hide:[".nrk-masthead__info-banner--cookie"]}]},{name:"obi.de",prehideSelectors:[".disc-cp--active"],detectCmp:[{exists:".disc-cp-modal__modal"}],detectPopup:[{visible:".disc-cp-modal__modal"}],optIn:[{click:".js-disc-cp-accept-all"}],optOut:[{click:".js-disc-cp-deny-all"}]},{name:"onlyFans.com",prehideSelectors:["div.b-cookies-informer"],detectCmp:[{exists:"div.b-cookies-informer"}],detectPopup:[{exists:"div.b-cookies-informer"}],optIn:[{click:"div.b-cookies-informer__nav > button:nth-child(2)"}],optOut:[{click:"div.b-cookies-informer__nav > button:nth-child(1)"},{click:'div.b-cookies-informer__switchers > div:nth-child(2) > div[at-attr="checkbox"] > span.b-input-radio__container > input[type="checkbox"]'},{click:"div.b-cookies-informer__nav > button"}]},{name:"osano",prehideSelectors:[".osano-cm-window"],cosmetic:!0,detectCmp:[{exists:".osano-cm-window"}],detectPopup:[{visible:".osano-cm-dialog"}],optIn:[{click:".osano-cm-accept-all",optional:!0}],optOut:[{hide:[".osano-cm-window"]}]},{name:"otto.de",prehideSelectors:[".cookieBanner--visibility"],detectCmp:[{exists:".cookieBanner--visibility"}],detectPopup:[{visible:".cookieBanner__wrapper"}],optIn:[{click:".js_cookieBannerPermissionButton"}],optOut:[{click:".js_cookieBannerProhibitionButton"}]},{name:"paypal-us",prehideSelectors:["#ccpaCookieContent_wrapper, article.ppvx_modal--overpanel"],detectCmp:[{exists:"#ccpaCookieBanner, .privacy-modal-content"}],detectPopup:[{exists:"#ccpaCookieBanner, .privacy-modal-content"}],optIn:[{click:"#acceptAllButton"}],optOut:[{if:{exists:"a#manageCookiesLink"},then:[{click:"a#manageCookiesLink"}],else:[{waitForVisible:".privacy-modal-content #formContent"},{click:"#formContent .cookiepref-11m2iee-checkbox_base input:checked",all:!0,optional:!0},{click:".confirmCookie #submitCookiesBtn"}]}]},{name:"paypal.com",prehideSelectors:["#gdprCookieBanner"],detectCmp:[{exists:"#gdprCookieBanner"}],detectPopup:[{visible:"#gdprCookieContent_wrapper"}],optIn:[{click:"#acceptAllButton"}],optOut:[{wait:200},{click:".gdprCookieBanner_decline-button"}],test:[{wait:500},{eval:"EVAL_PAYPAL_0"}]},{name:"pinetools.com",cosmetic:!0,prehideSelectors:["#aviso_cookies"],detectCmp:[{exists:"#aviso_cookies"}],detectPopup:[{exists:".lang_en #aviso_cookies"}],optIn:[{click:"#aviso_cookies .a_boton_cerrar"}],optOut:[{hide:["#aviso_cookies"]}]},{name:"pmc",cosmetic:!0,prehideSelectors:["#pmc-pp-tou--notice"],detectCmp:[{exists:"#pmc-pp-tou--notice"}],detectPopup:[{visible:"#pmc-pp-tou--notice"}],optIn:[{click:"span.pmc-pp-tou--notice-close-btn"}],optOut:[{hide:["#pmc-pp-tou--notice"]}]},{name:"pornhub.com",runContext:{urlPattern:"^https://(www\\.)?pornhub\\.com/"},cosmetic:!0,prehideSelectors:[".cookiesBanner"],detectCmp:[{exists:".cookiesBanner"}],detectPopup:[{visible:".cookiesBanner"}],optIn:[{click:".cookiesBanner .okButton"}],optOut:[{hide:[".cookiesBanner"]}]},{name:"pornpics.com",cosmetic:!0,prehideSelectors:["#cookie-contract"],detectCmp:[{exists:"#cookie-contract"}],detectPopup:[{visible:"#cookie-contract"}],optIn:[{click:"#cookie-contract .icon-cross"}],optOut:[{hide:["#cookie-contract"]}]},{name:"PrimeBox CookieBar",prehideSelectors:["#cookie-bar"],detectCmp:[{exists:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy"}],detectPopup:[{visible:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy",check:"any"}],optIn:[{waitForThenClick:"#cookie-bar .cb-enable"}],optOut:[{click:"#cookie-bar .cb-disable",optional:!0},{hide:["#cookie-bar"]}],test:[{eval:"EVAL_PRIMEBOX_0"}]},{name:"privacymanager.io",prehideSelectors:["#gdpr-consent-tool-wrapper",'iframe[src^="https://cmp-consent-tool.privacymanager.io"]'],runContext:{urlPattern:"^https://cmp-consent-tool\\.privacymanager\\.io/",main:!1,frame:!0},detectCmp:[{exists:"button#save"}],detectPopup:[{visible:"button#save"}],optIn:[{click:"button#save"}],optOut:[{if:{exists:"#denyAll"},then:[{click:"#denyAll"},{waitForThenClick:".okButton"}],else:[{waitForThenClick:"#manageSettings"},{waitFor:".purposes-overview-list"},{waitFor:"button#saveAndExit"},{click:"span[role=checkbox][aria-checked=true]",all:!0,optional:!0},{click:"button#saveAndExit"}]}]},{name:"pubtech",prehideSelectors:["#pubtech-cmp"],detectCmp:[{exists:"#pubtech-cmp"}],detectPopup:[{visible:"#pubtech-cmp #pt-actions"}],optIn:[{if:{exists:"#pt-accept-all"},then:[{click:"#pubtech-cmp #pt-actions #pt-accept-all"}],else:[{click:"#pubtech-cmp #pt-actions button:nth-of-type(2)"}]}],optOut:[{click:"#pubtech-cmp #pt-close"}],test:[{eval:"EVAL_PUBTECH_0"}]},{name:"quantcast",prehideSelectors:["#qc-cmp2-main,#qc-cmp2-container"],detectCmp:[{exists:"#qc-cmp2-container"}],detectPopup:[{visible:"#qc-cmp2-ui"}],optOut:[{click:'.qc-cmp2-summary-buttons > button[mode="secondary"]'},{waitFor:"#qc-cmp2-ui"},{click:'.qc-cmp2-toggle-switch > button[aria-checked="true"]',all:!0,optional:!0},{click:'.qc-cmp2-main button[aria-label="REJECT ALL"]',optional:!0},{waitForThenClick:'.qc-cmp2-main button[aria-label="SAVE & EXIT"],.qc-cmp2-buttons-desktop > button[mode="primary"]',timeout:5e3}],optIn:[{click:'.qc-cmp2-summary-buttons > button[mode="primary"]'}]},{name:"reddit.com",runContext:{urlPattern:"^https://www\\.reddit\\.com/"},prehideSelectors:['section:has(a[href^="https://www.reddit.com/policies/cookies"])'],detectCmp:[{exists:'section:has(a[href^="https://www.reddit.com/policies/cookies"])'}],detectPopup:[{visible:'section:has(a[href^="https://www.reddit.com/policies/cookies"])'}],optIn:[{waitForThenClick:"section:has(a[href^=\"https://www.reddit.com/policies/cookies\"]) section[class^='_'] > section:first-child form button"}],optOut:[{waitForThenClick:"section:has(a[href^=\"https://www.reddit.com/policies/cookies\"]) section[class^='_'] > section:last-child form button"}],test:[{eval:"EVAL_REDDIT_0"}]},{name:"samsung.com",runContext:{urlPattern:"^https://www\\.samsung\\.com/"},cosmetic:!0,prehideSelectors:["div.cookie-bar"],detectCmp:[{exists:"div.cookie-bar"}],detectPopup:[{visible:"div.cookie-bar"}],optIn:[{click:"div.cookie-bar__manage > a"}],optOut:[{hide:["div.cookie-bar"]}]},{name:"sibbo",prehideSelectors:["sibbo-cmp-layout"],detectCmp:[{exists:"sibbo-cmp-layout"}],detectPopup:[{visible:"sibbo-cmp-layout"}],optIn:[{click:"sibbo-cmp-layout [data-accept-all]"}],optOut:[{click:'.sibbo-panel__aside__buttons a[data-nav="purposes"]'},{click:'.sibbo-panel__main__header__actions a[data-focusable="reject-all"]'},{if:{exists:"[data-view=purposes] .sibbo-panel__main__footer__actions [data-save-and-exit]"},then:[],else:[{waitFor:'.sibbo-panel__main__footer__actions a[data-focusable="next"]:not(.sibbo-cmp-button--disabled)'},{click:'.sibbo-panel__main__footer__actions a[data-focusable="next"]'},{click:'.sibbo-panel__main div[data-view="purposesLegInt"] a[data-focusable="reject-all"]'}]},{waitFor:".sibbo-panel__main__footer__actions [data-save-and-exit]:not(.sibbo-cmp-button--disabled)"},{click:".sibbo-panel__main__footer__actions [data-save-and-exit]:not(.sibbo-cmp-button--disabled)"}],test:[{eval:"EVAL_SIBBO_0"}]},{name:"similarweb.com",cosmetic:!0,prehideSelectors:[".app-cookies-notification"],detectCmp:[{exists:".app-cookies-notification"}],detectPopup:[{exists:".app-layout .app-cookies-notification"}],optIn:[{click:"button.app-cookies-notification__dismiss"}],optOut:[{hide:[".app-layout .app-cookies-notification"]}]},{name:"Sirdata",prehideSelectors:["#sd-cmp"],detectCmp:[{exists:"#sd-cmp"}],detectPopup:[{visible:"#sd-cmp"}],optIn:[{waitForThenClick:"#sd-cmp .sd-cmp-3cRQ2"}],optOut:[{waitForThenClick:"#sd-cmp .sd-cmp-1pO44"}],test:[{eval:"EVAL_SIRDATA_0"}]},{name:"snigel",detectCmp:[{exists:".snigel-cmp-framework"}],detectPopup:[{visible:".snigel-cmp-framework"}],optOut:[{click:"#sn-b-custom"},{click:"#sn-b-save"}],test:[{eval:"EVAL_SNIGEL_0"}],optIn:[{click:".snigel-cmp-framework #accept-choices"}]},{name:"steampowered.com",detectCmp:[{exists:".cookiepreferences_popup"},{visible:".cookiepreferences_popup"}],detectPopup:[{visible:".cookiepreferences_popup"}],optOut:[{click:"#rejectAllButton"}],optIn:[{click:"#acceptAllButton"}],test:[{wait:1e3},{eval:"EVAL_STEAMPOWERED_0"}]},{name:"takealot.com",cosmetic:!0,prehideSelectors:['div[class^="cookies-banner-module_"]'],detectCmp:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],detectPopup:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],optIn:[{click:'button[class*="cookies-banner-module_dismiss-button_"]'}],optOut:[{hide:['div[class^="cookies-banner-module_"]']},{if:{exists:'div[class^="cookies-banner-module_small-cookie-banner_"]'},then:[{eval:"EVAL_TAKEALOT_0"}],else:[]}]},{name:"tarteaucitron.js",prehideSelectors:["#tarteaucitronRoot"],detectCmp:[{exists:"#tarteaucitronRoot"}],detectPopup:[{visible:"#tarteaucitronRoot #tarteaucitronAlertSmall,#tarteaucitronRoot #tarteaucitronAlertBig",check:"any"}],optIn:[{eval:"EVAL_TARTEAUCITRON_1"}],optOut:[{eval:"EVAL_TARTEAUCITRON_0"}],test:[{eval:"EVAL_TARTEAUCITRON_2",comment:"sometimes there are required categories, so we check that at least something is false"}]},{name:"Tealium",prehideSelectors:["#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs,#consent-layer"],detectCmp:[{visible:"#__tealiumGDPRecModal"},{eval:"EVAL_TEALIUM_0"}],detectPopup:[{visible:"#__tealiumGDPRecModal"}],optOut:[{waitForThenClick:"#cm-acceptNone,.js-accept-essential-cookies",timeout:1e3},{eval:"EVAL_TEALIUM_1"}],optIn:[{hide:["#__tealiumGDPRecModal"]},{eval:"EVAL_TEALIUM_2"}],test:[{eval:"EVAL_TEALIUM_3"}]},{name:"Termly",prehideSelectors:["#termly-code-snippet-support"],detectCmp:[{exists:"#termly-code-snippet-support"}],detectPopup:[{visible:"#termly-code-snippet-support div"}],optIn:[{waitForThenClick:'[data-tid="banner-accept"]'}],optOut:[{if:{exists:'[data-tid="banner-decline"]'},then:[{click:'[data-tid="banner-decline"]'}],else:[{click:".t-preference-button"},{wait:500},{if:{exists:".t-declineAllButton"},then:[{click:".t-declineAllButton"}],else:[{waitForThenClick:".t-preference-modal input[type=checkbox][checked]:not([disabled])",all:!0},{waitForThenClick:".t-saveButton"}]}]}]},{name:"Test page cosmetic CMP",cosmetic:!0,prehideSelectors:["#privacy-test-page-cmp-test-prehide"],detectCmp:[{exists:"#privacy-test-page-cmp-test-banner"}],detectPopup:[{visible:"#privacy-test-page-cmp-test-banner"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{hide:["#privacy-test-page-cmp-test-banner"]}],test:[{wait:500},{eval:"EVAL_TESTCMP_COSMETIC_0"}]},{name:"Test page CMP",prehideSelectors:["#reject-all"],detectCmp:[{exists:"#privacy-test-page-cmp-test"}],detectPopup:[{visible:"#privacy-test-page-cmp-test"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{waitFor:"#reject-all"},{click:"#reject-all"}],test:[{eval:"EVAL_TESTCMP_0"}]},{name:"thalia.de",prehideSelectors:[".consent-banner-box"],detectCmp:[{exists:"consent-banner[component=consent-banner]"}],detectPopup:[{visible:".consent-banner-box"}],optIn:[{click:".button-zustimmen"}],optOut:[{click:"button[data-consent=disagree]"}]},{name:"thefreedictionary.com",prehideSelectors:["#cmpBanner"],detectCmp:[{exists:"#cmpBanner"}],detectPopup:[{visible:"#cmpBanner"}],optIn:[{eval:"EVAL_THEFREEDICTIONARY_1"}],optOut:[{eval:"EVAL_THEFREEDICTIONARY_0"}]},{name:"theverge",runContext:{frame:!1,main:!0,urlPattern:"^https://(www)?\\.theverge\\.com"},intermediate:!1,prehideSelectors:[".duet--cta--cookie-banner"],detectCmp:[{exists:".duet--cta--cookie-banner"}],detectPopup:[{visible:".duet--cta--cookie-banner"}],optIn:[{click:".duet--cta--cookie-banner button.tracking-12",all:!1}],optOut:[{click:".duet--cta--cookie-banner button.tracking-12 > span"}],test:[{eval:"EVAL_THEVERGE_0"}]},{name:"tidbits-com",cosmetic:!0,prehideSelectors:["#eu_cookie_law_widget-2"],detectCmp:[{exists:"#eu_cookie_law_widget-2"}],detectPopup:[{visible:"#eu_cookie_law_widget-2"}],optIn:[{click:"#eu-cookie-law form > input.accept"}],optOut:[{hide:["#eu_cookie_law_widget-2"]}]},{name:"tractor-supply",runContext:{urlPattern:"^https://www\\.tractorsupply\\.com/"},cosmetic:!0,prehideSelectors:[".tsc-cookie-banner"],detectCmp:[{exists:".tsc-cookie-banner"}],detectPopup:[{visible:".tsc-cookie-banner"}],optIn:[{click:"#cookie-banner-cancel"}],optOut:[{hide:[".tsc-cookie-banner"]}]},{name:"trader-joes-com",cosmetic:!0,prehideSelectors:['div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'],detectCmp:[{exists:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],detectPopup:[{visible:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],optIn:[{click:'div[class^="CookiesAlert_cookiesAlert__container__"] button'}],optOut:[{hide:['div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]']}]},{name:"tropicfeel-com",prehideSelectors:["#shopify-section-cookies-controller"],detectCmp:[{exists:"#shopify-section-cookies-controller"}],detectPopup:[{visible:"#shopify-section-cookies-controller #cookies-controller-main-pane",check:"any"}],optIn:[{waitForThenClick:"#cookies-controller-main-pane form[data-form-allow-all] button"}],optOut:[{click:"#cookies-controller-main-pane a[data-tab-target=manage-cookies]"},{waitFor:"#manage-cookies-pane.active"},{click:"#manage-cookies-pane.active input[type=checkbox][checked]:not([disabled])",all:!0},{click:"#manage-cookies-pane.active button[type=submit]"}],test:[]},{name:"true-car",runContext:{urlPattern:"^https://www\\.truecar\\.com/"},cosmetic:!0,prehideSelectors:[['div[aria-labelledby="cookie-banner-heading"]']],detectCmp:[{exists:'div[aria-labelledby="cookie-banner-heading"]'}],detectPopup:[{visible:'div[aria-labelledby="cookie-banner-heading"]'}],optIn:[{click:'div[aria-labelledby="cookie-banner-heading"] > button[aria-label="Close"]'}],optOut:[{hide:['div[aria-labelledby="cookie-banner-heading"]']}]},{name:"truyo",prehideSelectors:["#truyo-consent-module"],detectCmp:[{exists:"#truyo-cookieBarContent"}],detectPopup:[{visible:"#truyo-consent-module"}],optIn:[{click:"button#acceptAllCookieButton"}],optOut:[{click:"button#declineAllCookieButton"}]},{name:"tumblr-com",cosmetic:!0,prehideSelectors:["#cmp-app-container"],detectCmp:[{exists:"#cmp-app-container"}],detectPopup:[{visible:"#cmp-app-container"}],optIn:[{click:"#tumblr #cmp-app-container div.components-modal__frame > iframe > html body > div > div > div.cmp__dialog-footer > div > button.components-button.white-space-normal.is-primary"}],optOut:[{hide:["#cmp-app-container"]}]},{name:"twitch.tv",runContext:{urlPattern:"^https?://(www\\.)?twitch\\.tv"},prehideSelectors:["div:has(> .consent-banner .consent-banner__content--gdpr-v2),.ReactModalPortal:has([data-a-target=consent-modal-save])"],detectCmp:[{exists:".consent-banner .consent-banner__content--gdpr-v2"}],detectPopup:[{visible:".consent-banner .consent-banner__content--gdpr-v2"}],optIn:[{click:'button[data-a-target="consent-banner-accept"]'}],optOut:[{hide:["div:has(> .consent-banner .consent-banner__content--gdpr-v2)"]},{click:'button[data-a-target="consent-banner-manage-preferences"]'},{waitFor:"input[type=checkbox][data-a-target=tw-checkbox]"},{click:"input[type=checkbox][data-a-target=tw-checkbox][checked]:not([disabled])",all:!0,optional:!0},{waitForThenClick:"[data-a-target=consent-modal-save]"},{waitForVisible:".ReactModalPortal:has([data-a-target=consent-modal-save])",check:"none"}]},{name:"twitter",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?twitter\\.com/"},prehideSelectors:['[data-testid="BottomBar"]'],detectCmp:[{exists:'[data-testid="BottomBar"] div'}],detectPopup:[{visible:'[data-testid="BottomBar"] div'}],optIn:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>span[role=button]) > div:last-child > div[role=button]:first-child'}],optOut:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>span[role=button]) > div:last-child > div[role=button]:last-child'}],TODOtest:[{eval:"EVAL_document.cookie.includes('d_prefs=MjoxLGNvbnNlbnRfdmVyc2lvbjoy')"}]},{name:"ubuntu.com",prehideSelectors:["dialog.cookie-policy"],detectCmp:[{any:[{exists:"dialog.cookie-policy header"},{exists:'xpath///*[@id="modal"]/div/header'}]}],detectPopup:[{any:[{visible:"dialog header"},{visible:'xpath///*[@id="modal"]/div/header'}]}],optIn:[{any:[{waitForThenClick:"#cookie-policy-button-accept"},{waitForThenClick:'xpath///*[@id="cookie-policy-button-accept"]'}]}],optOut:[{any:[{waitForThenClick:"button.p-button"},{waitForThenClick:'xpath///*[@id="cookie-policy-content"]/p[4]/button[2]'}]},{waitForThenClick:".p-switch__input:checked",optional:!0,all:!0},{any:[{waitForThenClick:"div > button"},{waitForThenClick:'xpath///*[@id="modal"]/div/button'}]}],test:[{eval:"EVAL_UBUNTU_COM_0"}]},{name:"UK Cookie Consent",prehideSelectors:["#catapult-cookie-bar"],cosmetic:!0,detectCmp:[{exists:"#catapult-cookie-bar"}],detectPopup:[{exists:".has-cookie-bar #catapult-cookie-bar"}],optIn:[{click:"#catapultCookie"}],optOut:[{hide:["#catapult-cookie-bar"]}],test:[{eval:"EVAL_UK_COOKIE_CONSENT_0"}]},{name:"urbanarmorgear-com",cosmetic:!0,prehideSelectors:['div[class^="Layout__CookieBannerContainer-"]'],detectCmp:[{exists:'div[class^="Layout__CookieBannerContainer-"]'}],detectPopup:[{visible:'div[class^="Layout__CookieBannerContainer-"]'}],optIn:[{click:'button[class^="CookieBanner__AcceptButton"]'}],optOut:[{hide:['div[class^="Layout__CookieBannerContainer-"]']}]},{name:"usercentrics-api",detectCmp:[{exists:"#usercentrics-root"}],detectPopup:[{eval:"EVAL_USERCENTRICS_API_0"},{exists:["#usercentrics-root","[data-testid=uc-container]"]}],optIn:[{eval:"EVAL_USERCENTRICS_API_3"},{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_5"}],optOut:[{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_2"}],test:[{eval:"EVAL_USERCENTRICS_API_6"}]},{name:"usercentrics-button",detectCmp:[{exists:"#usercentrics-button"}],detectPopup:[{visible:"#usercentrics-button #uc-btn-accept-banner"}],optIn:[{click:"#usercentrics-button #uc-btn-accept-banner"}],optOut:[{click:"#usercentrics-button #uc-btn-deny-banner"}],test:[{eval:"EVAL_USERCENTRICS_BUTTON_0"}]},{name:"uswitch.com",prehideSelectors:["#cookie-banner-wrapper"],detectCmp:[{exists:"#cookie-banner-wrapper"}],detectPopup:[{visible:"#cookie-banner-wrapper"}],optIn:[{click:"#cookie_banner_accept_mobile"}],optOut:[{click:"#cookie_banner_save"}]},{name:"vodafone.de",runContext:{urlPattern:"^https://www\\.vodafone\\.de/"},prehideSelectors:[".dip-consent,.dip-consent-container"],detectCmp:[{exists:".dip-consent-container"}],detectPopup:[{visible:".dip-consent-content"}],optOut:[{click:'.dip-consent-btn[tabindex="2"]'}],optIn:[{click:'.dip-consent-btn[tabindex="1"]'}]},{name:"waitrose.com",prehideSelectors:["div[aria-labelledby=CookieAlertModalHeading]","section[data-test=initial-waitrose-cookie-consent-banner]","section[data-test=cookie-consent-modal]"],detectCmp:[{exists:"section[data-test=initial-waitrose-cookie-consent-banner]"}],detectPopup:[{visible:"section[data-test=initial-waitrose-cookie-consent-banner]"}],optIn:[{click:"button[data-test=accept-all]"}],optOut:[{click:"button[data-test=manage-cookies]"},{wait:200},{eval:"EVAL_WAITROSE_0"},{click:"button[data-test=submit]"}],test:[{eval:"EVAL_WAITROSE_1"}]},{name:"wetransfer.com",detectCmp:[{exists:".welcome__cookie-notice"}],detectPopup:[{visible:".welcome__cookie-notice"}],optIn:[{click:".welcome__button--accept"}],optOut:[{click:".welcome__button--decline"}]},{name:"whitepages.com",runContext:{urlPattern:"^https://www\\.whitepages\\.com/"},cosmetic:!0,prehideSelectors:[".cookie-wrapper, .cookie-overlay"],detectCmp:[{exists:".cookie-wrapper"}],detectPopup:[{visible:".cookie-overlay"}],optIn:[{click:'button[aria-label="Got it"]'}],optOut:[{hide:[".cookie-wrapper"]}]},{name:"woo-commerce-com",prehideSelectors:[".wccom-comp-privacy-banner .wccom-privacy-banner"],detectCmp:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],detectPopup:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],optIn:[{click:".wccom-privacy-banner__content-buttons button.is-primary"}],optOut:[{click:".wccom-privacy-banner__content-buttons button.is-secondary"},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:"div.wccom-modal__footer > button"}]},{name:"WP Cookie Notice for GDPR",comment:"https://wordpress.org/plugins/gdpr-cookie-consent/",prehideSelectors:["#gdpr-cookie-consent-bar"],detectCmp:[{exists:"#gdpr-cookie-consent-bar"}],detectPopup:[{visible:"#gdpr-cookie-consent-bar"}],optIn:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_accept"}],optOut:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_reject"}],test:[{eval:"EVAL_WP_COOKIE_NOTICE_0"}]},{name:"wpcc",cosmetic:!0,prehideSelectors:[".wpcc-container"],detectCmp:[{exists:".wpcc-container"}],detectPopup:[{exists:".wpcc-container .wpcc-message"}],optIn:[{click:".wpcc-compliance .wpcc-btn"}],optOut:[{hide:[".wpcc-container"]}]},{name:"xhamster-eu",prehideSelectors:[".cookies-modal"],detectCmp:[{exists:".cookies-modal"}],detectPopup:[{exists:".cookies-modal"}],optIn:[{click:"button.cmd-button-accept-all"}],optOut:[{click:"button.cmd-button-reject-all"}]},{name:"xhamster-us",runContext:{urlPattern:"^https://(www\\.)?xhamster\\d?\\.com"},cosmetic:!0,prehideSelectors:[".cookie-announce"],detectCmp:[{exists:".cookie-announce"}],detectPopup:[{visible:".cookie-announce .announce-text"}],optIn:[{click:".cookie-announce button.xh-button"}],optOut:[{hide:[".cookie-announce"]}]},{name:"xing.com",detectCmp:[{exists:"div[class^=cookie-consent-CookieConsent]"}],detectPopup:[{exists:"div[class^=cookie-consent-CookieConsent]"}],optIn:[{click:"#consent-accept-button"}],optOut:[{click:"#consent-settings-button"},{click:".consent-banner-button-accept-overlay"}],test:[{eval:"EVAL_XING_0"}]},{name:"xnxx-com",cosmetic:!0,prehideSelectors:["#cookies-use-alert"],detectCmp:[{exists:"#cookies-use-alert"}],detectPopup:[{visible:"#cookies-use-alert"}],optIn:[{click:"#cookies-use-alert .close"}],optOut:[{hide:["#cookies-use-alert"]}]},{name:"youporn.com",cosmetic:!0,prehideSelectors:[".euCookieModal, #js_euCookieModal"],detectCmp:[{exists:".euCookieModal"}],detectPopup:[{exists:".euCookieModal, #js_euCookieModal"}],optIn:[{click:'button[name="user_acceptCookie"]'}],optOut:[{hide:[".euCookieModal"]}]},{name:"youtube-desktop",prehideSelectors:["tp-yt-iron-overlay-backdrop.opened","ytd-consent-bump-v2-lightbox"],detectCmp:[{exists:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"},{exists:'ytd-consent-bump-v2-lightbox tp-yt-paper-dialog a[href^="https://consent.youtube.com/"]'}],detectPopup:[{visible:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"}],optIn:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child button"},{wait:500}],optOut:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_DESKTOP_0"}]},{name:"youtube-mobile",prehideSelectors:[".consent-bump-v2-lightbox"],detectCmp:[{exists:"ytm-consent-bump-v2-renderer"}],detectPopup:[{visible:"ytm-consent-bump-v2-renderer"}],optIn:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:first-child button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:first-child button"},{wait:500}],optOut:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:nth-child(2) button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:nth-child(2) button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_MOBILE_0"}]},{name:"zdf",prehideSelectors:["#zdf-cmp-banner-sdk"],detectCmp:[{exists:"#zdf-cmp-banner-sdk"}],detectPopup:[{visible:"#zdf-cmp-main.zdf-cmp-show"}],optIn:[{waitForThenClick:"#zdf-cmp-main #zdf-cmp-accept-btn"}],optOut:[{waitForThenClick:"#zdf-cmp-main #zdf-cmp-deny-btn"}],test:[]}],T={"didomi.io":{detectors:[{presentMatcher:{target:{selector:"#didomi-host, #didomi-notice"},type:"css"},showingMatcher:{target:{selector:"body.didomi-popup-open, .didomi-notice-banner"},type:"css"}}],methods:[{action:{target:{selector:".didomi-popup-notice-buttons .didomi-button:not(.didomi-button-highlight), .didomi-notice-banner .didomi-learn-more-button"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{retries:50,target:{selector:"#didomi-purpose-cookies"},type:"waitcss",waitTime:50},{consents:[{description:"Share (everything) with others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:last-child"},type:"click"},type:"X"},{description:"Information storage and access",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:last-child"},type:"click"},type:"D"},{description:"Content selection, offers and marketing",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:last-child"},type:"click"},type:"E"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:last-child"},type:"click"},type:"B"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:last-child"},type:"click"},type:"B"},{description:"Ad and content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection",falseAction:{parent:{childFilter:{target:{selector:"#didomi-purpose-pub-ciblee"}},selector:".didomi-consent-popup-data-processing, .didomi-components-accordion-label-container"},target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - basics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - partners and subsidiaries",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:last-child"},type:"click"},type:"F"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:last-child"},type:"click"},type:"A"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:last-child"},type:"click"},type:"A"},{description:"Content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:last-child"},type:"click"},type:"E"},{description:"Ad delivery",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:last-child"},type:"click"},type:"F"}],type:"consent"},{action:{consents:[{matcher:{childFilter:{target:{selector:":not(.didomi-components-radio__option--selected)"}},type:"css"},trueAction:{target:{selector:":nth-child(2)"},type:"click"},falseAction:{target:{selector:":first-child"},type:"click"},type:"X"}],type:"consent"},target:{selector:".didomi-components-radio"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".didomi-consent-popup-footer .didomi-consent-popup-actions"},target:{selector:".didomi-components-button:first-child"},type:"click"},name:"SAVE_CONSENT"}]},oil:{detectors:[{presentMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"},showingMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".as-js-advanced-settings"},type:"click"},{retries:"10",target:{selector:".as-oil-cpc__purpose-container"},type:"waitcss",waitTime:"250"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{consents:[{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"D"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"B"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:".as-oil__btn-optin"},type:"click"},name:"SAVE_CONSENT"},{action:{target:{selector:"div.as-oil"},type:"hide"},name:"HIDE_CMP"}]},optanon:{detectors:[{presentMatcher:{target:{selector:"#optanon-menu, .optanon-alert-box-wrapper"},type:"css"},showingMatcher:{target:{displayFilter:!0,selector:".optanon-alert-box-wrapper"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".optanon-alert-box-wrapper .optanon-toggle-display, a[onclick*='OneTrust.ToggleInfoDisplay()'], a[onclick*='Optanon.ToggleInfoDisplay()']"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".preference-menu-item #Your-privacy"},type:"click"},{target:{selector:"#optanon-vendor-consent-text"},type:"click"},{action:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},target:{selector:"#optanon-vendor-consent-list .vendor-item"},type:"foreach"},{target:{selector:".vendor-consent-back-link"},type:"click"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"D"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".optanon-save-settings-button"},target:{selector:".optanon-white-button-middle"},type:"click"},name:"SAVE_CONSENT"},{action:{actions:[{target:{selector:"#optanon-popup-wrapper"},type:"hide"},{target:{selector:"#optanon-popup-bg"},type:"hide"},{target:{selector:".optanon-alert-box-wrapper"},type:"hide"}],type:"list"},name:"HIDE_CMP"}]},quantcast2:{detectors:[{presentMatcher:{target:{selector:"[data-tracking-opt-in-overlay]"},type:"css"},showingMatcher:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"css"}}],methods:[{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{type:"wait",waitTime:500},{action:{actions:[{target:{selector:"div",textFilter:["Information storage and access"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"D"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Personalization"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Ad selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Content selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"E"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Measurement"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"B"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Other Partners"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},type:"ifcss"}],type:"list"},parent:{childFilter:{target:{selector:"input"}},selector:"[data-tracking-opt-in-overlay] > div > div"},target:{childFilter:{target:{selector:"input"}},selector:":scope > div"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-save]"},type:"click"},name:"SAVE_CONSENT"}]},springer:{detectors:[{presentMatcher:{parent:null,target:{selector:".cmp-app_gdpr"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".cmp-popup_popup"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".cmp-intro_rejectAll"},type:"click"},{type:"wait",waitTime:250},{target:{selector:".cmp-purposes_purposeItem:not(.cmp-purposes_selectedPurpose)"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{consents:[{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"D"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"}],type:"consent"},name:"DO_CONSENT"},{action:{target:{selector:".cmp-details_save"},type:"click"},name:"SAVE_CONSENT"}]},wordpressgdpr:{detectors:[{presentMatcher:{parent:null,target:{selector:".wpgdprc-consent-bar"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".wpgdprc-consent-bar"},type:"css"}}],methods:[{action:{parent:null,target:{selector:".wpgdprc-consent-bar .wpgdprc-consent-bar__settings",textFilter:null},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Eyeota"},type:"click"},{consents:[{description:"Eyeota Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Advertising"},type:"click"},{consents:[{description:"Advertising Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{parent:null,target:{selector:".wpgdprc-button",textFilter:"Save my settings"},type:"click"},name:"SAVE_CONSENT"}]}},F={autoconsent:P,consentomatic:T},L=Object.freeze({__proto__:null,autoconsent:P,consentomatic:T,default:F});const N=new class{constructor(e,t=null,o=null){if(this.id=y(),this.rules=[],this.foundCmp=null,this.state={lifecycle:"loading",prehideOn:!1,findCmpAttempts:0,detectedCmps:[],detectedPopups:[],selfTest:null},C.sendContentMessage=e,this.sendContentMessage=e,this.rules=[],this.updateState({lifecycle:"loading"}),this.addDynamicRules(),t)this.initialize(t,o);else{o&&this.parseDeclarativeRules(o);e({type:"init",url:window.location.href}),this.updateState({lifecycle:"waitingForInitResponse"})}}initialize(e,t){if(this.config=e,e.enabled){if(t&&this.parseDeclarativeRules(t),this.rules=function(e,t){return e.filter((e=>(!t.disabledCmps||!t.disabledCmps.includes(e.name))&&(t.enableCosmeticRules||!e.isCosmetic)))}(this.rules,e),e.enablePrehide)if(document.documentElement)this.prehideElements();else{const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.prehideElements()};window.addEventListener("DOMContentLoaded",e)}if("loading"===document.readyState){const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.start()};window.addEventListener("DOMContentLoaded",e)}else this.start();this.updateState({lifecycle:"initialized"})}}addDynamicRules(){I.forEach((e=>{this.rules.push(new e(this))}))}parseDeclarativeRules(e){Object.keys(e.consentomatic).forEach((t=>{this.addConsentomaticCMP(t,e.consentomatic[t])})),e.autoconsent.forEach((e=>{this.addDeclarativeCMP(e)}))}addDeclarativeCMP(e){this.rules.push(new E(e,this))}addConsentomaticCMP(e,t){this.rules.push(new O(`com_${e}`,t))}start(){window.requestIdleCallback?window.requestIdleCallback((()=>this._start()),{timeout:500}):this._start()}async _start(){this.updateState({lifecycle:"started"});const e=await this.findCmp(this.config.detectRetries);if(this.updateState({detectedCmps:e.map((e=>e.name))}),0===e.length)return this.config.enablePrehide&&this.undoPrehide(),this.updateState({lifecycle:"nothingDetected"}),!1;this.updateState({lifecycle:"cmpDetected"});let t=await this.detectPopups(e.filter((e=>!e.isCosmetic)));if(0===t.length&&(t=await this.detectPopups(e.filter((e=>e.isCosmetic)))),0===t.length)return this.config.enablePrehide&&this.undoPrehide(),!1;if(this.updateState({lifecycle:"openPopupDetected"}),this.config.enablePrehide&&!this.state.prehideOn&&this.prehideElements(),t.length>1){const e={msg:"Found multiple CMPs, check the detection rules.",cmps:t.map((e=>e.name))};this.sendContentMessage({type:"autoconsentError",details:e})}return this.foundCmp=t[0],"optOut"===this.config.autoAction?await this.doOptOut():"optIn"!==this.config.autoAction||await this.doOptIn()}async findCmp(e){this.updateState({findCmpAttempts:this.state.findCmpAttempts+1});const t=[];for(const e of this.rules)try{if(!e.checkRunContext())continue;await e.detectCmp()&&(this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:e.name}),t.push(e))}catch(e){}return 0===t.length&&e>0?(await b(500),this.findCmp(e-1)):t}async detectPopups(e){const t=[],o=e.map((e=>this.waitForPopup(e).then((o=>{o&&(this.updateState({detectedPopups:this.state.detectedPopups.concat([e.name])}),this.sendContentMessage({type:"popupFound",cmp:e.name,url:location.href}),t.push(e))})).catch((e=>null))));return await Promise.all(o),t}async doOptOut(){let e;return this.updateState({lifecycle:"runningOptOut"}),e=!!this.foundCmp&&await this.foundCmp.optOut(),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optOutResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:e,scheduleSelfTest:this.foundCmp&&this.foundCmp.hasSelfTest,url:location.href}),e&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:e?"optOutSucceeded":"optOutFailed"}),e}async doOptIn(){let e;return this.updateState({lifecycle:"runningOptIn"}),e=!!this.foundCmp&&await this.foundCmp.optIn(),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optInResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:e,scheduleSelfTest:!1,url:location.href}),e&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:e?"optInSucceeded":"optInFailed"}),e}async doSelfTest(){let e;return e=!!this.foundCmp&&await this.foundCmp.test(),this.sendContentMessage({type:"selfTestResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:e,url:location.href}),this.updateState({selfTest:e}),e}async waitForPopup(e,t=5,o=500){const c=await e.detectPopup().catch((e=>!1));return!c&&t>0?(await b(o),this.waitForPopup(e,t-1,o)):c}prehideElements(){const e=this.rules.reduce(((e,t)=>t.prehideSelectors?[...e,...t.prehideSelectors]:e),["#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"]);return this.updateState({prehideOn:!0}),setTimeout((()=>{this.config.enablePrehide&&this.state.prehideOn&&!["runningOptOut","runningOptIn"].includes(this.state.lifecycle)&&this.undoPrehide()}),this.config.prehideTimeout||2e3),function(e){return s(a("autoconsent-prehide"),e,"opacity")}(e)}undoPrehide(){return this.updateState({prehideOn:!1}),function(){const e=a("autoconsent-prehide");return e&&e.remove(),!!e}()}updateState(e){Object.assign(this.state,e),this.sendContentMessage({type:"report",instanceId:this.id,url:window.location.href,mainFrame:window.top===window.self,state:this.state})}async receiveMessageCallback(e){switch(e.type){case"initResp":this.initialize(e.config,e.rules);break;case"optIn":await this.doOptIn();break;case"optOut":await this.doOptOut();break;case"selfTest":await this.doSelfTest();break;case"evalResp":!function(e,t){const o=C.pending.get(e);o?(C.pending.delete(e),o.timer&&window.clearTimeout(o.timer),o.resolve(t)):console.warn("no eval #",e)}(e.id,e.result)}}}((e=>{window.webkit.messageHandlers[e.type]&&window.webkit.messageHandlers[e.type].postMessage(e).then((e=>{N.receiveMessageCallback(e)}))}),null,L);window.autoconsentMessageCallback=e=>{N.receiveMessageCallback(e)}}();
diff --git a/package-lock.json b/package-lock.json
index 85e777a32f..a096c1ea3b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,7 @@
       "name": "ios",
       "version": "1.0.0",
       "dependencies": {
-        "@duckduckgo/autoconsent": "^6.0.0"
+        "@duckduckgo/autoconsent": "^6.4.0"
       },
       "devDependencies": {
         "@rollup/plugin-json": "^4.1.0",
@@ -135,9 +135,9 @@
       }
     },
     "node_modules/@duckduckgo/autoconsent": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/@duckduckgo/autoconsent/-/autoconsent-6.0.0.tgz",
-      "integrity": "sha512-RcvC2sD8JY/QnMWdKQnMZMb1aCw6lEgJsT9OF7y/rZRUQKOIhDq6U8dJ///vZQjeVkmmJnR/T2ljLN0Qfvyy1g=="
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/@duckduckgo/autoconsent/-/autoconsent-6.4.0.tgz",
+      "integrity": "sha512-WhQnE0Zy8ArMyo78tTZSOXVn9IQ0qut4INLHvt7kyPkzQVhfrckVwSlehlTETFu22NkuX1jUW1GaugFtxnYJWg=="
     },
     "node_modules/@eslint/eslintrc": {
       "version": "0.4.3",
diff --git a/package.json b/package.json
index 664bbde3b5..bd1ed62a18 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,6 @@
     "rollup-plugin-terser": "^7.0.2"
   },
   "dependencies": {
-    "@duckduckgo/autoconsent": "^6.0.0"
+    "@duckduckgo/autoconsent": "^6.4.0"
   }
 }

From 83bc0d1ccef002765a72c48f4d612d76a2285c8d Mon Sep 17 00:00:00 2001
From: bwaresiak <bartek@duckduckgo.com>
Date: Wed, 22 Nov 2023 09:15:21 +0100
Subject: [PATCH 07/40] Release 7.98.0 (#2179)

---
 Configuration/Version.xcconfig                |   2 +-
 .../AppPrivacyConfigurationDataProvider.swift |   4 +-
 Core/ios-config.json                          | 275 ++++++++++++++++--
 DuckDuckGo.xcodeproj/project.pbxproj          |  42 +--
 DuckDuckGo/Settings.bundle/Root.plist         |   2 +-
 fastlane/metadata/default/release_notes.txt   |   1 +
 6 files changed, 270 insertions(+), 56 deletions(-)

diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig
index 773b0e1646..71b21c82cd 100644
--- a/Configuration/Version.xcconfig
+++ b/Configuration/Version.xcconfig
@@ -1 +1 @@
-MARKETING_VERSION = 7.97.0
+MARKETING_VERSION = 7.98.0
diff --git a/Core/AppPrivacyConfigurationDataProvider.swift b/Core/AppPrivacyConfigurationDataProvider.swift
index 4e4e1e6202..c984d0206f 100644
--- a/Core/AppPrivacyConfigurationDataProvider.swift
+++ b/Core/AppPrivacyConfigurationDataProvider.swift
@@ -23,8 +23,8 @@ import BrowserServicesKit
 final public class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider {
 
     public struct Constants {
-        public static let embeddedDataETag = "\"71b1b5499f333348df4f9bc52b74185f\""
-        public static let embeddedDataSHA = "a5b30cf79e5efc40fec6fb28491a7484822041d927a6e2d8c9c7ccd3bd236c61"
+        public static let embeddedDataETag = "\"b8a321aec612923a53b958fbdbfa541e\""
+        public static let embeddedDataSHA = "af271d73da0863e678670fb0d9cf4f8269ddb7e584599bfb57d5a370961dbc4b"
     }
 
     public var embeddedDataEtag: String {
diff --git a/Core/ios-config.json b/Core/ios-config.json
index ce6aeae32a..3283af4e90 100644
--- a/Core/ios-config.json
+++ b/Core/ios-config.json
@@ -1,6 +1,6 @@
 {
     "readme": "https://github.com/duckduckgo/privacy-configuration",
-    "version": 1699875322077,
+    "version": 1700585688784,
     "features": {
         "adClickAttribution": {
             "readme": "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections/#3rd-party-tracker-loading-protection",
@@ -242,6 +242,9 @@
                 {
                     "domain": "capital.fr"
                 },
+                {
+                    "domain": "metro.co.uk"
+                },
                 {
                     "domain": "earth.google.com"
                 },
@@ -261,13 +264,10 @@
                 ]
             },
             "state": "enabled",
-            "hash": "4719cb6c793d13a9ac81c329f4d206c8"
+            "hash": "9ab9e1acdb6a8617c77109acc1e3943c"
         },
         "autofill": {
             "exceptions": [
-                {
-                    "domain": "containerstore.com"
-                },
                 {
                     "domain": "roll20.net"
                 }
@@ -312,7 +312,7 @@
                     }
                 }
             },
-            "hash": "3d95a9b3c8112148eda0ad09b1002b53"
+            "hash": "bd604dcd1f7bb584185f0c1cb94a5771"
         },
         "clickToLoad": {
             "exceptions": [
@@ -1642,6 +1642,14 @@
                         "selector": ".ad-slot",
                         "type": "closest-empty"
                     },
+                    {
+                        "selector": "#ad-top",
+                        "type": "hide-empty"
+                    },
+                    {
+                        "selector": "#ad-wrap",
+                        "type": "hide-empty"
+                    },
                     {
                         "selector": ".ad-wrap",
                         "type": "closest-empty"
@@ -1734,6 +1742,10 @@
                         "selector": "[data-ad]",
                         "type": "hide-empty"
                     },
+                    {
+                        "selector": ".instream_ad",
+                        "type": "hide-empty"
+                    },
                     {
                         "selector": ".adthrive",
                         "type": "hide-empty"
@@ -2359,9 +2371,46 @@
                     {
                         "domain": "foxnews.com",
                         "rules": [
+                            {
+                                "type": "disable-default"
+                            },
                             {
                                 "selector": ".vendor-unit",
                                 "type": "hide-empty"
+                            },
+                            {
+                                "selector": ".pre-content",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": "[class*='rr-ad-']",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": ".ad-h-250",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": ".sticky-pre-header",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": ".adhesion-ad",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": ".sticky-pre-header-inner",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": ".site-header",
+                                "type": "modify-style",
+                                "values": [
+                                    {
+                                        "property": "min-height",
+                                        "value": "50px"
+                                    }
+                                ]
                             }
                         ]
                     },
@@ -2902,6 +2951,28 @@
                             }
                         ]
                     },
+                    {
+                        "domain": "paypal.com",
+                        "rules": [
+                            {
+                                "selector": "#gslFrame",
+                                "type": "hide"
+                            }
+                        ]
+                    },
+                    {
+                        "domain": "petapixel.com",
+                        "rules": [
+                            {
+                                "selector": ".banners",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": "#ppvideoadvertisement",
+                                "type": "closest-empty"
+                            }
+                        ]
+                    },
                     {
                         "domain": "peterboroughtoday.co.uk",
                         "rules": [
@@ -3183,6 +3254,15 @@
                             }
                         ]
                     },
+                    {
+                        "domain": "takealot.com",
+                        "rules": [
+                            {
+                                "selector": "[class*='ad-slot_']",
+                                "type": "override"
+                            }
+                        ]
+                    },
                     {
                         "domain": "target.com",
                         "rules": [
@@ -3245,6 +3325,15 @@
                             }
                         ]
                     },
+                    {
+                        "domain": "thewordfinder.com",
+                        "rules": [
+                            {
+                                "selector": "[id*='adngin']",
+                                "type": "closest-empty"
+                            }
+                        ]
+                    },
                     {
                         "domain": "thingiverse.com",
                         "rules": [
@@ -3254,6 +3343,15 @@
                             }
                         ]
                     },
+                    {
+                        "domain": "tinybeans.com",
+                        "rules": [
+                            {
+                                "selector": ".tb-ad",
+                                "type": "hide-empty"
+                            }
+                        ]
+                    },
                     {
                         "domain": "tripadvisor.ca",
                         "rules": [
@@ -3489,10 +3587,6 @@
                             {
                                 "selector": "[data-content='Advertisement']",
                                 "type": "hide-empty"
-                            },
-                            {
-                                "selector": "[id*='default']",
-                                "type": "hide-empty"
                             }
                         ]
                     },
@@ -3610,7 +3704,7 @@
                 ]
             },
             "state": "enabled",
-            "hash": "15184cba961aadf588965f6caf070306"
+            "hash": "c747ff47f18924f7ddde7cea3874e3bc"
         },
         "exceptionHandler": {
             "exceptions": [
@@ -3930,6 +4024,9 @@
         "gpc": {
             "state": "enabled",
             "exceptions": [
+                {
+                    "domain": "abcnews.go.com"
+                },
                 {
                     "domain": "allegiantair.com"
                 },
@@ -3954,6 +4051,9 @@
                 {
                     "domain": "verizon.com"
                 },
+                {
+                    "domain": "chime.com"
+                },
                 {
                     "domain": "earth.google.com"
                 },
@@ -3965,6 +4065,9 @@
                 },
                 {
                     "domain": "sundancecatalog.com"
+                },
+                {
+                    "domain": "oreillyauto.com"
                 }
             ],
             "settings": {
@@ -3976,7 +4079,7 @@
                     "privacy-test-pages.site"
                 ]
             },
-            "hash": "083267b595694bd75cda73218f8811c2"
+            "hash": "9f8ae6a01924a47b3ca6ce18f001cbd9"
         },
         "harmfulApis": {
             "settings": {
@@ -4173,17 +4276,17 @@
             "hash": "698de7b963d7d7942c5c5d1e986bb1b1"
         },
         "networkProtection": {
-            "state": "disabled",
+            "state": "enabled",
             "features": {
-                "waitlist": {
-                    "state": "disabled"
-                },
                 "waitlistBetaActive": {
-                    "state": "disabled"
+                    "state": "enabled"
+                },
+                "waitlist": {
+                    "state": "enabled"
                 }
             },
             "exceptions": [],
-            "hash": "ba52a36920a4a76343fc3c44d98936f9"
+            "hash": "7899368978e0f3aaf7eb141a027e4150"
         },
         "newTabContinueSetUp": {
             "exceptions": [],
@@ -4537,12 +4640,38 @@
                             {
                                 "rule": "c.amazon-adsystem.com/aax2/apstag.js",
                                 "domains": [
+                                    "4029tv.com",
                                     "cnn.com",
                                     "corriere.it",
                                     "eurogamer.net",
+                                    "foxweather.com",
+                                    "kcci.com",
+                                    "kcra.com",
+                                    "ketv.com",
+                                    "kmbc.com",
+                                    "koat.com",
+                                    "koco.com",
+                                    "ksbw.com",
+                                    "mynbc5.com",
                                     "seattletimes.com",
+                                    "thesurfersview.com",
+                                    "wapt.com",
+                                    "wbaltv.com",
                                     "wcvb.com",
-                                    "wildrivers.lostcoastoutpost.com"
+                                    "wdsu.com",
+                                    "wesh.com",
+                                    "wgal.com",
+                                    "wildrivers.lostcoastoutpost.com",
+                                    "wisn.com",
+                                    "wlky.com",
+                                    "wlwt.com",
+                                    "wmtw.com",
+                                    "wmur.com",
+                                    "wpbf.com",
+                                    "wtae.com",
+                                    "wvtm13.com",
+                                    "wxii12.com",
+                                    "wyff4.com"
                                 ]
                             }
                         ]
@@ -4713,16 +4842,6 @@
                             }
                         ]
                     },
-                    "cdn.trackjs.com": {
-                        "rules": [
-                            {
-                                "rule": "cdn.trackjs.com/agent/v3/latest/t.js",
-                                "domains": [
-                                    "delta.com"
-                                ]
-                            }
-                        ]
-                    },
                     "certona.net": {
                         "rules": [
                             {
@@ -4827,6 +4946,12 @@
                                 "domains": [
                                     "sigalert.com"
                                 ]
+                            },
+                            {
+                                "rule": "dbukjj6eu5tsf.cloudfront.net/assets.sidearmsports.com/common/js/20170825/video.js",
+                                "domains": [
+                                    "<all>"
+                                ]
                             }
                         ]
                     },
@@ -5053,6 +5178,12 @@
                                     "rocketnews24.com"
                                 ]
                             },
+                            {
+                                "rule": "pubads.g.doubleclick.net/ssai/pods/",
+                                "domains": [
+                                    "foxweather.com"
+                                ]
+                            },
                             {
                                 "rule": "securepubads.g.doubleclick.net/tag/js/gpt.js",
                                 "domains": [
@@ -5492,7 +5623,13 @@
                             {
                                 "rule": "imasdk.googleapis.com/js/sdkloader/ima3.js",
                                 "domains": [
-                                    "nfl.com"
+                                    "bloomberg.com",
+                                    "games.washingtonpost.com",
+                                    "metro.co.uk",
+                                    "nfl.com",
+                                    "paper-io.com",
+                                    "rawstory.com",
+                                    "usatoday.com"
                                 ]
                             }
                         ]
@@ -5512,6 +5649,7 @@
                             {
                                 "rule": "pagead2.googlesyndication.com/pagead/js/adsbygoogle.js",
                                 "domains": [
+                                    "drakescans.com",
                                     "duden.de",
                                     "magicgameworld.com",
                                     "rocketnews24.com",
@@ -5994,6 +6132,17 @@
                             }
                         ]
                     },
+                    "live.primis.tech": {
+                        "rules": [
+                            {
+                                "rule": "live.primis.tech/live/liveView.php",
+                                "domains": [
+                                    "belfastlive.co.uk",
+                                    "cornwalllive.com"
+                                ]
+                            }
+                        ]
+                    },
                     "livechatinc.com": {
                         "rules": [
                             {
@@ -6151,6 +6300,16 @@
                             }
                         ]
                     },
+                    "npttech.com": {
+                        "rules": [
+                            {
+                                "rule": "npttech.com/advertising.js",
+                                "domains": [
+                                    "blick.ch"
+                                ]
+                            }
+                        ]
+                    },
                     "nuance.com": {
                         "rules": [
                             {
@@ -6447,6 +6606,16 @@
                             }
                         ]
                     },
+                    "protection-widget.route.com": {
+                        "rules": [
+                            {
+                                "rule": "protection-widget.route.com/protect.core.js",
+                                "domains": [
+                                    "littleunicorn.com"
+                                ]
+                            }
+                        ]
+                    },
                     "pubmatic.com": {
                         "rules": [
                             {
@@ -6701,6 +6870,16 @@
                             }
                         ]
                     },
+                    "taboola.com": {
+                        "rules": [
+                            {
+                                "rule": "cdn.taboola.com/libtrc/tipranks-tipranks/loader.js",
+                                "domains": [
+                                    "tipranks.com"
+                                ]
+                            }
+                        ]
+                    },
                     "tealiumiq.com": {
                         "rules": [
                             {
@@ -6764,6 +6943,22 @@
                                 "domains": [
                                     "<all>"
                                 ]
+                            },
+                            {
+                                "rule": "tags.tiqcdn.com/utag/",
+                                "domains": [
+                                    "<all>"
+                                ]
+                            }
+                        ]
+                    },
+                    "trackjs.com": {
+                        "rules": [
+                            {
+                                "rule": "cdn.trackjs.com/agent/v3/latest/t.js",
+                                "domains": [
+                                    "delta.com"
+                                ]
                             }
                         ]
                     },
@@ -7089,7 +7284,7 @@
                     "domain": "sundancecatalog.com"
                 }
             ],
-            "hash": "65670bfba426ac832fe6bb2082c432c8"
+            "hash": "f5e54d051c76c97e2ebaf3014037d10a"
         },
         "trackingCookies1p": {
             "settings": {
@@ -7264,6 +7459,24 @@
             "state": "disabled",
             "hash": "728493ef7a1488e4781656d3f9db84aa"
         },
+        "windowsStartupBoost": {
+            "exceptions": [
+                {
+                    "domain": "earth.google.com"
+                },
+                {
+                    "domain": "iscorp.com"
+                },
+                {
+                    "domain": "marvel.com"
+                },
+                {
+                    "domain": "sundancecatalog.com"
+                }
+            ],
+            "state": "disabled",
+            "hash": "5e792dd491428702bc0104240fbce0ce"
+        },
         "windowsWaitlist": {
             "exceptions": [],
             "state": "enabled",
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 41659805c7..6e9a784388 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -7802,7 +7802,7 @@
 				CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -7839,7 +7839,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -7931,7 +7931,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = ShareExtension/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -7958,7 +7958,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8104,7 +8104,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8128,7 +8128,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				INFOPLIST_FILE = DuckDuckGo/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8192,7 +8192,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEAD_CODE_STRIPPING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = Widgets/Info.plist;
@@ -8227,7 +8227,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8261,7 +8261,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = OpenAction/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8291,7 +8291,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8577,7 +8577,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8603,7 +8603,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8635,7 +8635,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8672,7 +8672,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8708,7 +8708,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8743,11 +8743,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 0;
+				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8921,11 +8921,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 0;
+				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8954,10 +8954,10 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 0;
+				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist
index 52e3696d8c..8b140d6b84 100644
--- a/DuckDuckGo/Settings.bundle/Root.plist
+++ b/DuckDuckGo/Settings.bundle/Root.plist
@@ -6,7 +6,7 @@
 	<array>
 		<dict>
 			<key>DefaultValue</key>
-			<string>7.97.0</string>
+			<string>7.98.0</string>
 			<key>Key</key>
 			<string>version</string>
 			<key>Title</key>
diff --git a/fastlane/metadata/default/release_notes.txt b/fastlane/metadata/default/release_notes.txt
index 4942898476..318421afc6 100644
--- a/fastlane/metadata/default/release_notes.txt
+++ b/fastlane/metadata/default/release_notes.txt
@@ -1,3 +1,4 @@
+We fixed a rare issue that caused text selection in the address bar to not work as expected.
 Bug fixes and other improvements.
 
 Join our fully distributed team and help raise the standard of trust online! https://duckduckgo.com/hiring

From 0b5b4b889ccd8340b92a67ec9eed91a37d72fefa Mon Sep 17 00:00:00 2001
From: Chris Brind <brindy@duckduckgo.com>
Date: Wed, 22 Nov 2023 15:02:32 +0000
Subject: [PATCH 08/40] refactor bookmarks and fire pixel if migration happens
 more than once

---
 Core/Pixel.swift                        |  1 +
 Core/PixelEvent.swift                   |  3 +
 Core/UserDefaultsPropertyWrapper.swift  |  2 +
 DuckDuckGo.xcodeproj/project.pbxproj    |  4 ++
 DuckDuckGo/AppDelegate.swift            | 71 +++++++---------------
 DuckDuckGo/BookmarksDatabaseSetup.swift | 79 +++++++++++++++++++++++++
 6 files changed, 109 insertions(+), 51 deletions(-)
 create mode 100644 DuckDuckGo/BookmarksDatabaseSetup.swift

diff --git a/Core/Pixel.swift b/Core/Pixel.swift
index d358707618..eefed5046e 100644
--- a/Core/Pixel.swift
+++ b/Core/Pixel.swift
@@ -106,6 +106,7 @@ public struct PixelParameters {
     public static let emailKeychainKeychainOperation = "keychain_operation"
 
     public static let bookmarkErrorOrphanedFolderCount = "bookmark_error_orphaned_count"
+    public static let bookmarksLastGoodVersion = "previous_app_version"
 
     // Remote messaging
     public static let message = "message"
diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index 37e48dcb73..d71eca1bc1 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -450,6 +450,7 @@ extension Pixel {
         case debugCantSaveBookmarkFix
 
         case debugCannotClearObservationsDatabase
+        case debugBookmarksLost
 
         // Return user measurement
         case debugReturnUserReadATB
@@ -877,6 +878,8 @@ extension Pixel.Event {
         case .dbRemoteMessagingDeleteScheduledMessageError: return "m_d_db_rm_delete_scheduled_message"
         case .dbLocalAuthenticationError: return "m_d_local_auth_error"
 
+        case .debugBookmarksLost: return "m_debug_bookmarks_lost"
+
         case .configurationFetchInfo: return "m_d_cfgfetch"
             
         case .trackerDataParseFailed: return "m_d_tds_p"
diff --git a/Core/UserDefaultsPropertyWrapper.swift b/Core/UserDefaultsPropertyWrapper.swift
index 47c17546f9..e1a4a4cd5b 100644
--- a/Core/UserDefaultsPropertyWrapper.swift
+++ b/Core/UserDefaultsPropertyWrapper.swift
@@ -106,6 +106,8 @@ public struct UserDefaultsWrapper<T> {
 
         case addressBarPosition = "com.duckduckgo.ios.addressbarposition"
         case showFullSiteAddress = "com.duckduckgo.ios.showfullsiteaddress"
+
+        case bookmarksLastGoodVersion = "com.duckduckgo.ios.bookmarksLastGoodVersion"
     }
 
     private let key: Key
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 41659805c7..7294b8de88 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -463,6 +463,7 @@
 		85C2970A247EB7AA0063A335 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85C29709247EB7AA0063A335 /* Text.xcassets */; };
 		85C2971A248162CA0063A335 /* DaxOnboardingPadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C29719248162CA0063A335 /* DaxOnboardingPadViewController.swift */; };
 		85C861E628FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C861E528FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift */; };
+		85C8E61D2B0E47380029A6BD /* BookmarksDatabaseSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C8E61C2B0E47380029A6BD /* BookmarksDatabaseSetup.swift */; };
 		85C91CA224671F4C00A11132 /* AppDeepLinkSchemes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F17D723B1E8BB374003E8B0E /* AppDeepLinkSchemes.swift */; };
 		85CA53A824BB343700A6288C /* Favicons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CA53A324B9F2BD00A6288C /* Favicons.swift */; };
 		85CA53AA24BB376800A6288C /* NotFoundCachingDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CA53A924BB376800A6288C /* NotFoundCachingDownloader.swift */; };
@@ -1486,6 +1487,7 @@
 		85C29709247EB7AA0063A335 /* Text.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Text.xcassets; sourceTree = "<group>"; };
 		85C29719248162CA0063A335 /* DaxOnboardingPadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxOnboardingPadViewController.swift; sourceTree = "<group>"; };
 		85C861E528FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewSectionRenderersExtension.swift; sourceTree = "<group>"; };
+		85C8E61C2B0E47380029A6BD /* BookmarksDatabaseSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksDatabaseSetup.swift; sourceTree = "<group>"; };
 		85CA53A324B9F2BD00A6288C /* Favicons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Favicons.swift; path = ../DuckDuckGo/Favicons.swift; sourceTree = "<group>"; };
 		85CA53A924BB376800A6288C /* NotFoundCachingDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotFoundCachingDownloader.swift; sourceTree = "<group>"; };
 		85CA53AB24BBD39300A6288C /* FaviconRequestModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconRequestModifier.swift; sourceTree = "<group>"; };
@@ -5108,6 +5110,7 @@
 				850250B220D803F4002199C7 /* AtbAndVariantCleanup.swift */,
 				983EABB7236198F6003948D1 /* DatabaseMigration.swift */,
 				853C5F6021C277C7001F7A05 /* global.swift */,
+				85C8E61C2B0E47380029A6BD /* BookmarksDatabaseSetup.swift */,
 			);
 			name = Application;
 			sourceTree = "<group>";
@@ -6431,6 +6434,7 @@
 				C17B595A2A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift in Sources */,
 				8531A08E1F9950E6000484F0 /* UnprotectedSitesViewController.swift in Sources */,
 				CBD4F13C279EBF4A00B20FD7 /* HomeMessage.swift in Sources */,
+				85C8E61D2B0E47380029A6BD /* BookmarksDatabaseSetup.swift in Sources */,
 				3132FA2C27A07A1B00DD7A12 /* FilePreview.swift in Sources */,
 				85C861E628FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift in Sources */,
 				F1D477C61F2126CC0031ED49 /* OmniBarState.swift in Sources */,
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index 3732a3fd5e..c9a218e182 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -116,17 +116,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         if testing {
             _ = DefaultUserAgentManager.shared
             Database.shared.loadStore { _, _ in }
-            bookmarksDatabase.loadStore { context, error in
-                guard let context = context else {
-                    fatalError("Error: \(error?.localizedDescription ?? "<unknown>")")
-                }
-                
-                let legacyStorage = LegacyBookmarksCoreDataStorage()
-                legacyStorage?.loadStoreAndCaches()
-                LegacyBookmarksStoreMigration.migrate(from: legacyStorage,
-                                                      to: context)
-                legacyStorage?.removeStore()
-            }
+            _ = BookmarksDatabaseSetup.loadStoreAndMigrate(bookmarksDatabase: bookmarksDatabase, crashOnLoadStoreError: true)
             window?.rootViewController = UIStoryboard.init(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
             return true
         }
@@ -166,48 +156,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         }
 
         var shouldResetBookmarksSyncTimestamp = false
-
-        bookmarksDatabase.loadStore { [weak self] context, error in
-            guard let context = context else {
-                if let error = error {
-                    Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase,
-                               error: error)
-                } else {
-                    Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase)
-                }
-
-                if shouldPresentInsufficientDiskSpaceAlertAndCrash {
-                    return
-                } else {
-                    Thread.sleep(forTimeInterval: 1)
-                    fatalError("Could not create Bookmarks database stack: \(error?.localizedDescription ?? "err")")
-                }
-            }
-            
-            let legacyStorage = LegacyBookmarksCoreDataStorage()
-            legacyStorage?.loadStoreAndCaches()
-            LegacyBookmarksStoreMigration.migrate(from: legacyStorage,
-                                                  to: context)
-            legacyStorage?.removeStore()
-
-            do {
-                BookmarkUtils.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile, in: context)
-                if context.hasChanges {
-                    try context.save(onErrorFire: .bookmarksMigrationCouldNotPrepareMultipleFavoriteFolders)
-                    if let syncDataProviders = self?.syncDataProviders {
-                        syncDataProviders.bookmarksAdapter.shouldResetBookmarksSyncTimestamp = true
-                    } else {
-                        shouldResetBookmarksSyncTimestamp = true
-                    }
-                }
-            } catch {
-                Thread.sleep(forTimeInterval: 1)
-                fatalError("Could not prepare Bookmarks DB structure")
-            }
-
-            WidgetCenter.shared.reloadAllTimelines()
+        if BookmarksDatabaseSetup.loadStoreAndMigrate(bookmarksDatabase: bookmarksDatabase,
+                                                      crashOnLoadStoreError: !shouldPresentInsufficientDiskSpaceAlertAndCrash) {
+            // MARK: post-Bookmarks migration logic
+            assertBookmarksMigrationHappensOnlyOnce()
+            shouldResetBookmarksSyncTimestamp = true
         }
 
+        WidgetCenter.shared.reloadAllTimelines()
+
 #if APP_TRACKING_PROTECTION
         appTrackingProtectionDatabase.loadStore { context, error in
             guard context != nil else {
@@ -328,6 +285,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         return true
     }
 
+    private func assertBookmarksMigrationHappensOnlyOnce() {
+        let key = UserDefaultsWrapper<Any>.Key.bookmarksLastGoodVersion.rawValue
+        if let lastGoodVersion = UserDefaults.standard.string(forKey: key) {
+            Pixel.fire(pixel: .debugBookmarksLost, withAdditionalParameters: [
+                PixelParameters.bookmarksLastGoodVersion: lastGoodVersion
+            ])
+            assertionFailure("Unexpected bookmarks migration")
+        } else {
+            UserDefaults.standard.setValue(AppVersion().versionNumber, forKey: key)
+        }
+    }
+
     private func presentPreemptiveCrashAlert() {
         Task { @MainActor in
             let alertController = CriticalAlerts.makePreemptiveCrashAlert()
diff --git a/DuckDuckGo/BookmarksDatabaseSetup.swift b/DuckDuckGo/BookmarksDatabaseSetup.swift
new file mode 100644
index 0000000000..675b24b7e2
--- /dev/null
+++ b/DuckDuckGo/BookmarksDatabaseSetup.swift
@@ -0,0 +1,79 @@
+//
+//  BookmarksDatabaseSetup.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+import CoreData
+import Core
+import Bookmarks
+import Persistence
+
+struct BookmarksDatabaseSetup {
+
+    static func loadStoreAndMigrate(bookmarksDatabase: CoreDataDatabase, crashOnLoadStoreError: Bool) -> Bool {
+        var migrationHappened = false
+        bookmarksDatabase.loadStore { context, error in
+            guard let context = assertContext(context, error: error, crashOnError: crashOnLoadStoreError) else { return }
+            self.migrateFromFirstVersionOfBookmarksCoreDataStorage(context)
+            migrationHappened = self.migrateToFormFactorSpecificFavorites(context)
+            // Add future bookmarks database migrations here and set boolean to result of whatever the last migration returns
+        }
+        return migrationHappened
+    }
+
+    private static func assertContext(_ context: NSManagedObjectContext?, error: Error?, crashOnError: Bool) -> NSManagedObjectContext? {
+        guard let context = context else {
+            if let error = error {
+                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase, error: error)
+            } else {
+                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase)
+            }
+
+            if !crashOnError {
+                return nil
+            } else {
+                Thread.sleep(forTimeInterval: 1)
+                fatalError("Could not create Bookmarks database stack: \(error?.localizedDescription ?? "err")")
+            }
+        }
+        return context
+    }
+
+    private static func migrateFromFirstVersionOfBookmarksCoreDataStorage(_ context: NSManagedObjectContext) {
+        let legacyStorage = LegacyBookmarksCoreDataStorage()
+        legacyStorage?.loadStoreAndCaches()
+        LegacyBookmarksStoreMigration.migrate(from: legacyStorage, to: context)
+        legacyStorage?.removeStore()
+    }
+
+    private static func migrateToFormFactorSpecificFavorites(_ context: NSManagedObjectContext) -> Bool {
+        var migrationHappened = false
+        do {
+            BookmarkUtils.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile, in: context)
+            if context.hasChanges {
+                migrationHappened = true
+                try context.save(onErrorFire: .bookmarksMigrationCouldNotPrepareMultipleFavoriteFolders)
+            }
+        } catch {
+            Thread.sleep(forTimeInterval: 1)
+            fatalError("Could not prepare Bookmarks DB structure")
+        }
+        return migrationHappened
+    }
+
+}

From d5fbba7218c267d1b8412764ae8b70df530da42c Mon Sep 17 00:00:00 2001
From: Chris Brind <brindy@duckduckgo.com>
Date: Wed, 22 Nov 2023 15:02:47 +0000
Subject: [PATCH 09/40] Revert "refactor bookmarks and fire pixel if migration
 happens more than once"

This reverts commit 0b5b4b889ccd8340b92a67ec9eed91a37d72fefa.
---
 Core/Pixel.swift                        |  1 -
 Core/PixelEvent.swift                   |  3 -
 Core/UserDefaultsPropertyWrapper.swift  |  2 -
 DuckDuckGo.xcodeproj/project.pbxproj    |  4 --
 DuckDuckGo/AppDelegate.swift            | 71 +++++++++++++++-------
 DuckDuckGo/BookmarksDatabaseSetup.swift | 79 -------------------------
 6 files changed, 51 insertions(+), 109 deletions(-)
 delete mode 100644 DuckDuckGo/BookmarksDatabaseSetup.swift

diff --git a/Core/Pixel.swift b/Core/Pixel.swift
index eefed5046e..d358707618 100644
--- a/Core/Pixel.swift
+++ b/Core/Pixel.swift
@@ -106,7 +106,6 @@ public struct PixelParameters {
     public static let emailKeychainKeychainOperation = "keychain_operation"
 
     public static let bookmarkErrorOrphanedFolderCount = "bookmark_error_orphaned_count"
-    public static let bookmarksLastGoodVersion = "previous_app_version"
 
     // Remote messaging
     public static let message = "message"
diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index d71eca1bc1..37e48dcb73 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -450,7 +450,6 @@ extension Pixel {
         case debugCantSaveBookmarkFix
 
         case debugCannotClearObservationsDatabase
-        case debugBookmarksLost
 
         // Return user measurement
         case debugReturnUserReadATB
@@ -878,8 +877,6 @@ extension Pixel.Event {
         case .dbRemoteMessagingDeleteScheduledMessageError: return "m_d_db_rm_delete_scheduled_message"
         case .dbLocalAuthenticationError: return "m_d_local_auth_error"
 
-        case .debugBookmarksLost: return "m_debug_bookmarks_lost"
-
         case .configurationFetchInfo: return "m_d_cfgfetch"
             
         case .trackerDataParseFailed: return "m_d_tds_p"
diff --git a/Core/UserDefaultsPropertyWrapper.swift b/Core/UserDefaultsPropertyWrapper.swift
index e1a4a4cd5b..47c17546f9 100644
--- a/Core/UserDefaultsPropertyWrapper.swift
+++ b/Core/UserDefaultsPropertyWrapper.swift
@@ -106,8 +106,6 @@ public struct UserDefaultsWrapper<T> {
 
         case addressBarPosition = "com.duckduckgo.ios.addressbarposition"
         case showFullSiteAddress = "com.duckduckgo.ios.showfullsiteaddress"
-
-        case bookmarksLastGoodVersion = "com.duckduckgo.ios.bookmarksLastGoodVersion"
     }
 
     private let key: Key
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 7294b8de88..41659805c7 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -463,7 +463,6 @@
 		85C2970A247EB7AA0063A335 /* Text.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85C29709247EB7AA0063A335 /* Text.xcassets */; };
 		85C2971A248162CA0063A335 /* DaxOnboardingPadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C29719248162CA0063A335 /* DaxOnboardingPadViewController.swift */; };
 		85C861E628FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C861E528FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift */; };
-		85C8E61D2B0E47380029A6BD /* BookmarksDatabaseSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C8E61C2B0E47380029A6BD /* BookmarksDatabaseSetup.swift */; };
 		85C91CA224671F4C00A11132 /* AppDeepLinkSchemes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F17D723B1E8BB374003E8B0E /* AppDeepLinkSchemes.swift */; };
 		85CA53A824BB343700A6288C /* Favicons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CA53A324B9F2BD00A6288C /* Favicons.swift */; };
 		85CA53AA24BB376800A6288C /* NotFoundCachingDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CA53A924BB376800A6288C /* NotFoundCachingDownloader.swift */; };
@@ -1487,7 +1486,6 @@
 		85C29709247EB7AA0063A335 /* Text.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Text.xcassets; sourceTree = "<group>"; };
 		85C29719248162CA0063A335 /* DaxOnboardingPadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxOnboardingPadViewController.swift; sourceTree = "<group>"; };
 		85C861E528FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewSectionRenderersExtension.swift; sourceTree = "<group>"; };
-		85C8E61C2B0E47380029A6BD /* BookmarksDatabaseSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksDatabaseSetup.swift; sourceTree = "<group>"; };
 		85CA53A324B9F2BD00A6288C /* Favicons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Favicons.swift; path = ../DuckDuckGo/Favicons.swift; sourceTree = "<group>"; };
 		85CA53A924BB376800A6288C /* NotFoundCachingDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotFoundCachingDownloader.swift; sourceTree = "<group>"; };
 		85CA53AB24BBD39300A6288C /* FaviconRequestModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconRequestModifier.swift; sourceTree = "<group>"; };
@@ -5110,7 +5108,6 @@
 				850250B220D803F4002199C7 /* AtbAndVariantCleanup.swift */,
 				983EABB7236198F6003948D1 /* DatabaseMigration.swift */,
 				853C5F6021C277C7001F7A05 /* global.swift */,
-				85C8E61C2B0E47380029A6BD /* BookmarksDatabaseSetup.swift */,
 			);
 			name = Application;
 			sourceTree = "<group>";
@@ -6434,7 +6431,6 @@
 				C17B595A2A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift in Sources */,
 				8531A08E1F9950E6000484F0 /* UnprotectedSitesViewController.swift in Sources */,
 				CBD4F13C279EBF4A00B20FD7 /* HomeMessage.swift in Sources */,
-				85C8E61D2B0E47380029A6BD /* BookmarksDatabaseSetup.swift in Sources */,
 				3132FA2C27A07A1B00DD7A12 /* FilePreview.swift in Sources */,
 				85C861E628FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift in Sources */,
 				F1D477C61F2126CC0031ED49 /* OmniBarState.swift in Sources */,
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index c9a218e182..3732a3fd5e 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -116,7 +116,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         if testing {
             _ = DefaultUserAgentManager.shared
             Database.shared.loadStore { _, _ in }
-            _ = BookmarksDatabaseSetup.loadStoreAndMigrate(bookmarksDatabase: bookmarksDatabase, crashOnLoadStoreError: true)
+            bookmarksDatabase.loadStore { context, error in
+                guard let context = context else {
+                    fatalError("Error: \(error?.localizedDescription ?? "<unknown>")")
+                }
+                
+                let legacyStorage = LegacyBookmarksCoreDataStorage()
+                legacyStorage?.loadStoreAndCaches()
+                LegacyBookmarksStoreMigration.migrate(from: legacyStorage,
+                                                      to: context)
+                legacyStorage?.removeStore()
+            }
             window?.rootViewController = UIStoryboard.init(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
             return true
         }
@@ -156,14 +166,47 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         }
 
         var shouldResetBookmarksSyncTimestamp = false
-        if BookmarksDatabaseSetup.loadStoreAndMigrate(bookmarksDatabase: bookmarksDatabase,
-                                                      crashOnLoadStoreError: !shouldPresentInsufficientDiskSpaceAlertAndCrash) {
-            // MARK: post-Bookmarks migration logic
-            assertBookmarksMigrationHappensOnlyOnce()
-            shouldResetBookmarksSyncTimestamp = true
-        }
 
-        WidgetCenter.shared.reloadAllTimelines()
+        bookmarksDatabase.loadStore { [weak self] context, error in
+            guard let context = context else {
+                if let error = error {
+                    Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase,
+                               error: error)
+                } else {
+                    Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase)
+                }
+
+                if shouldPresentInsufficientDiskSpaceAlertAndCrash {
+                    return
+                } else {
+                    Thread.sleep(forTimeInterval: 1)
+                    fatalError("Could not create Bookmarks database stack: \(error?.localizedDescription ?? "err")")
+                }
+            }
+            
+            let legacyStorage = LegacyBookmarksCoreDataStorage()
+            legacyStorage?.loadStoreAndCaches()
+            LegacyBookmarksStoreMigration.migrate(from: legacyStorage,
+                                                  to: context)
+            legacyStorage?.removeStore()
+
+            do {
+                BookmarkUtils.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile, in: context)
+                if context.hasChanges {
+                    try context.save(onErrorFire: .bookmarksMigrationCouldNotPrepareMultipleFavoriteFolders)
+                    if let syncDataProviders = self?.syncDataProviders {
+                        syncDataProviders.bookmarksAdapter.shouldResetBookmarksSyncTimestamp = true
+                    } else {
+                        shouldResetBookmarksSyncTimestamp = true
+                    }
+                }
+            } catch {
+                Thread.sleep(forTimeInterval: 1)
+                fatalError("Could not prepare Bookmarks DB structure")
+            }
+
+            WidgetCenter.shared.reloadAllTimelines()
+        }
 
 #if APP_TRACKING_PROTECTION
         appTrackingProtectionDatabase.loadStore { context, error in
@@ -285,18 +328,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         return true
     }
 
-    private func assertBookmarksMigrationHappensOnlyOnce() {
-        let key = UserDefaultsWrapper<Any>.Key.bookmarksLastGoodVersion.rawValue
-        if let lastGoodVersion = UserDefaults.standard.string(forKey: key) {
-            Pixel.fire(pixel: .debugBookmarksLost, withAdditionalParameters: [
-                PixelParameters.bookmarksLastGoodVersion: lastGoodVersion
-            ])
-            assertionFailure("Unexpected bookmarks migration")
-        } else {
-            UserDefaults.standard.setValue(AppVersion().versionNumber, forKey: key)
-        }
-    }
-
     private func presentPreemptiveCrashAlert() {
         Task { @MainActor in
             let alertController = CriticalAlerts.makePreemptiveCrashAlert()
diff --git a/DuckDuckGo/BookmarksDatabaseSetup.swift b/DuckDuckGo/BookmarksDatabaseSetup.swift
deleted file mode 100644
index 675b24b7e2..0000000000
--- a/DuckDuckGo/BookmarksDatabaseSetup.swift
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-//  BookmarksDatabaseSetup.swift
-//  DuckDuckGo
-//
-//  Copyright © 2023 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import Foundation
-import CoreData
-import Core
-import Bookmarks
-import Persistence
-
-struct BookmarksDatabaseSetup {
-
-    static func loadStoreAndMigrate(bookmarksDatabase: CoreDataDatabase, crashOnLoadStoreError: Bool) -> Bool {
-        var migrationHappened = false
-        bookmarksDatabase.loadStore { context, error in
-            guard let context = assertContext(context, error: error, crashOnError: crashOnLoadStoreError) else { return }
-            self.migrateFromFirstVersionOfBookmarksCoreDataStorage(context)
-            migrationHappened = self.migrateToFormFactorSpecificFavorites(context)
-            // Add future bookmarks database migrations here and set boolean to result of whatever the last migration returns
-        }
-        return migrationHappened
-    }
-
-    private static func assertContext(_ context: NSManagedObjectContext?, error: Error?, crashOnError: Bool) -> NSManagedObjectContext? {
-        guard let context = context else {
-            if let error = error {
-                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase, error: error)
-            } else {
-                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase)
-            }
-
-            if !crashOnError {
-                return nil
-            } else {
-                Thread.sleep(forTimeInterval: 1)
-                fatalError("Could not create Bookmarks database stack: \(error?.localizedDescription ?? "err")")
-            }
-        }
-        return context
-    }
-
-    private static func migrateFromFirstVersionOfBookmarksCoreDataStorage(_ context: NSManagedObjectContext) {
-        let legacyStorage = LegacyBookmarksCoreDataStorage()
-        legacyStorage?.loadStoreAndCaches()
-        LegacyBookmarksStoreMigration.migrate(from: legacyStorage, to: context)
-        legacyStorage?.removeStore()
-    }
-
-    private static func migrateToFormFactorSpecificFavorites(_ context: NSManagedObjectContext) -> Bool {
-        var migrationHappened = false
-        do {
-            BookmarkUtils.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile, in: context)
-            if context.hasChanges {
-                migrationHappened = true
-                try context.save(onErrorFire: .bookmarksMigrationCouldNotPrepareMultipleFavoriteFolders)
-            }
-        } catch {
-            Thread.sleep(forTimeInterval: 1)
-            fatalError("Could not prepare Bookmarks DB structure")
-        }
-        return migrationHappened
-    }
-
-}

From af8dc3a1fc758cf3bd8a1828a8ed7fb275fd74cd Mon Sep 17 00:00:00 2001
From: Shane Osbourne <shane.osbourne8@gmail.com>
Date: Wed, 22 Nov 2023 22:18:38 +0000
Subject: [PATCH 10/40] bump C-S-S to 4.52.0 (#2186)

Co-authored-by: Shane Osbourne <sosbourne@duckduckgo.com>
---
 DuckDuckGo.xcodeproj/project.pbxproj                   |  2 +-
 .../xcshareddata/swiftpm/Package.resolved              | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 6e9a784388..811892cf8d 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9143,7 +9143,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 84.1.1;
+				version = 84.2.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index a9e3205a3a..802a39a398 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "b97c451037f7a24aef6389be8252df301d2294cd",
-          "version": "84.1.1"
+          "revision": "af63158c03de7a47fb9e2cbcd97fbd28a64ab1fd",
+          "version": "84.2.0"
         }
       },
       {
@@ -33,8 +33,8 @@
         "repositoryURL": "https://github.com/duckduckgo/content-scope-scripts",
         "state": {
           "branch": null,
-          "revision": "254b23cf292140498650421bb31fd05740f4579b",
-          "version": "4.40.0"
+          "revision": "b7ad9843e70cede0c2ca9c4260d970f62cb28156",
+          "version": "4.52.0"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",

From e5d8fde1578588f1e0b21c6058f6ae4a7d98d769 Mon Sep 17 00:00:00 2001
From: Federico Cappelli <fcappelli@duckduckgo.com>
Date: Thu, 23 Nov 2023 10:45:30 +0000
Subject: [PATCH 11/40] Breakage report improvements (#2168)

Task/Issue URL: https://app.asana.com/0/1205842942115003/1205692741026215/f
Tech Design URL: https://app.asana.com/0/1205842942115003/1205917507991804/f

**Description**:
This PR introduces a new version of BSK (PR: https://github.com/duckduckgo/BrowserServicesKit/pull/566) that allows iOS and macOS to share the same web implementation of the `ReportBrokenSite` page and introduce improvements to Pixels and the broken site report data.

Additional changes
- The old native `Report broken site` page has been removed
- Added 2 new Pixels https://app.asana.com/0/1205842942115003/1205859726054342/f
- Removed legacy PrivacyDashboard.storyboard localised strings
---
 .gitignore                                    |   1 +
 Core/PixelEvent.swift                         |  13 +-
 DuckDuckGo.xcodeproj/project.pbxproj          |  94 ++---------
 .../xcshareddata/swiftpm/Package.resolved     |  10 +-
 .../xcschemes/DuckDuckGo.xcscheme             |   9 +-
 .../ActionSheetDaxDialogViewController.swift  |   2 +-
 DuckDuckGo/Base.lproj/Feedback.storyboard     |  63 ++------
 DuckDuckGo/Base.lproj/Settings.storyboard     |  14 +-
 DuckDuckGo/BrokenSiteCategories.swift         |  63 --------
 DuckDuckGo/MainViewController+Segues.swift    |  31 +++-
 DuckDuckGo/MainViewController.swift           |   6 +-
 .../Base.lproj/PrivacyDashboard.storyboard    |  13 +-
 .../PrivacyDashboard/BrokenSiteInfo.swift     | 130 +++++++++++++++
 .../PrivacyDashboardViewController.swift      |  93 +++++++----
 DuckDuckGo/ReportBrokenSiteView.swift         | 150 ------------------
 .../ReportBrokenSiteViewController.swift      |  79 ---------
 ...cSettingsViewController+SyncDelegate.swift |   4 +-
 DuckDuckGo/TabDelegate.swift                  |   1 -
 DuckDuckGo/TabViewController.swift            |  10 +-
 DuckDuckGo/UserText.swift                     |  18 ---
 DuckDuckGo/WebContainerViewController.swift   |   2 +-
 DuckDuckGo/bg.lproj/Feedback.strings          |   6 -
 DuckDuckGo/bg.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/bg.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/bg.lproj/Settings.strings          |  13 +-
 DuckDuckGo/cs.lproj/Feedback.strings          |   6 -
 DuckDuckGo/cs.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/cs.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/cs.lproj/Settings.strings          |  13 +-
 DuckDuckGo/da.lproj/Feedback.strings          |   6 -
 DuckDuckGo/da.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/da.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/da.lproj/Settings.strings          |  13 +-
 DuckDuckGo/de.lproj/Feedback.strings          |   6 -
 DuckDuckGo/de.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/de.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/de.lproj/Settings.strings          |  13 +-
 DuckDuckGo/el.lproj/Feedback.strings          |   6 -
 DuckDuckGo/el.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/el.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/el.lproj/Settings.strings          |  13 +-
 DuckDuckGo/en.lproj/Localizable.strings       |  45 ------
 DuckDuckGo/es.lproj/Feedback.strings          |   6 -
 DuckDuckGo/es.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/es.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/es.lproj/Settings.strings          |  13 +-
 DuckDuckGo/et.lproj/Feedback.strings          |   6 -
 DuckDuckGo/et.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/et.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/et.lproj/Settings.strings          |  13 +-
 DuckDuckGo/fi.lproj/Feedback.strings          |   6 -
 DuckDuckGo/fi.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/fi.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/fi.lproj/Settings.strings          |  13 +-
 DuckDuckGo/fr.lproj/Feedback.strings          |   6 -
 DuckDuckGo/fr.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/fr.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/fr.lproj/Settings.strings          |  13 +-
 DuckDuckGo/hr.lproj/Feedback.strings          |   6 -
 DuckDuckGo/hr.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/hr.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/hr.lproj/Settings.strings          |  13 +-
 DuckDuckGo/hu.lproj/Feedback.strings          |   6 -
 DuckDuckGo/hu.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/hu.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/hu.lproj/Settings.strings          |  13 +-
 DuckDuckGo/it.lproj/Feedback.strings          |   6 -
 DuckDuckGo/it.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/it.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/it.lproj/Settings.strings          |  13 +-
 DuckDuckGo/lt.lproj/Feedback.strings          |   6 -
 DuckDuckGo/lt.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/lt.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/lt.lproj/Settings.strings          |  13 +-
 DuckDuckGo/lv.lproj/Feedback.strings          |   6 -
 DuckDuckGo/lv.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/lv.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/lv.lproj/Settings.strings          |  13 +-
 DuckDuckGo/nb.lproj/Feedback.strings          |   6 -
 DuckDuckGo/nb.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/nb.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/nb.lproj/Settings.strings          |  13 +-
 DuckDuckGo/nl.lproj/Feedback.strings          |   6 -
 DuckDuckGo/nl.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/nl.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/nl.lproj/Settings.strings          |  13 +-
 DuckDuckGo/pl.lproj/Feedback.strings          |   6 -
 DuckDuckGo/pl.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/pl.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/pl.lproj/Settings.strings          |  13 +-
 DuckDuckGo/pt.lproj/Feedback.strings          |   6 -
 DuckDuckGo/pt.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/pt.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/pt.lproj/Settings.strings          |  13 +-
 DuckDuckGo/ro.lproj/Feedback.strings          |   6 -
 DuckDuckGo/ro.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/ro.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/ro.lproj/Settings.strings          |  13 +-
 DuckDuckGo/ru.lproj/Feedback.strings          |   6 -
 DuckDuckGo/ru.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/ru.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/ru.lproj/Settings.strings          |  13 +-
 DuckDuckGo/sk.lproj/Feedback.strings          |   6 -
 DuckDuckGo/sk.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/sk.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/sk.lproj/Settings.strings          |  13 +-
 DuckDuckGo/sl.lproj/Feedback.strings          |   6 -
 DuckDuckGo/sl.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/sl.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/sl.lproj/Settings.strings          |  13 +-
 DuckDuckGo/sv.lproj/Feedback.strings          |   6 -
 DuckDuckGo/sv.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/sv.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/sv.lproj/Settings.strings          |  13 +-
 DuckDuckGo/tr.lproj/Feedback.strings          |   6 -
 DuckDuckGo/tr.lproj/Localizable.strings       | 132 +++++++++------
 DuckDuckGo/tr.lproj/PrivacyDashboard.strings  | 129 ---------------
 DuckDuckGo/tr.lproj/Settings.strings          |  13 +-
 .../BrokenSiteReportingTests.swift            |   6 +-
 Widgets/bg.lproj/Localizable.strings          |  15 ++
 Widgets/cs.lproj/Localizable.strings          |  15 ++
 Widgets/da.lproj/Localizable.strings          |  15 ++
 Widgets/de.lproj/Localizable.strings          |  15 ++
 Widgets/el.lproj/Localizable.strings          |  15 ++
 Widgets/es.lproj/Localizable.strings          |  15 ++
 Widgets/et.lproj/Localizable.strings          |  15 ++
 Widgets/fi.lproj/Localizable.strings          |  15 ++
 Widgets/fr.lproj/Localizable.strings          |  15 ++
 Widgets/hr.lproj/Localizable.strings          |  15 ++
 Widgets/hu.lproj/Localizable.strings          |  15 ++
 Widgets/it.lproj/Localizable.strings          |  15 ++
 Widgets/lt.lproj/Localizable.strings          |  15 ++
 Widgets/lv.lproj/Localizable.strings          |  15 ++
 Widgets/nb.lproj/Localizable.strings          |  15 ++
 Widgets/nl.lproj/Localizable.strings          |  15 ++
 Widgets/pl.lproj/Localizable.strings          |  15 ++
 Widgets/pt.lproj/Localizable.strings          |  15 ++
 Widgets/ro.lproj/Localizable.strings          |  15 ++
 Widgets/ru.lproj/Localizable.strings          |  15 ++
 Widgets/sk.lproj/Localizable.strings          |  15 ++
 Widgets/sl.lproj/Localizable.strings          |  15 ++
 Widgets/sv.lproj/Localizable.strings          |  15 ++
 Widgets/tr.lproj/Localizable.strings          |  15 ++
 143 files changed, 2781 insertions(+), 5156 deletions(-)
 delete mode 100644 DuckDuckGo/BrokenSiteCategories.swift
 rename DuckDuckGo/{ => PrivacyDashboard}/Base.lproj/PrivacyDashboard.storyboard (84%)
 create mode 100644 DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift
 rename DuckDuckGo/{ => PrivacyDashboard}/PrivacyDashboardViewController.swift (63%)
 delete mode 100644 DuckDuckGo/ReportBrokenSiteView.swift
 delete mode 100644 DuckDuckGo/ReportBrokenSiteViewController.swift
 delete mode 100644 DuckDuckGo/bg.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/cs.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/da.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/de.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/el.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/es.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/et.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/fi.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/fr.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/hr.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/hu.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/it.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/lt.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/lv.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/nb.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/nl.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/pl.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/pt.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/ro.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/ru.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/sk.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/sl.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/sv.lproj/PrivacyDashboard.strings
 delete mode 100644 DuckDuckGo/tr.lproj/PrivacyDashboard.strings

diff --git a/.gitignore b/.gitignore
index f723942232..07ebc5f934 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,3 +73,4 @@ fastlane/test_output
 # DuckDuckGo
 
 Configuration/ExternalDeveloper.xcconfig
+scripts/assets
diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index 37e48dcb73..12a0824b50 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -37,8 +37,10 @@ extension Pixel {
         case forgetAllDataCleared
         
         case privacyDashboardOpened
-        case privacyDashboardProtectionDisabled
-        case privacyDashboardProtectionEnabled
+        
+        case dashboardProtectionAllowlistAdd
+        case dashboardProtectionAllowlistRemove
+        
         case privacyDashboardReportBrokenSite
         case privacyDashboardPixelFromJS(rawPixel: String)
         
@@ -533,9 +535,10 @@ extension Pixel.Event {
         case .forgetAllDataCleared: return "mf_dc"
             
         case .privacyDashboardOpened: return "mp"
-
-        case .privacyDashboardProtectionDisabled: return "mp_wla"
-        case .privacyDashboardProtectionEnabled: return "mp_wlr"
+           
+        case .dashboardProtectionAllowlistAdd: return "mp_wla"
+        case .dashboardProtectionAllowlistRemove: return "mp_wlr"
+            
         case .privacyDashboardReportBrokenSite: return "mp_rb"
         case .privacyDashboardPixelFromJS(let rawPixel): return rawPixel
             
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 811892cf8d..fe4d605d97 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -297,7 +297,6 @@
 		4BB7CBB02AF59C310014A35F /* VPNWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */; };
 		4BBBBA872B02E85400D965DA /* DesignResourcesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 4BBBBA862B02E85400D965DA /* DesignResourcesKit */; };
 		4BC21A2F27238B7500229F0E /* RunLoopExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC21A2C272388BD00229F0E /* RunLoopExtensionTests.swift */; };
-		4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */; };
 		4BE2756827304F57006B20B0 /* URLRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE27566272F878F006B20B0 /* URLRequestExtension.swift */; };
 		4BEF65692989C2FC00B650CB /* AdapterSocketEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D307A2989C0C400918636 /* AdapterSocketEvent.swift */; };
 		4BEF656A2989C2FC00B650CB /* ProxyServerEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D307C2989C0C600918636 /* ProxyServerEvent.swift */; };
@@ -550,8 +549,6 @@
 		986B16C425E92DF0007D23E8 /* BrowsingMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B16C225E92DF0007D23E8 /* BrowsingMenuViewController.swift */; };
 		986B45CB299D5EF50089D2D7 /* BookmarksLookupPerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B45CA299D5EF50089D2D7 /* BookmarksLookupPerformanceTests.swift */; };
 		986B45D0299E30A50089D2D7 /* BookmarkEntityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B45CF299E30A50089D2D7 /* BookmarkEntityTests.swift */; };
-		986C7FA724171C6000A3557D /* BrokenSiteCategories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986C7FA624171C6000A3557D /* BrokenSiteCategories.swift */; };
-		986C7FA92417ADE700A3557D /* ReportBrokenSiteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986C7FA82417ADE700A3557D /* ReportBrokenSiteViewController.swift */; };
 		986DA94A24884B18004A7E39 /* WebViewTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986DA94924884B18004A7E39 /* WebViewTransition.swift */; };
 		987130C4294AAB9F00AB05E0 /* FavoriteListViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 987130BE294AAB9E00AB05E0 /* FavoriteListViewModelTests.swift */; };
 		987130C5294AAB9F00AB05E0 /* BookmarkEditorViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 987130BF294AAB9E00AB05E0 /* BookmarkEditorViewModelTests.swift */; };
@@ -1317,7 +1314,6 @@
 		4B83397429AFBCE6003F7EA9 /* AppTrackingProtectionFeedbackModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionFeedbackModelTests.swift; sourceTree = "<group>"; };
 		4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNWidget.swift; sourceTree = "<group>"; };
 		4BC21A2C272388BD00229F0E /* RunLoopExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunLoopExtensionTests.swift; sourceTree = "<group>"; };
-		4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportBrokenSiteView.swift; sourceTree = "<group>"; };
 		4BE27566272F878F006B20B0 /* URLRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = URLRequestExtension.swift; path = ../DuckDuckGo/URLRequestExtension.swift; sourceTree = "<group>"; };
 		4BFB911A29B7D9530014D4B7 /* AppTrackingProtectionStoringModelPerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionStoringModelPerformanceTests.swift; sourceTree = "<group>"; };
 		56244C1C2A137B1900EDF259 /* WaitlistViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistViews.swift; sourceTree = "<group>"; };
@@ -1552,7 +1548,6 @@
 		981685462521EEF000FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Home.strings; sourceTree = "<group>"; };
 		981685482521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		981685492521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9816854A2521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9816854C2521EEF200FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Settings.strings; sourceTree = "<group>"; };
 		9816854D2521EEF300FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Tab.strings; sourceTree = "<group>"; };
 		9816854E2521EEF300FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1655,7 +1650,6 @@
 		9866DB8E251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DB90251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DB91251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DB92251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DB94251CA8F500612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DB95251CA8F500612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DB96251CA8F500612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1673,7 +1667,6 @@
 		9866DBA5251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBA7251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBA8251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DBA9251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBAB251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBAC251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBAD251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1691,7 +1684,6 @@
 		9866DBBC251CA92A00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBBE251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBBF251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DBC0251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBC2251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBC3251CA92C00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBC4251CA92C00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1709,7 +1701,6 @@
 		9866DBD3251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBD5251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBD6251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DBD7251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBD9251CA93A00612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBDA251CA93A00612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBDB251CA93A00612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1727,7 +1718,6 @@
 		9866DBEA251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBEC251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBED251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DBEE251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBF0251CA95000612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBF1251CA95000612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBF2251CA95000612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1745,7 +1735,6 @@
 		9866DC01251CA96200612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC03251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC04251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC05251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC07251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC08251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC09251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1763,7 +1752,6 @@
 		9866DC18251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC1A251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC1B251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC1C251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC1E251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC1F251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC20251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1781,7 +1769,6 @@
 		9866DC2F251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC31251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC32251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC33251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC35251CA9B100612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC36251CA9B100612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC37251CA9B100612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1799,7 +1786,6 @@
 		9866DC46251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC48251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC49251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC4A251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC4C251CA9C100612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC4D251CA9C100612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC4E251CA9C100612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1817,7 +1803,6 @@
 		9866DC5D251CA9CE00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC5F251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC60251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC61251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC63251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC64251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC65251CA9D000612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1835,7 +1820,6 @@
 		9866DC74251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC76251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC77251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC78251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC7A251CA9E400612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC7B251CA9E400612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC7C251CA9E400612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1853,7 +1837,6 @@
 		9866DC8B251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC8D251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC8E251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DC8F251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC91251CA9F600612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC92251CA9F600612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC93251CA9F600612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1871,7 +1854,6 @@
 		9866DCA2251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCA4251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCA5251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DCA6251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCA8251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCA9251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCAA251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1889,7 +1871,6 @@
 		9866DCB9251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCBB251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCBC251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DCBD251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCBF251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCC0251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCC1251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1907,7 +1888,6 @@
 		9866DCD0251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCD2251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCD3251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DCD4251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCD6251CAA3500612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCD7251CAA3500612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCD8251CAA3500612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1925,7 +1905,6 @@
 		9866DCE7251CAA4800612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCE9251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCEA251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DCEB251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCED251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCEE251CAA4A00612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCEF251CAA4A00612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1979,13 +1958,6 @@
 		9866DD8E251CB12D00612E3A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Authentication.strings; sourceTree = "<group>"; };
 		9866DD90251CB12E00612E3A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Authentication.strings; sourceTree = "<group>"; };
 		9866DD92251CB12E00612E3A /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Authentication.strings; sourceTree = "<group>"; };
-		9866DD9C251CB14600612E3A /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
-		9866DD9E251CB17A00612E3A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
-		9866DDA2251CB1C000612E3A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
-		9866DDA4251CB1F500612E3A /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
-		9866DDA6251CB24F00612E3A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
-		9866DDA8251CB41000612E3A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
-		9866DDAA251CB4F500612E3A /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DDAC251CB58400612E3A /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DDAE251CB5B400612E3A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DDB2251CB62500612E3A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Settings.strings; sourceTree = "<group>"; };
@@ -2059,8 +2031,6 @@
 		986B16C225E92DF0007D23E8 /* BrowsingMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsingMenuViewController.swift; sourceTree = "<group>"; };
 		986B45CA299D5EF50089D2D7 /* BookmarksLookupPerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksLookupPerformanceTests.swift; sourceTree = "<group>"; };
 		986B45CF299E30A50089D2D7 /* BookmarkEntityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkEntityTests.swift; sourceTree = "<group>"; };
-		986C7FA624171C6000A3557D /* BrokenSiteCategories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrokenSiteCategories.swift; sourceTree = "<group>"; };
-		986C7FA82417ADE700A3557D /* ReportBrokenSiteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportBrokenSiteViewController.swift; sourceTree = "<group>"; };
 		986DA94924884B18004A7E39 /* WebViewTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewTransition.swift; sourceTree = "<group>"; };
 		987130BE294AAB9E00AB05E0 /* FavoriteListViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FavoriteListViewModelTests.swift; sourceTree = "<group>"; };
 		987130BF294AAB9E00AB05E0 /* BookmarkEditorViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkEditorViewModelTests.swift; sourceTree = "<group>"; };
@@ -3108,15 +3078,6 @@
 			name = PrivacyIconAndTrackers;
 			sourceTree = "<group>";
 		};
-		1E87615728A1515400C7C5CE /* PrivacyDashboard */ = {
-			isa = PBXGroup;
-			children = (
-				1E87615828A1517200C7C5CE /* PrivacyDashboardViewController.swift */,
-				984147B924F0268D00362052 /* PrivacyDashboard.storyboard */,
-			);
-			name = PrivacyDashboard;
-			sourceTree = "<group>";
-		};
 		1E8AD1C527BE45F800ABA377 /* DownloadsList */ = {
 			isa = PBXGroup;
 			children = (
@@ -3568,18 +3529,14 @@
 		83D4A73820E2454D003A7A6D /* UI */ = {
 			isa = PBXGroup;
 			children = (
-				98DA6B3222243CC3006EA9EB /* Feedback.xcassets */,
 				984147B024F0261A00362052 /* Feedback.storyboard */,
-				9888F77A2224980500C46159 /* FeedbackViewController.swift */,
-				9838059E2228208E00385F1A /* PositiveFeedbackViewController.swift */,
+				98DA6B3222243CC3006EA9EB /* Feedback.xcassets */,
 				984D60B1222A1284003B9E3B /* FeedbackFormViewController.swift */,
-				982E562F222C3D5B008D861B /* FeedbackPickerViewController.swift */,
 				980891A42237D4F500313A70 /* FeedbackNavigator.swift */,
+				982E562F222C3D5B008D861B /* FeedbackPickerViewController.swift */,
 				980891A62237D5D800313A70 /* FeedbackPresenter.swift */,
-				986C7FA624171C6000A3557D /* BrokenSiteCategories.swift */,
-				4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */,
-				986C7FA82417ADE700A3557D /* ReportBrokenSiteViewController.swift */,
-				98728E812417E3300033960E /* BrokenSiteInfo.swift */,
+				9888F77A2224980500C46159 /* FeedbackViewController.swift */,
+				9838059E2228208E00385F1A /* PositiveFeedbackViewController.swift */,
 			);
 			name = UI;
 			sourceTree = "<group>";
@@ -3675,7 +3632,7 @@
 				85AE668C20971FCA0014CF04 /* Notifications */,
 				F1C4A70C1E5771F800A6CA1B /* OmniBar */,
 				F1AE54DB1F0425BB00D9A700 /* Privacy */,
-				1E87615728A1515400C7C5CE /* PrivacyDashboard */,
+				F1DF09502B039E6E008CC908 /* PrivacyDashboard */,
 				02ECEC602A965074009F0654 /* PrivacyInfo.xcprivacy */,
 				C1B7B51D28941F160098FD6A /* RemoteMessaging */,
 				F1AB2B401E3F75A000868554 /* Settings */,
@@ -5221,6 +5178,16 @@
 			name = UserInterface;
 			sourceTree = "<group>";
 		};
+		F1DF09502B039E6E008CC908 /* PrivacyDashboard */ = {
+			isa = PBXGroup;
+			children = (
+				98728E812417E3300033960E /* BrokenSiteInfo.swift */,
+				1E87615828A1517200C7C5CE /* PrivacyDashboardViewController.swift */,
+				984147B924F0268D00362052 /* PrivacyDashboard.storyboard */,
+			);
+			path = PrivacyDashboard;
+			sourceTree = "<group>";
+		};
 		F1E092B31E92A6B900732CCC /* Core */ = {
 			isa = PBXGroup;
 			children = (
@@ -6041,7 +6008,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "./lint.sh\n";
+			shellScript = "./lint.sh --strict\n";
 		};
 		98B0CE69251C937D003FB601 /* Update Localizable.strings */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -6283,7 +6250,6 @@
 				31A42566285A0A6300049386 /* FaviconViewModel.swift in Sources */,
 				8C4838B5221C8F7F008A6739 /* GestureToolbarButton.swift in Sources */,
 				EE276BEA2A77F823009167B6 /* NetworkProtectionRootViewController.swift in Sources */,
-				986C7FA92417ADE700A3557D /* ReportBrokenSiteViewController.swift in Sources */,
 				310ECFDD282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift in Sources */,
 				1E908BF329827C480008C8F3 /* AutoconsentManagement.swift in Sources */,
 				CB9B8739278C8E72001F4906 /* WidgetEducationViewController.swift in Sources */,
@@ -6310,7 +6276,6 @@
 				4B6484F327FD1E350050A7A1 /* MenuControllerView.swift in Sources */,
 				1EE7C299294227EC0026C8CB /* AutoconsentSettingsViewController.swift in Sources */,
 				1E8AD1D527C2E22900ABA377 /* DownloadsListSectionViewModel.swift in Sources */,
-				4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */,
 				31584616281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift in Sources */,
 				C1F341C72A6924100032057B /* EmailAddressPromptViewModel.swift in Sources */,
 				F47E53D9250A97330037C686 /* OnboardingDefaultBroswerViewController.swift in Sources */,
@@ -6408,7 +6373,6 @@
 				027F487A2A4B66CD001A1C6C /* AppTPFAQViewModel.swift in Sources */,
 				F1E90C201E678E7C005E7E21 /* HomeControllerDelegate.swift in Sources */,
 				F17922DE1E7192E6006E3D97 /* SuggestionTableViewCell.swift in Sources */,
-				986C7FA724171C6000A3557D /* BrokenSiteCategories.swift in Sources */,
 				85DB12ED2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift in Sources */,
 				98DA6ECA2181E41F00E65433 /* ThemeManager.swift in Sources */,
 				C159DF072A430B60007834BB /* EmailSignupViewController.swift in Sources */,
@@ -7250,30 +7214,6 @@
 			isa = PBXVariantGroup;
 			children = (
 				984147B824F0268D00362052 /* Base */,
-				9866DB92251CA8F400612E3A /* bg */,
-				9866DBA9251CA91800612E3A /* hr */,
-				9866DBC0251CA92B00612E3A /* cs */,
-				9866DBD7251CA93900612E3A /* da */,
-				9866DBEE251CA94F00612E3A /* nl */,
-				9866DC05251CA96300612E3A /* et */,
-				9866DC1C251CA99C00612E3A /* de */,
-				9866DC33251CA9B000612E3A /* el */,
-				9866DC4A251CA9C000612E3A /* hu */,
-				9866DC61251CA9CF00612E3A /* it */,
-				9866DC78251CA9E300612E3A /* lv */,
-				9866DC8F251CA9F500612E3A /* lt */,
-				9866DCA6251CAA0600612E3A /* pl */,
-				9866DCBD251CAA2700612E3A /* ro */,
-				9866DCD4251CAA3400612E3A /* sk */,
-				9866DCEB251CAA4900612E3A /* sl */,
-				9866DD9C251CB14600612E3A /* fi */,
-				9866DD9E251CB17A00612E3A /* fr */,
-				9866DDA2251CB1C000612E3A /* pt */,
-				9866DDA4251CB1F500612E3A /* ru */,
-				9866DDA6251CB24F00612E3A /* es */,
-				9866DDA8251CB41000612E3A /* sv */,
-				9866DDAA251CB4F500612E3A /* tr */,
-				9816854A2521EEF100FA91A1 /* nb */,
 			);
 			name = PrivacyDashboard.storyboard;
 			sourceTree = "<group>";
@@ -9143,7 +9083,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 84.2.0;
+				version = 85.0.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 802a39a398..e0abad139e 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "af63158c03de7a47fb9e2cbcd97fbd28a64ab1fd",
-          "version": "84.2.0"
+          "revision": "6dc31cc7e46131d79ce1f96463b36381656d7b2d",
+          "version": "85.0.0"
         }
       },
       {
@@ -105,8 +105,8 @@
         "repositoryURL": "https://github.com/duckduckgo/privacy-dashboard",
         "state": {
           "branch": null,
-          "revision": "b4ac92a444e79d5651930482623b9f6dc9265667",
-          "version": "2.0.0"
+          "revision": "59dedf0f4ff1e9147de0806a54c6043861eb0870",
+          "version": "3.1.0"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",
diff --git a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme
index 5383c46f83..046960ab50 100644
--- a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme
+++ b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
    LastUpgradeVersion = "1250"
-   version = "1.3">
+   version = "1.7">
    <BuildAction
       parallelizeBuildables = "YES"
       buildImplicitDependencies = "YES">
@@ -95,7 +95,8 @@
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       debugServiceExtension = "internal"
-      allowLocationSimulation = "YES">
+      allowLocationSimulation = "NO"
+      showNonLocalizedStrings = "YES">
       <BuildableProductRunnable
          runnableDebuggingMode = "0">
          <BuildableReference
@@ -132,6 +133,10 @@
             isEnabled = "NO">
          </EnvironmentVariable>
       </EnvironmentVariables>
+      <LocationScenarioReference
+         identifier = "London, England"
+         referenceType = "1">
+      </LocationScenarioReference>
    </LaunchAction>
    <ProfileAction
       buildConfiguration = "Release"
diff --git a/DuckDuckGo/ActionSheetDaxDialogViewController.swift b/DuckDuckGo/ActionSheetDaxDialogViewController.swift
index be0e1cd07f..78f3e691d5 100644
--- a/DuckDuckGo/ActionSheetDaxDialogViewController.swift
+++ b/DuckDuckGo/ActionSheetDaxDialogViewController.swift
@@ -94,7 +94,7 @@ class ActionSheetDaxDialogViewController: UIViewController {
             return
         }
         
-        self.dismiss(animated: true)
+        dismiss(animated: true)
         if let spec = spec {
             Pixel.fire(pixel: spec.cancelActionPixelName)
         }
diff --git a/DuckDuckGo/Base.lproj/Feedback.storyboard b/DuckDuckGo/Base.lproj/Feedback.storyboard
index a9b59c7cc8..ac8172e1c5 100644
--- a/DuckDuckGo/Base.lproj/Feedback.storyboard
+++ b/DuckDuckGo/Base.lproj/Feedback.storyboard
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="h22-TC-N6i">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="c32-S5-kCk">
     <device id="retina5_5" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>
@@ -29,8 +28,8 @@
         <scene sceneID="dQB-jL-THB">
             <objects>
                 <viewController id="xnZ-YI-mV7" customClass="FeedbackViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="C2C-S7-btw">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="672"/>
+                    <view key="view" contentMode="scaleToFill" misplaced="YES" id="C2C-S7-btw">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="666"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yS1-TL-7Xx">
@@ -149,7 +148,7 @@
             <objects>
                 <viewController title="Share Feedback" id="rAY-cv-mjl" userLabel="Positive Feedback" customClass="PositiveFeedbackViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
                     <view key="view" contentMode="scaleToFill" id="zgc-vi-YZO">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="672"/>
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="666"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                             <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YJu-FY-Z3R">
@@ -304,8 +303,8 @@
         <scene sceneID="pU2-w2-HSD">
             <objects>
                 <tableViewController storyboardIdentifier="FeedbackPicker" title="Share Feedback" id="lY6-5c-iu4" userLabel="Feedback Picker" customClass="FeedbackPickerViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
-                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="insetGrouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="r0Q-7K-kUf">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="672"/>
+                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="insetGrouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="r0Q-7K-kUf">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="666"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <view key="tableHeaderView" contentMode="scaleToFill" id="h6D-eT-YCX">
                             <rect key="frame" x="0.0" y="0.0" width="414" height="170"/>
@@ -372,11 +371,11 @@
                                 <rect key="frame" x="20" y="225.33333206176758" width="374" height="44"/>
                                 <autoresizingMask key="autoresizingMask"/>
                                 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="has-ek-M3V" id="ZVE-Ej-2Dt">
-                                    <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="44"/>
+                                    <rect key="frame" x="0.0" y="0.0" width="347.66666666666669" height="44"/>
                                     <autoresizingMask key="autoresizingMask"/>
                                     <subviews>
                                         <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" usesAttributedText="YES" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Vp9-Jz-mUC">
-                                            <rect key="frame" x="20" y="0.0" width="315.66666666666669" height="44"/>
+                                            <rect key="frame" x="16" y="0.0" width="323.66666666666669" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <attributedString key="attributedText">
                                                 <fragment content="Title">
@@ -633,47 +632,6 @@
             </objects>
             <point key="canvasLocation" x="1361" y="924"/>
         </scene>
-        <!--Themable Navigation Controller-->
-        <scene sceneID="4Cd-5O-E32">
-            <objects>
-                <navigationController id="h22-TC-N6i" customClass="ThemableNavigationController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
-                    <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translucent="NO" id="7vH-Qe-IZl">
-                        <rect key="frame" x="0.0" y="20" width="414" height="44"/>
-                        <autoresizingMask key="autoresizingMask"/>
-                    </navigationBar>
-                    <connections>
-                        <segue destination="8h9-Oy-9xi" kind="relationship" relationship="rootViewController" id="fId-6e-Jea"/>
-                    </connections>
-                </navigationController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="i6L-q4-FDc" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="-1384" y="1690"/>
-        </scene>
-        <!--Report Broken Site-->
-        <scene sceneID="F6V-Ex-sf0">
-            <objects>
-                <viewController id="8h9-Oy-9xi" customClass="ReportBrokenSiteViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="z30-di-tew">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <viewLayoutGuide key="safeArea" id="Up8-9v-hR9"/>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
-                    </view>
-                    <toolbarItems/>
-                    <navigationItem key="navigationItem" title="Report Broken Site" id="WjT-HM-yim">
-                        <barButtonItem key="leftBarButtonItem" title="Close" id="cZl-qB-kSL">
-                            <connections>
-                                <action selector="onClosePressedWithSender:" destination="8h9-Oy-9xi" id="F2e-uB-ZF8"/>
-                            </connections>
-                        </barButtonItem>
-                    </navigationItem>
-                    <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
-                    <nil key="simulatedBottomBarMetrics"/>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="8yo-EF-AhR" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="-659.4202898550725" y="1689.9456521739132"/>
-        </scene>
     </scenes>
     <designables>
         <designable name="TMj-NM-j3b">
@@ -683,8 +641,5 @@
     <resources>
         <image name="happyFace" width="48" height="48"/>
         <image name="sadFace" width="48" height="48"/>
-        <systemColor name="systemBackgroundColor">
-            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-        </systemColor>
     </resources>
 </document>
diff --git a/DuckDuckGo/Base.lproj/Settings.storyboard b/DuckDuckGo/Base.lproj/Settings.storyboard
index 1d4eb7fa61..a365a5908a 100644
--- a/DuckDuckGo/Base.lproj/Settings.storyboard
+++ b/DuckDuckGo/Base.lproj/Settings.storyboard
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="w88-u3-TgK">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="w88-u3-TgK">
     <device id="retina6_5" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
         <capability name="Image references" minToolsVersion="12.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="collection view cell content view" minToolsVersion="11.0"/>
@@ -1102,7 +1102,7 @@
                 <viewControllerPlaceholder storyboardName="HomeRow" id="4xy-dB-g65" sceneMemberID="viewController"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="f7V-ze-SNX" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="2526" y="96"/>
+            <point key="canvasLocation" x="2564" y="-129"/>
         </scene>
         <!--Text Size-->
         <scene sceneID="27H-Zj-xSY">
@@ -1278,15 +1278,15 @@
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="Ztc-dF-sSr" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="2540" y="-72"/>
+            <point key="canvasLocation" x="2573" y="-61"/>
         </scene>
         <!--Feedback-->
         <scene sceneID="AdS-SO-faF">
             <objects>
-                <viewControllerPlaceholder storyboardName="Feedback" referencedIdentifier="Feedback" id="Hvb-oi-0lX" sceneMemberID="viewController"/>
+                <viewControllerPlaceholder storyboardName="Feedback" id="Hvb-oi-0lX" sceneMemberID="viewController"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="TVx-JL-4ci" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="2524" y="148"/>
+            <point key="canvasLocation" x="2572" y="53"/>
         </scene>
         <!--Automatically Clear Data-->
         <scene sceneID="y9R-2c-mBz">
@@ -2346,7 +2346,7 @@
             <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
         <systemColor name="secondaryLabelColor">
-            <color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
+            <color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
         </systemColor>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
diff --git a/DuckDuckGo/BrokenSiteCategories.swift b/DuckDuckGo/BrokenSiteCategories.swift
deleted file mode 100644
index 443a51185d..0000000000
--- a/DuckDuckGo/BrokenSiteCategories.swift
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  BrokenSiteCategories.swift
-//  DuckDuckGo
-//
-//  Copyright © 2020 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import Foundation
-
-struct BrokenSite {
-    
-    enum Category: String, CaseIterable, Identifiable {
-        case images
-        case paywall
-        case comments
-        case videos
-        case links
-        case content
-        case login
-        case unsupported
-        case cookiePrompt = "cookieprompt"
-        case other
-        
-        var id: Self { self }
-        
-        var categoryText: String {
-            switch self {
-            case .images:
-                return UserText.brokenSiteCategoryImages
-            case .paywall:
-                return UserText.brokenSiteCategoryPaywall
-            case .comments:
-                return UserText.brokenSiteCategoryComments
-            case .videos:
-                return UserText.brokenSiteCategoryVideos
-            case .links:
-                return UserText.brokenSiteCategoryLinks
-            case .content:
-                return UserText.brokenSiteCategoryContent
-            case .login:
-                return UserText.brokenSiteCategoryLogin
-            case .unsupported:
-                return UserText.brokenSiteCategoryUnsupported
-            case .cookiePrompt:
-                return UserText.brokenSiteCategoryCookiePrompt
-            case .other:
-                return UserText.brokenSiteCategoryOther
-            }
-        }
-    }
-}
diff --git a/DuckDuckGo/MainViewController+Segues.swift b/DuckDuckGo/MainViewController+Segues.swift
index 4eb01f301a..47af3fba21 100644
--- a/DuckDuckGo/MainViewController+Segues.swift
+++ b/DuckDuckGo/MainViewController+Segues.swift
@@ -22,6 +22,7 @@ import Common
 import Core
 import Bookmarks
 import BrowserServicesKit
+import PrivacyDashboard
 
 extension MainViewController {
 
@@ -122,21 +123,37 @@ extension MainViewController {
         os_log(#function, log: .generalLog, type: .debug)
         hideAllHighlightsIfNeeded()
 
-        let storyboard = UIStoryboard(name: "Feedback", bundle: nil)
-        guard let controller: UINavigationController = storyboard.instantiateInitialViewController(),
-              let brokenSiteScreen = controller.topViewController as? ReportBrokenSiteViewController else {
-            assertionFailure()
+        let brokenSiteInfo = currentTab?.getCurrentWebsiteInfo()
+        guard let currentURL = currentTab?.url,
+              let privacyInfo = currentTab?.makePrivacyInfo(url: currentURL) else {
+            assertionFailure("Missing fundamental data")
             return
         }
-
-        brokenSiteScreen.brokenSiteInfo = currentTab?.getCurrentWebsiteInfo()
+        
+        let storyboard = UIStoryboard(name: "PrivacyDashboard", bundle: nil)
+        let controller = storyboard.instantiateInitialViewController { coder in
+             PrivacyDashboardViewController(coder: coder,
+                                           privacyInfo: privacyInfo,
+                                           privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager,
+                                           contentBlockingManager: ContentBlocking.shared.contentBlockingManager,
+                                           initMode: .reportBrokenSite)
+        }
+        
+        guard let controller = controller else {
+            assertionFailure("PrivacyDashboardViewController not initialised")
+            return
+        }
+        
+        currentTab?.privacyDashboard = controller
+        controller.popoverPresentationController?.delegate = controller
+        controller.brokenSiteInfo = brokenSiteInfo
 
         if UIDevice.current.userInterfaceIdiom == .pad {
             controller.modalPresentationStyle = .formSheet
         } else {
             controller.modalPresentationStyle = .pageSheet
         }
-
+        
         present(controller, animated: true)
     }
 
diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift
index 66785d4359..2577c60d3b 100644
--- a/DuckDuckGo/MainViewController.swift
+++ b/DuckDuckGo/MainViewController.swift
@@ -674,10 +674,10 @@ class MainViewController: UIViewController {
     func onQuickFirePressed() {
         wakeLazyFireButtonAnimator()
         
-        self.forgetAllWithAnimation {}
-        self.dismiss(animated: true)
+        forgetAllWithAnimation {}
+        dismiss(animated: true)
         if KeyboardSettings().onAppLaunch {
-            self.enterSearch()
+            enterSearch()
         }
     }
     
diff --git a/DuckDuckGo/Base.lproj/PrivacyDashboard.storyboard b/DuckDuckGo/PrivacyDashboard/Base.lproj/PrivacyDashboard.storyboard
similarity index 84%
rename from DuckDuckGo/Base.lproj/PrivacyDashboard.storyboard
rename to DuckDuckGo/PrivacyDashboard/Base.lproj/PrivacyDashboard.storyboard
index a30dfbca7b..7f4ce74cea 100644
--- a/DuckDuckGo/Base.lproj/PrivacyDashboard.storyboard
+++ b/DuckDuckGo/PrivacyDashboard/Base.lproj/PrivacyDashboard.storyboard
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="E4q-pT-pJ1">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="E4q-pT-pJ1">
     <device id="retina5_9" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -38,21 +38,12 @@
                     <value key="contentSizeForViewInPopover" type="size" width="375" height="650"/>
                     <connections>
                         <outlet property="webView" destination="9r4-O0-IkD" id="0PF-2w-VYe"/>
-                        <segue destination="f4z-Pu-QxE" kind="presentation" identifier="ReportBrokenSite" modalPresentationStyle="formSheet" id="kJi-QP-mel"/>
                     </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="cBN-QY-8a1" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             <point key="canvasLocation" x="319" y="412"/>
         </scene>
-        <!--Feedback-->
-        <scene sceneID="Jx3-vm-WCX">
-            <objects>
-                <viewControllerPlaceholder storyboardName="Feedback" id="f4z-Pu-QxE" sceneMemberID="viewController"/>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="gTT-yM-AmS" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="1089" y="356"/>
-        </scene>
     </scenes>
     <resources>
         <systemColor name="systemBackgroundColor">
diff --git a/DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift b/DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift
new file mode 100644
index 0000000000..ab5bcd3e33
--- /dev/null
+++ b/DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift
@@ -0,0 +1,130 @@
+//
+//  BrokenSiteInfo.swift
+//  DuckDuckGo
+//
+//  Copyright © 2020 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+import Core
+
+public struct BrokenSiteInfo {
+
+    static let allowedQueryReservedCharacters =  CharacterSet(charactersIn: ",")
+
+    private struct Keys {
+        static let url = "siteUrl"
+        static let category = "category"
+        static let reportFlow = "reportFlow"
+        static let description = "description"
+        static let upgradedHttps = "upgradedHttps"
+        static let tds = "tds"
+        static let blockedTrackers = "blockedTrackers"
+        static let surrogates = "surrogates"
+        static let atb = "atb"
+        static let os = "os"
+        static let manufacturer = "manufacturer"
+        static let model = "model"
+        static let siteType = "siteType"
+        static let gpc = "gpc"
+        static let ampUrl = "ampUrl"
+        static let urlParametersRemoved = "urlParametersRemoved"
+        static let protectionsState = "protectionsState"
+    }
+    
+    public enum Source: String {
+        case menu
+        case dashboard
+    }
+    
+    private let url: URL?
+    private let httpsUpgrade: Bool
+    private let blockedTrackerDomains: [String]
+    private let installedSurrogates: [String]
+    private let isDesktop: Bool
+    private let tdsETag: String?
+    private let ampUrl: String?
+    private let urlParametersRemoved: Bool
+    private let model: String
+    private let manufacturer: String
+    private let systemVersion: String
+    private let gpc: Bool
+    private let protectionsState: Bool
+
+    public init(url: URL?, httpsUpgrade: Bool,
+                blockedTrackerDomains: [String],
+                installedSurrogates: [String],
+                isDesktop: Bool,
+                tdsETag: String?,
+                ampUrl: String?,
+                urlParametersRemoved: Bool,
+                protectionsState: Bool,
+                model: String = UIDevice.current.model,
+                manufacturer: String = "Apple",
+                systemVersion: String = UIDevice.current.systemVersion,
+                gpc: Bool? = nil) {
+        self.url = url
+        self.httpsUpgrade = httpsUpgrade
+        self.blockedTrackerDomains = blockedTrackerDomains
+        self.installedSurrogates = installedSurrogates
+        self.isDesktop = isDesktop
+        self.tdsETag = tdsETag
+        self.ampUrl = ampUrl
+        self.urlParametersRemoved = urlParametersRemoved
+
+        self.model = model
+        self.manufacturer = manufacturer
+        self.systemVersion = systemVersion
+        self.protectionsState = protectionsState
+
+        if let gpcParam = gpc {
+            self.gpc = gpcParam
+        } else {
+            self.gpc = AppDependencyProvider.shared.appSettings.sendDoNotSell
+        }
+    }
+    
+    func send(with category: String?, description: String, source: Source) {
+        
+        let parameters: [String: String] = [
+            Keys.url: normalize(url),
+            Keys.category: category ?? "",
+            Keys.description: description,
+            Keys.reportFlow: source.rawValue,
+            Keys.upgradedHttps: httpsUpgrade ? "true" : "false",
+            Keys.siteType: isDesktop ? "desktop" : "mobile",
+            Keys.tds: tdsETag?.trimmingCharacters(in: CharacterSet(charactersIn: "\"")) ?? "",
+            Keys.blockedTrackers: blockedTrackerDomains.joined(separator: ","),
+            Keys.surrogates: installedSurrogates.joined(separator: ","),
+            Keys.atb: StatisticsUserDefaults().atb ?? "",
+            Keys.os: systemVersion,
+            Keys.manufacturer: manufacturer,
+            Keys.model: model,
+            Keys.gpc: gpc ? "true" : "false",
+            Keys.ampUrl: ampUrl ?? "",
+            Keys.urlParametersRemoved: urlParametersRemoved ? "true" : "false",
+            Keys.protectionsState: protectionsState ? "true" : "false"
+        ]
+        
+        Pixel.fire(pixel: .brokenSiteReport,
+                   withAdditionalParameters: parameters,
+                   allowedQueryReservedCharacters: BrokenSiteInfo.allowedQueryReservedCharacters)
+    }
+    
+    private func normalize(_ url: URL?) -> String {
+        return url?.normalized()?.absoluteString ?? ""
+    }
+
+}
diff --git a/DuckDuckGo/PrivacyDashboardViewController.swift b/DuckDuckGo/PrivacyDashboard/PrivacyDashboardViewController.swift
similarity index 63%
rename from DuckDuckGo/PrivacyDashboardViewController.swift
rename to DuckDuckGo/PrivacyDashboard/PrivacyDashboardViewController.swift
index 319e31b91e..c9cec14d59 100644
--- a/DuckDuckGo/PrivacyDashboardViewController.swift
+++ b/DuckDuckGo/PrivacyDashboard/PrivacyDashboardViewController.swift
@@ -24,27 +24,42 @@ import Core
 import BrowserServicesKit
 import PrivacyDashboard
 
+/// View controller used for `Privacy Dasboard` or `Report broken site`, the web content is chosen at init time setting the correct `initMode`
 class PrivacyDashboardViewController: UIViewController {
     
+    /// Type of web page displayed
+    enum Mode {
+        case privacyDashboard
+        case reportBrokenSite
+    }
+
     @IBOutlet private(set) weak var webView: WKWebView!
     
-    public weak var tabViewController: TabViewController?
-    
+    private let initMode: Mode
     private let privacyDashboardController: PrivacyDashboardController
     private let privacyConfigurationManager: PrivacyConfigurationManaging
     private let contentBlockingManager: ContentBlockerRulesManager
+    public var brokenSiteInfo: BrokenSiteInfo?
+    
+    var source: BrokenSiteInfo.Source {
+        initMode == .reportBrokenSite ? .menu : .dashboard
+    }
 
     init?(coder: NSCoder,
           privacyInfo: PrivacyInfo?,
           privacyConfigurationManager: PrivacyConfigurationManaging,
-          contentBlockingManager: ContentBlockerRulesManager) {
+          contentBlockingManager: ContentBlockerRulesManager,
+          initMode: Mode) {
         self.privacyDashboardController = PrivacyDashboardController(privacyInfo: privacyInfo)
         self.privacyConfigurationManager = privacyConfigurationManager
         self.contentBlockingManager = contentBlockingManager
+        self.initMode = initMode
         
         super.init(coder: coder)
         
-        self.privacyDashboardController.delegate = self
+        self.privacyDashboardController.privacyDashboardDelegate = self
+        self.privacyDashboardController.privacyDashboardNavigationDelegate = self
+        self.privacyDashboardController.privacyDashboardReportBrokenSiteDelegate = self
     }
     
     required init?(coder: NSCoder) {
@@ -53,8 +68,7 @@ class PrivacyDashboardViewController: UIViewController {
 
     public override func viewDidLoad() {
         super.viewDidLoad()
-        
-        privacyDashboardController.setup(for: webView)
+        privacyDashboardController.setup(for: webView, reportBrokenSiteOnly: initMode == Mode.reportBrokenSite ? true : false)
         privacyDashboardController.preferredLocale = Bundle.main.preferredLocalizations.first
         applyTheme(ThemeManager.shared.currentTheme)
     }
@@ -68,38 +82,26 @@ class PrivacyDashboardViewController: UIViewController {
         privacyDashboardController.didFinishRulesCompilation()
         privacyDashboardController.updatePrivacyInfo(privacyInfo)
     }
-    
-    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
-        if let navController = segue.destination as? UINavigationController,
-           let brokenSiteScreen = navController.topViewController as? ReportBrokenSiteViewController {
-            brokenSiteScreen.brokenSiteInfo = tabViewController?.getCurrentWebsiteInfo()
-        }
-    }
-}
 
-private extension PrivacyDashboardViewController {
-    
-    func privacyDashboardProtectionSwitchChangeHandler(enabled: Bool) {
+    private func privacyDashboardProtectionSwitchChangeHandler(state: ProtectionState) {
         guard let domain = privacyDashboardController.privacyInfo?.url.host else { return }
         
         let privacyConfiguration = privacyConfigurationManager.privacyConfig
-        
-        if enabled {
+        let pixelParam = ["trigger_origin": state.eventOrigin.screen.rawValue]
+        if state.isProtected {
             privacyConfiguration.userEnabledProtection(forDomain: domain)
             ActionMessageView.present(message: UserText.messageProtectionEnabled.format(arguments: domain))
+            Pixel.fire(pixel: .dashboardProtectionAllowlistRemove, withAdditionalParameters: pixelParam)
         } else {
             privacyConfiguration.userDisabledProtection(forDomain: domain)
             ActionMessageView.present(message: UserText.messageProtectionDisabled.format(arguments: domain))
+            Pixel.fire(pixel: .dashboardProtectionAllowlistAdd, withAdditionalParameters: pixelParam)
         }
         
         contentBlockingManager.scheduleCompilation()
-        
-        privacyDashboardController.didStartRulesCompilation()
-        
-        Pixel.fire(pixel: enabled ? .privacyDashboardProtectionEnabled : .privacyDashboardProtectionDisabled)
     }
     
-    func privacyDashboardCloseTappedHandler() {
+    private func privacyDashboardCloseHandler() {
         dismiss(animated: true)
     }
 }
@@ -122,9 +124,8 @@ extension PrivacyDashboardViewController: Themable {
 
 extension PrivacyDashboardViewController: PrivacyDashboardControllerDelegate {
 
-    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController,
-                                    didChangeProtectionSwitch protectionState: ProtectionState) {
-        privacyDashboardProtectionSwitchChangeHandler(enabled: protectionState.isProtected)
+    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController, didChangeProtectionSwitch protectionState: ProtectionState) {
+        privacyDashboardProtectionSwitchChangeHandler(state: protectionState)
     }
     
     func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController, didRequestOpenUrlInNewTab url: URL) {
@@ -135,13 +136,8 @@ extension PrivacyDashboardViewController: PrivacyDashboardControllerDelegate {
         }
     }
     
-    func privacyDashboardControllerDidTapClose(_ privacyDashboardController: PrivacyDashboardController) {
-        privacyDashboardCloseTappedHandler()
-    }
-    
     func privacyDashboardControllerDidRequestShowReportBrokenSite(_ privacyDashboardController: PrivacyDashboardController) {
         Pixel.fire(pixel: .privacyDashboardReportBrokenSite)
-        performSegue(withIdentifier: "ReportBrokenSite", sender: self)
     }
     
     func privacyDashboardController(_ privacyDashboardController: PrivacyDashboard.PrivacyDashboardController,
@@ -159,4 +155,35 @@ extension PrivacyDashboardViewController: PrivacyDashboardControllerDelegate {
     }
 }
 
-extension PrivacyDashboardViewController: UIPopoverPresentationControllerDelegate { }
+extension PrivacyDashboardViewController: PrivacyDashboardNavigationDelegate {
+    
+    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboard.PrivacyDashboardController, didSetHeight height: Int) {
+        // The size received in iPad is wrong, shane will sort this out soon.
+        // preferredContentSize.height = CGFloat(height)
+    }
+    
+    func privacyDashboardControllerDidTapClose(_ privacyDashboardController: PrivacyDashboardController) {
+        privacyDashboardCloseHandler()
+    }
+}
+
+extension PrivacyDashboardViewController: PrivacyDashboardReportBrokenSiteDelegate {
+        
+    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController, reportBrokenSiteDidChangeProtectionSwitch protectionState: ProtectionState) {
+        privacyDashboardProtectionSwitchChangeHandler(state: protectionState)
+    }
+    
+    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboard.PrivacyDashboardController, didRequestSubmitBrokenSiteReportWithCategory category: String, description: String) {
+        
+        guard let brokenSiteInfo = brokenSiteInfo else {
+            assertionFailure("brokenSiteInfo not initialised")
+            return
+        }
+        
+        brokenSiteInfo.send(with: category, description: description, source: source)
+        ActionMessageView.present(message: UserText.feedbackSumbittedConfirmation)
+        privacyDashboardCloseHandler()
+    }
+}
+
+extension PrivacyDashboardViewController: UIPopoverPresentationControllerDelegate {}
diff --git a/DuckDuckGo/ReportBrokenSiteView.swift b/DuckDuckGo/ReportBrokenSiteView.swift
deleted file mode 100644
index 788c524e29..0000000000
--- a/DuckDuckGo/ReportBrokenSiteView.swift
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-//  ReportBrokenSiteView.swift
-//  DuckDuckGo
-//
-//  Copyright © 2023 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import SwiftUI
-import DuckUI
-import DesignResourcesKit
-
-struct ReportBrokenSiteView: View {
-    
-    let categories: [BrokenSite.Category]
-    let submitReport: (BrokenSite.Category?, String) -> Void
-    
-    @State private var selectedCategory: BrokenSite.Category?
-    
-    @State private var description: String = ""
-    @State private var placeholderText: String = UserText.brokenSiteCommentPlaceholder
-    
-    func submitForm() {
-        submitReport(selectedCategory, description)
-    }
-    
-    var form: some View {
-        Form {
-            Section {
-                
-            } header: {
-                VStack {
-                    Image("Breakage-128")
-                        .resizable()
-                        .aspectRatio(contentMode: .fit)
-                        .frame(width: Const.Size.imageSize, height: Const.Size.imageSize)
-                    
-                    Text(UserText.reportBrokenSiteHeader)
-                        .textCase(nil)
-                        .multilineTextAlignment(.center)
-                        .daxBodyRegular()
-                        .foregroundColor(Color(designSystemColor: .textSecondary))
-                }
-                .frame(maxWidth: .infinity)
-            }
-            .listRowBackground(Color.clear)
-            
-            Section {
-                HStack {
-                    Picker("", selection: $selectedCategory) {
-                        HStack {
-                            Text(UserText.brokenSiteCategoryPlaceholder)
-                            Spacer()
-                        }
-                        .tag(nil as BrokenSite.Category?)
-                        
-                        ForEach(categories) { cat in
-                            HStack {
-                                Text(cat.categoryText)
-                                Spacer()
-                            }
-                            .tag(Optional(cat))
-                        }
-                    }
-                    .labelsHidden()
-                    
-                    Spacer()
-                }
-                .padding(.leading, Const.Size.pickerPadding)
-            } header: {
-                Text(UserText.brokenSiteCategoryTitle)
-            }
-            
-            Section {
-                // As of July 2023 SwiftUI STILL does not support placeholders for `TextEditor`
-                // Until that time we have to use this hack to show a placeholder
-                // https://stackoverflow.com/a/65406506
-                ZStack {
-                    if self.description.isEmpty {
-                        TextEditor(text: $placeholderText)
-                            .font(.body)
-                            .foregroundColor(Color(UIColor.placeholderText))
-                            .disabled(true)
-                    }
-                    
-                    TextEditor(text: $description)
-                        .font(.body)
-                }
-                .padding(.leading, Const.Size.commentFieldPadding)
-                .frame(minHeight: Const.Size.minCommentHeight)
-            } header: {
-                Text(UserText.brokenSiteSectionTitle)
-            }
-            
-            Section {
-                Button(action: {
-                    submitForm()
-                }, label: {
-                    Text(UserText.appTPReportSubmit)
-                })
-                .buttonStyle(PrimaryButtonStyle())
-                .listRowBackground(Color.clear)
-            }
-            .listRowInsets(EdgeInsets())
-        }
-    }
-    
-    @ViewBuilder
-    var formWithBackground: some View {
-        if #available(iOS 16, *) {
-            form
-                .scrollContentBackground(.hidden)
-                .background(Color(designSystemColor: .background))
-        } else {
-            form
-                .background(Color(designSystemColor: .background))
-        }
-    }
-    
-    var body: some View {
-        formWithBackground
-    }
-}
-
-private enum Const {
-    enum Size {
-        static let imageSize: CGFloat = 128
-        static let minCommentHeight: CGFloat = 60
-        static let commentFieldPadding: CGFloat = -4
-        static let pickerPadding: CGFloat = -12
-        static let buttonHeight: CGFloat = 30
-    }
-}
-
-struct ReportBrokenSiteView_Previews: PreviewProvider {
-    static var previews: some View {
-        ReportBrokenSiteView(categories: BrokenSite.Category.allCases, submitReport: { _, _ in })
-    }
-}
diff --git a/DuckDuckGo/ReportBrokenSiteViewController.swift b/DuckDuckGo/ReportBrokenSiteViewController.swift
deleted file mode 100644
index ea23d8112c..0000000000
--- a/DuckDuckGo/ReportBrokenSiteViewController.swift
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-//  ReportBrokenSiteViewController.swift
-//  DuckDuckGo
-//
-//  Copyright © 2020 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import UIKit
-import SwiftUI
-
-class ReportBrokenSiteViewController: UIViewController {
-    
-    public var brokenSiteInfo: BrokenSiteInfo?
-    
-    private var reportView: ReportBrokenSiteView?
-    
-    private let categories: [BrokenSite.Category] = {
-        var categories = BrokenSite.Category.allCases
-        categories = categories.filter { $0 != .other }
-        categories = categories.shuffled()
-        categories.append(.other)
-        return categories
-    }()
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        
-        applyTheme(ThemeManager.shared.currentTheme)
-        
-        reportView = ReportBrokenSiteView(categories: categories, submitReport: submitForm(category:description:))
-        let hc = UIHostingController(rootView: reportView)
-        
-        self.addChild(hc)
-        self.view.addSubview(hc.view)
-        hc.didMove(toParent: self)
-        
-        hc.view.translatesAutoresizingMaskIntoConstraints = false
-        hc.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
-        hc.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
-        hc.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
-        hc.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
-        
-        DispatchQueue.main.async {
-            self.view.setNeedsLayout()
-            self.view.layoutIfNeeded()
-        }
-    }
-    
-    @IBAction func onClosePressed(sender: Any) {
-        dismiss(animated: true)
-    }
-    
-    func submitForm(category: BrokenSite.Category?, description: String) {
-        brokenSiteInfo?.send(with: category?.rawValue, description: description)
-        ActionMessageView.present(message: UserText.feedbackSumbittedConfirmation)
-        dismiss(animated: true)
-    }
-}
-
-extension ReportBrokenSiteViewController: Themable {
-    
-    func decorate(with theme: Theme) {
-        decorateNavigationBar(with: theme)
-        
-        view.backgroundColor = theme.backgroundColor
-    }
-}
diff --git a/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift b/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
index 082b312ace..c2ea00eb73 100644
--- a/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
+++ b/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
@@ -27,13 +27,13 @@ extension SyncSettingsViewController: SyncManagementViewModelDelegate {
 
     func launchAutofillViewController() {
         guard let mainVC = view.window?.rootViewController as? MainViewController else { return }
-        self.dismiss(animated: true)
+        dismiss(animated: true)
         mainVC.launchAutofillLogins()
     }
 
     func launchBookmarksViewController() {
         guard let mainVC = view.window?.rootViewController as? MainViewController else { return }
-        self.dismiss(animated: true)
+        dismiss(animated: true)
         mainVC.segueToBookmarks()
     }
 
diff --git a/DuckDuckGo/TabDelegate.swift b/DuckDuckGo/TabDelegate.swift
index 6f7438d918..d5c58da091 100644
--- a/DuckDuckGo/TabDelegate.swift
+++ b/DuckDuckGo/TabDelegate.swift
@@ -86,5 +86,4 @@ protocol TabDelegate: AnyObject {
     func tabCheckIfItsBeingCurrentlyPresented(_ tab: TabViewController) -> Bool
     
     func showBars()
-
 }
diff --git a/DuckDuckGo/TabViewController.swift b/DuckDuckGo/TabViewController.swift
index e54ad09196..b16261e6cb 100644
--- a/DuckDuckGo/TabViewController.swift
+++ b/DuckDuckGo/TabViewController.swift
@@ -82,7 +82,7 @@ class TabViewController: UIViewController {
 
     private(set) var webView: WKWebView!
     private lazy var appRatingPrompt: AppRatingPrompt = AppRatingPrompt()
-    private weak var privacyDashboard: PrivacyDashboardViewController?
+    public weak var privacyDashboard: PrivacyDashboardViewController?
     
     private var storageCache: StorageCache = AppDependencyProvider.shared.storageCache
     let appSettings: AppSettings
@@ -681,7 +681,7 @@ class TabViewController: UIViewController {
                 controller.popoverPresentationController?.sourceRect = iconView.bounds
             }
             privacyDashboard = controller
-            privacyDashboard?.tabViewController = self
+            privacyDashboard?.brokenSiteInfo = getCurrentWebsiteInfo()
         }
         
         if let controller = segue.destination as? FullscreenDaxDialogViewController {
@@ -707,8 +707,10 @@ class TabViewController: UIViewController {
         PrivacyDashboardViewController(coder: coder,
                                        privacyInfo: privacyInfo,
                                        privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager,
-                                       contentBlockingManager: ContentBlocking.shared.contentBlockingManager)
+                                       contentBlockingManager: ContentBlocking.shared.contentBlockingManager,
+                                       initMode: .privacyDashboard)
     }
+    
     private func addTextSizeObserver() {
         NotificationCenter.default.addObserver(self,
                                                selector: #selector(onTextSizeChange),
@@ -770,7 +772,7 @@ class TabViewController: UIViewController {
         onPrivacyInfoChanged()
     }
     
-    private func makePrivacyInfo(url: URL) -> PrivacyInfo? {
+    public func makePrivacyInfo(url: URL) -> PrivacyInfo? {
         guard let host = url.host else { return nil }
         
         let entity = ContentBlocking.shared.trackerDataManager.trackerData.findEntity(forHost: host)
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 08452d8e89..637d4f6fac 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -91,24 +91,6 @@ public struct UserText {
     public static let navigationTitleEdit = NSLocalizedString("navigation.title.edit", value: "Edit", comment: "Edit button")
     public static let navigationTitleDone = NSLocalizedString("navigation.title.done", value: "Done", comment: "Finish editing bookmarks button")
     
-    static let reportBrokenSiteHeader = NSLocalizedString("report.brokensite.header", value: "Submitting an anonymous broken site report helps us debug these issues and improve the app.", comment: "")
-    
-    static let brokenSiteSectionTitle = NSLocalizedString("brokensite.sectionTitle", value: "DESCRIBE WHAT HAPPENED", comment: "Broken Site Section Title")
-    static let brokenSiteCategoryTitle = NSLocalizedString("brokensite.categoryTitle", value: "SELECT A CATEGORY", comment: "Broken Site Category Section Title")
-    static let brokenSiteCategoryPlaceholder = NSLocalizedString("brokensite.categoryPlaceholder", value: "Pick your issue from the list...", comment: "Broken Site Category Placeholder")
-    static let brokenSiteCommentPlaceholder = NSLocalizedString("brokensite.commentPlaceholder", value: "Sharing more details can help us address this issue", comment: "Broken Site Comment Placeholder")
-    
-    static let brokenSiteCategoryImages = NSLocalizedString("brokensite.category.images", value: "Images didn’t load", comment: "Broken Site Category")
-    static let brokenSiteCategoryPaywall = NSLocalizedString("brokensite.category.paywall", value: "The site asked me to disable", comment: "Broken Site Category")
-    static let brokenSiteCategoryComments = NSLocalizedString("brokensite.category.comments", value: "Comments didn’t load", comment: "Broken Site Category")
-    static let brokenSiteCategoryVideos = NSLocalizedString("brokensite.category.videos", value: "Video didn’t play", comment: "Broken Site Category")
-    static let brokenSiteCategoryLinks = NSLocalizedString("brokensite.category.links", value: "Links or buttons don’t work", comment: "Broken Site Category")
-    static let brokenSiteCategoryContent = NSLocalizedString("brokensite.category.content", value: "Content is missing", comment: "Broken Site Category")
-    static let brokenSiteCategoryLogin = NSLocalizedString("brokensite.category.login", value: "I can’t sign in", comment: "Broken Site Category")
-    static let brokenSiteCategoryUnsupported = NSLocalizedString("brokensite.category.unsupported", value: "The browser is incompatible", comment: "Broken Site Category")
-    static let brokenSiteCategoryCookiePrompt = NSLocalizedString("brokensite.category.cookieprompt", value: "Cookie pop-up wasn't managed", comment: "Broken Site Category")
-    static let brokenSiteCategoryOther = NSLocalizedString("brokensite.category.other", value: "Something else", comment: "Broken Site Category")
-        
     public static let homeRowReminderTitle = NSLocalizedString("home.row.reminder.title", value: "Take DuckDuckGo home", comment: "Home is this context is the bottom home row (dock)")
     public static let homeRowReminderMessage = NSLocalizedString("home.row.reminder.message", value: "Add DuckDuckGo to your dock for easy access!", comment: "")
     
diff --git a/DuckDuckGo/WebContainerViewController.swift b/DuckDuckGo/WebContainerViewController.swift
index 2dd1663815..fa4f3d74bb 100644
--- a/DuckDuckGo/WebContainerViewController.swift
+++ b/DuckDuckGo/WebContainerViewController.swift
@@ -63,7 +63,7 @@ class WebContainerViewController: UIViewController {
     }
 
     @IBAction func dismiss() {
-        self.dismiss(animated: true)
+        dismiss(animated: true)
     }
 
     private func load(url: URL) {
diff --git a/DuckDuckGo/bg.lproj/Feedback.strings b/DuckDuckGo/bg.lproj/Feedback.strings
index a207c7cead..6cf1444e00 100644
--- a/DuckDuckGo/bg.lproj/Feedback.strings
+++ b/DuckDuckGo/bg.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Не, благодаря! Готово";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Затваряне";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Споделяне на отзив";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Кой уебсайт е повреден?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Подаване на сигнал за повреден сайт";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Споделяне на отзив";
 
diff --git a/DuckDuckGo/bg.lproj/Localizable.strings b/DuckDuckGo/bg.lproj/Localizable.strings
index ebb2fec0f5..4619b25016 100644
--- a/DuckDuckGo/bg.lproj/Localizable.strings
+++ b/DuckDuckGo/bg.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Редактиране";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Съществуващите отметки няма да бъдат дублирани.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Превишихте ограничението за синхронизиране на отметки. Опитайте да изтриете някои от отметките. Докато този проблем не бъде разрешен, отметките няма да бъдат архивирани.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Синхронизирането на отметки е на пауза";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Превишихте ограничението за синхронизиране на пароли. Опитайте да изтриете някои от паролите. Докато този проблем не бъде разрешен, паролите няма да бъдат архивирани.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Синхронизирането на паролите е на пауза";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Научете повече";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "ОК";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Поставяне на всички раздели в отметки?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Импортирайте HTML файл с отметки от друг браузър или експортирайте съществуващите отметки.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Коментарите не се зареждат";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Липсва съдържание";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Неуспешно управление на изскачащ прозорец за бисквитки";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Изображенията не се зареждат";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Връзките или бутоните не работят";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Не мога да вляза";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Нещо друго";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Сайтът ме помоли да деактивирам";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Браузърът е несъвместим";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Видеото не се възпроизвежда";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Изберете проблем от списъка...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "ИЗБЕРЕТЕ КАТЕГОРИЯ";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Ако споделите повече подробности, може да ни помогне да се справим с този проблем";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "ОПИШЕТЕ ПРОБЛЕМА";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "контейнер: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Премахване";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Всички любими, запазени на устройството";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Изберете кои любими отметки да се показват в нов раздел въз основа на техния произход.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Предпочитания за показване";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Само любими на мобилни устройства";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Блокиране на реклами и изскачащи прозорци";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Отваряне на VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Управление";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Включване на известията";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Разрешете на DuckDuckGo да Ви уведомява, ако връзката бъде прекъсната или състоянието на VPN се промени.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Получавайте известия при прекъсване на връзката или промяна на състоянието на VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Известия за VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Автоматично възстановяване на VPN връзка след прекъсване.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Винаги включено";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Известия за VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Мрежовата защита предотвратява изтичането на DNS към Вашия доставчик на интернет услуги, като насочва DNS заявките през VPN тунела към нашия собствен резолвер.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Сигурен DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Настройки на VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Отваряне в друго приложение?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Изпращането на анонимен доклад за неработещ сайт ни помага да отстраним грешките и да подобрим приложението.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Търсене или въвеждане на адрес";
 
diff --git a/DuckDuckGo/bg.lproj/PrivacyDashboard.strings b/DuckDuckGo/bg.lproj/PrivacyDashboard.strings
deleted file mode 100644
index a0488e0ab4..0000000000
--- a/DuckDuckGo/bg.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Сайтът е основна проследяваща мрежа";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Нов опит";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Данните не са криптирани";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Подаване на сигнал за повреден сайт";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Проверете интернет връзката и опитайте отново.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Засилена степен";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Етикет";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Опа, това не се получи";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Клас на поверителност";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Бутон";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "ПРАКТИКИ ЗА ЗАЩИТА НА ПОВЕРИТЕЛНОСТТА";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Нулиране на статистики на проследяващи мрежи";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Бутон";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ШИФРОВАНА ВРЪЗКА";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Бутон";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Незащитени сайтове";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Блокирани мрежи";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 блокирани тракери";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Подаване на сигнал за повреден сайт";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Практики за защита на поверителността";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Основни нарушители";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Етикет";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Не са намерени практики за защита на поверителността";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Незащитени сайтове";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Етикет";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Добри практики за защита на поверителността";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Защита на поверителността на сайта";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Защита на поверителността на сайта";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Шифрована връзка";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Деактивирахме временно защитата на поверителността, защото изглежда, че пречи на зареждането на този сайт.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Блокирани основни мрежи";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "ЧЕСТОТА НА ПРОСЛЕДЯВАЩА МРЕЖА";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Заредени са 8 други домейна";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Шифрована връзка";
-
diff --git a/DuckDuckGo/bg.lproj/Settings.strings b/DuckDuckGo/bg.lproj/Settings.strings
index 961ce72b2a..6887796705 100644
--- a/DuckDuckGo/bg.lproj/Settings.strings
+++ b/DuckDuckGo/bg.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Автоматично изчистване на данните";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Още на duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Настройки";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "По подразбиране";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Поверителност, опростена. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Управление на прозорци за бисквитки";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Защитата на поверителността е активирана за всички сайтове";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Икона";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Още от DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Синхронизиране";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Синхронизиране и архивиране";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Сърфирайте поверително с нашето приложение за Mac ";
diff --git a/DuckDuckGo/cs.lproj/Feedback.strings b/DuckDuckGo/cs.lproj/Feedback.strings
index a9f2cec279..816910d59f 100644
--- a/DuckDuckGo/cs.lproj/Feedback.strings
+++ b/DuckDuckGo/cs.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, díky! Skončil(a) jsem";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Zavřít";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Podělte se o zpětnou vazbu";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Které webové stránky jsou poškozené?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Nahlásit nefunkční webové stránky";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Podělte se o zpětnou vazbu";
 
diff --git a/DuckDuckGo/cs.lproj/Localizable.strings b/DuckDuckGo/cs.lproj/Localizable.strings
index 02864ed0e8..1542c6559b 100644
--- a/DuckDuckGo/cs.lproj/Localizable.strings
+++ b/DuckDuckGo/cs.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Upravit";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Existující záložky nebudou duplikovány.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Máš překročený limit pro synchronizaci záložek. Zkus pár záložek smazat. Dokud problém nevyřešíš, záložky se nebudou zálohovat.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Synchronizace záložek je pozastavená";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Máš překročený limit pro synchronizaci hesel. Zkus pár hesel smazat. Dokud tenhle problém nevyřešíš, hesla se nebudou zálohovat.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Synchronizace hesel je pozastavená";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Více informací";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "DOBŘE";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Dát do záložek všechny karty?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Naimportuj soubor HTML se záložkami z jiného prohlížeče nebo vyexportuj svoje existující záložky.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Komentáře se nenačetly";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Chybí obsah";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Správa vyskakovacích oken pro souhlas s cookies se neaktivovala";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Obrázky se nenačetly";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Odkazy nebo tlačítka nefungují";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Nemohu se přihlásit";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Něco jiného";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Tato stránka mě požádala o deaktivaci";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Prohlížeč je nekompatibilní";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video se nepřehrálo";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Vyber problém ze seznamu...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VYBER KATEGORII";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Tento problém snáz vyřešíme, když nám nasdílíš další informace";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "POPIŠTE, CO SE STALO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: % @";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Odstranit";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Všechny oblíbené položky na zařízení";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Vyber, které oblíbené položky se mají zobrazit na nové kartě podle jejich původu.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Předvolby zobrazení";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Jenom oblíbené mobilní položky";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokování reklam a vyskakovacích oken";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Otevřít VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Spravovat";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Zapnout oznámení";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Nech si od DuckDuckGo poslat upozornění, když se přeruší připojení nebo se změní stav VPN.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Nech si poslat upozornění, když se přeruší připojení nebo se změní stav VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Upozornění VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Po přerušení automaticky obnovit připojení VPN.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Vždycky zapnuté";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Oznámení sítě VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Ochrana sítě zabraňuje únikům DNS k poskytovateli internetových služeb tím, že směruje dotazy DNS přes tunel VPN na náš vlastní resolver.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Zabezpečený systém DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Nastavení sítě VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otevřít v jiné aplikaci?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Odeslání anonymní zprávy o nefunkčním webu nám pomůže tyto problémy řešit a vylepšovat aplikaci.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Vyhledejte nebo zadejte adresu";
 
diff --git a/DuckDuckGo/cs.lproj/PrivacyDashboard.strings b/DuckDuckGo/cs.lproj/PrivacyDashboard.strings
deleted file mode 100644
index aa68ffa1dc..0000000000
--- a/DuckDuckGo/cs.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Stránky jsou hlavní sledovací sítí";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Zkuste to znovu";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Data jsou nezašifrovaná";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Nahlásit nefunkční webové stránky";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Zkontrolujte připojení k internetu a zkuste to znovu.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Rozšířené hodnocení";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Štítek";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "A jéje, to nefungovalo";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Hodnocení ochrany soukromí";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Tlačítko";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "ZÁSADY OCHRANY SOUKROMÍ";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Obnovit statistiky sledovací sítě";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Tlačítko";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŠIFROVANÉ PŘIPOJENÍ";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Tlačítko";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Nechráněné stránky";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Blokované sítě";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 blokovaných trackerů";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Nahlásit nefunkční webové stránky";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Zásady ochrany soukromí";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Nejčastější provinilci";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Štítek";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nebyly nalezeny žádné postupy na ochranu soukromí";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Nechráněné stránky";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Štítek";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Správné postupy ochrany soukromí";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Ochrana osobních údajů na webových stránkách";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Ochrana osobních údajů na webových stránkách";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Šifrované připojení";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Dočasně jsme zakázali ochranu osobních údajů, protože se zdá, že porušuje podmínky této stránky.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Hlavní sítě zablokovány";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FREKVENCE SLEDOVACÍ SÍTĚ";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Načteno dalších 8 domén";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Šifrované připojení";
-
diff --git a/DuckDuckGo/cs.lproj/Settings.strings b/DuckDuckGo/cs.lproj/Settings.strings
index bb12c152b4..965b4ff82e 100644
--- a/DuckDuckGo/cs.lproj/Settings.strings
+++ b/DuckDuckGo/cs.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automaticky vymazat data";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Více na duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nastavení";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Výchozí";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Ochrana soukromí, zjednodušená. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Správa vyskakovacích oken ohledně cookies";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Ochrana osobních údajů povolena pro všechny weby";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Další od DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronizace";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronizace a zálohování";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Anonymní brouzdání po internetu s naší aplikací pro Mac ";
diff --git a/DuckDuckGo/da.lproj/Feedback.strings b/DuckDuckGo/da.lproj/Feedback.strings
index 8d15d853f7..9ef0f1d21d 100644
--- a/DuckDuckGo/da.lproj/Feedback.strings
+++ b/DuckDuckGo/da.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nej tak. jeg er færdig";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Luk";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Del feedback";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Hvilket websted er ødelagt?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Rapporter ødelagt websted";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Del feedback";
 
diff --git a/DuckDuckGo/da.lproj/Localizable.strings b/DuckDuckGo/da.lproj/Localizable.strings
index a0e9bb2c37..3b9fcbc22c 100644
--- a/DuckDuckGo/da.lproj/Localizable.strings
+++ b/DuckDuckGo/da.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Rediger";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Eksisterende bogmærker duplikeres ikke.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Du har overskredet grænsen for bogmærkesynkronisering. Prøv at slette nogle bogmærker. Dine bogmærker vil ikke blive sikkerhedskopieret, før dette er løst.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Bogmærkesynkronisering er sat på pause";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Du har overskredet grænsen for synkronisering af adgangskoder. Prøv at slette nogle adgangskoder. Dine adgangskoder vil ikke blive sikkerhedskopieret, før dette er løst.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Synkronisering af adgangskoder er sat på pause";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Mere info";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "Okay";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Bogmærk alle faner?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importér en HTML-fil med bogmærker fra en anden browser, eller eksportér dine eksisterende bogmærker.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Kommentarer blev ikke indlæst";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Indhold mangler";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Cookie-pop op blev ikke administreret";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Billeder blev ikke indlæst";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Links eller knapper fungerer ikke";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Jeg kan ikke logge ind";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Noget andet";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Webstedet bad mig om at deaktivere";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Browseren er inkompatibel";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Videoen blev ikke spillet";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Vælg dit emne fra listen ...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VÆLG EN KATEGORI";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Flere detaljer kan hjælpe os med at løse dette problem";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "BESKRIV, HVAD DER SKETE";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Fjern";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Alle favoritter på enheden";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Vælg, hvilke favoritter der skal vises på en ny fane baseret på deres oprindelse.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Indstillinger for visning";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Kun favoritter på mobil";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokering af annoncer og pop op-vinduer";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Åbn VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Administrer";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Slå notifikationer til";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Tillad DuckDuckGo at give dig besked, hvis din forbindelse falder ud, eller VPN-status ændres.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Få besked, hvis din forbindelse falder ud, eller VPN-status ændres.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-advarsler";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Gendan automatisk en VPN-forbindelse efter afbrydelse.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Altid aktiv";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-meddelelser";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection forhindrer DNS-lækager til din internetudbyder ved at dirigere DNS-forespørgsler gennem VPN-tunnelen til vores egen resolver.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Sikker DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-indstillinger";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Åbn i en anden app?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Indsendelse af en anonym webstedsrapport om brud hjælper os med at debugge disse problemer og forbedre appen.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Søg eller indtast adresse";
 
diff --git a/DuckDuckGo/da.lproj/PrivacyDashboard.strings b/DuckDuckGo/da.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 48b888961d..0000000000
--- a/DuckDuckGo/da.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Websted er et stort tracker-netværk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Prøv igen";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Data er ikke krypterede";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Rapporter ødelagt websted";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Kontroller din internetforbindelse, og prøv igen.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Forstærket grad";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etiket";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Åh nej, det fungerede ikke";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Grad af privatliv";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Knap";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "Praksis for beskyttelse af privatlivets fred";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Nulstil statistik for tracker-netværk";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Knap";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "Krypteret forbindelse";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Knap";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Ubeskyttede websteder";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Netværk blokeret";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 trackere blokeret";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Rapporter ødelagt websted";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Praksis for beskyttelse af privatlivets fred";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Primære overtrædere";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etiket";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Ingen praksis for beskyttelse af privatlivets fred fundet";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Ubeskyttede websteder";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etiket";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "God praksis for beskyttelse af privatlivets fred";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Webstedets beskyttelse af personlige oplysninger";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Webstedets beskyttelse af personlige oplysninger";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Krypteret forbindelse";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Vi har midlertidigt deaktiveret beskyttelse af privatlivets fred, da det ser ud til at ødelægge dette websted.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Store netværk blokeret";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "TRACKER NETVÆRKSFREKVENS";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 andre domæner indlæst";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Krypteret forbindelse";
-
diff --git a/DuckDuckGo/da.lproj/Settings.strings b/DuckDuckGo/da.lproj/Settings.strings
index b0c910808b..631f1f1c56 100644
--- a/DuckDuckGo/da.lproj/Settings.strings
+++ b/DuckDuckGo/da.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Ryd data automatisk";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Mere på duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Indstillinger";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Tema";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Fortrolighed, helt enkelt. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Administrer cookie pop op-vinduer";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Databeskyttelse aktiveret for alle websteder";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mere fra DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronisering";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronisering og sikkerhedskopiering";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Browse privat med vores app til Mac ";
diff --git a/DuckDuckGo/de.lproj/Feedback.strings b/DuckDuckGo/de.lproj/Feedback.strings
index 5630ec0bc1..1e29dbe8a2 100644
--- a/DuckDuckGo/de.lproj/Feedback.strings
+++ b/DuckDuckGo/de.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nein danke. Ich bin fertig";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Schließen";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Feedback teilen";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Welche Website ist fehlerhaft?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Fehlerhafte Website melden";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Feedback teilen";
 
diff --git a/DuckDuckGo/de.lproj/Localizable.strings b/DuckDuckGo/de.lproj/Localizable.strings
index 6f59a19e6e..3a0b2d35d1 100644
--- a/DuckDuckGo/de.lproj/Localizable.strings
+++ b/DuckDuckGo/de.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Bearbeiten";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Bestehende Lesezeichen werden nicht kopiert.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Du hast das Limit für die Synchronisierung von Lesezeichen überschritten. Versuche, einige Lesezeichen zu löschen. Bis dieses Problem behoben ist, werden deine Lesezeichen nicht gesichert.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Lesezeichen-Synchronisierung ist angehalten";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Du hast das Limit für die Synchronisierung von Passwörtern überschritten. Versuche, einige Passwörter zu löschen. Bis dieses Problem behoben ist, werden deine Passwörter nicht gesichert.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Passwortsynchronisierung ist angehalten";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Mehr erfahren";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Alle Tabs mit Lesezeichen versehen?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importiere eine HTML-Datei mit Lesezeichen aus einem anderen Browser oder exportieren deine vorhandenen Lesezeichen.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Kommentare wurden nicht geladen";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Inhalt fehlt";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Cookie-Pop-up wurde nicht verwaltet";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Bilder wurden nicht geladen";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Links oder Schaltflächen funktionieren nicht";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Ich kann mich nicht anmelden";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Etwas anderes";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Die Seite hat mich aufgefordert zu deaktivieren";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Der Browser ist nicht kompatibel";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video wurde nicht abgespielt";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Wähle dein Problem aus der Liste aus...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "EINE KATEGORIE AUSWÄHLEN";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Das Teilen weiterer Details kann uns helfen, dieses Problem zu lösen";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "BESCHREIBE, WAS PASSIERT IST";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "Bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Entfernen";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Alle Gerätefavoriten";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Wähle aus, welche Favoriten auf in einem neuen Tab angezeigt werden sollen, je nachdem, woher sie stammen.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Anzeigeeinstellungen";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Nur mobile Favoriten";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blockieren von Werbungen und Pop-ups";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "VPN öffnen";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Verwalten";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Benachrichtigungen aktivieren";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Erlaube DuckDuckGo, dich zu benachrichtigen, wenn deine Verbindung abbricht oder sich dein VPN-Status ändert.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Lass dich benachrichtigen, wenn deine Verbindung abbricht oder sich der VPN-Status ändert.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-Benachrichtigungen";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Stelle eine VPN-Verbindung nach einer Unterbrechung automatisch wieder her.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Immer aktiviert";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-Benachrichtigungen";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection verhindert DNS-Lecks zu deinem Internetanbieter, indem DNS-Anfragen über den VPN-Tunnel an unseren eigenen Resolver weitergeleitet werden.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Sicheres DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-Einstellungen";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "In einer anderen App öffnen?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Das Senden eines anonymen Berichts über fehlerhafte Websites hilft uns, diese Probleme zu beheben und die App zu verbessern.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Adresse suchen oder eingeben";
 
diff --git a/DuckDuckGo/de.lproj/PrivacyDashboard.strings b/DuckDuckGo/de.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 7173449fbc..0000000000
--- a/DuckDuckGo/de.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Diese Website gehört zu einem großen Tracker-Netzwerk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Erneut versuchen";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Die Daten sind unverschlüsselt";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Fehlerhafte Website melden";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Überprüfe deine Internetverbindung und versuche es erneut.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Erhöhte Stufe";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Oh, das hat nicht funktioniert";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Datenschutz-Stufe";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Schaltfläche";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "DATENSCHUTZPRAKTIKEN";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Tracker-Netzwerk-Statistiken zurücksetzen";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Schaltfläche";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "Verschlüsselte Verbindung";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Schaltfläche";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Ungeschützte Websites";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Netzwerke wurden blockiert";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 Tracker wurden blockiert";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Fehlerhafte Website melden";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Datenschutzpraktiken";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Hartnäckigste Tracker";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Keine Datenschutzpraktiken gefunden";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Ungeschützte Websites";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Gute Datenschutzpraktiken";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Datenschutz der Website";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Datenschutz der Website";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Verschlüsselte Verbindung";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Wir haben den Datenschutz vorübergehend deaktiviert, da die Seite derzeit dadurch gestört wird.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Große Netzwerke wurden blockiert";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "TRACKER-NETZWERK-HÄUFIGKEIT";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 weitere Domains geladen";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Verschlüsselte Verbindung";
-
diff --git a/DuckDuckGo/de.lproj/Settings.strings b/DuckDuckGo/de.lproj/Settings.strings
index 739a017f02..49d0dd41f7 100644
--- a/DuckDuckGo/de.lproj/Settings.strings
+++ b/DuckDuckGo/de.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Daten automatisch löschen";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Mehr auf duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Einstellungen";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standard";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Datenschutz, vereinfacht. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Cookie-Pop-ups verwalten";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Datenschutz für alle Websites aktiviert";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Symbol";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mehr von DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronisieren";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronisieren und sichern";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Privat browsen mit unserer App für Mac ";
diff --git a/DuckDuckGo/el.lproj/Feedback.strings b/DuckDuckGo/el.lproj/Feedback.strings
index 8bdc855b3f..f79eaed2c7 100644
--- a/DuckDuckGo/el.lproj/Feedback.strings
+++ b/DuckDuckGo/el.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Όχι ευχαριστώ! Τελείωσα";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Κλείσιμο";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Κοινοποίηση σχολίου";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Ποιος ιστότοπος είναι κατεστραμμένος;";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Αναφορά ιστότοπου που δεν λειτουργεί";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Κοινοποίηση σχολίου";
 
diff --git a/DuckDuckGo/el.lproj/Localizable.strings b/DuckDuckGo/el.lproj/Localizable.strings
index ff3591fc75..b416648110 100644
--- a/DuckDuckGo/el.lproj/Localizable.strings
+++ b/DuckDuckGo/el.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Επεξεργασία";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Οι υπάρχοντες σελιδοδείκτες δεν θα αναπαραχθούν.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Έχετε υπερβεί το όριο συγχρονισμού σελιδοδεικτών. Προσπαθήστε να διαγράψετε ορισμένους σελιδοδείκτες. Μέχρι να επιλυθεί το πρόβλημα αυτό, δεν θα δημιουργηθούν αντίγραφα ασφαλείας για τους σελιδοδείκτες σας.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Ο συγχρονισμός σελιδοδεικτών έχει τεθεί σε παύση";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Έχετε υπερβεί το όριο συγχρονισμού κωδικών πρόσβασης. Προσπαθήστε να διαγράψετε κάποιους κωδικούς πρόσβασης. Μέχρι να επιλυθεί το πρόβλημα αυτό, δεν θα δημιουργηθούν αντίγραφα ασφαλείας για τους κωδικούς πρόσβασής σας.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Ο συγχρονισμός κωδικών πρόσβασης έχει τεθεί σε παύση";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Μάθετε περισσότερα";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "Εντάξει";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Προσθήκη σελιδοδείκτη για όλες τις καρτέλες;";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Κάντε εισαγωγή ενός αρχείου HTML με σελιδοδείκτες από άλλο πρόγραμμα περιήγησης, ή κάντε εξαγωγή των σελιδοδεικτών που διαθέτετε ήδη.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Τα σχόλια δεν φορτώθηκαν";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Το περιεχόμενο λείπει";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Δεν έγινε διαχείριση του αναδυόμενου παραθύρου για cookies";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Οι εικόνες δεν φορτώθηκαν";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Οι σύνδεσμοι ή τα κουμπιά δεν λειτουργούν";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Δεν μπορώ να συνδεθώ";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Κάτι άλλο";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Ο ιστότοπος μου ζήτησε να απενεργοποιήσω";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Το πρόγραμμα περιήγησης είναι ασύμβατο";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Το βίντεο δεν αναπαράχθηκε";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Επιλέξτε το πρόβλημα που αντιμετωπίζετε, από τη λίστα...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "ΕΠΙΛΕΞΤΕ ΚΑΤΗΓΟΡΙΑ";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Η κοινοποίηση περισσότερων λεπτομερειών μπορεί να μας βοηθήσει να επιλύσουμε το πρόβλημα αυτό";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "ΠΕΡΙΓΡΑΨΤΕ ΤΙ ΣΥΝΕΒΗ";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "κάδος: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Αφαίρεση";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Αγαπημένα όλων των συσκευών";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Επιλέξτε ποια αγαπημένα θα εμφανίζονται σε μια νέα καρτέλα με βάση την προέλευσή τους.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Προτιμήσεις προβολής";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Αγαπημένα μόνο για κινητά";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Αποκλεισμός διαφημίσεων και αναδυόμενων παραθύρων";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Ανοικτό VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Διαχείριση";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Ενεργοποίηση ειδοποιήσεων";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Επιτρέψτε στο DuckDuckGo να σας ειδοποιεί εάν η ισχύς της σύνδεσή σας μειωθεί ή αλλάξει η κατάσταση του VPN.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Ειδοποιηθείτε εάν η ισχύς της σύνδεσής σας μειωθεί ή αλλάξει η κατάσταση του VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Ειδοποιήσεις VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Αυτόματη αποκατάσταση μιας σύνδεσης VPN έπειτα από διακοπή.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Πάντα σε λειτουργία";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Ειδοποιήσεις VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Η Προστασία δικτύου αποτρέπει διαρροές DNS προς τον πάροχο υπηρεσιών διαδικτύου σας, δρομολογώντας ερωτήματα DNS μέσω της σήραγγας VPN στο δικό μας πρόγραμμα επίλυσης.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Ασφαλές DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Ρυθμίσεις VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Άνοιγμα σε άλλη εφαρμογή;";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Η υποβολή μιας ανώνυμης αναφοράς για σπασμένους συνδεσμους μασ βοηθά να πραγματοποιήσουμε επανόρθωση των εντοπισμένων σφαλμάτων και προβλημάτων αυτών των ζητημάτων και να βελτιώσουμε την εφαρμογή.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Αναζήτηση ή εισαγωγή διεύθυνσης";
 
diff --git a/DuckDuckGo/el.lproj/PrivacyDashboard.strings b/DuckDuckGo/el.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 75c7e9766a..0000000000
--- a/DuckDuckGo/el.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Ο ιστότοπος είναι κύριο δίκτυο παρακολούθησης";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Προσπαθήστε ξανά";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Τα δεδομένα δεν είναι κρυπτογραφημένα";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Αναφορά ιστότοπου που δεν λειτουργεί";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και προσπαθήστε ξανά.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Βελτιωμένη βαθμολογία";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Ωχ, όχι! Δεν λειτούργησε αυτό";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Βαθμολογία ιδιωτικότητας";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Κουμπί";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "ΠΡΑΚΤΙΚΕΣ ΙΔΙΩΤΙΚΟΤΗΤΑΣ";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Επαναφορά στατιστικών δικτύου παρακολούθησης";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Κουμπί";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ΚΡΥΠΤΟΓΡΑΦΗΜΕΝΗ ΣΥΝΔΕΣΗ";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Κουμπί";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Μη προστατευόμενοι ιστότοποι";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Αποκλείστηκαν δίκτυα";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Αποκλείστηκαν 8 εφαρμογές παρακολούθησης";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Αναφορά ιστότοπου που δεν λειτουργεί";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Πρακτικές ιδιωτικότητας";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Κορυφαίοι παραβάτες";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Δεν βρέθηκαν πρακτικές προστασίας προσωπικών δεδομένων";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Μη προστατευόμενοι ιστότοποι";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Ορθές πρακτικές ιδιωτικότητας";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Προστασία της ιδιωτικότητας του ιστότοπου";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Προστασία της ιδιωτικότητας του ιστότοπου";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Κρυπτογραφημένη σύνδεση";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Απενεργοποιήσαμε προσωρινά την Προστασία προσωπικών δεδομένων καθώς φαίνεται ότι ρίχνει τον ιστότοπο.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Αποκλείστηκαν κύρια δίκτυα";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "ΣΥΧΝΟΤΗΤΑ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ ΔΙΚΤΥΟΥ";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 ακόμη τομείς φορτώθηκαν";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Κρυπτογραφημένη σύνδεση";
-
diff --git a/DuckDuckGo/el.lproj/Settings.strings b/DuckDuckGo/el.lproj/Settings.strings
index a05763b68c..38a6b1ac4b 100644
--- a/DuckDuckGo/el.lproj/Settings.strings
+++ b/DuckDuckGo/el.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Αυτόματη απαλοιφή δεδομένων";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Περισσότερα στη διεύθυνση duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ρυθμίσεις";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Προεπιλογή";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Η ιδιωτικότητα απλοποιημένη. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Διαχείριση αναδυόμενων παραθύρων cookies";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Η προστασία προσωπικών δεδομένων είναι ενεργοποιημένη για όλους τους ιστότοπους";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Εικονίδιο";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Περισσότερα από το DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Συγχρονισμός";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Συγχρονισμός και δημιουργία αντιγράφων ασφαλείας";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Περιηγηθείτε ιδιωτικά με την εφαρμογή μας για Mac ";
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index 14489e1a91..c8d01d8d47 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -769,48 +769,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Import an HTML file of bookmarks from another browser, or export your existing bookmarks.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Comments didn’t load";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Content is missing";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Cookie pop-up wasn't managed";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Images didn’t load";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Links or buttons don’t work";
-
-/* Broken Site Category */
-"brokensite.category.login" = "I can’t sign in";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Something else";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "The site asked me to disable";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "The browser is incompatible";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video didn’t play";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Pick your issue from the list...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SELECT A CATEGORY";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Sharing more details can help us address this issue";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "DESCRIBE WHAT HAPPENED";
-
 /* Title for a section containing only items from past month */
 "date.range.past-month" = "Past month";
 
@@ -1663,9 +1621,6 @@ https://duckduckgo.com/mac";
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Open in Another App?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Submitting an anonymous broken site report helps us debug these issues and improve the app.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Search or enter address";
 
diff --git a/DuckDuckGo/es.lproj/Feedback.strings b/DuckDuckGo/es.lproj/Feedback.strings
index a81befc8d5..897984c7a4 100644
--- a/DuckDuckGo/es.lproj/Feedback.strings
+++ b/DuckDuckGo/es.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "No, gracias. He terminado";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Cerrar";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Compartir opiniones";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "¿Qué sitio web no funciona?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Informar de sitio web dañado";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Compartir opiniones";
 
diff --git a/DuckDuckGo/es.lproj/Localizable.strings b/DuckDuckGo/es.lproj/Localizable.strings
index 9262ddf95a..ed3a0d69b7 100644
--- a/DuckDuckGo/es.lproj/Localizable.strings
+++ b/DuckDuckGo/es.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Editar";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Los marcadores existentes no se duplicarán.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Has superado el límite de sincronización de marcadores. Prueba a eliminar algunos marcadores. No se realizará una copia de seguridad de los marcadores hasta que se resuelva esto.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "La sincronización de marcadores está en pausa";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Ha superado el límite de sincronización de contraseñas. Prueba a eliminar algunas contraseñas. No se realizará una copia de seguridad de las contraseñas hasta que se resuelva esto.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "La sincronización de contraseñas está en pausa";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Más información";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "De acuerdo";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "¿Añadir todas las pestañas a marcadores?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importa un archivo HTML de marcadores desde otro navegador o exporta tus marcadores existentes.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "No se han cargado los comentarios";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Falta contenido";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "No se ha gestionado la ventana emergente de cookies";
-
-/* Broken Site Category */
-"brokensite.category.images" = "No se han cargado las imágenes";
-
-/* Broken Site Category */
-"brokensite.category.links" = "No funcionan los enlaces o botones";
-
-/* Broken Site Category */
-"brokensite.category.login" = "No puedo iniciar sesión";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Otro problema";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "El sitio me pidió que desactivara";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "El navegador es incompatible";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "No se ha reproducido el vídeo";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Elige tu problema en la lista...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SELECCIONA UNA CATEGORÍA";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Si compartes más detalles, nos ayudarás a resolver esta incidencia";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "DESCRIBE QUÉ PASÓ";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Eliminar";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Todos los favoritos del dispositivo";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Elige qué favoritos mostrar en una nueva pestaña en función de su origen.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Preferencias de visualización";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Solo favoritos móviles";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Bloquear anuncios y mensajes emergentes";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Abrir VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Gestionar";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Activar notificaciones";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Permite que DuckDuckGo te notifique si tu conexión se cae o si cambia el estado de la VPN.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Recibe notificaciones si tu conexión se cae o cambia el estado de la VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Alertas de VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Restaura automáticamente una conexión VPN después de una interrupción.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Siempre activado";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Notificaciones de VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "La protección de red evita las filtraciones DNS a tu proveedor de servicios de internet redirigiendo las consultas de DNS a través del túnel VPN a nuestro propio <em>resolver</em>.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "DNS seguro";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Configuración de VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "¿Abrir en otra aplicación?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Enviar un informe anónimo del sitio dañado nos ayuda a depurar estos problemas y mejorar la aplicación.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Buscar o introducir dirección";
 
diff --git a/DuckDuckGo/es.lproj/PrivacyDashboard.strings b/DuckDuckGo/es.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 45827fcbba..0000000000
--- a/DuckDuckGo/es.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "El sitio web es una de las principales redes de rastreadores";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.ejemplo.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Intentar de nuevo";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Los datos no están cifrados";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Informar de sitio web dañado";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Comprueba tu conexión a internet e inténtalo de nuevo.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Nivel incrementado";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etiqueta";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Vaya, no ha funcionado";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.ejemplo.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Grado de privacidad";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Botón";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRACTICAS DE PRIVACIDAD";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Reiniciar las estadísticas de la red de rastreadores";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Botón";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "CONEXIÓN CIFRADA";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.ejemplo.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Botón";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.ejemplo.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Sitios no protegidos";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Redes bloqueadas";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 rastreadores bloqueados";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Informar de sitio web dañado";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Prácticas de privacidad";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Principales culpables";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etiqueta";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "No se han encontrado prácticas de privacidad";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Sitios no protegidos";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etiqueta";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Buenas prácticas de privacidad";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Protección de privacidad del sitio web";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Protección de privacidad del sitio web";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Conexión cifrada";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Hemos desactivado temporalmente la protección de privacidad, ya que parece que está causando errores en el sitio.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Redes principales bloqueadas";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FRECUENCIA DE REDES DE RASTREADORES";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Otros 8 dominios cargados";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Conexión cifrada";
-
diff --git a/DuckDuckGo/es.lproj/Settings.strings b/DuckDuckGo/es.lproj/Settings.strings
index 98762d2786..90ce5a3ace 100644
--- a/DuckDuckGo/es.lproj/Settings.strings
+++ b/DuckDuckGo/es.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Borrar datos automáticamente";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Más información en duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ajustes";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Predeterminado";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "La privacidad, simplificada. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Administrar ventanas emergentes de cookies";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Protección de privacidad habilitada para todos los sitios";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icono";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Más sobre DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronizar";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronización y copia de seguridad";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Navega de forma privada con nuestra aplicación para Mac ";
diff --git a/DuckDuckGo/et.lproj/Feedback.strings b/DuckDuckGo/et.lproj/Feedback.strings
index 55e2028121..fa4a347aff 100644
--- a/DuckDuckGo/et.lproj/Feedback.strings
+++ b/DuckDuckGo/et.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Tänan, ei! Olen lõpetanud";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Sulge";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Jaga tagasisidet";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Milline veebisait on katki?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Teata mittetoimivast saidist";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Jaga tagasisidet";
 
diff --git a/DuckDuckGo/et.lproj/Localizable.strings b/DuckDuckGo/et.lproj/Localizable.strings
index 3df8179e8c..f777ed9d3c 100644
--- a/DuckDuckGo/et.lproj/Localizable.strings
+++ b/DuckDuckGo/et.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Redigeeri";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Olemasolevaid järjehoidjaid ei dubleerita.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Oled järjehoidjate sünkroonimise limiidi ületanud. Proovi mõned järjehoidjad kustutada. Kuni see pole lahendatud, ei varundata sinu järjehoidjaid.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Järjehoidjate sünkroonimine on peatatud";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Oled paroolide sünkroonimise limiidi ületanud. Proovi mõned paroolid kustutada. Kuni see pole lahendatud, ei varundata sinu paroole.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Paroolide sünkroonimine on peatatud";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Loe edasi";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Kas lisada kõik vahekaardid järjehoidjasse?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Impordi järjehoidjate HTML-fail teisest brauserist või ekspordi oma olemas olevad järjehoidjad.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Kommentaare ei laaditud";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Sisu puudub";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Küpsise hüpikakent ei hallatud";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Pilte ei laaditud";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Lingid või nupud ei töötanud";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Ma ei saa sisse logida";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Midagi muud";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Sait palus mul välja lülitada";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Brauser ei ühildu";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Videot ei esitatud";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Vali loendist oma probleem...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VALI KATEGOORIA";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Probleemi täpsem kirjeldamine võib meil aidata seda lahendada";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "KIRJELDAGE TOIMUNUT";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "andmekogum: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Eemaldage";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Kõik seadme lemmikud";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Vali, milliseid lemmikuid uuel vahekaardil kuvada, lähtudes nende päritolust.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Kuvamise seaded";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Ainult mobiililemmikud";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklaami ja hüpikakende blokeerimine";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Ava VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Halda";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Lülita teavitused sisse";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Lubab DuckDuckGol sulle teada anda, kui sinu ühendus katkeb või VPN-i olek muutub.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Saad teate, kui sinu ühendus katkeb või VPN-i olek muutub.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-i hoiatused";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "VPN-ühendus taastatakse pärast katkestust automaatselt.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Alati sisse lülitatud";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-i teavitused";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection takistab DNS-i lekkeid sinu internetiteenuse pakkujale, suunates DNS-päringud läbi VPN-tunneli meie enda aadressiteisendusteenusesse.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Turvaline DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-i seaded";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Avada teises rakenduses?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Anonüümse katkise saidi aruande esitamine aitab meil neid probleeme siluda ja rakendust täiustada.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Otsi või sisesta aadress";
 
diff --git a/DuckDuckGo/et.lproj/PrivacyDashboard.strings b/DuckDuckGo/et.lproj/PrivacyDashboard.strings
deleted file mode 100644
index d5425f6da1..0000000000
--- a/DuckDuckGo/et.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Sait on peamine jälgimisvõrk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Proovi uuesti";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Andmed on krüptimata";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Teata mittetoimivast saidist";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Kontrolli oma internetiühendust ja proovi uuesti.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Täiustatud aste";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Silt";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Oih, see ei toiminud";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Privaatsusaste";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Nupp";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRIVAATUSUPRAKTIKAD";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Lähtesta jälgimisvõrkude statistika";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Nupp";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "KRÜPTITUD ÜHENDUS";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Nupp";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Kaitseta saidid";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Võrgud blokeeritud";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 jälgijat blokeeritud";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Teata mittetoimivast saidist";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Privaatsuspõhimõtted";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Suurimad rikkujad";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Privaatsuspõhimõtteid ei leitud";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Kaitseta saidid";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Head privaatsustavad";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Saidi privaatsuse kaitse";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Saidi privaatsuse kaitse";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Krüptitud ühendus";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Keelasime ajutiselt privaatsuse kaitse, kuna näib, et see kahjustab seda saiti.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Suured võrgud blokeeritud";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "JÄLGIJA VÕRGU SAGEDUS";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 muud domeeni laaditud";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Krüptitud ühendus";
-
diff --git a/DuckDuckGo/et.lproj/Settings.strings b/DuckDuckGo/et.lproj/Settings.strings
index 5cb1f1e951..14d97bb0ae 100644
--- a/DuckDuckGo/et.lproj/Settings.strings
+++ b/DuckDuckGo/et.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Kustuta andmed automaatselt";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Lisateave: duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Seaded";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Vaikimisi";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Privaatsus, lihtsalt. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Halda küpsiste hüpikaknaid";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privaatsuse kaitse on lubatud kõigil saitidel";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikoon";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Veel DuckDuckGo'lt";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sünkrooni";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sünkroonimine ja varundamine";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Sirvi privaatselt meie Maci rakendusega ";
diff --git a/DuckDuckGo/fi.lproj/Feedback.strings b/DuckDuckGo/fi.lproj/Feedback.strings
index aef969e8ca..c2142a90a6 100644
--- a/DuckDuckGo/fi.lproj/Feedback.strings
+++ b/DuckDuckGo/fi.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ei kiitos! Valmista";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Sulje";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Jaa palaute";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Mikä verkkosivusto on viallinen?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Ilmoita viallisesta sivustosta";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Jaa palaute";
 
diff --git a/DuckDuckGo/fi.lproj/Localizable.strings b/DuckDuckGo/fi.lproj/Localizable.strings
index 2f5ff76343..626d914125 100644
--- a/DuckDuckGo/fi.lproj/Localizable.strings
+++ b/DuckDuckGo/fi.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Muokkaa";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Olemassa olevia kirjanmerkkejä ei kopioida.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Olet ylittänyt kirjanmerkkien synkronointirajan. Yritä poistaa joitakin kirjanmerkkejä. Kirjanmerkkejäsi ei varmuuskopioida ennen kuin tämä ongelma on ratkaistu.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Kirjanmerkkien synkronointi on keskeytetty";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Olet ylittänyt salasanojen synkronointirajan. Yritä poistaa joitakin salasanoja. Salasanojasi ei varmuuskopioida ennen kuin tämä ongelma on ratkaistu.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Salasanojen synkronointi on keskeytetty";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Lue lisää";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Lisätäänkö kaikki välilehdet kirjanmerkkeihin?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Tuo HTML-kirjanmerkkitiedosto toisesta selaimesta tai vie olemassa olevat kirjanmerkkisi.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Kommentit eivät latautuneet";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Sisältöä puuttuu";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Evästeen ponnahdusikkunaa ei hallittu";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Kuvat eivät latautuneet";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Linkit tai painikkeet eivät toimi";
-
-/* Broken Site Category */
-"brokensite.category.login" = "En pysty kirjautumaan sisään";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Jotain muuta";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Sivusto pyysi minua poistamaan käytöstä";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Selain ei ole yhteensopiva";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Videota ei toistettu";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Valitse ongelma luettelosta...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VALITSE KATEGORIA";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Lisätiedot saattavat auttaa meitä ratkaisemaan tämän ongelman";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "KUVAILE MITÄ TAPAHTUI";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Poista";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Kaikki laitteen suosikit";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Valitse alkuperän perusteella, mitkä suosikit näytetään uudessa välilehdessä.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Näytön asetukset";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Vain mobiilisuosikit";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Mainosten ja ponnahdusikkunoiden esto";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Avaa VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Hallitse";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Ota ilmoitukset käyttöön";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Anna DuckDuckGon ilmoittaa sinulle, jos yhteys katkeaa tai VPN:n tila muuttuu.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Saat ilmoituksen, jos yhteytesi katkeaa tai VPN:n tila muuttuu.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-ilmoitukset";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Palauta VPN-yhteys automaattisesti keskeytyksen jälkeen.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Aina käytössä";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-ilmoitukset";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection estää DNS-vuodot internetpalveluntarjoajallesi ohjaamalla DNS-pyynnöt VPN-verkon kautta omalle välittäjällemme.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Suojattu DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-asetukset";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Avataanko toisessa sovelluksessa?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Anonyymin raportin lähettäminen toimimattomasta sivustosta auttaa meitä korjaamaan nämä ongelmat ja parantamaan sovellusta.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Hae tai anna osoite";
 
diff --git a/DuckDuckGo/fi.lproj/PrivacyDashboard.strings b/DuckDuckGo/fi.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 2e02e8efdb..0000000000
--- a/DuckDuckGo/fi.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Sivusto on merkittävä seurantaverkosto";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.esimerkki.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Yritä uudelleen";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Tiedot ovat salaamattomia";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Ilmoita viallisesta sivustosta";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "PAHIMMAT SEURANTAVERKOSTOT";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Tarkista internetyhteytesi ja yritä uudelleen.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Parannettu arvosana";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Hups, ei toiminut";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.esimerkki.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Tietosuoja-arvosana";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Painike";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "TIETOSUOJAKÄYTÄNNÖT";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Nollaa seurantaverkostojen tilastot";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "PAHIMMAT SEURANTAVERKOSTOT";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Painike";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "SALATTU YHTEYS";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.esimerkki.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Painike";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.esimerkki.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Suojaamattomat sivustot";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Verkostoja estetty";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 seurainta estetty";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Ilmoita viallisesta sivustosta";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Tietosuojakäytännöt";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Pahimmat seuraajat";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Tietosuojakäytäntöjä ei löytynyt";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Suojaamattomat sivustot";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Hyvät tietosuojakäytännöt";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Sivuston yksityisyydensuoja";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "PAHIMMAT SEURANTAVERKOSTOT";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Sivuston yksityisyydensuoja";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "PAHIMMAT SEURANTAVERKOSTOT";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Salattu yhteys";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Yksityisyyden suoja on väliaikaisesti poistettu käytöstä, koska se näyttäisi rikkovan tämän sivun.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Tärkeitä verkostoja estetty";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "SEURANTAVERKOSTOJEN YLEISYYS";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 Muuta verkkotunnusta ladattu";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Salattu yhteys";
-
diff --git a/DuckDuckGo/fi.lproj/Settings.strings b/DuckDuckGo/fi.lproj/Settings.strings
index 11b81ffefe..f684826ce3 100644
--- a/DuckDuckGo/fi.lproj/Settings.strings
+++ b/DuckDuckGo/fi.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Tyhjennä tiedot automaattisesti";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Lisätietoa: duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Asetukset";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Oletus";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Itsestään selvää tietosuojaa. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Evästeiden hallinnan ponnahdusikkunat";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Tietosuoja on käytössä kaikilla sivustoilla";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Kuvake";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Lisää DuckDuckGolta";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronoi";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronoi ja varmuuskopioi";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Selaa yksityisesti Mac-sovelluksellamme ";
diff --git a/DuckDuckGo/fr.lproj/Feedback.strings b/DuckDuckGo/fr.lproj/Feedback.strings
index e829b3329b..31997163c4 100644
--- a/DuckDuckGo/fr.lproj/Feedback.strings
+++ b/DuckDuckGo/fr.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Non merci ! J'ai terminé";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Fermer";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Partagez vos commentaires";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Quel site Web pose problème ?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Signaler un problème de site";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Partagez vos commentaires";
 
diff --git a/DuckDuckGo/fr.lproj/Localizable.strings b/DuckDuckGo/fr.lproj/Localizable.strings
index e29c841bb2..2b4df59dc5 100644
--- a/DuckDuckGo/fr.lproj/Localizable.strings
+++ b/DuckDuckGo/fr.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Modifier";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Les signets existants ne seront pas dupliqués.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Vous avez dépassé le nombre maximal de signets à synchroniser. Veuillez en supprimer quelques-uns pour pouvoir sauvegarder vos signets.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "La synchronisation des signets est suspendue";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Vous avez dépassé le nombre maximal de mots de passe à synchroniser. Veuillez en supprimer quelques-uns pour pouvoir sauvegarder vos mots de passe.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "La synchronisation des mots de passe est suspendue";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "En savoir plus";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Ajouter tous les onglets aux signets ?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importez un fichier HTML de signets à partir d'un autre navigateur, ou exportez vos signets existants.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Les commentaires n'ont pas pu être chargés";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Le contenu est manquant";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "La fenêtre contextuelle des cookies n'a pas été gérée";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Les images n'ont pas pu être chargées";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Les liens ou les boutons ne fonctionnent pas";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Je ne peux pas me connecter";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Autre chose";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Le site m'a demandé de désactiver";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Le navigateur est incompatible";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "La vidéo n'a pas été lue";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Sélectionnez votre problème dans la liste...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SÉLECTIONNER UNE CATÉGORIE";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Le fait de partager plus d'informations peut nous aider à résoudre ce problème";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "DÉCRIVEZ CE QU'IL S'EST PASSÉ";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "case : %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Supprimer";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Tous les favoris de l'appareil";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Choisissez les favoris à afficher dans un nouvel onglet en fonction de leur origine.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Préférences d'affichage";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Favoris sur mobile uniquement";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Bloquer les publicités et les fenêtres contextuelles";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Ouvrir le VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Gérer";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Activer les notifications";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Autorisez DuckDuckGo à vous avertir si votre connexion échoue ou si l'état de votre VPN change.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Recevez une notification si votre connexion échoue ou si l'état de votre VPN change.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Alertes VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Restaurez automatiquement une connexion VPN après une interruption.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Toujours activé";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Notifications VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection empêche les fuites DNS vers votre fournisseur de services Internet en acheminant les requêtes DNS via le tunnel VPN vers notre propre résolveur.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "DNS sécurisé";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Paramètres VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Ouvrir dans une autre application ?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "La soumission d'un rapport anonyme pour signaler le mauvais fonctionnement du site nous aide à déboguer ces problèmes et à améliorer l'application.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Rechercher ou saisir une adresse";
 
diff --git a/DuckDuckGo/fr.lproj/PrivacyDashboard.strings b/DuckDuckGo/fr.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 59c30dea8b..0000000000
--- a/DuckDuckGo/fr.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Le site est un réseau majeur de traqueurs";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.exemple.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Réessayer";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Les données ne sont pas chiffrées";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Signaler un problème de site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Vérifiez votre connexion Internet, puis réessayez.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Degré amélioré";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Oups, cela n'a pas fonctionné";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.exemple.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Degré de confidentialité";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Bouton";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRATIQUES DE CONFIDENTIALITÉ";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Réinitialiser les statistiques du réseau de traqueurs";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Bouton";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "CONNEXION CHIFFRÉE";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.exemple.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Bouton";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.exemple.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Sites non protégés";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Réseaux bloqués";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 traqueurs bloqués";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Signaler un problème de site";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Pratiques de confidentialité";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Principaux coupables";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Aucune pratique de confidentialité trouvée";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Sites non protégés";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Bonnes pratiques de confidentialité";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Protection de la confidentialité du site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Protection de la confidentialité du site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Connexion chiffrée";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Nous avons temporairement désactivé la protection de la confidentialité car elle semble perturber ce site.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Réseaux majeurs bloqués";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FRÉQUENCE DU RÉSEAU DE TRAQUEURS";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 autres domaines chargés";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Connexion chiffrée";
-
diff --git a/DuckDuckGo/fr.lproj/Settings.strings b/DuckDuckGo/fr.lproj/Settings.strings
index b4e289ee89..2fc2c6d4d7 100644
--- a/DuckDuckGo/fr.lproj/Settings.strings
+++ b/DuckDuckGo/fr.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Effacer automatiquement les données";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Pour en savoir plus, visitez duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Paramètres";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Défaut";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "La confidentialité, simplifiée. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gérer les fenêtres contextuelles (cookies)";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "La protection de la confidentialité est activée pour tous les sites";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icône";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Plus de la part de DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronisation";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronisation et sauvegarde";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Naviguez incognito avec notre application pour Mac ";
diff --git a/DuckDuckGo/hr.lproj/Feedback.strings b/DuckDuckGo/hr.lproj/Feedback.strings
index db97dd3363..0789000dcd 100644
--- a/DuckDuckGo/hr.lproj/Feedback.strings
+++ b/DuckDuckGo/hr.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, hvala! Završio/la sam";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Zatvori";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Podijeli povratne informacije";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Koje je web-mjesto neispravno?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Prijavi neispravno web-mjesto";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Podijeli povratne informacije";
 
diff --git a/DuckDuckGo/hr.lproj/Localizable.strings b/DuckDuckGo/hr.lproj/Localizable.strings
index 47220b3f4c..442bb1fb10 100644
--- a/DuckDuckGo/hr.lproj/Localizable.strings
+++ b/DuckDuckGo/hr.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Uredi";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Postojeće knjižne oznake neće se duplicirati.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Prekoračeno je ograničenje sinkronizacije oznaka. Pokušaj izbrisati neke oznake. Dok se to ne riješi, tvoje se oznake neće sigurnosno kopirati.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Sinkronizacija oznaka je pauzirana";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Prekoračeno je ograničenje sinkronizacije lozinki. Pokušaj izbrisati neke lozinke. Dok se to ne riješi, tvoje se lozinke neće sigurnosno kopirati.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Sinkronizacija lozinki je pauzirana";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Saznajte više";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "U redu";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Označi sve kartice?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Uvezite HTML datoteku oznaka iz drugog preglednika ili izvezite postojeće oznake.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Komentari se nisu učitali";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Nedostaje sadržaj";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Nisu određena pravila za skočne prozore kolačića";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Slike se nisu učitale";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Poveznice ili gumbi ne funkcioniraju";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Ne mogu se prijaviti";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Nešto drugo";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Web-mjesto zatražilo je da onemogućim";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Preglednik nije kompatibilan";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Videozapis se nije reproducirao";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Odaberi svoj problem s popisa...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "ODABERI KATEGORIJU";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Dijeljenje više pojedinosti može nam pomoći u rješavanju ovog problema";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "OPIŠITE ŠTO SE DOGODILO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Ukloni";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Svi favoriti na uređaju";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Odaberi koje favorite želiš prikazati na novoj kartici na temelju njihove izvorne lokacije.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Željeni prikaz";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Samo favoriti na mobilnom uređaju";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokiranje oglasa i skočnih prozora";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Otvori VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Upravljanje";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Uključi obavijesti";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Dopusti DuckDuckGou da te obavijesti ako se tvoja veza prekine ili se status VPN-a promijeni.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Primaj obavijesti ako se tvoja veza prekine ili se status VPN-a promijeni.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN upozorenja";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Automatski obnovi VPN vezu nakon prekida.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Uvijek uključeno";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN obavijesti";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Mrežna zaštita sprječava curenje DNS-a tvom davatelju internetskih usluga usmjeravanjem DNS upita kroz VPN tunel na naš vlastiti rješavač.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Siguran DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN postavke";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otvori u drugoj aplikaciji?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Slanje anonimnog izvješća o neispravnom web-mjestu pomaže nam da ispravimo te probleme i poboljšamo aplikaciju.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Pretraži ili unesi adresu";
 
diff --git a/DuckDuckGo/hr.lproj/PrivacyDashboard.strings b/DuckDuckGo/hr.lproj/PrivacyDashboard.strings
deleted file mode 100644
index f27dae05e4..0000000000
--- a/DuckDuckGo/hr.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Web-mjesto glavna je mreža za praćenje";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Pokušaj ponovo";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Podaci nisu šifrirani";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Prijavi neispravno web-mjesto";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "NAJVEĆI PREKRŠITELJI OD MREŽA ZA PRAĆENJE";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Provjeri svoju internetsku vezu i pokušaj ponovo.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Poboljšana ocjena";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "O ne, to nije uspjelo";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Ocjena zaštite privatnosti";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Gumb";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRAKSE ZAŠTITE PRIVATNOSTI";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Poništi mrežnu statistiku tragača";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "NAJČEŠĆI MREŽNI TRAGAČI";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Gumb";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŠIFRIRANA VEZA";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Gumb";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Nezaštićena web-mjesta";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Mreže blokirane";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Blokirano 8 tragača";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Prijavi neispravno web-mjesto";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Prakse zaštite privatnosti";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Najčešći tragači";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nisu pronađene prakse zaštite privatnosti";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Nezaštićena web-mjesta";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Dobre prakse zaštite privatnosti";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Zaštita privatnosti web-mjesta";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "NAJČEŠĆI MREŽNI TRAGAČI";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Zaštita privatnosti web-mjesta";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "NAJČEŠĆI MREŽNI TRAGAČI";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Šifrirana veza";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Privremeno smo onemogućili zaštitu privatnosti jer se čini da narušava ovo web-mjesto.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Glavne mreže su blokirane";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "UČESTALOST MREŽNIH TRAGAČA";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Učitano je još 8 domena";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Šifrirana veza";
-
diff --git a/DuckDuckGo/hr.lproj/Settings.strings b/DuckDuckGo/hr.lproj/Settings.strings
index 522994e162..5b4efa5072 100644
--- a/DuckDuckGo/hr.lproj/Settings.strings
+++ b/DuckDuckGo/hr.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automatsko brisanje podataka";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Više na duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Postavke";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Zadano";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Zaštita privatnosti, pojednostavljeno. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Upravljanje skočnim prozorima kolačića";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Zaštita privatnosti omogućena za sva web-mjesta";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Više od DuckDuckGoa";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinkronizacija";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinkronizacija i sigurnosno kopiranje";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Pretražujte privatno s našom aplikacijom za Mac ";
diff --git a/DuckDuckGo/hu.lproj/Feedback.strings b/DuckDuckGo/hu.lproj/Feedback.strings
index ad536e2dd3..47b8cd039d 100644
--- a/DuckDuckGo/hu.lproj/Feedback.strings
+++ b/DuckDuckGo/hu.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nem, köszönöm. Kész vagyok.";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Bezárás";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Visszajelzés megosztása";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Melyik weboldal nem működik?”";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Hibás weboldal jelentése";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Visszajelzés megosztása";
 
diff --git a/DuckDuckGo/hu.lproj/Localizable.strings b/DuckDuckGo/hu.lproj/Localizable.strings
index 340223040d..7fb08d0a2e 100644
--- a/DuckDuckGo/hu.lproj/Localizable.strings
+++ b/DuckDuckGo/hu.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Szerkesztés";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "A meglévő könyvjelzők nem kettőződnek.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Túllépted a szinkronizálható könyvjelzők maximális számát. Próbálj törölni néhány könyvjelzőt. Amíg ezt nem sikerül megoldani, a könyvjelzőkről nem készül biztonsági másolat.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "A könyvjelzők szinkronizálása szünetel";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Túllépted a szinkronizálható jelszavak maximális számát. Próbálj törölni néhány jelszót. Amíg ezt nem sikerül megoldani, a jelszavakról nem készül biztonsági másolat.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "A jelszavak szinkronizálása szünetel";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "További részletek";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Az összes lapot könyvjelzőzöd?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Könyvjelzőket tartalmazó HTML-fájl importálása másik gépről, vagy a meglévő könyvjelzők exportálása.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "A megjegyzések nem töltődtek be";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Hiányzik a tartalom";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "A felugró sütiablak nem lett kezelve";
-
-/* Broken Site Category */
-"brokensite.category.images" = "A képek nem töltődtek be";
-
-/* Broken Site Category */
-"brokensite.category.links" = "A hivatkozások vagy a gombok nem működnek";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Nem tudok bejelentkezni";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Valami más";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "A webhely kérte tőlem a letiltást";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "A böngésző nem kompatibilis";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "A videót nem játszotta le";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Válaszd ki a problémát a listából…";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VÁLASSZ KATEGÓRIÁT";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "A további részletek segítségünkre lehetnek a probléma megoldásában";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "ESEMÉNY LEÍRÁSA";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "gyűjtő: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Eltávolítás";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Eszközön lévő minden kedvenc";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Válaszd ki, hogy az eredetük alapján melyik kedvencek jelenjenek meg az új lapon.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Megjelenítési beállítások";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Csak mobilon lévő kedvencek";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Hirdetések és felugró ablakok letiltása";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "VPN megnyitása";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Kezelés";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Értesítések bekapcsolása";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Engedélyezd, hogy a DuckDuckGo értesítsen, ha a kapcsolat megszakad vagy a VPN állapota megváltozik.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Kapj értesítést, ha a kapcsolat megszakad vagy a VPN állapota megváltozik.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-figyelmeztetések";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "A VPN-kapcsolat automatikus helyreállítása megszakítás után.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Mindig be van kapcsolva";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-értesítések";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "A hálózatvédelem megakadályozza a DNS-szivárgást az internetszolgáltatód felé azáltal, hogy a DNS-lekérdezéseket a VPN-alagúton keresztül a saját feloldónkhoz irányítja.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Biztonságos DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-beállítások";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Megnyitás másik alkalmazásban?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Egy hibás webhelyről szóló névtelen bejelentés segít a hibakeresésben és az alkalmazás fejlesztésében.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Keresés vagy cím megadása";
 
diff --git a/DuckDuckGo/hu.lproj/PrivacyDashboard.strings b/DuckDuckGo/hu.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 59afe9e620..0000000000
--- a/DuckDuckGo/hu.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "A weboldal egy nagy nyomkövető-hálózat";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Próbáld újra";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Az adatok nincsenek titkosítva";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Hibás weboldal jelentése";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Ellenőrizd az internetkapcsolatodat, és próbáld újra.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Emelt fokozat";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Címke";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Hát, ez nem vált be.";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Adatvédelmi fokozat";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Gomb";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "ADATVÉDELMI GYAKORLATOK";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Nyomkövető hálózati statisztikák visszaállítása";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Gomb";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "TITKOSÍTOTT KAPCSOLAT";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Gomb";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Védelem nélküli weboldalak";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Hálózatok blokkolva";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 nyomkövető blokkolva";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Hibás weboldal jelentése";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Adatvédelmi gyakorlatok";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Fő bűnösök";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Címke";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nem találhatók adatvédelmi gyakorlatok";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Védelem nélküli weboldalak";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Címke";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Jó adatvédelmi gyakorlatok";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "A weboldal adatvédelme";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "A weboldal adatvédelme";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Titkosított kapcsolat";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Ideiglenesen letiltottuk az adatvédelmet, mert úgy tűnik, hogy kárt okoz ezen a webhelyen.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Fő blokkolt hálózatok";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "NYOMKÖVETŐ HÁLÓZAT GYAKORISÁGA";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 másik tartomány betöltve";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Titkosított kapcsolat";
-
diff --git a/DuckDuckGo/hu.lproj/Settings.strings b/DuckDuckGo/hu.lproj/Settings.strings
index e3b5199113..b6f3f5cc23 100644
--- a/DuckDuckGo/hu.lproj/Settings.strings
+++ b/DuckDuckGo/hu.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Adatok automatikus törlése";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "További információk a duckduckgo.com/about oldalon";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Beállítások";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Alapértelmezett";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Adatvédelem, leegyszerűsítve. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Felugró sütiablakok kezelése";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Adatvédelem engedélyezve minden weboldalhoz";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Továbbiak a DuckDuckGótól";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Szinkronizálás";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Szinkronizálás és biztonsági mentés";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Privát böngészés Maces alkalmazásunkkal ";
diff --git a/DuckDuckGo/it.lproj/Feedback.strings b/DuckDuckGo/it.lproj/Feedback.strings
index 57876c9c21..02bd8b8089 100644
--- a/DuckDuckGo/it.lproj/Feedback.strings
+++ b/DuckDuckGo/it.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "No, grazie! Ho finito";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Chiudi";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Condividi feedback";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Quale sito web è danneggiato?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Segnala sito danneggiato";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Condividi feedback";
 
diff --git a/DuckDuckGo/it.lproj/Localizable.strings b/DuckDuckGo/it.lproj/Localizable.strings
index 70109a5069..327788f150 100644
--- a/DuckDuckGo/it.lproj/Localizable.strings
+++ b/DuckDuckGo/it.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Modifica";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "I segnalibri già presenti non saranno duplicati.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Hai superato il limite di sincronizzazione dei segnalibri. Prova a eliminarne qualcuno. Fino a quando il problema non verrà risolto, non sarà eseguito il backup dei tuoi segnalibri.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "La sincronizzazione dei segnalibri è in pausa";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Hai superato il limite di sincronizzazione delle password. Prova a eliminarne qualcuna. Fino a quando il problema non verrà risolto, non sarà eseguito il backup delle tue password.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "La sincronizzazione delle password è in pausa";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Ulteriori informazioni";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Creare un segnalibro con tutte le schede?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importa un file HTML di segnalibri da un altro browser o esporta i segnalibri esistenti.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "I commenti non sono stati caricati";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Manca il contenuto";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Il pop-up dei cookie non era gestito";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Le immagini non sono state caricate";
-
-/* Broken Site Category */
-"brokensite.category.links" = "I collegamenti o i pulsanti non funzionano";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Non riesco ad accedere";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Qualcos'altro";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Il sito mi ha chiesto di disabilitare";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Il browser non è compatibile";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Il video non è stato riprodotto";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Seleziona il problema dall'elenco...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SELEZIONA UNA CATEGORIA";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Condividere maggiori dettagli può aiutarci a risolvere questo problema";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "DESCRIVI COSA È SUCCESSO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Rimuovi";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Tutti i preferiti sul dispositivo";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Scegli i preferiti da visualizzare in una nuova scheda in base alla loro origine.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Preferenze di visualizzazione";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Solo preferiti sul dispositivo mobile";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blocco di annunci e popup";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Apri VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Gestisci";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Attiva le notifiche";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Consenti a DuckDuckGo di inviarti notifiche se la tua connessione si interrompe o lo stato della VPN cambia.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Ricevi una notifica se la tua connessione si interrompe o lo stato della VPN cambia.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Avvisi VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Ripristina automaticamente una connessione VPN dopo un'interruzione.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Sempre attiva";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Notifiche VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection previene le fughe di DNS verso il tuo Internet Service Provider instradando le query DNS tramite tunneling VPN verso il nostro resolver.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "DNS sicuro";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Impostazioni VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Aprire in un'altra app?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "L'invio di un rapporto sul sito non funzionante nell'anonimato ci consente di eseguire il debug di questi problemi e migliorare l'app.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Cerca o digita l'indirizzo";
 
diff --git a/DuckDuckGo/it.lproj/PrivacyDashboard.strings b/DuckDuckGo/it.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 9bee227e61..0000000000
--- a/DuckDuckGo/it.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Il sito è una rete di tracciamento principale";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Riprova";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "I dati non sono crittografati";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Segnala sito danneggiato";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Verifica la tua connessione a Internet e riprova.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Punteggio migliorato";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etichetta";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Non ha funzionato";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Valutazione dell’affidabilità dei siti";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Pulsante";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRATICHE DI PRIVACY";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Reimposta le statistiche sulle reti dei sistemi di tracciamento";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Pulsante";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "CONNESSIONE CRITTOGRAFATA";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Pulsante";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Siti non protetti";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Reti bloccate";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 sistemi di tracciamento bloccati";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Segnala sito danneggiato";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Pratiche di privacy";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Minacce principali";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etichetta";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Pratiche di privacy non trovate";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Siti non protetti";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etichetta";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Buone pratiche di privacy";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Tutela della privacy del sito";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Tutela della privacy del sito";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Connessione crittografata";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Abbiamo temporaneamente disabilitato la Tutela della privacy poiché sembra che stia interrompendo il funzionamento del sito.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Reti principali bloccate";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FREQUENZA RETI DEI SISTEMI DI TRACCIAMENTO";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 altri domini caricati";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Connessione crittografata";
-
diff --git a/DuckDuckGo/it.lproj/Settings.strings b/DuckDuckGo/it.lproj/Settings.strings
index c50d0f31a9..ca6f845e18 100644
--- a/DuckDuckGo/it.lproj/Settings.strings
+++ b/DuckDuckGo/it.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Cancellazione automatica dei dati";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Scopri di più su duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Impostazioni";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Predefinito";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "La privacy semplificata. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gestisci popup dei cookie";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Tutela della privacy attivata per tutti i siti";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Ulteriori informazioni su DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronizzazione";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronizzazione e backup";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Naviga in privato con la nostra app per Mac ";
diff --git a/DuckDuckGo/lt.lproj/Feedback.strings b/DuckDuckGo/lt.lproj/Feedback.strings
index 018d11813a..48c7338f83 100644
--- a/DuckDuckGo/lt.lproj/Feedback.strings
+++ b/DuckDuckGo/lt.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, ačiū! Pakaks";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Uždaryti";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Bendrinti atsiliepimą";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Kuri svetainė neveikia?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Pranešti apie sugadintą svetainę";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Bendrinti atsiliepimą";
 
diff --git a/DuckDuckGo/lt.lproj/Localizable.strings b/DuckDuckGo/lt.lproj/Localizable.strings
index 3a1bb62474..716ca0ad61 100644
--- a/DuckDuckGo/lt.lproj/Localizable.strings
+++ b/DuckDuckGo/lt.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Redaguoti";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Esamos žymės nebus kopijuojamos.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Viršijote žymių sinchronizavimo limitą. Pabandykite ištrinti kai kurias žymes. Kol ši problema nebus išspręsta, nebus kuriamos atsarginės jūsų žymių kopijos.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Žymių sinchronizavimas pristabdytas";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Viršijote slaptažodžių sinchronizavimo limitą. Pabandykite ištrinti kai kuriuos slaptažodžius. Kol ši problema nebus išspręsta, nebus kuriamos atsarginės jūsų slaptažodžių kopijos.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Slaptažodžių sinchronizavimas pristabdytas";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Sužinoti daugiau";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "GERAI";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Pažymėti visus skirtukus?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Eksportuoti HTML žymelių failą iš kitos naršyklės arba eksportuoti esamas žymeles.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Komentarai neįkelti";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Trūksta turinio";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Iškylantysis slapukų langas nebuvo sutvarkytas";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Vaizdai neįkelti";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Nuorodos ar mygtukai neveikia";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Negaliu prisijungti";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Kažkas kito";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Svetainė paprašė manęs išjungti";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Naršyklė nesuderinama";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Vaizdo įrašas nepaleistas";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Pasirinkite problemą iš sąrašo...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "PASIRINKITE KATEGORIJĄ";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Jei pasidalinsime daugiau informacijos, galime padėti išspręsti šią problemą";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "APRAŠYKITE, KAS ATSITIKO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "talpykla: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Pašalinti";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Visi įrenginio mėgstamiausi";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Pasirinkite, kuriuos mėgstamiausius rodyti naujame skirtuke pagal jų vietą.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Ekrano nuostatos";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Tik mobiliojo mėgstamiausi";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklamų ir iššokančiųjų langų blokavimas";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Atviras VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Tvarkyti";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Įjungti pranešimus";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Leiskite „DuckDuckGo“ pranešti, jei nutrūksta ryšys arba pasikeičia VPN būsena.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Gaukite pranešimą, jei nutrūksta ryšys arba pasikeičia VPN būsena.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN įspėjimai";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Automatiškai atkurti VPN ryšį po nutrūkimo.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Visada įjungta";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN pranešimai";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Tinklo apsauga apsaugo nuo DNS nutekėjimo interneto paslaugų teikėjui, nukreipdama DNS užklausas per VPN tunelį į mūsų trūkumo šalinimo įrankį.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Saugi DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN nustatymai";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Atidaryti kitoje programoje?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Pateikdami anoniminę sugadintos svetainės ataskaitą, galime padėti išspręsti šias problemas ir patobulinti programėlę.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Ieškoti arba įvesti adresą";
 
diff --git a/DuckDuckGo/lt.lproj/PrivacyDashboard.strings b/DuckDuckGo/lt.lproj/PrivacyDashboard.strings
deleted file mode 100644
index a539b39a57..0000000000
--- a/DuckDuckGo/lt.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Svetainė yra didelis stebėjimo priemonių tinklas";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Bandyti dar kartą";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Duomenys nėra šifruojami";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Pranešti apie sugadintą svetainę";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Patikrinkite savo interneto ryšį ir bandykite dar kartą.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Pagerintas laipsnis";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etiketė";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Oi, nepavyko";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Privatumo laipsnis";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Mygtukas";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRIVATUMO PRAKTIKA";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Iš naujo nustatykite stebėjimo priemonės tinklo statistiką";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Mygtukas";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŠIFRUOTAS RYŠYS";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Mygtukas";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Neapsaugotos svetainės";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Tinklai užblokuoti";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Užblokuotos 8 stebėjimo priemonės";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Pranešti apie sugadintą svetainę";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Privatumo praktika";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Populiariausi pažeidėjai";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etiketė";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nerasta jokių privatumo praktikų";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Neapsaugotos svetainės";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etiketė";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Gera privatumo praktika";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Svetainės privatumo apsauga";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Svetainės privatumo apsauga";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Šifruotas ryšys";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Laikinai išjungiame privatumo apsaugą, kadangi atrodo, kad ji trukdo šios svetainės veikimui.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Pagrindiniai tinklai užblokuoti";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "STEBĖJIMO PRIEMONĖS TINKLO DAŽNIS";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Įkelti 8 kiti domenai";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Šifruotas ryšys";
-
diff --git a/DuckDuckGo/lt.lproj/Settings.strings b/DuckDuckGo/lt.lproj/Settings.strings
index c5ccd972b3..4f67084ae3 100644
--- a/DuckDuckGo/lt.lproj/Settings.strings
+++ b/DuckDuckGo/lt.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automatiškai valyti duomenis";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Daugiau informacijos rasite duckdukgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nustatymai";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Numatytoji";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Supaprastintas privatumas. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Valdyti slapukų iššokančiuosius langus";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privatumo apsauga įjungta visose svetainėse";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "„DuckDuckGo“";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Piktograma";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Daugiau iš „DuckDuckGo“";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinchronizuoti";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinchronizuoti ir kurti atsarginę kopiją";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Naršykite privačiai su mūsų „Mac“ skirta programa ";
diff --git a/DuckDuckGo/lv.lproj/Feedback.strings b/DuckDuckGo/lv.lproj/Feedback.strings
index b497d9cf11..7054c522ab 100644
--- a/DuckDuckGo/lv.lproj/Feedback.strings
+++ b/DuckDuckGo/lv.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nē, paldies! Es pabeidzu.";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Aizvērt";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Kopīgot atsauksmi";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Kura vietne ir bojāta?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Ziņot par bojātu vietni";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Kopīgot atsauksmi";
 
diff --git a/DuckDuckGo/lv.lproj/Localizable.strings b/DuckDuckGo/lv.lproj/Localizable.strings
index 02d64bd141..09a7d5fa0a 100644
--- a/DuckDuckGo/lv.lproj/Localizable.strings
+++ b/DuckDuckGo/lv.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Rediģēt";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Esošās grāmatzīmes netiks dublētas.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Tu esi pārsniedzis grāmatzīmju sinhronizācijas ierobežojumu. Mēģini izdzēst dažas grāmatzīmes. Kamēr šī problēma nebūs atrisināta, grāmatzīmes netiks dublētas.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Grāmatzīmju sinhronizācija ir apturēta";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Tu esi pārsniedzis paroļu sinhronizācijas ierobežojumu. Mēģini izdzēst dažas paroles. Kamēr šī problēma nebūs atrisināta, paroles netiks dublētas.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Paroļu sinhronizācija ir apturēta";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Uzzināt vairāk";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "Labi";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Vai pievienot grāmatzīmes visām cilnēm?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importē grāmatzīmju HTML failu no citas pārlūkprogrammas vai eksportē esošās grāmatzīmes.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Komentāri netika ielādēti";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Trūkst satura";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Sīkfailu uznirstošais logs netika pārvaldīts";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Attēli netika ielādēti";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Saites vai pogas nedarbojas";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Es nevaru pierakstīties";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Kaut kas cits";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Vietne pieprasīja atspējošanu";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Pārlūks nav saderīgs";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video netika demonstrēts";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Norādi problēmu sarakstā...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "ATLASĪT KATEGORIJU";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Sīkākas informācijas sniegšana var mums palīdzēt atrisināt šo problēmu";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "APRAKSTI NOTIKUŠO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Noņemt";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Visu ierīču izlase";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Izvēlies, kurus izlases vienumus rādīt jaunā cilnē, pamatojoties uz to izcelsmi.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Displeja preferences";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Tikai mobilā izlase";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklāmu un uznirstošo logu bloķēšana";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Atvērt VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Pārvaldīt";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Ieslēgt paziņojumus";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Ļauj DuckDuckGo tev paziņot, ja savienojums pārtrūkst vai mainās VPN statuss.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Saņem paziņojumu, ja savienojums pārtrūkst vai mainās VPN statuss.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN brīdinājumi";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Automātiski atjaunot VPN savienojumu pēc pārtraukuma.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Vienmēr ieslēgts";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN paziņojumi";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Tīkla aizsardzība novērš DNS noplūdi uz tavu interneta pakalpojumu sniedzēju, novirzot DNS vaicājumus caur VPN tuneli uz mūsu pašu atrisinātāju.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Drošs DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN iestatījumi";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Vai atvērt citā lietotnē?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Ja iesniegsi anonīmu ziņojumu par bojātu vietni, mēs varēsim atkļūdot šīs problēmas un uzlabot lietotni.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Meklē vai ievadi adresi";
 
diff --git a/DuckDuckGo/lv.lproj/PrivacyDashboard.strings b/DuckDuckGo/lv.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 4a1ff6a91e..0000000000
--- a/DuckDuckGo/lv.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Vietne ir lielākais izsekotāju tīkls";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.piemērs.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Mēģini vēlreiz";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Dati nav šifrēti";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Ziņot par bojātu vietni";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Pārbaudi interneta savienojumu un mēģini vēlreiz.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Uzlabots līmenis";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etiķete";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Ak, vai, tas nepalīdzēja.";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.piemērs.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Privātuma līmenis";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Poga";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRIVĀTUMA PRAKSE";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Atiestatīt izsekotāju tīklu statistiku";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Poga";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŠIFRĒTS SAVIENOJUMS";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.piemērs.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Poga";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.piemērs.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Neaizsargātas vietnes";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Tīkli ir bloķēti";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 izsekotāji ir bloķēti";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Ziņot par bojātu vietni";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Privātuma prakse";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Lielākie pārkāpēji";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etiķete";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Privātuma prakse nav atrasta";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Neaizsargātas vietnes";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etiķete";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Laba privātuma prakse";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Vietnes privātuma aizsardzība";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Vietnes privātuma aizsardzība";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Šifrēts savienojums";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Mēs īslaicīgi atspējojām privātuma aizsardzību, jo šķiet, ka tā traucē šīs vietnes darbību.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Lielākie tīkli ir bloķēti";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "IZSEKOTĀJU TĪKLU ATRAŠANAS BIEŽUMS";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Ielādēti 8 citi domēni";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Šifrēts savienojums";
-
diff --git a/DuckDuckGo/lv.lproj/Settings.strings b/DuckDuckGo/lv.lproj/Settings.strings
index 1cb5ae932d..23f21ecfb1 100644
--- a/DuckDuckGo/lv.lproj/Settings.strings
+++ b/DuckDuckGo/lv.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automātiski notīrīt datus";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Vairāk vietnē duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Iestatījumi";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Noklusējums";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Privātums – vienkāršots. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Pārvaldīt sīkfailu uznirstošos logus";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privātuma aizsardzība ir iespējota visām vietnēm";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Vairāk no DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinhronizēt";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinhronizācija un dublēšana";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Pārlūko privāti, izmantojot mūsu Mac lietotni ";
diff --git a/DuckDuckGo/nb.lproj/Feedback.strings b/DuckDuckGo/nb.lproj/Feedback.strings
index 20b8629dd4..ccff489698 100644
--- a/DuckDuckGo/nb.lproj/Feedback.strings
+++ b/DuckDuckGo/nb.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nei takk. Jeg er ferdig.";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Lukk";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Del tilbakemelding";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Hvilket nettsted fungerer ikke?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Rapporter nettstedfeil";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Del tilbakemelding";
 
diff --git a/DuckDuckGo/nb.lproj/Localizable.strings b/DuckDuckGo/nb.lproj/Localizable.strings
index 5ace68b096..29ea848984 100644
--- a/DuckDuckGo/nb.lproj/Localizable.strings
+++ b/DuckDuckGo/nb.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Rediger";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Eksisterende bokmerker blir ikke duplisert.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Du har overskredet grensen for synkronisering av bokmerker. Prøv å slette noen bokmerker. Inntil dette er løst, blir ikke bokmerkene sikkerhetskopiert.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Synkronisering av bokmerker er satt på pause";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Du har overskredet grensen for synkronisering av passord. Prøv å slette noen passord. Inntil dette er løst, blir ikke passordene sikkerhetskopiert.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Synkronisering av passord er satt på pause";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Finn ut mer";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Legg til alle faner i bokmerker?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importer en HTML-fil med bokmerker fra en annen nettleser, eller eksporter dine eksisterende bokmerker.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Kommentarene ble ikke lastet inn";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Innhold mangler";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Popup-vinduet om informasjonskapsler ble ikke håndtert";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Bildene ble ikke lastet inn";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Lenker eller knapper fungerer ikke";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Jeg kan ikke logge inn";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Noe annet";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Nettstedet ba meg om å deaktivere";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Nettleseren er inkompatibel";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video ble ikke avspilt";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Velg problemet ditt fra listen …";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VELG EN KATEGORI";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Hvis du gir oss flere detaljer, kan det hjelpe oss å løse dette problemet";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "BESKRIV HVA SOM SKJEDDE";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Fjern";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Alle favoritter på enheten";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Velg hvilke favoritter som skal vises på en ny fane basert på opprinnelsen deres.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Visningsinnstillinger";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Kun favoritter på mobil";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokkering av reklame og popups";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Åpne VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Administrere";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Slå på varslinger";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Tillat DuckDuckGo å varsle deg hvis tilkoblingen blir brutt eller VPN-statusen endret.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Få varsel hvis tilkoblingen blir brutt eller VPN-statusen endret.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-varsler";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Gjenopprett automatisk VPN-tilkobling etter avbrudd.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Alltid på";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-varsler";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Nettverksbeskyttelse forhindrer DNS-lekkasjer til internettleverandøren din ved å rute DNS-forespørsler gjennom VPN-tunnelen til vår egen resolver.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Sikker DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-innstillinger";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Åpne i en annen app?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Når du sender inn en anonym rapport om nettstedfeil, hjelper det oss med å feilsøke disse problemene og forbedre appen.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Søk eller skriv inn adresse";
 
diff --git a/DuckDuckGo/nb.lproj/PrivacyDashboard.strings b/DuckDuckGo/nb.lproj/PrivacyDashboard.strings
deleted file mode 100644
index a4c696de3d..0000000000
--- a/DuckDuckGo/nb.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Nettstedet er et stort sporingsnettverk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Prøv igjen";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Data er ikke kryptert";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Rapporter nettstedfeil";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "DE VERSTE SPORINGSNETTVERKENE";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Kontroller internettforbindelsen og prøv igjen.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Forsterket grad";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etikett";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Ops, det virket ikke";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Grad av personvern";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Knapp";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PERSONVERNPRAKSIS";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Nullstill tall for sporingsnettverk";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "DE VERSTE SPORINGSNETTVERKENE";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Knapp";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "KRYPTERT TILKOBLING";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Knapp";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Ubeskyttede nettsteder";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Nettverk blokkert";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 sporere blokkert";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Rapporter nettstedfeil";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Personvernpraksis";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Verste syndere";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etikett";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Ingen personvernpraksis funnet";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Ubeskyttede nettsteder";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etikett";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "God personvernpraksis";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Personvern for side";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "DE VERSTE SPORINGSNETTVERKENE";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Personvern for side";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "DE VERSTE SPORINGSNETTVERKENE";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Kryptert tilkobling";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Vi har midlertidig deaktivert personvernbeskyttelse, da det ser ut til å få nettstedet til å slutte å fungere.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Større nettverk blokkert";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FOREKOMST AV SPORINGSNETTVERK";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 andre domener lastet";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Kryptert tilkobling";
-
diff --git a/DuckDuckGo/nb.lproj/Settings.strings b/DuckDuckGo/nb.lproj/Settings.strings
index bbd8470e81..8c3750d5fb 100644
--- a/DuckDuckGo/nb.lproj/Settings.strings
+++ b/DuckDuckGo/nb.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Slett data automatisk";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Mer på duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Innstillinger";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standard";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Personvern gjort enkelt. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Administrer vinduer om informasjonskapsler";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Personvernbeskyttelse aktivert for alle nettsteder";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mer fra DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkr.";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronisering og sikkerhetskopiering";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Surf privat med vår app for Mac ";
diff --git a/DuckDuckGo/nl.lproj/Feedback.strings b/DuckDuckGo/nl.lproj/Feedback.strings
index 0aa9568bb8..343f7a90aa 100644
--- a/DuckDuckGo/nl.lproj/Feedback.strings
+++ b/DuckDuckGo/nl.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nee, bedankt! Ik ben klaar";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Sluiten";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Feedback delen";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Welke website is defect?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Defecte website melden";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Feedback delen";
 
diff --git a/DuckDuckGo/nl.lproj/Localizable.strings b/DuckDuckGo/nl.lproj/Localizable.strings
index 0a52970964..0d8da8c2e0 100644
--- a/DuckDuckGo/nl.lproj/Localizable.strings
+++ b/DuckDuckGo/nl.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Bewerken";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Bestaande bladwijzers worden niet gedupliceerd.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Je hebt de synchronisatielimiet voor bladwijzers overschreden. Probeer enkele bladwijzers te verwijderen. Er wordt geen back-up van je bladwijzers gemaakt totdat dit probleem is opgelost.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Synchronisatie van bladwijzers is gepauzeerd";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Je hebt de synchronisatielimiet voor wachtwoorden overschreden. Probeer enkele wachtwoorden te verwijderen. Er wordt geen back-up van je wachtwoorden gemaakt totdat dit probleem is opgelost.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Synchronisatie van wachtwoorden is gepauzeerd";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Meer informatie";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Alle tabbladen toevoegen als bladwijzer?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importeer een HTML-bestand met bladwijzers uit een andere browser of exporteer je bestaande bladwijzers.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Opmerkingen zijn niet geladen";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Inhoud ontbreekt";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Cookie-pop-up is niet beheerd";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Afbeeldingen zijn niet geladen";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Links of knoppen werken niet";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Ik kan niet inloggen";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Iets anders";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "De site heeft me gevraagd om uit te schakelen";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "De browser is niet compatibel";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video werd niet afgespeeld";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Kies je probleem in de lijst ...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SELECTEER EEN CATEGORIE";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Deel meer details om ons te helpen dit probleem op te lossen";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "BESCHRIJF WAT ER IS GEBEURD";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Verwijderen";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Alle favorieten op apparaat";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Kies welke favorieten je op een nieuw tabblad wilt weergeven op basis van hun herkomst.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Weergavevoorkeuren";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Alleen mobiele favorieten";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Advertentie- en pop-upblokkering";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "VPN openen";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Beheren";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Meldingen inschakelen";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Ontvang meldingen van DuckDuckGo als je verbinding wegvalt of de VPN-status verandert.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Ontvang een melding als je verbinding wegvalt of de VPN-status verandert.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-meldingen";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Herstel een VPN-verbinding automatisch na onderbreking.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Altijd aan";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-meldingen";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Netwerkbeveiliging voorkomt DNS-lekken naar je internetprovider door DNS-aanvragen via de VPN-tunnel naar onze eigen resolver te routeren.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Veilige DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-instellingen";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Openen in een andere app?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Als je een anoniem rapport voor een defecte site indient, kunnen we deze problemen oplossen en de app verbeteren.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Zoek of voer een adres in";
 
diff --git a/DuckDuckGo/nl.lproj/PrivacyDashboard.strings b/DuckDuckGo/nl.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 8b2c5e1cbe..0000000000
--- a/DuckDuckGo/nl.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Site is groot trackernetwerk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.voorbeeld.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Probeer het opnieuw";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Gegevens zijn niet versleuteld";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Defecte website melden";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "TOPOVERTREDERS TRACKERNETWERK";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Controleer je internetverbinding en probeer het opnieuw.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Verbeterde klasse";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Er is iets fout gegaan";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.voorbeeld.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Privacyklasse";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Knop";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRIVACYPRAKTIJKEN";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Trackernetwerkstatistieken resetten";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "TOPOVERTREDERS TRACKERNETWERK";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Knop";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "GECODEERDE VERBINDING";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.voorbeeld.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Knop";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.voorbeeld.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Onbeschermde sites";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Netwerken geblokkeerd";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 trackers geblokkeerd";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Defecte website melden";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Privacypraktijken";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Topovertreders";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Geen privacypraktijken gevonden";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Onbeschermde sites";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Goede privacypraktijken";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Privacybescherming van de site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "TOPOVERTREDERS TRACKERNETWERK";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Privacybescherming van de site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "TOPOVERTREDERS TRACKERNETWERK";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Gecodeerde verbinding";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "We hebben privacybescherming tijdelijk uitgeschakeld, omdat het erop lijkt dat deze site hierdoor niet goed meer werkt.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Grote netwerken geblokkeerd";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "TRACKERNETWERKFREQUENTIE";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 andere domeinen geladen";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Gecodeerde verbinding";
-
diff --git a/DuckDuckGo/nl.lproj/Settings.strings b/DuckDuckGo/nl.lproj/Settings.strings
index 96c60260cb..99c32eca3e 100644
--- a/DuckDuckGo/nl.lproj/Settings.strings
+++ b/DuckDuckGo/nl.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Gegevens automatisch wissen";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Meer informatie op duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Instellingen";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standaard";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Privacy, vereenvoudigd. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Cookiepop-ups beheren";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privacybescherming ingeschakeld voor alle sites";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Pictogram";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Meer over DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchroniseren";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronisatie en back-up";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Browse privé met onze app voor Mac ";
diff --git a/DuckDuckGo/pl.lproj/Feedback.strings b/DuckDuckGo/pl.lproj/Feedback.strings
index 020beeb122..d1b3e2eebe 100644
--- a/DuckDuckGo/pl.lproj/Feedback.strings
+++ b/DuckDuckGo/pl.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nie, dziękuję, skończyłem(-am)";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Zamknij";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Podziel się opinią";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Która witryna nie działa poprawnie?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Zgłoś uszkodzoną witrynę";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Podziel się opinią";
 
diff --git a/DuckDuckGo/pl.lproj/Localizable.strings b/DuckDuckGo/pl.lproj/Localizable.strings
index a9577094e3..f283b6e277 100644
--- a/DuckDuckGo/pl.lproj/Localizable.strings
+++ b/DuckDuckGo/pl.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Edytuj";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Istniejące zakładki nie zostaną zduplikowane.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Przekroczono limit synchronizacji zakładek. Spróbuj usunąć niektóre zakładki. Dopóki ten problem nie zostanie rozwiązany, nie będzie tworzona kopia zapasowa zakładek.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Synchronizacja zakładek jest wstrzymana";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Przekroczono limit synchronizacji haseł. Spróbuj usunąć niektóre hasła. Dopóki ten problem nie zostanie rozwiązany, nie będzie tworzona kopia zapasowa haseł.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Synchronizacja haseł jest wstrzymana";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Dowiedz się więcej";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Dodać wszystkie karty do zakładek?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Zaimportuj plik HTML z zakładkami z innej przeglądarki lub wyeksportuj istniejące zakładki.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Nie wczytano komentarzy";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Brakuje treści";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Nie zarządzano wyskakującymi okienkami plików cookie";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Obrazy nie zostały wczytane";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Łącza lub przyciski nie działają";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Nie mogę się zalogować";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Coś innego";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Witryna poprosiła mnie o wyłączenie";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Przeglądarka jest niezgodna";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Film nie został odtworzony";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Wybierz problem z listy...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "WYBIERZ KATEGORIĘ";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Udostępnienie szczegółowych informacji może pomóc nam rozwiązać ten problem";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "OPISZ, CO SIĘ STAŁO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "Zbiór: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Usuń";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Ulubione na urządzeniu";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Wybierz, które ulubione elementy mają być wyświetlane na nowej karcie w oparciu o ich źródło.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Preferencje wyświetlania";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Tylko ulubione z urządzeń mobilnych";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokowanie reklam i wyskakujących okienek";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Otwórz VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Zarządzaj";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Włącz powiadomienia";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Zezwól na powiadomienia DuckDuckGo o zerwaniu połączenia lub zmianie stanu VPN.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Otrzymuj powiadomienia o zerwaniu połączenia lub zmianie stanu VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Alerty VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Automatycznie przywracaj połączenie VPN po jego przerwaniu.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Zawsze włączone";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Powiadomienia VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Ochrona sieci zapobiega wyciekom DNS do dostawcy usług internetowych poprzez kierowanie zapytań DNS przez tunel VPN do naszego mechanizmu rozpoznawania nazw.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Bezpieczny DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Ustawienia VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otworzyć w innej aplikacji?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Przesłanie anonimowego raportu o uszkodzonej witrynie pomaga nam debugować te problemy i ulepszać aplikację.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Wyszukaj lub wprowadź adres";
 
diff --git a/DuckDuckGo/pl.lproj/PrivacyDashboard.strings b/DuckDuckGo/pl.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 356608dbb3..0000000000
--- a/DuckDuckGo/pl.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Strona stanowi główną sieć skryptów śledzących";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.domena.pl";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Spróbuj ponownie";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Dane są niezaszyfrowane";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Zgłoś uszkodzoną witrynę";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Sprawdź połączenie internetowe i spróbuj ponownie.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Podwyższony poziom";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etykieta";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Niestety to nie zadziałało";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.domena.pl";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Poziom prywatności";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Przycisk";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "POLITYKA PRYWATNOŚCI";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Zresetuj statystyki sieciowe modułu śledzącego";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Przycisk";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "POŁĄCZENIE ZASZYFROWANE";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.domena.pl";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Przycisk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.domena.pl";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Niezabezpieczone witryny";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Zablokowano sieci";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Zablokowano 8 skryptów śledzących";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Zgłoś uszkodzoną witrynę";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Polityka prywatności";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Najwięksi sprawcy";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etykieta";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nie znaleziono polityk prywatności";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Niezabezpieczone witryny";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etykieta";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Dobra polityka prywatności";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Ochrona prywatności witryny";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Ochrona prywatności witryny";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Połączenie zaszyfrowane";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Tymczasowo wyłączyliśmy ochronę prywatności, ponieważ wygląda na to, że zniekształca tę witrynę.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Zablokowane główne sieci";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "CZĘSTOTLIWOŚĆ SIECI SKRYPTÓW ŚLEDZĄCYCH";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Załadowano 8 innych domen";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Połączenie zaszyfrowane";
-
diff --git a/DuckDuckGo/pl.lproj/Settings.strings b/DuckDuckGo/pl.lproj/Settings.strings
index 0ce1fa9ac0..4afbe423ff 100644
--- a/DuckDuckGo/pl.lproj/Settings.strings
+++ b/DuckDuckGo/pl.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automatyczne czyszczenie danych";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Więcej informacji: duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ustawienia";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Domyślny";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Prywatność – jeszcze prostsza. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Zarządzaj okienkami z prośbą o zgodę";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Ochrona prywatności włączona dla wszystkich witryn";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Więcej możliwości DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronizacja";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronizacja i kopia zapasowa";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Przeglądaj prywatnie za pomocą aplikacji dla komputerów Mac ";
diff --git a/DuckDuckGo/pt.lproj/Feedback.strings b/DuckDuckGo/pt.lproj/Feedback.strings
index ec88efdd05..5fe33ac432 100644
--- a/DuckDuckGo/pt.lproj/Feedback.strings
+++ b/DuckDuckGo/pt.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Não, obrigado! Terminei";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Fechar";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Partilhar comentários";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Que site está com falhas?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Denunciar site danificado";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Partilhar comentários";
 
diff --git a/DuckDuckGo/pt.lproj/Localizable.strings b/DuckDuckGo/pt.lproj/Localizable.strings
index 929e1ca91a..8aa6300773 100644
--- a/DuckDuckGo/pt.lproj/Localizable.strings
+++ b/DuckDuckGo/pt.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Editar";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Os marcadores existentes não serão duplicados.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Excedeste o limite de sincronização de favoritos. Experimenta eliminar alguns favoritos. Não é possível fazer uma cópia de segurança dos favoritos até este problema estar resolvido.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "A sincronização de favoritos está em pausa";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Excedeste o limite de sincronização de palavras-passe. Experimenta eliminar algumas palavras-passe. Não é possível fazer uma cópia de segurança das palavras-passe até este problema estar resolvido.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "A sincronização de palavras-passe está em pausa";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Saiba mais";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Marcar todos os separadores?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importe um ficheiro HTML de marcadores de outro navegador ou exporte os seus marcadores existentes.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Os comentários não carregaram";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Falta conteúdo";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Não foi feita a gestão do pop-up de cookies";
-
-/* Broken Site Category */
-"brokensite.category.images" = "As imagens não carregaram";
-
-/* Broken Site Category */
-"brokensite.category.links" = "As ligações ou os botões não funcionam";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Não consigo iniciar sessão";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Outra coisa";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "O site pediu-me para desativar";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "O navegador é incompatível";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "O vídeo não foi reproduzido";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Escolhe o teu problema na lista…";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SELECIONA UMA CATEGORIA";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Indica mais detalhes para nos ajudares a resolver este problema";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "DESCREVER O QUE ACONTECEU";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "grupo: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Remover";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Todos os favoritos no dispositivo";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Escolhe os favoritos a apresentar num novo separador com base na respetiva origem.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Preferências de apresentação";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Apenas favoritos em dispositivos móveis";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Bloquear anúncios e pop-ups";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Abrir VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Gerir";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Ativar as notificações";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Permite que o DuckDuckGo te notifique se a tua ligação cair ou o estado da VPN mudar.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Recebe uma notificação se a tua ligação cair ou o estado da VPN mudar.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Alertas de VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Restaurar automaticamente uma ligação VPN após a interrupção.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Sempre ligada";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Notificações da VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "A Network Protection impede fugas de DNS para o teu fornecedor de serviços de internet ao encaminhar as consultas de DNS através do túnel da VPN para o nosso resolvedor.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "DNS seguro";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Definições da VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Abrir noutra aplicação?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "O envio de um relatório anónimo de site com problemas ajuda-nos a depurar e a melhorar a aplicação.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Pesquisar ou inserir endereço";
 
diff --git a/DuckDuckGo/pt.lproj/PrivacyDashboard.strings b/DuckDuckGo/pt.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 9508ef3c61..0000000000
--- a/DuckDuckGo/pt.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "O site é uma grande rede de rastreadores";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.exemplo.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Tentar novamente";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Os dados não estão encriptados";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Denunciar site danificado";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Verifique a sua ligação e tente de novo.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Grau melhorado";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Rótulo";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Oh, não funcionou";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.exemplo.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Grau de privacidade";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Botão";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRÁTICAS DE PRIVACIDADE";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Repor as estatísticas da rede de rastreamento";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Botão";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "LIGAÇÃO ENCRIPTADA";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.exemplo.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Botão";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.exemplo.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Sites desprotegidos";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Redes bloqueadas";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 rastreadores bloqueados";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Denunciar site danificado";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Práticas de privacidade";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Principais infratores";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Rótulo";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Não foram encontradas práticas de privacidade";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Sites desprotegidos";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Rótulo";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Boas práticas de privacidade";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Proteção de Privacidade do Site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Proteção de Privacidade do Site";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Ligação encriptada";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Desativámos temporariamente a Proteção de Privacidade, pois parece estar a bloquear este site.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Redes principais bloqueadas";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FREQUÊNCIA DE REDE DE RASTREAMENTO";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 domínios adicionais carregados";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Ligação encriptada";
-
diff --git a/DuckDuckGo/pt.lproj/Settings.strings b/DuckDuckGo/pt.lproj/Settings.strings
index e7f04d47c8..f136fee8f4 100644
--- a/DuckDuckGo/pt.lproj/Settings.strings
+++ b/DuckDuckGo/pt.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Limpar os dados automaticamente";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Mais em duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Definições";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Predefinido";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Privacidade, simplificada. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gerir pop-ups de cookies";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Proteção de Privacidade ativa para todos os sites";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ícone";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mais da DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronizar";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronização e cópia de segurança";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Navegue em privado com a nossa aplicação para Mac ";
diff --git a/DuckDuckGo/ro.lproj/Feedback.strings b/DuckDuckGo/ro.lproj/Feedback.strings
index c2715d7fcf..a0d66fdd73 100644
--- a/DuckDuckGo/ro.lproj/Feedback.strings
+++ b/DuckDuckGo/ro.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nu mulțumesc! Am terminat";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Închidere";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Partajează feedback";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Ce site este defect?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Raportați site-ul defect";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Partajează feedback";
 
diff --git a/DuckDuckGo/ro.lproj/Localizable.strings b/DuckDuckGo/ro.lproj/Localizable.strings
index 0064a3f2b3..2dcbdc6a07 100644
--- a/DuckDuckGo/ro.lproj/Localizable.strings
+++ b/DuckDuckGo/ro.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Editați";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Marcajele existente nu vor fi duplicate.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Ai depășit limita de sincronizare a marcajelor. Încearcă să ștergi unele marcaje. Până la rezolvarea acestei probleme, nu se va efectua copierea de rezervă pentru marcajele tale.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Sincronizarea marcajelor este întreruptă";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Ai depășit limita de sincronizare a parolelor. Încearcă să ștergi câteva parole. Până la rezolvarea acestei probleme, nu se va efectua copierea de rezervă pentru parolele tale.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Sincronizarea parolelor este întreruptă";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Află mai multe";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Marchezi toate filele?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importă un fișier HTML sau marcaje dintr-un alt browser sau exportă marcajele tale existente.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Comentariile nu s-au încărcat";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Conținutul lipsește";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Fereastra pop-up privind modulele cookie nu a fost gestionată";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Imaginile nu s-au încărcat";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Linkurile sau butoanele nu funcționează";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Nu mă pot conecta";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Altceva";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Site-ul mi-a cerut să dezactivez";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Browserul este incompatibil";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Videoclipul nu s-a redat";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Alegeți problema ta din listă...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "SELECTEAZĂ O CATEGORIE";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Comunicarea mai multor detalii ne poate ajuta să rezolvăm această problemă";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "DESCRIE CE S-A INTAMPLAT";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Elimină";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Toate favoritele de pe dispozitiv";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Alege ce favorite să afișezi într-o filă nouă în funcție de originea lor.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Preferințe de afișare";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Doar favoritele pentru mobil";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blocarea anunțurilor și ferestrelor pop-up";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Deschide VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Gestionează";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Activează Notificările";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Permite ca DuckDuckGo să te înștiințeze dacă conexiunea ta devine mai slabă sau dacă starea VPN-ului se schimbă.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Primește o notificare dacă conexiunea ta devine mai slabă sau dacă starea VPN-ului se schimbă.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Alerte VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Restaurează automat o conexiune VPN după întrerupere.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Întotdeauna activat";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Notificări VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection previne scurgerile DNS către furnizorul tău de servicii de internet prin direcționarea interogărilor DNS prin tunelul VPN către propriul nostru resolver.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "DNS securizat";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Setări VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Deschizi în altă aplicație?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Trimiterea unui raport anonim al unui site care nu funcționează ne ajută să corectăm aceste probleme și să îmbunătățim aplicația.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Caută sau introdu adresa";
 
diff --git a/DuckDuckGo/ro.lproj/PrivacyDashboard.strings b/DuckDuckGo/ro.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 740dd3c4ee..0000000000
--- a/DuckDuckGo/ro.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Site-ul este o rețea mare de instrumente de urmărire";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Încearcă din nou";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Datele sunt necriptate";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Raportați site-ul defect";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Verifică conexiunea la internet și încearcă din nou.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Grad mărit";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Of, nu a funcționat";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Grad de confidențialitate";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Buton";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRACTICI DE CONFIDENȚIALITATE";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Resetează statisticile despre rețelele de urmărire";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Buton";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "CONEXIUNE CRIPTATĂ";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Buton";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Site-uri neprotejate";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Rețele blocate";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 instrumente de urmărire blocate";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Raportați site-ul defect";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Practici privind confidențialitatea";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Principalii urmăritori";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nu s-au găsit practici privind confidențialitatea";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Site-uri neprotejate";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Bune practici privind confidențialitatea";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Protecția confidențialității site-ului";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Protecția confidențialității site-ului";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Conexiune criptată";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Am dezactivat temporar protecția confidențialității, deoarece pare să spargă acest site.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Rețele principale blocate";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FRECVENȚA REȚELELOR URMĂRITOARE";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 alte domenii încărcate";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Conexiune criptată";
-
diff --git a/DuckDuckGo/ro.lproj/Settings.strings b/DuckDuckGo/ro.lproj/Settings.strings
index c2b63de768..4404ec5c0d 100644
--- a/DuckDuckGo/ro.lproj/Settings.strings
+++ b/DuckDuckGo/ro.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Șterge automat datele";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Aflați mai multe la duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Setări";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Implicită";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Despre confidențialitate, pe scurt. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gestionare pop-up-uri pentru module cookie";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Protecția confidențialității este activată pentru toate site-urile";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Pictogramă";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mai multe de la DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronizare";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronizare și copiere de rezervă";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Răsfoiește în mod privat, cu aplicația noastră pentru Mac ";
diff --git a/DuckDuckGo/ru.lproj/Feedback.strings b/DuckDuckGo/ru.lproj/Feedback.strings
index b34300f93c..7b1bd5e71e 100644
--- a/DuckDuckGo/ru.lproj/Feedback.strings
+++ b/DuckDuckGo/ru.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Нет, спасибо. У меня пока всё";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Закрыть";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Оставьте нам отзыв";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "На каком сайте возникает проблема?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Сообщить о неработающем сайте";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Оставьте нам отзыв";
 
diff --git a/DuckDuckGo/ru.lproj/Localizable.strings b/DuckDuckGo/ru.lproj/Localizable.strings
index 4b79bf5001..c36a7b98e5 100644
--- a/DuckDuckGo/ru.lproj/Localizable.strings
+++ b/DuckDuckGo/ru.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Редактировать";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Существующие закладки дублироваться не будут.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Вы превысили лимит синхронизации закладок. Попробуйте удалить некоторые из них. Пока вы не устраните эту проблему, резервная копия закладок создаваться не будет.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Синхронизация закладок приостановлена";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Вы превысили лимит синхронизации паролей. Попробуйте удалить некоторые из них. Пока вы не устраните эту проблему, резервная копия закладок создаваться не будет.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Синхронизация паролей приостановлена";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Узнать больше";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "Хорошо";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Добавить все вкладки в закладки?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Импортировать файл HTML с закладками из другого браузера или экспортировать свои закладки.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Не загружаются комментарии";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Отсутствует содержимое";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Не выбраны настройки во всплывающем окне куки-файлов";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Не загружаются изображения";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Не работают ссылки или кнопки";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Не удается войти";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Что-то другое";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Сайт попросил меня отключить";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Несовместимость браузера";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Не воспроизводится видео";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Выберите проблему из списка...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "ВЫБЕРИТЕ КАТЕГОРИЮ";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Более подробная информация поможет нам быстрее найти решение";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "ОПИШИТЕ, ЧТО СЛУЧИЛОСЬ";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "контейнер: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Удалить";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Избранное со всех устройств";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Выберите, какие избранные объекты показывать в новой вкладке (в зависимости от места их нахождения).";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Настройки отображения";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Только избранное с телефона";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Блокировка рекламы и всплывающих окон";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Открыть настройки VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Настроить";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Включить уведомления";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Разрешить DuckDuckGo уведомлять вас о разрыве соединения или изменении состояния VPN.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "DuckDuckGo оповестит вас о разрыве соединения или изменении состояния VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Оповещения о VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Автоматически восстанавливать VPN-соединение в случае его прерывания.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Всегда включено";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Уведомления о VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Защита сети предотвращает утечку данных через DNS вашему интернет-провайдеру, направляя DNS-запросы через VPN-туннель к нашему собственному сопоставителю.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Безопасный DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Настройки VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Открыть в другом приложении?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Отправка анонимной жалобы на неработающий сайт помогает нам решить эти проблемы и улучшить приложение.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Введите поисковый запрос или адрес сайта";
 
diff --git a/DuckDuckGo/ru.lproj/PrivacyDashboard.strings b/DuckDuckGo/ru.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 75181675d4..0000000000
--- a/DuckDuckGo/ru.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Этот сайт — крупная сеть трекеров";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Повторите попытку";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Данные не шифруются";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Сообщить о неработающем сайте";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Проверьте подключение к интернету и повторите попытку.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Повышенный рейтинг конфиденциальности";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Метка";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Ой, не сработало";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Рейтинг конфиденциальности";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Кнопка";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "УРОВЕНЬ КОНФИДЕНЦИАЛЬНОСТИ";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Сброс статистики сетей трекеров";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Кнопка";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ЗАШИФРОВАННОЕ СОЕДИНЕНИЕ";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Кнопка";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Незащищенные сайты";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Заблокированы сети трекеров";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Заблокировано 8 трекеров";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Сообщить о неработающем сайте";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Уровень конфиденциальности";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Главные шпионы";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Метка";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Уровень конфиденциальности не определен";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Незащищенные сайты";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Метка";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Высокий уровень конфиденциальности";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Защита конфиденциальности сайта";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Защита конфиденциальности сайта";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Зашифрованное соединение";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Мы временно отключили функцию защиты конфиденциальности, так как она мешала работе сайта.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Заблокированы крупные сети трекеров";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "ЧАСТОТА БЛОКИРОВАНИЯ";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Загружено еще 8 доменов";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Зашифрованное соединение";
-
diff --git a/DuckDuckGo/ru.lproj/Settings.strings b/DuckDuckGo/ru.lproj/Settings.strings
index 7f84888c62..6b54a2d6c0 100644
--- a/DuckDuckGo/ru.lproj/Settings.strings
+++ b/DuckDuckGo/ru.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Автоудаление данных";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Подробнее на https://duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Настройки";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "По умолчанию";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Максимум конфиденциальности, минимум усилий. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Управление окнами выбора куки-файлов";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Защита конфиденциальности включена на всех сайтах";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Значок";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "DuckDuckGo также предлагает...";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Синхронизация";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Синхронизация и резервное копирование";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Интернет без трекеров с нашим приложением для Mac ";
diff --git a/DuckDuckGo/sk.lproj/Feedback.strings b/DuckDuckGo/sk.lproj/Feedback.strings
index 41fb371247..01a325f548 100644
--- a/DuckDuckGo/sk.lproj/Feedback.strings
+++ b/DuckDuckGo/sk.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nie, vďaka! Skončil/skončila som";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Zatvoriť";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Zdieľať spätnú väzbu";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Ktorá webová stránka je nefunkčná?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Nahlásiť nefunkčnú stránku";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Zdieľať spätnú väzbu";
 
diff --git a/DuckDuckGo/sk.lproj/Localizable.strings b/DuckDuckGo/sk.lproj/Localizable.strings
index 2cc71be60f..bfa9a50608 100644
--- a/DuckDuckGo/sk.lproj/Localizable.strings
+++ b/DuckDuckGo/sk.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Upraviť";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Existujúce záložky sa nebudú duplikovať.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Prekročili ste limit na synchronizáciu záložiek. Skúste niektoré záložky odstrániť. Kým to nevyriešite, vaše záložky sa nebudú zálohovať.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Synchronizácia záložiek je pozastavená.";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Prekročili ste limit na synchronizáciu hesiel. Skúste niektoré heslá odstrániť. Kým to nevyriešite, vaše heslá sa nebudú zálohovať.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Synchronizácia hesiel je pozastavená.";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Zistite viac";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Uložiť všetky karty medzi záložky?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importujte súbor HTML so záložkami z iného prehliadača alebo exportujte svoje existujúce záložky.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Komentáre sa nepodarilo načítať";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Chýba obsah";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Automaticky otvárané okno pre súbory cookie nebolo spravované";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Obrázky sa nepodarilo načítať";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Odkazy alebo tlačidlá nefungujú";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Nemôžem sa prihlásiť";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Niečo iné";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Táto stránka ma požiadala o deaktiváciu";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Prehliadač je nekompatibilný";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video sa neprehráva";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Vyberte problém zo zoznamu...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VYBERTE KATEGÓRIU";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Zdieľanie ďalších podrobností nám môže pomôcť vyriešiť tento problém";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "POPÍŠTE, ČO SA STALO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "vedro: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Odstrániť";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Obľúbené položky zo všetkých zariadení";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Vyberte, ktoré obľúbené položky sa majú zobraziť na novej karte na základe ich zdroja.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Nastavenia zobrazenia";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Iba obľúbené mobilné položky";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokovanie reklám a automaticky otváraných okien";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Otvoriť VPN sieť";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Spravujte stránku";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Zapnúť oznámenia";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Povoľte službe DuckDuckGo, aby vás upozornila, ak dôjde k prerušeniu pripojenia alebo zmene stavu VPN siete.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Dostávajte upozornenia, ak dôjde k prerušeniu pripojenia alebo sa zmení stav VPN siete.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Upozornenia týkajúce sa VPN siete";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Automatické obnovenie pripojenia VPN po prerušení.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Vždy zapnuté";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Oznámenia VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Ochrana siete zabraňuje úniku informácií DNS k poskytovateľovi internetových služieb tým, že presmeruje DNS požiadavky cez VPN tunel na náš vlastný, tzv. „DNS resolver“.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Zabezpečený systém DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Nastavenia siete VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otvoriť v inej aplikácii?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Odoslaním anonymného hlásenia o nefunkčnom webe nám pomôžete tieto problémy odstrániť a vylepšiť aplikáciu.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Vyhľadajte alebo zadajte adresu";
 
diff --git a/DuckDuckGo/sk.lproj/PrivacyDashboard.strings b/DuckDuckGo/sk.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 98a27974f1..0000000000
--- a/DuckDuckGo/sk.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Webová stránka je veľkou monitorovacou sieťou";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Skúste to znova";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Údaje sú nezašifrované";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Nahlásiť nefunkčnú stránku";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Skontrolujte svoje internetové pripojenie a skúste znova.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Posilnený stupeň";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Označenie";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Ľutujeme, to nefungovalo";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Stupeň ochrany súkromia";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Tlačidlo";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "SPÔSOBY OCHRANY SÚKROMIA";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Obnoviť štatistiky sledovacích sietí";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Tlačidlo";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŠIFROVANÉ PRIPOJENIE";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Tlačidlo";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Nezabezpečené webové stránky";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Siete boli zablokované";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Zablokovalo sa 8 sledovacích zariadení";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Nahlásiť nefunkčnú stránku";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Spôsoby ochrany súkromia";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Top prenasledovatelia";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Označenie";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Nenašli sa žiadne postupy ochrany súkromia";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Nezabezpečené webové stránky";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Označenie";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Osvedčené spôsoby ochrany súkromia";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Ochrana súkromia stránky";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Ochrana súkromia stránky";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Šifrované pripojenie";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Dočasne sme vypli ochranu súkromia, pretože sa zdá, že spôsobuje poruchy na tejto lokalite.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Hlavné siete boli zablokované";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FREKVENCIA SLEDOVACÍCH SIETÍ";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "Bolo načítaných ďalších 8 domén";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Šifrované pripojenie";
-
diff --git a/DuckDuckGo/sk.lproj/Settings.strings b/DuckDuckGo/sk.lproj/Settings.strings
index 6864fb3a4f..5aba47196d 100644
--- a/DuckDuckGo/sk.lproj/Settings.strings
+++ b/DuckDuckGo/sk.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automaticky vymazať údaje";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Viac informácií na stránke duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nastavenia";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Štandardný";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Súkromie, zjednodušene. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Správa kontextových okien súborov cookie";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Ochrana súkromia je zapnutá pre všetky webové stránky";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Viac od DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronizácia";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronizácia a zálohovanie";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Prezerajte si súkromne stránky s našou aplikáciou pre Mac ";
diff --git a/DuckDuckGo/sl.lproj/Feedback.strings b/DuckDuckGo/sl.lproj/Feedback.strings
index a5fbc20190..c4005555fd 100644
--- a/DuckDuckGo/sl.lproj/Feedback.strings
+++ b/DuckDuckGo/sl.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, hvala! Zaključil/a sem";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Zapri";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Deli povratne informacije";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Katera spletna stran je poškodovana?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Prijavi nedelujočo stran";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Deli povratne informacije";
 
diff --git a/DuckDuckGo/sl.lproj/Localizable.strings b/DuckDuckGo/sl.lproj/Localizable.strings
index 47190ef484..ccf5941d44 100644
--- a/DuckDuckGo/sl.lproj/Localizable.strings
+++ b/DuckDuckGo/sl.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Uredi";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Obstoječi zaznamki ne bodo podvojeni.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Presegli ste omejitev sinhronizacije zaznamkov. Poskusite izbrisati nekaj zaznamkov. Dokler ta težava ne bo odpravljena, zaznamki ne bodo varnostno kopirani.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Sinhronizacija zaznamkov je zaustavljena";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Presegli ste omejitev sinhronizacije gesel. Poskusite izbrisati nekaj gesel. Dokler ta težava ne bo odpravljena, vaša gesla ne bodo varnostno kopirana.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Sinhronizacija gesel je zaustavljena";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Več";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "V REDU";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Želiš dodati vse zavihke med zaznamke?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Uvozite datoteko HTML z zaznamki iz drugega brskalnika ali pa izvozite vaše obstoječe zaznamke.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Komentarji se niso naložili";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Vsebina manjka";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Pojavno okno za piškotke ni bilo upravljano";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Slike se niso naložile";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Povezave ali tipke ne delujejo";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Ne morem se prijaviti";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Nekaj drugega";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Spletišče me je prosilo, da onemogočim";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Brskalnik ni združljiv";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video se ni predvajal";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Svoje vprašanje izberite s seznama ...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "IZBERITE KATEGORIJO";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Če z nami delite več podrobnosti, nam to lahko pomaga pri reševanju te težave";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "OPIŠITE, KAJ SE JE ZGODILO";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "zbiralnik: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Odstrani";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Priljubljene iz vseh naprav";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Izberite priljubljene, ki naj se prikažejo v novem zavihku, glede na njihov izvor.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Nastavitve prikaza";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Priljubljene samo iz mobilne naprave";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokiranje oglasov in pojavnih oken";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Odpri VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Upravljanje";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Vključite obvestila";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Dovolite, da vas DuckDuckGo obvesti o prekinitvi povezave ali spremembi stanja VPN.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Prejmite obvestilo o prekinitvi povezave ali spremembi stanja VPN.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "Opozorila VPN";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Samodejno obnovite povezavo VPN po prekinitvi.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Vedno vklopljeno";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "Obvestila VPN";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Zaščita omrežja preprečuje uhajanje podatkov DNS k ponudniku internetnih storitev, saj poizvedbe DNS usmerja prek tunela VPN k lastnemu razreševalniku.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Varen DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "Nastavitve VPN";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Odpri v drugi aplikaciji?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Če pošljete poročilo o anonimnem pokvarjenem spletišču, nam pomagate odpraviti napake in izboljšati aplikacijo.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Poišči ali vnesi naslov";
 
diff --git a/DuckDuckGo/sl.lproj/PrivacyDashboard.strings b/DuckDuckGo/sl.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 623216482f..0000000000
--- a/DuckDuckGo/sl.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Spletno mesto je glavno sledilno omrežje";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Poskusi znova";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Podatki niso šifrirani";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Prijavi nedelujočo stran";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Preverite internetno povezavo in poskusite znova.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Izboljšana ocena";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Oznaka";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Joj, to pa ni uspelo";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Ocena zasebnosti";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Gumb";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "PRAKSE ZASEBNOSTI";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Ponastavi statistične podatke sledilnega omrežja";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Gumb";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŠIFRIRANA POVEZAVA";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Gumb";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Nezaščitene strani";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Blokirana omrežja";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "Blokiranih 8 sledilnikov";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Prijavi nedelujočo stran";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Prakse zasebnosti";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Glavni kršitelji";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Oznaka";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Ni najdenih praks zasebnosti";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Nezaščitene strani";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Oznaka";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Dobre prakse zasebnosti";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Zaščita zasebnosti na strani";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Zaščita zasebnosti na strani";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Šifrirana povezava";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Začasno smo onemogočili zaščito zasebnosti, saj se zdi, da zato pride do napak na tem spletnem mestu.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Glavna blokirana omrežja";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "POGOSTOST SLEDENJA OMREŽIJ";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 drugih naloženih domen";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Šifrirana povezava";
-
diff --git a/DuckDuckGo/sl.lproj/Settings.strings b/DuckDuckGo/sl.lproj/Settings.strings
index 5c032acda2..ec4d2b7bf2 100644
--- a/DuckDuckGo/sl.lproj/Settings.strings
+++ b/DuckDuckGo/sl.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Samodejno počisti podatke";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Več na duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nastavitve";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Privzeto";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Zasebnost, poenostavljeno. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Upravljanje pojavnih oken za piškotke";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Zaščita zasebnosti omogočena za vsa spletna mesta";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Več od iskalnika DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinhronizacija";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinhronizacija in varnostno kopiranje";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Brskajte zasebno z našo aplikacijo za računalnike Mac ";
diff --git a/DuckDuckGo/sv.lproj/Feedback.strings b/DuckDuckGo/sv.lproj/Feedback.strings
index 1c1dce6277..426fab986c 100644
--- a/DuckDuckGo/sv.lproj/Feedback.strings
+++ b/DuckDuckGo/sv.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nej tack! Jag är klar.";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Stäng";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Berätta vad du tycker";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Vilken webbplats är skadad?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Rapportera skadad webbplats";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Berätta vad du tycker";
 
diff --git a/DuckDuckGo/sv.lproj/Localizable.strings b/DuckDuckGo/sv.lproj/Localizable.strings
index 8cd3fdbc47..5e05b4d917 100644
--- a/DuckDuckGo/sv.lproj/Localizable.strings
+++ b/DuckDuckGo/sv.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Redigera";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Befintliga bokmärken kommer inte att kopieras.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Du har överskridit gränsen för bokmärkessynkronisering. Ta bort några bokmärken. Dina bokmärken kommer inte att säkerhetskopieras förrän detta har åtgärdats.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Bokmärkessynkronisering är pausad";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Du har överskridit gränsen för lösenordssynkronisering. Ta bort några lösenord. Dina lösenord kommer inte att säkerhetskopieras förrän detta har åtgärdats.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Lösenordssynkronisering är pausad";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Läs mer";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "OK";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Bokmärk alla flikar?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importera en HTML-fil med bokmärken från en annan webbläsare eller exportera dina befintliga bokmärken.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Kommentarer laddades inte";
-
-/* Broken Site Category */
-"brokensite.category.content" = "Innehåll saknas";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Popup-fönster för cookies hanterades inte";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Bilder laddades inte";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Länkar eller knappar fungerar inte";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Jag kan inte logga in";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Övrigt";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Webbplatsen bad mig att avaktivera";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Webbläsaren är inte kompatibel";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Videon spelades inte upp";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Välj din fråga i listan ...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "VÄLJ EN KATEGORI";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Om du delar mer information kan det hjälpa oss att lösa det här problemet";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "BERÄTTA VAD SOM HÄNDE";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Ta bort";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Alla enhetsfavoriter";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Välj vilka favoriter som ska visas på en ny flik baserat på deras ursprung.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Visningsinställningar";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Endast mobila favoriter";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blockering av annonser och poppuppfönster";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "Öppna VPN";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Hantera";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Aktivera aviseringar";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Tillåt DuckDuckGo att meddela dig om din anslutning bryts eller VPN-statusen ändras.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Få en avisering om din anslutning bryts eller om VPN-statusen ändras.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN-varningar";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Återställ automatiskt en VPN-anslutning efter avbrott.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Alltid på";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN-aviseringar";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Network Protection förhindrar DNS-läckor till din internetleverantör genom att dirigera DNS-frågor genom VPN-tunneln till vår egen resolver.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Säker DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN-inställningar";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Öppna i annan app?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Om du skickar in en anonym anmälan om att webbplatsen inte fungerar hjälper det oss att åtgärda problemet och förbättra appen.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Sök eller ange adress";
 
diff --git a/DuckDuckGo/sv.lproj/PrivacyDashboard.strings b/DuckDuckGo/sv.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 58b58cd04d..0000000000
--- a/DuckDuckGo/sv.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Webbplatsen är ett större spårningsnätverk";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Försök igen";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Okrypterad data";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Rapportera skadad webbplats";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "Kontrollera din internetanslutning och försök igen.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Förbättrad klass";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Etikett";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Hoppsan, det där fungerade inte";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Sekretessklass";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Knapp";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "INTEGRITETSPRAXIS";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "Återställ statistik för spårningsnätverk";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Knapp";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "KRYPTERAD ANSLUTNING";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Knapp";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Oskyddade webbplatser";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Nätverk blockerade";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 spårare blockerade";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Rapportera skadad webbplats";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Integritetspraxis";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "Främsta syndare";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Etikett";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Ingen integritetspraxis hittades";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Oskyddade webbplatser";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Etikett";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "God integritetspraxis";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Webbplatsens integritetsskydd";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Webbplatsens integritetsskydd";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Krypterad anslutning";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Vi har tillfälligt inaktiverat integritetsskydd eftersom det verkade göra att denna webbplats inte fungerade.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Stora nätverk blockerade";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "FREKVENS FÖR SPÅRNINGSNÄTVERK";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 andra domäner lästes in";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Krypterad anslutning";
-
diff --git a/DuckDuckGo/sv.lproj/Settings.strings b/DuckDuckGo/sv.lproj/Settings.strings
index 50d25a1314..5a1b5101ff 100644
--- a/DuckDuckGo/sv.lproj/Settings.strings
+++ b/DuckDuckGo/sv.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Rensa data automatiskt";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Mer på duckduckgo.com/about";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Inställningar";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standard";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Personlig integritet, förenklad. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Hantera popup-fönster för cookies";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Integritetsskydd aktiverat för alla webbplatser";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mer från DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronisering";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronisering och säkerhetskopiering";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Surfa privat med vår app för Mac ";
diff --git a/DuckDuckGo/tr.lproj/Feedback.strings b/DuckDuckGo/tr.lproj/Feedback.strings
index c16a94b613..20b5110818 100644
--- a/DuckDuckGo/tr.lproj/Feedback.strings
+++ b/DuckDuckGo/tr.lproj/Feedback.strings
@@ -10,9 +10,6 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Hayır Teşekkürler! Şimdilik Bu Kadar";
 
-/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
-"cZl-qB-kSL.title" = "Kapat";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Geri Bildirim Paylaş";
 
@@ -52,9 +49,6 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Hangi web sitesi hatalı?";
 
-/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
-"WjT-HM-yim.title" = "Hatalı Siteyi Bildir";
-
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Geri Bildirim Paylaş";
 
diff --git a/DuckDuckGo/tr.lproj/Localizable.strings b/DuckDuckGo/tr.lproj/Localizable.strings
index 1b87ef3f5d..4aed95b6cc 100644
--- a/DuckDuckGo/tr.lproj/Localizable.strings
+++ b/DuckDuckGo/tr.lproj/Localizable.strings
@@ -4,6 +4,9 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
+/* No comment provided by engineer. */
+"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
+
 /* Buton label for Edit action */
 "action.generic.edit" = "Düzenle";
 
@@ -133,6 +136,24 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Mevcut yer imleri çoğaltılmayacaktır.";
 
+/* Description for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-description" = "Yer işaretleri senkronizasyon sınırını aştınız. Bazı yer işaretlerini silmeyi deneyin. Bu sorun çözülene kadar yer işaretleriniz yedeklenmeyecektir.";
+
+/* Title for alert shown when sync bookmarks paused for too many items */
+"alert.sync-bookmarks-paused-title" = "Yer İşaretleri Senkronizasyonu Duraklatıldı";
+
+/* Description for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-description" = "Şifre senkronizasyon sınırını aştınız. Bazı şifreleri silmeyi deneyin. Bu sorun çözülene kadar şifreleriniz yedeklenmeyecektir.";
+
+/* Title for alert shown when sync credentials paused for too many items */
+"alert.sync-credentials-paused-title" = "Şifre Senkronizasyonu Duraklatıldı";
+
+/* Learn more button in alert */
+"alert.sync-paused-alert-learn-more-button" = "Daha Fazla Bilgi";
+
+/* Confirmation button in alert */
+"alert.sync-paused-alert-ok-button" = "Tamam";
+
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Tüm Sekmelere Yer İmi Eklensin mi?";
 
@@ -754,48 +775,6 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Yer işaretleri HTML dosyasını başka bir tarayıcıdan içeri aktarın veya mevcut yer işaretlerinizi dışarı aktarın.";
 
-/* Broken Site Category */
-"brokensite.category.comments" = "Yorumlar yüklenmedi";
-
-/* Broken Site Category */
-"brokensite.category.content" = "İçerik eksik";
-
-/* Broken Site Category */
-"brokensite.category.cookieprompt" = "Çerez açılır penceresi yönetilemedi";
-
-/* Broken Site Category */
-"brokensite.category.images" = "Resimler yüklenmedi";
-
-/* Broken Site Category */
-"brokensite.category.links" = "Bağlantılar veya düğmeler çalışmıyor";
-
-/* Broken Site Category */
-"brokensite.category.login" = "Oturum açamıyorum";
-
-/* Broken Site Category */
-"brokensite.category.other" = "Başka bir şey";
-
-/* Broken Site Category */
-"brokensite.category.paywall" = "Site benden devre dışı bırakmamı istedi";
-
-/* Broken Site Category */
-"brokensite.category.unsupported" = "Tarayıcı uyumsuz";
-
-/* Broken Site Category */
-"brokensite.category.videos" = "Video oynatılamadı";
-
-/* Broken Site Category Placeholder */
-"brokensite.categoryPlaceholder" = "Listeden yaşadığınız sorunu seçin...";
-
-/* Broken Site Category Section Title */
-"brokensite.categoryTitle" = "BİR KATEGORİ SEÇİN";
-
-/* Broken Site Comment Placeholder */
-"brokensite.commentPlaceholder" = "Daha fazla ayrıntı paylaşmak, bu sorunu çözmemize yardımcı olabilir";
-
-/* Broken Site Section Title */
-"brokensite.sectionTitle" = "NE OLDUĞUNU AÇIKLAYIN";
-
 /* No comment provided by engineer. */
 "bucket: %@" = "kova: %@";
 
@@ -1072,6 +1051,18 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Kaldır";
 
+/* Display Mode for favorites */
+"favorites.settings.all-devices" = "Tüm Cihaz Sık Kullanılanları";
+
+/* Footer of the favorites settings table */
+"favorites.settings.footer" = "Kaynaklarına göre hangi favorilerin yeni bir sekmede görüntüleneceğini seçin.";
+
+/* Header of the favorites settings table */
+"favorites.settings.header" = "Ekran Tercihleri";
+
+/* Display Mode for favorites */
+"favorites.settings.mobile-only" = "Yalnızca Mobil Favoriler";
+
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklam ve pop-up engelleme";
 
@@ -1438,6 +1429,9 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
+/* Title text for an iOS quick action that opens VPN settings */
+"network.protection.quick-action.open-vpn" = "VPN'i aç";
+
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1477,9 +1471,60 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
+/* Label shown on the title of the settings section in NetworkProtection's status view. */
+"network.protection.status.view.settings.section.title" = "Yönet";
+
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
+/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.button.title" = "Bildirimleri Açın";
+
+/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
+"network.protection.turn.on.notifications.section.footer" = "Bağlantınız kesilirse veya VPN durumunuz değişirse DuckDuckGo'nun sizi bilgilendirmesine izin verin.";
+
+/* List section footer for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.section.footer" = "Bağlantınız kesilirse veya VPN durumunuz değişirse bildirim alın.";
+
+/* Title for the toggle for VPN alerts. */
+"network.protection.vpn.alerts.toggle.title" = "VPN Uyarıları";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.footer" = "Kesintiden sonra VPN bağlantısını otomatik olarak geri yükleyin.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.always.on.setting.title" = "Her Zaman Açık";
+
+/* Title for the VPN Location screen's All Countries section. */
+"network.protection.vpn.location.all.countries.section.title" = "All Countries";
+
+/* Title for the VPN Location screen's Nearest Available selection item. */
+"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
+
+/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+
+/* Title for the VPN Location screen's Recommended section. */
+"network.protection.vpn.location.recommended.section.title" = "Recommended";
+
+/* Title for the VPN Notifications management screen. */
+"network.protection.vpn.notifications.title" = "VPN Bildirimleri";
+
+/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
+"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
+
+/* Title for the Preferred Location VPN Settings item. */
+"network.protection.vpn.preferred.location.title" = "Preferred Location";
+
+/* Footer text for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.footer" = "Ağ Koruması, DNS sorgularını VPN tüneli üzerinden kendi çözümleyicimize yönlendirerek İnternet Servis Sağlayıcınıza DNS sızıntılarını önler.";
+
+/* Title for the Always on VPN setting item. */
+"network.protection.vpn.secure.dns.setting.title" = "Güvenli DNS";
+
+/* Title for the VPN Settings screen. */
+"network.protection.vpn.settings.title" = "VPN Ayarları";
+
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1594,9 +1639,6 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Başka Bir Uygulamada Açılsın mı?";
 
-/* No comment provided by engineer. */
-"report.brokensite.header" = "Anonim olarak hatalı site raporu göndermeniz, bu sorunları ayıklamamıza ve uygulamayı geliştirmemize yardımcı olur.";
-
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Adres ara veya gir";
 
diff --git a/DuckDuckGo/tr.lproj/PrivacyDashboard.strings b/DuckDuckGo/tr.lproj/PrivacyDashboard.strings
deleted file mode 100644
index 8a697c7220..0000000000
--- a/DuckDuckGo/tr.lproj/PrivacyDashboard.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
-"0ax-Nd-tDU.text" = "Site Önemli İzleyici Ağlarından Biri";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
-"0SO-8y-5QH.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
-"2KC-47-FBo.normalTitle" = "Tekrar Dene";
-
-/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
-"2T4-dB-Wu0.text" = "Veriler Şifrelenmemiş";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
-"2xP-ZS-UtN.normalTitle" = "Hatalı Siteyi Bildir";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
-"3UG-EO-bt5.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
-
-/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
-"3uo-s0-uRc.text" = "İnternet bağlantınızı kontrol edip tekrar deneyin.";
-
-/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
-"5dV-qp-Hz5.text" = "Geliştirilmiş Sınıf";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
-"6os-4h-chg.text" = "Label";
-
-/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
-"7k3-Qj-oya.text" = "Ne Yazık ki Bu İşe Yaramadı";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
-"7nh-8f-M2e.text" = "www.example.com";
-
-/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
-"7xH-3L-wpf.text" = "Gizlilik Derecesi";
-
-/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
-"7Z1-eg-OWQ.title" = "xxx";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
-"8Ec-67-0A8.normalTitle" = "Düğme";
-
-/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
-"25V-p3-wsn.text" = "GİZLİLİK UYGULAMALARI";
-
-/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
-"953-jn-tmN.normalTitle" = "İzleyici Ağ İstatistiklerini Sıfırla";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
-"aD3-hP-MUU.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
-"DGo-7C-PoV.normalTitle" = "Düğme";
-
-/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
-"dZC-7f-pp3.text" = "ŞİFRELİ BAĞLANTI";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
-"edo-u1-cGj.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
-"eoi-RZ-ibW.normalTitle" = "Düğme";
-
-/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
-"F5w-e3-JfY.text" = "www.example.com";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
-"fqL-1Q-ilH.normalTitle" = "Korumasız Siteler";
-
-/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
-"Ge6-9h-2z5.text" = "Engellenen Ağlar";
-
-/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
-"GZ4-PW-wOG.text" = "8 İzleyici Engellendi";
-
-/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
-"hDv-jp-eaS.normalTitle" = "Hatalı Siteyi Bildir";
-
-/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
-"iF1-sO-WXk.text" = "Gizlilik Uygulamaları";
-
-/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
-"IPS-SD-65t.text" = "İlk Sıradaki Suçlular";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
-"J3L-KE-1Vb.text" = "Label";
-
-/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
-"k0S-dU-EUe.text" = "Gizlilik Uygulamaları Bulunamadı";
-
-/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
-"Kme-pZ-l7N.normalTitle" = "Korumasız Siteler";
-
-/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
-"Mv2-oP-SQd.text" = "Label";
-
-/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
-"oyz-09-obQ.text" = "Öne Çıkan Gizlilik Uygulamaları";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
-"pW9-ic-ro9.text" = "Site Gizlilik Koruması";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
-"rXM-kA-bL0.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
-
-/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
-"sr7-Qg-P74.text" = "Site Gizlilik Koruması";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
-"tpT-I9-kDk.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
-"wf1-HZ-e7d.text" = "Şifreli Bağlantı";
-
-/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
-"wwe-ee-up0.text" = "Bu sitede hatalara neden olduğu için Gizlilik Korumasını geçici olarak devre dışı bıraktık.";
-
-/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
-"XzQ-fW-tzk.text" = "Engellenen Başlıca Ağlar";
-
-/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
-"Y3q-u7-IeX.text" = "İZLEYİCİNİN AĞ İLE KARŞILAŞMA SIKLIĞI";
-
-/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
-"YDP-RX-LaV.text" = "8 Alan Adı Daha Yüklendi";
-
-/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
-"zz1-Q4-Fxr.text" = "Şifreli Bağlantı";
-
diff --git a/DuckDuckGo/tr.lproj/Settings.strings b/DuckDuckGo/tr.lproj/Settings.strings
index f15463e3e5..81c5b0fc5d 100644
--- a/DuckDuckGo/tr.lproj/Settings.strings
+++ b/DuckDuckGo/tr.lproj/Settings.strings
@@ -22,9 +22,6 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Verileri Otomatik Olarak Temizle";
 
-/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
-"7nt-uS-sOh.normalTitle" = "Duckduckgo.com/about adresinde daha fazla bilgi edinin";
-
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ayarlar";
 
@@ -148,9 +145,6 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Varsayılan";
 
-/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
-"gji-Fs-EET.text" = "Gizlilik, basitleştirildi. ";
-
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Çerez Açılır Pencerelerini Yönetin";
 
@@ -166,9 +160,6 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Gizlilik Koruması tüm siteler için etkin";
 
-/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
-"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
-
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icon";
 
@@ -199,8 +190,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "DuckDuckGo'dan Daha Fazlası";
 
-/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Senkronizasyon";
+/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Senkronizasyon ve Yedekleme";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Mac için uygulamamızla internette gezinirken gizliliğinizi koruyun ";
diff --git a/DuckDuckGoTests/BrokenSiteReportingTests.swift b/DuckDuckGoTests/BrokenSiteReportingTests.swift
index 6c663fda98..2ffc9f0d7b 100644
--- a/DuckDuckGoTests/BrokenSiteReportingTests.swift
+++ b/DuckDuckGoTests/BrokenSiteReportingTests.swift
@@ -44,6 +44,7 @@ final class BrokenSiteReportingTests: XCTestCase {
 
     func testBrokenSiteReporting() throws {
         let testJSON = data.fromJsonFile(Resource.tests)
+        let testString = String(data: testJSON, encoding: .utf8)
         let testData = try JSONDecoder().decode(BrokenSiteReportingTestData.self, from: testJSON)
 
         referenceTests = testData.reportURL.tests.filter {
@@ -64,7 +65,6 @@ final class BrokenSiteReportingTests: XCTestCase {
             return
         }
         
-        
         os_log("Testing [%s]", type: .info, test.name)
         
         let brokenSiteInfo = BrokenSiteInfo(url: URL(string: test.siteURL),
@@ -81,7 +81,6 @@ final class BrokenSiteReportingTests: XCTestCase {
                                             systemVersion: test.os ?? "",
                                             gpc: test.gpcEnabled)
         
-
         stub(condition: isHost(host)) { request -> HTTPStubsResponse in
             
             guard let requestURL = request.url else {
@@ -117,7 +116,7 @@ final class BrokenSiteReportingTests: XCTestCase {
             return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil)
         }
         
-        brokenSiteInfo.send(with: test.category, description: "")
+        brokenSiteInfo.send(with: test.category, description: "", source: .dashboard)
     }
 }
 
@@ -135,7 +134,6 @@ private struct ReportURL: Codable {
 }
 
 // MARK: - Test
-
 private struct Test: Codable {
     let name: String
     let siteURL: String
diff --git a/Widgets/bg.lproj/Localizable.strings b/Widgets/bg.lproj/Localizable.strings
index 642c6a3542..e36bdab9db 100644
--- a/Widgets/bg.lproj/Localizable.strings
+++ b/Widgets/bg.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Грешка";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Етикет";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Гласово търсене";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Насладете се на поверително търсене и сърфиране в любимите си сайтове само с едно докосване.";
 
diff --git a/Widgets/cs.lproj/Localizable.strings b/Widgets/cs.lproj/Localizable.strings
index 773e0773d7..845cf681a1 100644
--- a/Widgets/cs.lproj/Localizable.strings
+++ b/Widgets/cs.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Chyba";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Štítek";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Hlasové vyhledávání";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Vyhledávejte nebo navštěvujte své oblíbené weby soukromě jediným klepnutím.";
 
diff --git a/Widgets/da.lproj/Localizable.strings b/Widgets/da.lproj/Localizable.strings
index a97d59db1c..ad5843944c 100644
--- a/Widgets/da.lproj/Localizable.strings
+++ b/Widgets/da.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Fejl";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etiket";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Stemmesøgning";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Søg eller besøg dine yndlingssider privat med kun ét tryk.";
 
diff --git a/Widgets/de.lproj/Localizable.strings b/Widgets/de.lproj/Localizable.strings
index f2d7ca21a8..4e8d0d75e5 100644
--- a/Widgets/de.lproj/Localizable.strings
+++ b/Widgets/de.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Fehler";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Sprachsuche";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Du kannst deine Lieblingswebsites privat durchsuchen und anzeigen – einfach durch Antippen!";
 
diff --git a/Widgets/el.lproj/Localizable.strings b/Widgets/el.lproj/Localizable.strings
index 21fb056360..6aae28ca9a 100644
--- a/Widgets/el.lproj/Localizable.strings
+++ b/Widgets/el.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Σφάλμα";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Φωνητική αναζήτηση";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Κάντε αναζήτηση ή επισκεφτείτε τους αγαπημένους ιστότοπούς σας ιδιωτικά, με μόνο ένα πάτημα.";
 
diff --git a/Widgets/es.lproj/Localizable.strings b/Widgets/es.lproj/Localizable.strings
index 74ffef6287..29ba8d8698 100644
--- a/Widgets/es.lproj/Localizable.strings
+++ b/Widgets/es.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Error";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etiqueta";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Búsqueda por voz";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Busca o visita tus sitios web de forma privada con solo pulsar un botón.";
 
diff --git a/Widgets/et.lproj/Localizable.strings b/Widgets/et.lproj/Localizable.strings
index 9b45e87d3a..87539eae30 100644
--- a/Widgets/et.lproj/Localizable.strings
+++ b/Widgets/et.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Viga";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Silt";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Häälotsing";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Otsi või külasta oma lemmiksaite privaatselt vaid ühe puudutusega.";
 
diff --git a/Widgets/fi.lproj/Localizable.strings b/Widgets/fi.lproj/Localizable.strings
index fe34c710fa..d3c3815e10 100644
--- a/Widgets/fi.lproj/Localizable.strings
+++ b/Widgets/fi.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Virhe";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Äänihaku";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Tee hakuja ja käy lempisivustoillasi yhdellä napautuksella.";
 
diff --git a/Widgets/fr.lproj/Localizable.strings b/Widgets/fr.lproj/Localizable.strings
index 4560cf6c31..534645bedf 100644
--- a/Widgets/fr.lproj/Localizable.strings
+++ b/Widgets/fr.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Erreur";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Recherche vocale";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Recherchez ou visitez vos sites favoris en privé et d'un seul mouvement.";
 
diff --git a/Widgets/hr.lproj/Localizable.strings b/Widgets/hr.lproj/Localizable.strings
index 109e6b1ab3..6f30e34502 100644
--- a/Widgets/hr.lproj/Localizable.strings
+++ b/Widgets/hr.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Pogreška";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Glasovno pretraživanje";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Pretraži ili posjeti svoja omiljena web-mjesta privatno jednim dodirom.";
 
diff --git a/Widgets/hu.lproj/Localizable.strings b/Widgets/hu.lproj/Localizable.strings
index 4bfd4c0c17..020c39e048 100644
--- a/Widgets/hu.lproj/Localizable.strings
+++ b/Widgets/hu.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Hiba";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Címke";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Beszédhangalapú keresés";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Látogasd meg a kedvenc weboldalaidat és keress rajtuk privát módon, mindössze egyetlen koppintással.";
 
diff --git a/Widgets/it.lproj/Localizable.strings b/Widgets/it.lproj/Localizable.strings
index 40201cee2a..054ce6c494 100644
--- a/Widgets/it.lproj/Localizable.strings
+++ b/Widgets/it.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Errore";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etichetta";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Ricerca vocale";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Effettua ricerche o visita i tuoi siti preferiti in incognito con un solo tocco.";
 
diff --git a/Widgets/lt.lproj/Localizable.strings b/Widgets/lt.lproj/Localizable.strings
index 90cedf4c48..093743ccf9 100644
--- a/Widgets/lt.lproj/Localizable.strings
+++ b/Widgets/lt.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Klaida";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etiketė";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Paieška balsu";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Ieškokite arba lankykitės savo mėgstamose svetainėse privačiai vienu bakstelėjimu.";
 
diff --git a/Widgets/lv.lproj/Localizable.strings b/Widgets/lv.lproj/Localizable.strings
index fad926197f..9a4f7e7289 100644
--- a/Widgets/lv.lproj/Localizable.strings
+++ b/Widgets/lv.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Kļūda";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etiķete";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Balss meklēšana";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Meklē vai atver savas iecienītākās vietnes konfidenciāli, veicot tikai vienu pieskārienu.";
 
diff --git a/Widgets/nb.lproj/Localizable.strings b/Widgets/nb.lproj/Localizable.strings
index e36bae6f85..f4be22a9a9 100644
--- a/Widgets/nb.lproj/Localizable.strings
+++ b/Widgets/nb.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Feil";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etikett";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Talesøk";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Søk eller besøk favorittsider privat med ett trykk.";
 
diff --git a/Widgets/nl.lproj/Localizable.strings b/Widgets/nl.lproj/Localizable.strings
index 51d9e9e4a8..18e0f7e4f1 100644
--- a/Widgets/nl.lproj/Localizable.strings
+++ b/Widgets/nl.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Fout";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Zoeken via spraak";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Zoek of bezoek je favoriete sites in de privémodus met één tik.";
 
diff --git a/Widgets/pl.lproj/Localizable.strings b/Widgets/pl.lproj/Localizable.strings
index 062491c5fa..a188c79e20 100644
--- a/Widgets/pl.lproj/Localizable.strings
+++ b/Widgets/pl.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Błąd";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etykieta";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Wyszukiwanie głosowe";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Prywatnie przeszukuj lub odwiedzaj swoje ulubione witryny za pomocą jednego dotknięcia.";
 
diff --git a/Widgets/pt.lproj/Localizable.strings b/Widgets/pt.lproj/Localizable.strings
index a4900f4bb6..5727c566a8 100644
--- a/Widgets/pt.lproj/Localizable.strings
+++ b/Widgets/pt.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Erro";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Rótulo";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Pesquisa por voz";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Pesquise ou visite os seus sites favoritos de forma privada com apenas um toque.";
 
diff --git a/Widgets/ro.lproj/Localizable.strings b/Widgets/ro.lproj/Localizable.strings
index 0f2f18c418..8a8bc2c5c3 100644
--- a/Widgets/ro.lproj/Localizable.strings
+++ b/Widgets/ro.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Eroare";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Căutare vocală";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Caută sau vizitează site-urile preferate în mod privat cu o singură atingere.";
 
diff --git a/Widgets/ru.lproj/Localizable.strings b/Widgets/ru.lproj/Localizable.strings
index 137b724614..8559bd3c26 100644
--- a/Widgets/ru.lproj/Localizable.strings
+++ b/Widgets/ru.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Ошибка";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Метка";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Голосовой поиск";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Поиск и посещение любимых сайтов без слежки всего в одно касание.";
 
diff --git a/Widgets/sk.lproj/Localizable.strings b/Widgets/sk.lproj/Localizable.strings
index 9f736780af..817d0fd8b6 100644
--- a/Widgets/sk.lproj/Localizable.strings
+++ b/Widgets/sk.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Chyba";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Označenie";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Hlasové vyhľadávanie";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Vyhľadávajte alebo navštevujte svoje obľúbené stránky súkromne iba pomocou jedného kliknutia.";
 
diff --git a/Widgets/sl.lproj/Localizable.strings b/Widgets/sl.lproj/Localizable.strings
index 38d7e43b69..8f94f58b78 100644
--- a/Widgets/sl.lproj/Localizable.strings
+++ b/Widgets/sl.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Napaka";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Oznaka";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Glasovno iskanje";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Samo z enim dotikom zasebno poiščite ali obiščite priljubljena spletna mesta.";
 
diff --git a/Widgets/sv.lproj/Localizable.strings b/Widgets/sv.lproj/Localizable.strings
index 0ce98e5edd..0d06e15192 100644
--- a/Widgets/sv.lproj/Localizable.strings
+++ b/Widgets/sv.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Fel";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Etikett";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Röstsökning";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Gör sökningar eller besök dina favoritwebbplatser privat med ett enda tryck.";
 
diff --git a/Widgets/tr.lproj/Localizable.strings b/Widgets/tr.lproj/Localizable.strings
index 06ad932581..ac5a006384 100644
--- a/Widgets/tr.lproj/Localizable.strings
+++ b/Widgets/tr.lproj/Localizable.strings
@@ -1,3 +1,15 @@
+/* No comment provided by engineer. */
+"Connect" = "Connect";
+
+/* No comment provided by engineer. */
+"Disconnect" = "Disconnect";
+
+/* No comment provided by engineer. */
+"Error" = "Hata";
+
+/* No comment provided by engineer. */
+"iOS 17 required" = "iOS 17 required";
+
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -31,6 +43,9 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Sesli Arama";
 
+/* No comment provided by engineer. */
+"VPN Not Configured" = "VPN Not Configured";
+
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Tek bir dokunuşla favori sitelerinizi gizlice arayın veya ziyaret edin.";
 

From d3ffa47f0a9b492ed31c11fafbbfac92c784fc30 Mon Sep 17 00:00:00 2001
From: Federico Cappelli <fcappelli@duckduckgo.com>
Date: Thu, 23 Nov 2023 14:04:32 +0000
Subject: [PATCH 12/40] Revert "Breakage report improvements" (#2189)

---
 .gitignore                                    |   1 -
 Core/PixelEvent.swift                         |  13 +-
 DuckDuckGo.xcodeproj/project.pbxproj          |  94 +++++++++--
 .../xcshareddata/swiftpm/Package.resolved     |  10 +-
 .../xcschemes/DuckDuckGo.xcscheme             |   9 +-
 .../ActionSheetDaxDialogViewController.swift  |   2 +-
 DuckDuckGo/Base.lproj/Feedback.storyboard     |  63 ++++++--
 .../Base.lproj/PrivacyDashboard.storyboard    |  13 +-
 DuckDuckGo/Base.lproj/Settings.storyboard     |  14 +-
 DuckDuckGo/BrokenSiteCategories.swift         |  63 ++++++++
 DuckDuckGo/MainViewController+Segues.swift    |  31 +---
 DuckDuckGo/MainViewController.swift           |   6 +-
 .../PrivacyDashboard/BrokenSiteInfo.swift     | 130 ---------------
 .../PrivacyDashboardViewController.swift      |  93 ++++-------
 DuckDuckGo/ReportBrokenSiteView.swift         | 150 ++++++++++++++++++
 .../ReportBrokenSiteViewController.swift      |  79 +++++++++
 ...cSettingsViewController+SyncDelegate.swift |   4 +-
 DuckDuckGo/TabDelegate.swift                  |   1 +
 DuckDuckGo/TabViewController.swift            |  10 +-
 DuckDuckGo/UserText.swift                     |  18 +++
 DuckDuckGo/WebContainerViewController.swift   |   2 +-
 DuckDuckGo/bg.lproj/Feedback.strings          |   6 +
 DuckDuckGo/bg.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/bg.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/bg.lproj/Settings.strings          |  13 +-
 DuckDuckGo/cs.lproj/Feedback.strings          |   6 +
 DuckDuckGo/cs.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/cs.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/cs.lproj/Settings.strings          |  13 +-
 DuckDuckGo/da.lproj/Feedback.strings          |   6 +
 DuckDuckGo/da.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/da.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/da.lproj/Settings.strings          |  13 +-
 DuckDuckGo/de.lproj/Feedback.strings          |   6 +
 DuckDuckGo/de.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/de.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/de.lproj/Settings.strings          |  13 +-
 DuckDuckGo/el.lproj/Feedback.strings          |   6 +
 DuckDuckGo/el.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/el.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/el.lproj/Settings.strings          |  13 +-
 DuckDuckGo/en.lproj/Localizable.strings       |  45 ++++++
 DuckDuckGo/es.lproj/Feedback.strings          |   6 +
 DuckDuckGo/es.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/es.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/es.lproj/Settings.strings          |  13 +-
 DuckDuckGo/et.lproj/Feedback.strings          |   6 +
 DuckDuckGo/et.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/et.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/et.lproj/Settings.strings          |  13 +-
 DuckDuckGo/fi.lproj/Feedback.strings          |   6 +
 DuckDuckGo/fi.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/fi.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/fi.lproj/Settings.strings          |  13 +-
 DuckDuckGo/fr.lproj/Feedback.strings          |   6 +
 DuckDuckGo/fr.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/fr.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/fr.lproj/Settings.strings          |  13 +-
 DuckDuckGo/hr.lproj/Feedback.strings          |   6 +
 DuckDuckGo/hr.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/hr.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/hr.lproj/Settings.strings          |  13 +-
 DuckDuckGo/hu.lproj/Feedback.strings          |   6 +
 DuckDuckGo/hu.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/hu.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/hu.lproj/Settings.strings          |  13 +-
 DuckDuckGo/it.lproj/Feedback.strings          |   6 +
 DuckDuckGo/it.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/it.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/it.lproj/Settings.strings          |  13 +-
 DuckDuckGo/lt.lproj/Feedback.strings          |   6 +
 DuckDuckGo/lt.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/lt.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/lt.lproj/Settings.strings          |  13 +-
 DuckDuckGo/lv.lproj/Feedback.strings          |   6 +
 DuckDuckGo/lv.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/lv.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/lv.lproj/Settings.strings          |  13 +-
 DuckDuckGo/nb.lproj/Feedback.strings          |   6 +
 DuckDuckGo/nb.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/nb.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/nb.lproj/Settings.strings          |  13 +-
 DuckDuckGo/nl.lproj/Feedback.strings          |   6 +
 DuckDuckGo/nl.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/nl.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/nl.lproj/Settings.strings          |  13 +-
 DuckDuckGo/pl.lproj/Feedback.strings          |   6 +
 DuckDuckGo/pl.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/pl.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/pl.lproj/Settings.strings          |  13 +-
 DuckDuckGo/pt.lproj/Feedback.strings          |   6 +
 DuckDuckGo/pt.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/pt.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/pt.lproj/Settings.strings          |  13 +-
 DuckDuckGo/ro.lproj/Feedback.strings          |   6 +
 DuckDuckGo/ro.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/ro.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/ro.lproj/Settings.strings          |  13 +-
 DuckDuckGo/ru.lproj/Feedback.strings          |   6 +
 DuckDuckGo/ru.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/ru.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/ru.lproj/Settings.strings          |  13 +-
 DuckDuckGo/sk.lproj/Feedback.strings          |   6 +
 DuckDuckGo/sk.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/sk.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/sk.lproj/Settings.strings          |  13 +-
 DuckDuckGo/sl.lproj/Feedback.strings          |   6 +
 DuckDuckGo/sl.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/sl.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/sl.lproj/Settings.strings          |  13 +-
 DuckDuckGo/sv.lproj/Feedback.strings          |   6 +
 DuckDuckGo/sv.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/sv.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/sv.lproj/Settings.strings          |  13 +-
 DuckDuckGo/tr.lproj/Feedback.strings          |   6 +
 DuckDuckGo/tr.lproj/Localizable.strings       | 132 ++++++---------
 DuckDuckGo/tr.lproj/PrivacyDashboard.strings  | 129 +++++++++++++++
 DuckDuckGo/tr.lproj/Settings.strings          |  13 +-
 .../BrokenSiteReportingTests.swift            |   6 +-
 Widgets/bg.lproj/Localizable.strings          |  15 --
 Widgets/cs.lproj/Localizable.strings          |  15 --
 Widgets/da.lproj/Localizable.strings          |  15 --
 Widgets/de.lproj/Localizable.strings          |  15 --
 Widgets/el.lproj/Localizable.strings          |  15 --
 Widgets/es.lproj/Localizable.strings          |  15 --
 Widgets/et.lproj/Localizable.strings          |  15 --
 Widgets/fi.lproj/Localizable.strings          |  15 --
 Widgets/fr.lproj/Localizable.strings          |  15 --
 Widgets/hr.lproj/Localizable.strings          |  15 --
 Widgets/hu.lproj/Localizable.strings          |  15 --
 Widgets/it.lproj/Localizable.strings          |  15 --
 Widgets/lt.lproj/Localizable.strings          |  15 --
 Widgets/lv.lproj/Localizable.strings          |  15 --
 Widgets/nb.lproj/Localizable.strings          |  15 --
 Widgets/nl.lproj/Localizable.strings          |  15 --
 Widgets/pl.lproj/Localizable.strings          |  15 --
 Widgets/pt.lproj/Localizable.strings          |  15 --
 Widgets/ro.lproj/Localizable.strings          |  15 --
 Widgets/ru.lproj/Localizable.strings          |  15 --
 Widgets/sk.lproj/Localizable.strings          |  15 --
 Widgets/sl.lproj/Localizable.strings          |  15 --
 Widgets/sv.lproj/Localizable.strings          |  15 --
 Widgets/tr.lproj/Localizable.strings          |  15 --
 143 files changed, 5156 insertions(+), 2781 deletions(-)
 rename DuckDuckGo/{PrivacyDashboard => }/Base.lproj/PrivacyDashboard.storyboard (84%)
 create mode 100644 DuckDuckGo/BrokenSiteCategories.swift
 delete mode 100644 DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift
 rename DuckDuckGo/{PrivacyDashboard => }/PrivacyDashboardViewController.swift (63%)
 create mode 100644 DuckDuckGo/ReportBrokenSiteView.swift
 create mode 100644 DuckDuckGo/ReportBrokenSiteViewController.swift
 create mode 100644 DuckDuckGo/bg.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/cs.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/da.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/de.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/el.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/es.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/et.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/fi.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/fr.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/hr.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/hu.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/it.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/lt.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/lv.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/nb.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/nl.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/pl.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/pt.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/ro.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/ru.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/sk.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/sl.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/sv.lproj/PrivacyDashboard.strings
 create mode 100644 DuckDuckGo/tr.lproj/PrivacyDashboard.strings

diff --git a/.gitignore b/.gitignore
index 07ebc5f934..f723942232 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,4 +73,3 @@ fastlane/test_output
 # DuckDuckGo
 
 Configuration/ExternalDeveloper.xcconfig
-scripts/assets
diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index 12a0824b50..37e48dcb73 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -37,10 +37,8 @@ extension Pixel {
         case forgetAllDataCleared
         
         case privacyDashboardOpened
-        
-        case dashboardProtectionAllowlistAdd
-        case dashboardProtectionAllowlistRemove
-        
+        case privacyDashboardProtectionDisabled
+        case privacyDashboardProtectionEnabled
         case privacyDashboardReportBrokenSite
         case privacyDashboardPixelFromJS(rawPixel: String)
         
@@ -535,10 +533,9 @@ extension Pixel.Event {
         case .forgetAllDataCleared: return "mf_dc"
             
         case .privacyDashboardOpened: return "mp"
-           
-        case .dashboardProtectionAllowlistAdd: return "mp_wla"
-        case .dashboardProtectionAllowlistRemove: return "mp_wlr"
-            
+
+        case .privacyDashboardProtectionDisabled: return "mp_wla"
+        case .privacyDashboardProtectionEnabled: return "mp_wlr"
         case .privacyDashboardReportBrokenSite: return "mp_rb"
         case .privacyDashboardPixelFromJS(let rawPixel): return rawPixel
             
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index fe4d605d97..811892cf8d 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -297,6 +297,7 @@
 		4BB7CBB02AF59C310014A35F /* VPNWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */; };
 		4BBBBA872B02E85400D965DA /* DesignResourcesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 4BBBBA862B02E85400D965DA /* DesignResourcesKit */; };
 		4BC21A2F27238B7500229F0E /* RunLoopExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC21A2C272388BD00229F0E /* RunLoopExtensionTests.swift */; };
+		4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */; };
 		4BE2756827304F57006B20B0 /* URLRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE27566272F878F006B20B0 /* URLRequestExtension.swift */; };
 		4BEF65692989C2FC00B650CB /* AdapterSocketEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D307A2989C0C400918636 /* AdapterSocketEvent.swift */; };
 		4BEF656A2989C2FC00B650CB /* ProxyServerEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D307C2989C0C600918636 /* ProxyServerEvent.swift */; };
@@ -549,6 +550,8 @@
 		986B16C425E92DF0007D23E8 /* BrowsingMenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B16C225E92DF0007D23E8 /* BrowsingMenuViewController.swift */; };
 		986B45CB299D5EF50089D2D7 /* BookmarksLookupPerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B45CA299D5EF50089D2D7 /* BookmarksLookupPerformanceTests.swift */; };
 		986B45D0299E30A50089D2D7 /* BookmarkEntityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B45CF299E30A50089D2D7 /* BookmarkEntityTests.swift */; };
+		986C7FA724171C6000A3557D /* BrokenSiteCategories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986C7FA624171C6000A3557D /* BrokenSiteCategories.swift */; };
+		986C7FA92417ADE700A3557D /* ReportBrokenSiteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986C7FA82417ADE700A3557D /* ReportBrokenSiteViewController.swift */; };
 		986DA94A24884B18004A7E39 /* WebViewTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986DA94924884B18004A7E39 /* WebViewTransition.swift */; };
 		987130C4294AAB9F00AB05E0 /* FavoriteListViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 987130BE294AAB9E00AB05E0 /* FavoriteListViewModelTests.swift */; };
 		987130C5294AAB9F00AB05E0 /* BookmarkEditorViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 987130BF294AAB9E00AB05E0 /* BookmarkEditorViewModelTests.swift */; };
@@ -1314,6 +1317,7 @@
 		4B83397429AFBCE6003F7EA9 /* AppTrackingProtectionFeedbackModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionFeedbackModelTests.swift; sourceTree = "<group>"; };
 		4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNWidget.swift; sourceTree = "<group>"; };
 		4BC21A2C272388BD00229F0E /* RunLoopExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunLoopExtensionTests.swift; sourceTree = "<group>"; };
+		4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportBrokenSiteView.swift; sourceTree = "<group>"; };
 		4BE27566272F878F006B20B0 /* URLRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = URLRequestExtension.swift; path = ../DuckDuckGo/URLRequestExtension.swift; sourceTree = "<group>"; };
 		4BFB911A29B7D9530014D4B7 /* AppTrackingProtectionStoringModelPerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionStoringModelPerformanceTests.swift; sourceTree = "<group>"; };
 		56244C1C2A137B1900EDF259 /* WaitlistViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistViews.swift; sourceTree = "<group>"; };
@@ -1548,6 +1552,7 @@
 		981685462521EEF000FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Home.strings; sourceTree = "<group>"; };
 		981685482521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		981685492521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9816854A2521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9816854C2521EEF200FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Settings.strings; sourceTree = "<group>"; };
 		9816854D2521EEF300FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Tab.strings; sourceTree = "<group>"; };
 		9816854E2521EEF300FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1650,6 +1655,7 @@
 		9866DB8E251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DB90251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DB91251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DB92251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DB94251CA8F500612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DB95251CA8F500612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DB96251CA8F500612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1667,6 +1673,7 @@
 		9866DBA5251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBA7251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBA8251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DBA9251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBAB251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBAC251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBAD251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1684,6 +1691,7 @@
 		9866DBBC251CA92A00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBBE251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBBF251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DBC0251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBC2251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBC3251CA92C00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBC4251CA92C00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1701,6 +1709,7 @@
 		9866DBD3251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBD5251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBD6251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DBD7251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBD9251CA93A00612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBDA251CA93A00612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBDB251CA93A00612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1718,6 +1727,7 @@
 		9866DBEA251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DBEC251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DBED251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DBEE251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DBF0251CA95000612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DBF1251CA95000612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DBF2251CA95000612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1735,6 +1745,7 @@
 		9866DC01251CA96200612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC03251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC04251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC05251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC07251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC08251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC09251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1752,6 +1763,7 @@
 		9866DC18251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC1A251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC1B251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC1C251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC1E251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC1F251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC20251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1769,6 +1781,7 @@
 		9866DC2F251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC31251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC32251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC33251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC35251CA9B100612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC36251CA9B100612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC37251CA9B100612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1786,6 +1799,7 @@
 		9866DC46251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC48251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC49251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC4A251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC4C251CA9C100612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC4D251CA9C100612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC4E251CA9C100612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1803,6 +1817,7 @@
 		9866DC5D251CA9CE00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC5F251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC60251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC61251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC63251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC64251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC65251CA9D000612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1820,6 +1835,7 @@
 		9866DC74251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC76251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC77251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC78251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC7A251CA9E400612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC7B251CA9E400612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC7C251CA9E400612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1837,6 +1853,7 @@
 		9866DC8B251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DC8D251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DC8E251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DC8F251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DC91251CA9F600612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DC92251CA9F600612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DC93251CA9F600612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1854,6 +1871,7 @@
 		9866DCA2251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCA4251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCA5251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DCA6251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCA8251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCA9251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCAA251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1871,6 +1889,7 @@
 		9866DCB9251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCBB251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCBC251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DCBD251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCBF251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCC0251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCC1251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1888,6 +1907,7 @@
 		9866DCD0251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCD2251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCD3251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DCD4251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCD6251CAA3500612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCD7251CAA3500612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCD8251CAA3500612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1905,6 +1925,7 @@
 		9866DCE7251CAA4800612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Home.strings; sourceTree = "<group>"; };
 		9866DCE9251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/OmniBar.strings; sourceTree = "<group>"; };
 		9866DCEA251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DCEB251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DCED251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DCEE251CAA4A00612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Tab.strings; sourceTree = "<group>"; };
 		9866DCEF251CAA4A00612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/TabSwitcher.strings; sourceTree = "<group>"; };
@@ -1958,6 +1979,13 @@
 		9866DD8E251CB12D00612E3A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Authentication.strings; sourceTree = "<group>"; };
 		9866DD90251CB12E00612E3A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Authentication.strings; sourceTree = "<group>"; };
 		9866DD92251CB12E00612E3A /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Authentication.strings; sourceTree = "<group>"; };
+		9866DD9C251CB14600612E3A /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
+		9866DD9E251CB17A00612E3A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
+		9866DDA2251CB1C000612E3A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
+		9866DDA4251CB1F500612E3A /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
+		9866DDA6251CB24F00612E3A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
+		9866DDA8251CB41000612E3A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
+		9866DDAA251CB4F500612E3A /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/PrivacyDashboard.strings; sourceTree = "<group>"; };
 		9866DDAC251CB58400612E3A /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DDAE251CB5B400612E3A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Settings.strings; sourceTree = "<group>"; };
 		9866DDB2251CB62500612E3A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Settings.strings; sourceTree = "<group>"; };
@@ -2031,6 +2059,8 @@
 		986B16C225E92DF0007D23E8 /* BrowsingMenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowsingMenuViewController.swift; sourceTree = "<group>"; };
 		986B45CA299D5EF50089D2D7 /* BookmarksLookupPerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksLookupPerformanceTests.swift; sourceTree = "<group>"; };
 		986B45CF299E30A50089D2D7 /* BookmarkEntityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkEntityTests.swift; sourceTree = "<group>"; };
+		986C7FA624171C6000A3557D /* BrokenSiteCategories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrokenSiteCategories.swift; sourceTree = "<group>"; };
+		986C7FA82417ADE700A3557D /* ReportBrokenSiteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportBrokenSiteViewController.swift; sourceTree = "<group>"; };
 		986DA94924884B18004A7E39 /* WebViewTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewTransition.swift; sourceTree = "<group>"; };
 		987130BE294AAB9E00AB05E0 /* FavoriteListViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FavoriteListViewModelTests.swift; sourceTree = "<group>"; };
 		987130BF294AAB9E00AB05E0 /* BookmarkEditorViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkEditorViewModelTests.swift; sourceTree = "<group>"; };
@@ -3078,6 +3108,15 @@
 			name = PrivacyIconAndTrackers;
 			sourceTree = "<group>";
 		};
+		1E87615728A1515400C7C5CE /* PrivacyDashboard */ = {
+			isa = PBXGroup;
+			children = (
+				1E87615828A1517200C7C5CE /* PrivacyDashboardViewController.swift */,
+				984147B924F0268D00362052 /* PrivacyDashboard.storyboard */,
+			);
+			name = PrivacyDashboard;
+			sourceTree = "<group>";
+		};
 		1E8AD1C527BE45F800ABA377 /* DownloadsList */ = {
 			isa = PBXGroup;
 			children = (
@@ -3529,14 +3568,18 @@
 		83D4A73820E2454D003A7A6D /* UI */ = {
 			isa = PBXGroup;
 			children = (
-				984147B024F0261A00362052 /* Feedback.storyboard */,
 				98DA6B3222243CC3006EA9EB /* Feedback.xcassets */,
+				984147B024F0261A00362052 /* Feedback.storyboard */,
+				9888F77A2224980500C46159 /* FeedbackViewController.swift */,
+				9838059E2228208E00385F1A /* PositiveFeedbackViewController.swift */,
 				984D60B1222A1284003B9E3B /* FeedbackFormViewController.swift */,
-				980891A42237D4F500313A70 /* FeedbackNavigator.swift */,
 				982E562F222C3D5B008D861B /* FeedbackPickerViewController.swift */,
+				980891A42237D4F500313A70 /* FeedbackNavigator.swift */,
 				980891A62237D5D800313A70 /* FeedbackPresenter.swift */,
-				9888F77A2224980500C46159 /* FeedbackViewController.swift */,
-				9838059E2228208E00385F1A /* PositiveFeedbackViewController.swift */,
+				986C7FA624171C6000A3557D /* BrokenSiteCategories.swift */,
+				4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */,
+				986C7FA82417ADE700A3557D /* ReportBrokenSiteViewController.swift */,
+				98728E812417E3300033960E /* BrokenSiteInfo.swift */,
 			);
 			name = UI;
 			sourceTree = "<group>";
@@ -3632,7 +3675,7 @@
 				85AE668C20971FCA0014CF04 /* Notifications */,
 				F1C4A70C1E5771F800A6CA1B /* OmniBar */,
 				F1AE54DB1F0425BB00D9A700 /* Privacy */,
-				F1DF09502B039E6E008CC908 /* PrivacyDashboard */,
+				1E87615728A1515400C7C5CE /* PrivacyDashboard */,
 				02ECEC602A965074009F0654 /* PrivacyInfo.xcprivacy */,
 				C1B7B51D28941F160098FD6A /* RemoteMessaging */,
 				F1AB2B401E3F75A000868554 /* Settings */,
@@ -5178,16 +5221,6 @@
 			name = UserInterface;
 			sourceTree = "<group>";
 		};
-		F1DF09502B039E6E008CC908 /* PrivacyDashboard */ = {
-			isa = PBXGroup;
-			children = (
-				98728E812417E3300033960E /* BrokenSiteInfo.swift */,
-				1E87615828A1517200C7C5CE /* PrivacyDashboardViewController.swift */,
-				984147B924F0268D00362052 /* PrivacyDashboard.storyboard */,
-			);
-			path = PrivacyDashboard;
-			sourceTree = "<group>";
-		};
 		F1E092B31E92A6B900732CCC /* Core */ = {
 			isa = PBXGroup;
 			children = (
@@ -6008,7 +6041,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "./lint.sh --strict\n";
+			shellScript = "./lint.sh\n";
 		};
 		98B0CE69251C937D003FB601 /* Update Localizable.strings */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -6250,6 +6283,7 @@
 				31A42566285A0A6300049386 /* FaviconViewModel.swift in Sources */,
 				8C4838B5221C8F7F008A6739 /* GestureToolbarButton.swift in Sources */,
 				EE276BEA2A77F823009167B6 /* NetworkProtectionRootViewController.swift in Sources */,
+				986C7FA92417ADE700A3557D /* ReportBrokenSiteViewController.swift in Sources */,
 				310ECFDD282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift in Sources */,
 				1E908BF329827C480008C8F3 /* AutoconsentManagement.swift in Sources */,
 				CB9B8739278C8E72001F4906 /* WidgetEducationViewController.swift in Sources */,
@@ -6276,6 +6310,7 @@
 				4B6484F327FD1E350050A7A1 /* MenuControllerView.swift in Sources */,
 				1EE7C299294227EC0026C8CB /* AutoconsentSettingsViewController.swift in Sources */,
 				1E8AD1D527C2E22900ABA377 /* DownloadsListSectionViewModel.swift in Sources */,
+				4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */,
 				31584616281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift in Sources */,
 				C1F341C72A6924100032057B /* EmailAddressPromptViewModel.swift in Sources */,
 				F47E53D9250A97330037C686 /* OnboardingDefaultBroswerViewController.swift in Sources */,
@@ -6373,6 +6408,7 @@
 				027F487A2A4B66CD001A1C6C /* AppTPFAQViewModel.swift in Sources */,
 				F1E90C201E678E7C005E7E21 /* HomeControllerDelegate.swift in Sources */,
 				F17922DE1E7192E6006E3D97 /* SuggestionTableViewCell.swift in Sources */,
+				986C7FA724171C6000A3557D /* BrokenSiteCategories.swift in Sources */,
 				85DB12ED2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift in Sources */,
 				98DA6ECA2181E41F00E65433 /* ThemeManager.swift in Sources */,
 				C159DF072A430B60007834BB /* EmailSignupViewController.swift in Sources */,
@@ -7214,6 +7250,30 @@
 			isa = PBXVariantGroup;
 			children = (
 				984147B824F0268D00362052 /* Base */,
+				9866DB92251CA8F400612E3A /* bg */,
+				9866DBA9251CA91800612E3A /* hr */,
+				9866DBC0251CA92B00612E3A /* cs */,
+				9866DBD7251CA93900612E3A /* da */,
+				9866DBEE251CA94F00612E3A /* nl */,
+				9866DC05251CA96300612E3A /* et */,
+				9866DC1C251CA99C00612E3A /* de */,
+				9866DC33251CA9B000612E3A /* el */,
+				9866DC4A251CA9C000612E3A /* hu */,
+				9866DC61251CA9CF00612E3A /* it */,
+				9866DC78251CA9E300612E3A /* lv */,
+				9866DC8F251CA9F500612E3A /* lt */,
+				9866DCA6251CAA0600612E3A /* pl */,
+				9866DCBD251CAA2700612E3A /* ro */,
+				9866DCD4251CAA3400612E3A /* sk */,
+				9866DCEB251CAA4900612E3A /* sl */,
+				9866DD9C251CB14600612E3A /* fi */,
+				9866DD9E251CB17A00612E3A /* fr */,
+				9866DDA2251CB1C000612E3A /* pt */,
+				9866DDA4251CB1F500612E3A /* ru */,
+				9866DDA6251CB24F00612E3A /* es */,
+				9866DDA8251CB41000612E3A /* sv */,
+				9866DDAA251CB4F500612E3A /* tr */,
+				9816854A2521EEF100FA91A1 /* nb */,
 			);
 			name = PrivacyDashboard.storyboard;
 			sourceTree = "<group>";
@@ -9083,7 +9143,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 85.0.0;
+				version = 84.2.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index e0abad139e..802a39a398 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "6dc31cc7e46131d79ce1f96463b36381656d7b2d",
-          "version": "85.0.0"
+          "revision": "af63158c03de7a47fb9e2cbcd97fbd28a64ab1fd",
+          "version": "84.2.0"
         }
       },
       {
@@ -105,8 +105,8 @@
         "repositoryURL": "https://github.com/duckduckgo/privacy-dashboard",
         "state": {
           "branch": null,
-          "revision": "59dedf0f4ff1e9147de0806a54c6043861eb0870",
-          "version": "3.1.0"
+          "revision": "b4ac92a444e79d5651930482623b9f6dc9265667",
+          "version": "2.0.0"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",
diff --git a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme
index 046960ab50..5383c46f83 100644
--- a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme
+++ b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo.xcscheme
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
    LastUpgradeVersion = "1250"
-   version = "1.7">
+   version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
       buildImplicitDependencies = "YES">
@@ -95,8 +95,7 @@
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       debugServiceExtension = "internal"
-      allowLocationSimulation = "NO"
-      showNonLocalizedStrings = "YES">
+      allowLocationSimulation = "YES">
       <BuildableProductRunnable
          runnableDebuggingMode = "0">
          <BuildableReference
@@ -133,10 +132,6 @@
             isEnabled = "NO">
          </EnvironmentVariable>
       </EnvironmentVariables>
-      <LocationScenarioReference
-         identifier = "London, England"
-         referenceType = "1">
-      </LocationScenarioReference>
    </LaunchAction>
    <ProfileAction
       buildConfiguration = "Release"
diff --git a/DuckDuckGo/ActionSheetDaxDialogViewController.swift b/DuckDuckGo/ActionSheetDaxDialogViewController.swift
index 78f3e691d5..be0e1cd07f 100644
--- a/DuckDuckGo/ActionSheetDaxDialogViewController.swift
+++ b/DuckDuckGo/ActionSheetDaxDialogViewController.swift
@@ -94,7 +94,7 @@ class ActionSheetDaxDialogViewController: UIViewController {
             return
         }
         
-        dismiss(animated: true)
+        self.dismiss(animated: true)
         if let spec = spec {
             Pixel.fire(pixel: spec.cancelActionPixelName)
         }
diff --git a/DuckDuckGo/Base.lproj/Feedback.storyboard b/DuckDuckGo/Base.lproj/Feedback.storyboard
index ac8172e1c5..a9b59c7cc8 100644
--- a/DuckDuckGo/Base.lproj/Feedback.storyboard
+++ b/DuckDuckGo/Base.lproj/Feedback.storyboard
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="c32-S5-kCk">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="h22-TC-N6i">
     <device id="retina5_5" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>
@@ -28,8 +29,8 @@
         <scene sceneID="dQB-jL-THB">
             <objects>
                 <viewController id="xnZ-YI-mV7" customClass="FeedbackViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" misplaced="YES" id="C2C-S7-btw">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="666"/>
+                    <view key="view" contentMode="scaleToFill" id="C2C-S7-btw">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="672"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yS1-TL-7Xx">
@@ -148,7 +149,7 @@
             <objects>
                 <viewController title="Share Feedback" id="rAY-cv-mjl" userLabel="Positive Feedback" customClass="PositiveFeedbackViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
                     <view key="view" contentMode="scaleToFill" id="zgc-vi-YZO">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="666"/>
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="672"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                             <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YJu-FY-Z3R">
@@ -303,8 +304,8 @@
         <scene sceneID="pU2-w2-HSD">
             <objects>
                 <tableViewController storyboardIdentifier="FeedbackPicker" title="Share Feedback" id="lY6-5c-iu4" userLabel="Feedback Picker" customClass="FeedbackPickerViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
-                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="insetGrouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="r0Q-7K-kUf">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="666"/>
+                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="insetGrouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="r0Q-7K-kUf">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="672"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <view key="tableHeaderView" contentMode="scaleToFill" id="h6D-eT-YCX">
                             <rect key="frame" x="0.0" y="0.0" width="414" height="170"/>
@@ -371,11 +372,11 @@
                                 <rect key="frame" x="20" y="225.33333206176758" width="374" height="44"/>
                                 <autoresizingMask key="autoresizingMask"/>
                                 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="has-ek-M3V" id="ZVE-Ej-2Dt">
-                                    <rect key="frame" x="0.0" y="0.0" width="347.66666666666669" height="44"/>
+                                    <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="44"/>
                                     <autoresizingMask key="autoresizingMask"/>
                                     <subviews>
                                         <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" usesAttributedText="YES" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Vp9-Jz-mUC">
-                                            <rect key="frame" x="16" y="0.0" width="323.66666666666669" height="44"/>
+                                            <rect key="frame" x="20" y="0.0" width="315.66666666666669" height="44"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <attributedString key="attributedText">
                                                 <fragment content="Title">
@@ -632,6 +633,47 @@
             </objects>
             <point key="canvasLocation" x="1361" y="924"/>
         </scene>
+        <!--Themable Navigation Controller-->
+        <scene sceneID="4Cd-5O-E32">
+            <objects>
+                <navigationController id="h22-TC-N6i" customClass="ThemableNavigationController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translucent="NO" id="7vH-Qe-IZl">
+                        <rect key="frame" x="0.0" y="20" width="414" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <connections>
+                        <segue destination="8h9-Oy-9xi" kind="relationship" relationship="rootViewController" id="fId-6e-Jea"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="i6L-q4-FDc" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-1384" y="1690"/>
+        </scene>
+        <!--Report Broken Site-->
+        <scene sceneID="F6V-Ex-sf0">
+            <objects>
+                <viewController id="8h9-Oy-9xi" customClass="ReportBrokenSiteViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="z30-di-tew">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="Up8-9v-hR9"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <toolbarItems/>
+                    <navigationItem key="navigationItem" title="Report Broken Site" id="WjT-HM-yim">
+                        <barButtonItem key="leftBarButtonItem" title="Close" id="cZl-qB-kSL">
+                            <connections>
+                                <action selector="onClosePressedWithSender:" destination="8h9-Oy-9xi" id="F2e-uB-ZF8"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
+                    <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
+                    <nil key="simulatedBottomBarMetrics"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="8yo-EF-AhR" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-659.4202898550725" y="1689.9456521739132"/>
+        </scene>
     </scenes>
     <designables>
         <designable name="TMj-NM-j3b">
@@ -641,5 +683,8 @@
     <resources>
         <image name="happyFace" width="48" height="48"/>
         <image name="sadFace" width="48" height="48"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
     </resources>
 </document>
diff --git a/DuckDuckGo/PrivacyDashboard/Base.lproj/PrivacyDashboard.storyboard b/DuckDuckGo/Base.lproj/PrivacyDashboard.storyboard
similarity index 84%
rename from DuckDuckGo/PrivacyDashboard/Base.lproj/PrivacyDashboard.storyboard
rename to DuckDuckGo/Base.lproj/PrivacyDashboard.storyboard
index 7f4ce74cea..a30dfbca7b 100644
--- a/DuckDuckGo/PrivacyDashboard/Base.lproj/PrivacyDashboard.storyboard
+++ b/DuckDuckGo/Base.lproj/PrivacyDashboard.storyboard
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="E4q-pT-pJ1">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="E4q-pT-pJ1">
     <device id="retina5_9" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -38,12 +38,21 @@
                     <value key="contentSizeForViewInPopover" type="size" width="375" height="650"/>
                     <connections>
                         <outlet property="webView" destination="9r4-O0-IkD" id="0PF-2w-VYe"/>
+                        <segue destination="f4z-Pu-QxE" kind="presentation" identifier="ReportBrokenSite" modalPresentationStyle="formSheet" id="kJi-QP-mel"/>
                     </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="cBN-QY-8a1" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
             <point key="canvasLocation" x="319" y="412"/>
         </scene>
+        <!--Feedback-->
+        <scene sceneID="Jx3-vm-WCX">
+            <objects>
+                <viewControllerPlaceholder storyboardName="Feedback" id="f4z-Pu-QxE" sceneMemberID="viewController"/>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="gTT-yM-AmS" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="1089" y="356"/>
+        </scene>
     </scenes>
     <resources>
         <systemColor name="systemBackgroundColor">
diff --git a/DuckDuckGo/Base.lproj/Settings.storyboard b/DuckDuckGo/Base.lproj/Settings.storyboard
index a365a5908a..1d4eb7fa61 100644
--- a/DuckDuckGo/Base.lproj/Settings.storyboard
+++ b/DuckDuckGo/Base.lproj/Settings.storyboard
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="w88-u3-TgK">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="w88-u3-TgK">
     <device id="retina6_5" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
         <capability name="Image references" minToolsVersion="12.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="collection view cell content view" minToolsVersion="11.0"/>
@@ -1102,7 +1102,7 @@
                 <viewControllerPlaceholder storyboardName="HomeRow" id="4xy-dB-g65" sceneMemberID="viewController"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="f7V-ze-SNX" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="2564" y="-129"/>
+            <point key="canvasLocation" x="2526" y="96"/>
         </scene>
         <!--Text Size-->
         <scene sceneID="27H-Zj-xSY">
@@ -1278,15 +1278,15 @@
                 </viewControllerPlaceholder>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="Ztc-dF-sSr" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="2573" y="-61"/>
+            <point key="canvasLocation" x="2540" y="-72"/>
         </scene>
         <!--Feedback-->
         <scene sceneID="AdS-SO-faF">
             <objects>
-                <viewControllerPlaceholder storyboardName="Feedback" id="Hvb-oi-0lX" sceneMemberID="viewController"/>
+                <viewControllerPlaceholder storyboardName="Feedback" referencedIdentifier="Feedback" id="Hvb-oi-0lX" sceneMemberID="viewController"/>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="TVx-JL-4ci" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="2572" y="53"/>
+            <point key="canvasLocation" x="2524" y="148"/>
         </scene>
         <!--Automatically Clear Data-->
         <scene sceneID="y9R-2c-mBz">
@@ -2346,7 +2346,7 @@
             <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
         <systemColor name="secondaryLabelColor">
-            <color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
+            <color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
         </systemColor>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
diff --git a/DuckDuckGo/BrokenSiteCategories.swift b/DuckDuckGo/BrokenSiteCategories.swift
new file mode 100644
index 0000000000..443a51185d
--- /dev/null
+++ b/DuckDuckGo/BrokenSiteCategories.swift
@@ -0,0 +1,63 @@
+//
+//  BrokenSiteCategories.swift
+//  DuckDuckGo
+//
+//  Copyright © 2020 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+
+struct BrokenSite {
+    
+    enum Category: String, CaseIterable, Identifiable {
+        case images
+        case paywall
+        case comments
+        case videos
+        case links
+        case content
+        case login
+        case unsupported
+        case cookiePrompt = "cookieprompt"
+        case other
+        
+        var id: Self { self }
+        
+        var categoryText: String {
+            switch self {
+            case .images:
+                return UserText.brokenSiteCategoryImages
+            case .paywall:
+                return UserText.brokenSiteCategoryPaywall
+            case .comments:
+                return UserText.brokenSiteCategoryComments
+            case .videos:
+                return UserText.brokenSiteCategoryVideos
+            case .links:
+                return UserText.brokenSiteCategoryLinks
+            case .content:
+                return UserText.brokenSiteCategoryContent
+            case .login:
+                return UserText.brokenSiteCategoryLogin
+            case .unsupported:
+                return UserText.brokenSiteCategoryUnsupported
+            case .cookiePrompt:
+                return UserText.brokenSiteCategoryCookiePrompt
+            case .other:
+                return UserText.brokenSiteCategoryOther
+            }
+        }
+    }
+}
diff --git a/DuckDuckGo/MainViewController+Segues.swift b/DuckDuckGo/MainViewController+Segues.swift
index 47af3fba21..4eb01f301a 100644
--- a/DuckDuckGo/MainViewController+Segues.swift
+++ b/DuckDuckGo/MainViewController+Segues.swift
@@ -22,7 +22,6 @@ import Common
 import Core
 import Bookmarks
 import BrowserServicesKit
-import PrivacyDashboard
 
 extension MainViewController {
 
@@ -123,37 +122,21 @@ extension MainViewController {
         os_log(#function, log: .generalLog, type: .debug)
         hideAllHighlightsIfNeeded()
 
-        let brokenSiteInfo = currentTab?.getCurrentWebsiteInfo()
-        guard let currentURL = currentTab?.url,
-              let privacyInfo = currentTab?.makePrivacyInfo(url: currentURL) else {
-            assertionFailure("Missing fundamental data")
-            return
-        }
-        
-        let storyboard = UIStoryboard(name: "PrivacyDashboard", bundle: nil)
-        let controller = storyboard.instantiateInitialViewController { coder in
-             PrivacyDashboardViewController(coder: coder,
-                                           privacyInfo: privacyInfo,
-                                           privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager,
-                                           contentBlockingManager: ContentBlocking.shared.contentBlockingManager,
-                                           initMode: .reportBrokenSite)
-        }
-        
-        guard let controller = controller else {
-            assertionFailure("PrivacyDashboardViewController not initialised")
+        let storyboard = UIStoryboard(name: "Feedback", bundle: nil)
+        guard let controller: UINavigationController = storyboard.instantiateInitialViewController(),
+              let brokenSiteScreen = controller.topViewController as? ReportBrokenSiteViewController else {
+            assertionFailure()
             return
         }
-        
-        currentTab?.privacyDashboard = controller
-        controller.popoverPresentationController?.delegate = controller
-        controller.brokenSiteInfo = brokenSiteInfo
+
+        brokenSiteScreen.brokenSiteInfo = currentTab?.getCurrentWebsiteInfo()
 
         if UIDevice.current.userInterfaceIdiom == .pad {
             controller.modalPresentationStyle = .formSheet
         } else {
             controller.modalPresentationStyle = .pageSheet
         }
-        
+
         present(controller, animated: true)
     }
 
diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift
index 2577c60d3b..66785d4359 100644
--- a/DuckDuckGo/MainViewController.swift
+++ b/DuckDuckGo/MainViewController.swift
@@ -674,10 +674,10 @@ class MainViewController: UIViewController {
     func onQuickFirePressed() {
         wakeLazyFireButtonAnimator()
         
-        forgetAllWithAnimation {}
-        dismiss(animated: true)
+        self.forgetAllWithAnimation {}
+        self.dismiss(animated: true)
         if KeyboardSettings().onAppLaunch {
-            enterSearch()
+            self.enterSearch()
         }
     }
     
diff --git a/DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift b/DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift
deleted file mode 100644
index ab5bcd3e33..0000000000
--- a/DuckDuckGo/PrivacyDashboard/BrokenSiteInfo.swift
+++ /dev/null
@@ -1,130 +0,0 @@
-//
-//  BrokenSiteInfo.swift
-//  DuckDuckGo
-//
-//  Copyright © 2020 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import Foundation
-import Core
-
-public struct BrokenSiteInfo {
-
-    static let allowedQueryReservedCharacters =  CharacterSet(charactersIn: ",")
-
-    private struct Keys {
-        static let url = "siteUrl"
-        static let category = "category"
-        static let reportFlow = "reportFlow"
-        static let description = "description"
-        static let upgradedHttps = "upgradedHttps"
-        static let tds = "tds"
-        static let blockedTrackers = "blockedTrackers"
-        static let surrogates = "surrogates"
-        static let atb = "atb"
-        static let os = "os"
-        static let manufacturer = "manufacturer"
-        static let model = "model"
-        static let siteType = "siteType"
-        static let gpc = "gpc"
-        static let ampUrl = "ampUrl"
-        static let urlParametersRemoved = "urlParametersRemoved"
-        static let protectionsState = "protectionsState"
-    }
-    
-    public enum Source: String {
-        case menu
-        case dashboard
-    }
-    
-    private let url: URL?
-    private let httpsUpgrade: Bool
-    private let blockedTrackerDomains: [String]
-    private let installedSurrogates: [String]
-    private let isDesktop: Bool
-    private let tdsETag: String?
-    private let ampUrl: String?
-    private let urlParametersRemoved: Bool
-    private let model: String
-    private let manufacturer: String
-    private let systemVersion: String
-    private let gpc: Bool
-    private let protectionsState: Bool
-
-    public init(url: URL?, httpsUpgrade: Bool,
-                blockedTrackerDomains: [String],
-                installedSurrogates: [String],
-                isDesktop: Bool,
-                tdsETag: String?,
-                ampUrl: String?,
-                urlParametersRemoved: Bool,
-                protectionsState: Bool,
-                model: String = UIDevice.current.model,
-                manufacturer: String = "Apple",
-                systemVersion: String = UIDevice.current.systemVersion,
-                gpc: Bool? = nil) {
-        self.url = url
-        self.httpsUpgrade = httpsUpgrade
-        self.blockedTrackerDomains = blockedTrackerDomains
-        self.installedSurrogates = installedSurrogates
-        self.isDesktop = isDesktop
-        self.tdsETag = tdsETag
-        self.ampUrl = ampUrl
-        self.urlParametersRemoved = urlParametersRemoved
-
-        self.model = model
-        self.manufacturer = manufacturer
-        self.systemVersion = systemVersion
-        self.protectionsState = protectionsState
-
-        if let gpcParam = gpc {
-            self.gpc = gpcParam
-        } else {
-            self.gpc = AppDependencyProvider.shared.appSettings.sendDoNotSell
-        }
-    }
-    
-    func send(with category: String?, description: String, source: Source) {
-        
-        let parameters: [String: String] = [
-            Keys.url: normalize(url),
-            Keys.category: category ?? "",
-            Keys.description: description,
-            Keys.reportFlow: source.rawValue,
-            Keys.upgradedHttps: httpsUpgrade ? "true" : "false",
-            Keys.siteType: isDesktop ? "desktop" : "mobile",
-            Keys.tds: tdsETag?.trimmingCharacters(in: CharacterSet(charactersIn: "\"")) ?? "",
-            Keys.blockedTrackers: blockedTrackerDomains.joined(separator: ","),
-            Keys.surrogates: installedSurrogates.joined(separator: ","),
-            Keys.atb: StatisticsUserDefaults().atb ?? "",
-            Keys.os: systemVersion,
-            Keys.manufacturer: manufacturer,
-            Keys.model: model,
-            Keys.gpc: gpc ? "true" : "false",
-            Keys.ampUrl: ampUrl ?? "",
-            Keys.urlParametersRemoved: urlParametersRemoved ? "true" : "false",
-            Keys.protectionsState: protectionsState ? "true" : "false"
-        ]
-        
-        Pixel.fire(pixel: .brokenSiteReport,
-                   withAdditionalParameters: parameters,
-                   allowedQueryReservedCharacters: BrokenSiteInfo.allowedQueryReservedCharacters)
-    }
-    
-    private func normalize(_ url: URL?) -> String {
-        return url?.normalized()?.absoluteString ?? ""
-    }
-
-}
diff --git a/DuckDuckGo/PrivacyDashboard/PrivacyDashboardViewController.swift b/DuckDuckGo/PrivacyDashboardViewController.swift
similarity index 63%
rename from DuckDuckGo/PrivacyDashboard/PrivacyDashboardViewController.swift
rename to DuckDuckGo/PrivacyDashboardViewController.swift
index c9cec14d59..319e31b91e 100644
--- a/DuckDuckGo/PrivacyDashboard/PrivacyDashboardViewController.swift
+++ b/DuckDuckGo/PrivacyDashboardViewController.swift
@@ -24,42 +24,27 @@ import Core
 import BrowserServicesKit
 import PrivacyDashboard
 
-/// View controller used for `Privacy Dasboard` or `Report broken site`, the web content is chosen at init time setting the correct `initMode`
 class PrivacyDashboardViewController: UIViewController {
     
-    /// Type of web page displayed
-    enum Mode {
-        case privacyDashboard
-        case reportBrokenSite
-    }
-
     @IBOutlet private(set) weak var webView: WKWebView!
     
-    private let initMode: Mode
+    public weak var tabViewController: TabViewController?
+    
     private let privacyDashboardController: PrivacyDashboardController
     private let privacyConfigurationManager: PrivacyConfigurationManaging
     private let contentBlockingManager: ContentBlockerRulesManager
-    public var brokenSiteInfo: BrokenSiteInfo?
-    
-    var source: BrokenSiteInfo.Source {
-        initMode == .reportBrokenSite ? .menu : .dashboard
-    }
 
     init?(coder: NSCoder,
           privacyInfo: PrivacyInfo?,
           privacyConfigurationManager: PrivacyConfigurationManaging,
-          contentBlockingManager: ContentBlockerRulesManager,
-          initMode: Mode) {
+          contentBlockingManager: ContentBlockerRulesManager) {
         self.privacyDashboardController = PrivacyDashboardController(privacyInfo: privacyInfo)
         self.privacyConfigurationManager = privacyConfigurationManager
         self.contentBlockingManager = contentBlockingManager
-        self.initMode = initMode
         
         super.init(coder: coder)
         
-        self.privacyDashboardController.privacyDashboardDelegate = self
-        self.privacyDashboardController.privacyDashboardNavigationDelegate = self
-        self.privacyDashboardController.privacyDashboardReportBrokenSiteDelegate = self
+        self.privacyDashboardController.delegate = self
     }
     
     required init?(coder: NSCoder) {
@@ -68,7 +53,8 @@ class PrivacyDashboardViewController: UIViewController {
 
     public override func viewDidLoad() {
         super.viewDidLoad()
-        privacyDashboardController.setup(for: webView, reportBrokenSiteOnly: initMode == Mode.reportBrokenSite ? true : false)
+        
+        privacyDashboardController.setup(for: webView)
         privacyDashboardController.preferredLocale = Bundle.main.preferredLocalizations.first
         applyTheme(ThemeManager.shared.currentTheme)
     }
@@ -82,26 +68,38 @@ class PrivacyDashboardViewController: UIViewController {
         privacyDashboardController.didFinishRulesCompilation()
         privacyDashboardController.updatePrivacyInfo(privacyInfo)
     }
+    
+    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
+        if let navController = segue.destination as? UINavigationController,
+           let brokenSiteScreen = navController.topViewController as? ReportBrokenSiteViewController {
+            brokenSiteScreen.brokenSiteInfo = tabViewController?.getCurrentWebsiteInfo()
+        }
+    }
+}
 
-    private func privacyDashboardProtectionSwitchChangeHandler(state: ProtectionState) {
+private extension PrivacyDashboardViewController {
+    
+    func privacyDashboardProtectionSwitchChangeHandler(enabled: Bool) {
         guard let domain = privacyDashboardController.privacyInfo?.url.host else { return }
         
         let privacyConfiguration = privacyConfigurationManager.privacyConfig
-        let pixelParam = ["trigger_origin": state.eventOrigin.screen.rawValue]
-        if state.isProtected {
+        
+        if enabled {
             privacyConfiguration.userEnabledProtection(forDomain: domain)
             ActionMessageView.present(message: UserText.messageProtectionEnabled.format(arguments: domain))
-            Pixel.fire(pixel: .dashboardProtectionAllowlistRemove, withAdditionalParameters: pixelParam)
         } else {
             privacyConfiguration.userDisabledProtection(forDomain: domain)
             ActionMessageView.present(message: UserText.messageProtectionDisabled.format(arguments: domain))
-            Pixel.fire(pixel: .dashboardProtectionAllowlistAdd, withAdditionalParameters: pixelParam)
         }
         
         contentBlockingManager.scheduleCompilation()
+        
+        privacyDashboardController.didStartRulesCompilation()
+        
+        Pixel.fire(pixel: enabled ? .privacyDashboardProtectionEnabled : .privacyDashboardProtectionDisabled)
     }
     
-    private func privacyDashboardCloseHandler() {
+    func privacyDashboardCloseTappedHandler() {
         dismiss(animated: true)
     }
 }
@@ -124,8 +122,9 @@ extension PrivacyDashboardViewController: Themable {
 
 extension PrivacyDashboardViewController: PrivacyDashboardControllerDelegate {
 
-    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController, didChangeProtectionSwitch protectionState: ProtectionState) {
-        privacyDashboardProtectionSwitchChangeHandler(state: protectionState)
+    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController,
+                                    didChangeProtectionSwitch protectionState: ProtectionState) {
+        privacyDashboardProtectionSwitchChangeHandler(enabled: protectionState.isProtected)
     }
     
     func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController, didRequestOpenUrlInNewTab url: URL) {
@@ -136,8 +135,13 @@ extension PrivacyDashboardViewController: PrivacyDashboardControllerDelegate {
         }
     }
     
+    func privacyDashboardControllerDidTapClose(_ privacyDashboardController: PrivacyDashboardController) {
+        privacyDashboardCloseTappedHandler()
+    }
+    
     func privacyDashboardControllerDidRequestShowReportBrokenSite(_ privacyDashboardController: PrivacyDashboardController) {
         Pixel.fire(pixel: .privacyDashboardReportBrokenSite)
+        performSegue(withIdentifier: "ReportBrokenSite", sender: self)
     }
     
     func privacyDashboardController(_ privacyDashboardController: PrivacyDashboard.PrivacyDashboardController,
@@ -155,35 +159,4 @@ extension PrivacyDashboardViewController: PrivacyDashboardControllerDelegate {
     }
 }
 
-extension PrivacyDashboardViewController: PrivacyDashboardNavigationDelegate {
-    
-    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboard.PrivacyDashboardController, didSetHeight height: Int) {
-        // The size received in iPad is wrong, shane will sort this out soon.
-        // preferredContentSize.height = CGFloat(height)
-    }
-    
-    func privacyDashboardControllerDidTapClose(_ privacyDashboardController: PrivacyDashboardController) {
-        privacyDashboardCloseHandler()
-    }
-}
-
-extension PrivacyDashboardViewController: PrivacyDashboardReportBrokenSiteDelegate {
-        
-    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboardController, reportBrokenSiteDidChangeProtectionSwitch protectionState: ProtectionState) {
-        privacyDashboardProtectionSwitchChangeHandler(state: protectionState)
-    }
-    
-    func privacyDashboardController(_ privacyDashboardController: PrivacyDashboard.PrivacyDashboardController, didRequestSubmitBrokenSiteReportWithCategory category: String, description: String) {
-        
-        guard let brokenSiteInfo = brokenSiteInfo else {
-            assertionFailure("brokenSiteInfo not initialised")
-            return
-        }
-        
-        brokenSiteInfo.send(with: category, description: description, source: source)
-        ActionMessageView.present(message: UserText.feedbackSumbittedConfirmation)
-        privacyDashboardCloseHandler()
-    }
-}
-
-extension PrivacyDashboardViewController: UIPopoverPresentationControllerDelegate {}
+extension PrivacyDashboardViewController: UIPopoverPresentationControllerDelegate { }
diff --git a/DuckDuckGo/ReportBrokenSiteView.swift b/DuckDuckGo/ReportBrokenSiteView.swift
new file mode 100644
index 0000000000..788c524e29
--- /dev/null
+++ b/DuckDuckGo/ReportBrokenSiteView.swift
@@ -0,0 +1,150 @@
+//
+//  ReportBrokenSiteView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+import DuckUI
+import DesignResourcesKit
+
+struct ReportBrokenSiteView: View {
+    
+    let categories: [BrokenSite.Category]
+    let submitReport: (BrokenSite.Category?, String) -> Void
+    
+    @State private var selectedCategory: BrokenSite.Category?
+    
+    @State private var description: String = ""
+    @State private var placeholderText: String = UserText.brokenSiteCommentPlaceholder
+    
+    func submitForm() {
+        submitReport(selectedCategory, description)
+    }
+    
+    var form: some View {
+        Form {
+            Section {
+                
+            } header: {
+                VStack {
+                    Image("Breakage-128")
+                        .resizable()
+                        .aspectRatio(contentMode: .fit)
+                        .frame(width: Const.Size.imageSize, height: Const.Size.imageSize)
+                    
+                    Text(UserText.reportBrokenSiteHeader)
+                        .textCase(nil)
+                        .multilineTextAlignment(.center)
+                        .daxBodyRegular()
+                        .foregroundColor(Color(designSystemColor: .textSecondary))
+                }
+                .frame(maxWidth: .infinity)
+            }
+            .listRowBackground(Color.clear)
+            
+            Section {
+                HStack {
+                    Picker("", selection: $selectedCategory) {
+                        HStack {
+                            Text(UserText.brokenSiteCategoryPlaceholder)
+                            Spacer()
+                        }
+                        .tag(nil as BrokenSite.Category?)
+                        
+                        ForEach(categories) { cat in
+                            HStack {
+                                Text(cat.categoryText)
+                                Spacer()
+                            }
+                            .tag(Optional(cat))
+                        }
+                    }
+                    .labelsHidden()
+                    
+                    Spacer()
+                }
+                .padding(.leading, Const.Size.pickerPadding)
+            } header: {
+                Text(UserText.brokenSiteCategoryTitle)
+            }
+            
+            Section {
+                // As of July 2023 SwiftUI STILL does not support placeholders for `TextEditor`
+                // Until that time we have to use this hack to show a placeholder
+                // https://stackoverflow.com/a/65406506
+                ZStack {
+                    if self.description.isEmpty {
+                        TextEditor(text: $placeholderText)
+                            .font(.body)
+                            .foregroundColor(Color(UIColor.placeholderText))
+                            .disabled(true)
+                    }
+                    
+                    TextEditor(text: $description)
+                        .font(.body)
+                }
+                .padding(.leading, Const.Size.commentFieldPadding)
+                .frame(minHeight: Const.Size.minCommentHeight)
+            } header: {
+                Text(UserText.brokenSiteSectionTitle)
+            }
+            
+            Section {
+                Button(action: {
+                    submitForm()
+                }, label: {
+                    Text(UserText.appTPReportSubmit)
+                })
+                .buttonStyle(PrimaryButtonStyle())
+                .listRowBackground(Color.clear)
+            }
+            .listRowInsets(EdgeInsets())
+        }
+    }
+    
+    @ViewBuilder
+    var formWithBackground: some View {
+        if #available(iOS 16, *) {
+            form
+                .scrollContentBackground(.hidden)
+                .background(Color(designSystemColor: .background))
+        } else {
+            form
+                .background(Color(designSystemColor: .background))
+        }
+    }
+    
+    var body: some View {
+        formWithBackground
+    }
+}
+
+private enum Const {
+    enum Size {
+        static let imageSize: CGFloat = 128
+        static let minCommentHeight: CGFloat = 60
+        static let commentFieldPadding: CGFloat = -4
+        static let pickerPadding: CGFloat = -12
+        static let buttonHeight: CGFloat = 30
+    }
+}
+
+struct ReportBrokenSiteView_Previews: PreviewProvider {
+    static var previews: some View {
+        ReportBrokenSiteView(categories: BrokenSite.Category.allCases, submitReport: { _, _ in })
+    }
+}
diff --git a/DuckDuckGo/ReportBrokenSiteViewController.swift b/DuckDuckGo/ReportBrokenSiteViewController.swift
new file mode 100644
index 0000000000..ea23d8112c
--- /dev/null
+++ b/DuckDuckGo/ReportBrokenSiteViewController.swift
@@ -0,0 +1,79 @@
+//
+//  ReportBrokenSiteViewController.swift
+//  DuckDuckGo
+//
+//  Copyright © 2020 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import UIKit
+import SwiftUI
+
+class ReportBrokenSiteViewController: UIViewController {
+    
+    public var brokenSiteInfo: BrokenSiteInfo?
+    
+    private var reportView: ReportBrokenSiteView?
+    
+    private let categories: [BrokenSite.Category] = {
+        var categories = BrokenSite.Category.allCases
+        categories = categories.filter { $0 != .other }
+        categories = categories.shuffled()
+        categories.append(.other)
+        return categories
+    }()
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        applyTheme(ThemeManager.shared.currentTheme)
+        
+        reportView = ReportBrokenSiteView(categories: categories, submitReport: submitForm(category:description:))
+        let hc = UIHostingController(rootView: reportView)
+        
+        self.addChild(hc)
+        self.view.addSubview(hc.view)
+        hc.didMove(toParent: self)
+        
+        hc.view.translatesAutoresizingMaskIntoConstraints = false
+        hc.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
+        hc.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
+        hc.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
+        hc.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
+        
+        DispatchQueue.main.async {
+            self.view.setNeedsLayout()
+            self.view.layoutIfNeeded()
+        }
+    }
+    
+    @IBAction func onClosePressed(sender: Any) {
+        dismiss(animated: true)
+    }
+    
+    func submitForm(category: BrokenSite.Category?, description: String) {
+        brokenSiteInfo?.send(with: category?.rawValue, description: description)
+        ActionMessageView.present(message: UserText.feedbackSumbittedConfirmation)
+        dismiss(animated: true)
+    }
+}
+
+extension ReportBrokenSiteViewController: Themable {
+    
+    func decorate(with theme: Theme) {
+        decorateNavigationBar(with: theme)
+        
+        view.backgroundColor = theme.backgroundColor
+    }
+}
diff --git a/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift b/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
index c2ea00eb73..082b312ace 100644
--- a/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
+++ b/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
@@ -27,13 +27,13 @@ extension SyncSettingsViewController: SyncManagementViewModelDelegate {
 
     func launchAutofillViewController() {
         guard let mainVC = view.window?.rootViewController as? MainViewController else { return }
-        dismiss(animated: true)
+        self.dismiss(animated: true)
         mainVC.launchAutofillLogins()
     }
 
     func launchBookmarksViewController() {
         guard let mainVC = view.window?.rootViewController as? MainViewController else { return }
-        dismiss(animated: true)
+        self.dismiss(animated: true)
         mainVC.segueToBookmarks()
     }
 
diff --git a/DuckDuckGo/TabDelegate.swift b/DuckDuckGo/TabDelegate.swift
index d5c58da091..6f7438d918 100644
--- a/DuckDuckGo/TabDelegate.swift
+++ b/DuckDuckGo/TabDelegate.swift
@@ -86,4 +86,5 @@ protocol TabDelegate: AnyObject {
     func tabCheckIfItsBeingCurrentlyPresented(_ tab: TabViewController) -> Bool
     
     func showBars()
+
 }
diff --git a/DuckDuckGo/TabViewController.swift b/DuckDuckGo/TabViewController.swift
index b16261e6cb..e54ad09196 100644
--- a/DuckDuckGo/TabViewController.swift
+++ b/DuckDuckGo/TabViewController.swift
@@ -82,7 +82,7 @@ class TabViewController: UIViewController {
 
     private(set) var webView: WKWebView!
     private lazy var appRatingPrompt: AppRatingPrompt = AppRatingPrompt()
-    public weak var privacyDashboard: PrivacyDashboardViewController?
+    private weak var privacyDashboard: PrivacyDashboardViewController?
     
     private var storageCache: StorageCache = AppDependencyProvider.shared.storageCache
     let appSettings: AppSettings
@@ -681,7 +681,7 @@ class TabViewController: UIViewController {
                 controller.popoverPresentationController?.sourceRect = iconView.bounds
             }
             privacyDashboard = controller
-            privacyDashboard?.brokenSiteInfo = getCurrentWebsiteInfo()
+            privacyDashboard?.tabViewController = self
         }
         
         if let controller = segue.destination as? FullscreenDaxDialogViewController {
@@ -707,10 +707,8 @@ class TabViewController: UIViewController {
         PrivacyDashboardViewController(coder: coder,
                                        privacyInfo: privacyInfo,
                                        privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager,
-                                       contentBlockingManager: ContentBlocking.shared.contentBlockingManager,
-                                       initMode: .privacyDashboard)
+                                       contentBlockingManager: ContentBlocking.shared.contentBlockingManager)
     }
-    
     private func addTextSizeObserver() {
         NotificationCenter.default.addObserver(self,
                                                selector: #selector(onTextSizeChange),
@@ -772,7 +770,7 @@ class TabViewController: UIViewController {
         onPrivacyInfoChanged()
     }
     
-    public func makePrivacyInfo(url: URL) -> PrivacyInfo? {
+    private func makePrivacyInfo(url: URL) -> PrivacyInfo? {
         guard let host = url.host else { return nil }
         
         let entity = ContentBlocking.shared.trackerDataManager.trackerData.findEntity(forHost: host)
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 637d4f6fac..08452d8e89 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -91,6 +91,24 @@ public struct UserText {
     public static let navigationTitleEdit = NSLocalizedString("navigation.title.edit", value: "Edit", comment: "Edit button")
     public static let navigationTitleDone = NSLocalizedString("navigation.title.done", value: "Done", comment: "Finish editing bookmarks button")
     
+    static let reportBrokenSiteHeader = NSLocalizedString("report.brokensite.header", value: "Submitting an anonymous broken site report helps us debug these issues and improve the app.", comment: "")
+    
+    static let brokenSiteSectionTitle = NSLocalizedString("brokensite.sectionTitle", value: "DESCRIBE WHAT HAPPENED", comment: "Broken Site Section Title")
+    static let brokenSiteCategoryTitle = NSLocalizedString("brokensite.categoryTitle", value: "SELECT A CATEGORY", comment: "Broken Site Category Section Title")
+    static let brokenSiteCategoryPlaceholder = NSLocalizedString("brokensite.categoryPlaceholder", value: "Pick your issue from the list...", comment: "Broken Site Category Placeholder")
+    static let brokenSiteCommentPlaceholder = NSLocalizedString("brokensite.commentPlaceholder", value: "Sharing more details can help us address this issue", comment: "Broken Site Comment Placeholder")
+    
+    static let brokenSiteCategoryImages = NSLocalizedString("brokensite.category.images", value: "Images didn’t load", comment: "Broken Site Category")
+    static let brokenSiteCategoryPaywall = NSLocalizedString("brokensite.category.paywall", value: "The site asked me to disable", comment: "Broken Site Category")
+    static let brokenSiteCategoryComments = NSLocalizedString("brokensite.category.comments", value: "Comments didn’t load", comment: "Broken Site Category")
+    static let brokenSiteCategoryVideos = NSLocalizedString("brokensite.category.videos", value: "Video didn’t play", comment: "Broken Site Category")
+    static let brokenSiteCategoryLinks = NSLocalizedString("brokensite.category.links", value: "Links or buttons don’t work", comment: "Broken Site Category")
+    static let brokenSiteCategoryContent = NSLocalizedString("brokensite.category.content", value: "Content is missing", comment: "Broken Site Category")
+    static let brokenSiteCategoryLogin = NSLocalizedString("brokensite.category.login", value: "I can’t sign in", comment: "Broken Site Category")
+    static let brokenSiteCategoryUnsupported = NSLocalizedString("brokensite.category.unsupported", value: "The browser is incompatible", comment: "Broken Site Category")
+    static let brokenSiteCategoryCookiePrompt = NSLocalizedString("brokensite.category.cookieprompt", value: "Cookie pop-up wasn't managed", comment: "Broken Site Category")
+    static let brokenSiteCategoryOther = NSLocalizedString("brokensite.category.other", value: "Something else", comment: "Broken Site Category")
+        
     public static let homeRowReminderTitle = NSLocalizedString("home.row.reminder.title", value: "Take DuckDuckGo home", comment: "Home is this context is the bottom home row (dock)")
     public static let homeRowReminderMessage = NSLocalizedString("home.row.reminder.message", value: "Add DuckDuckGo to your dock for easy access!", comment: "")
     
diff --git a/DuckDuckGo/WebContainerViewController.swift b/DuckDuckGo/WebContainerViewController.swift
index fa4f3d74bb..2dd1663815 100644
--- a/DuckDuckGo/WebContainerViewController.swift
+++ b/DuckDuckGo/WebContainerViewController.swift
@@ -63,7 +63,7 @@ class WebContainerViewController: UIViewController {
     }
 
     @IBAction func dismiss() {
-        dismiss(animated: true)
+        self.dismiss(animated: true)
     }
 
     private func load(url: URL) {
diff --git a/DuckDuckGo/bg.lproj/Feedback.strings b/DuckDuckGo/bg.lproj/Feedback.strings
index 6cf1444e00..a207c7cead 100644
--- a/DuckDuckGo/bg.lproj/Feedback.strings
+++ b/DuckDuckGo/bg.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Не, благодаря! Готово";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Затваряне";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Споделяне на отзив";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Кой уебсайт е повреден?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Подаване на сигнал за повреден сайт";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Споделяне на отзив";
 
diff --git a/DuckDuckGo/bg.lproj/Localizable.strings b/DuckDuckGo/bg.lproj/Localizable.strings
index 4619b25016..ebb2fec0f5 100644
--- a/DuckDuckGo/bg.lproj/Localizable.strings
+++ b/DuckDuckGo/bg.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Редактиране";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Съществуващите отметки няма да бъдат дублирани.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Превишихте ограничението за синхронизиране на отметки. Опитайте да изтриете някои от отметките. Докато този проблем не бъде разрешен, отметките няма да бъдат архивирани.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Синхронизирането на отметки е на пауза";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Превишихте ограничението за синхронизиране на пароли. Опитайте да изтриете някои от паролите. Докато този проблем не бъде разрешен, паролите няма да бъдат архивирани.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Синхронизирането на паролите е на пауза";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Научете повече";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "ОК";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Поставяне на всички раздели в отметки?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Импортирайте HTML файл с отметки от друг браузър или експортирайте съществуващите отметки.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Коментарите не се зареждат";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Липсва съдържание";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Неуспешно управление на изскачащ прозорец за бисквитки";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Изображенията не се зареждат";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Връзките или бутоните не работят";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Не мога да вляза";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Нещо друго";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Сайтът ме помоли да деактивирам";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Браузърът е несъвместим";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Видеото не се възпроизвежда";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Изберете проблем от списъка...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "ИЗБЕРЕТЕ КАТЕГОРИЯ";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Ако споделите повече подробности, може да ни помогне да се справим с този проблем";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "ОПИШЕТЕ ПРОБЛЕМА";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "контейнер: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Премахване";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Всички любими, запазени на устройството";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Изберете кои любими отметки да се показват в нов раздел въз основа на техния произход.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Предпочитания за показване";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Само любими на мобилни устройства";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Блокиране на реклами и изскачащи прозорци";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Отваряне на VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Управление";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Включване на известията";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Разрешете на DuckDuckGo да Ви уведомява, ако връзката бъде прекъсната или състоянието на VPN се промени.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Получавайте известия при прекъсване на връзката или промяна на състоянието на VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Известия за VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Автоматично възстановяване на VPN връзка след прекъсване.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Винаги включено";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Известия за VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Мрежовата защита предотвратява изтичането на DNS към Вашия доставчик на интернет услуги, като насочва DNS заявките през VPN тунела към нашия собствен резолвер.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Сигурен DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Настройки на VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Отваряне в друго приложение?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Изпращането на анонимен доклад за неработещ сайт ни помага да отстраним грешките и да подобрим приложението.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Търсене или въвеждане на адрес";
 
diff --git a/DuckDuckGo/bg.lproj/PrivacyDashboard.strings b/DuckDuckGo/bg.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..a0488e0ab4
--- /dev/null
+++ b/DuckDuckGo/bg.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Сайтът е основна проследяваща мрежа";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Нов опит";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Данните не са криптирани";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Подаване на сигнал за повреден сайт";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Проверете интернет връзката и опитайте отново.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Засилена степен";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Етикет";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Опа, това не се получи";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Клас на поверителност";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Бутон";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "ПРАКТИКИ ЗА ЗАЩИТА НА ПОВЕРИТЕЛНОСТТА";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Нулиране на статистики на проследяващи мрежи";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Бутон";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ШИФРОВАНА ВРЪЗКА";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Бутон";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Незащитени сайтове";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Блокирани мрежи";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 блокирани тракери";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Подаване на сигнал за повреден сайт";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Практики за защита на поверителността";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Основни нарушители";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Етикет";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Не са намерени практики за защита на поверителността";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Незащитени сайтове";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Етикет";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Добри практики за защита на поверителността";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Защита на поверителността на сайта";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Защита на поверителността на сайта";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "ОСНОВНИ НАРУШИТЕЛИ В ПРОСЛЕДЯВАЩАТА МРЕЖА";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Шифрована връзка";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Деактивирахме временно защитата на поверителността, защото изглежда, че пречи на зареждането на този сайт.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Блокирани основни мрежи";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "ЧЕСТОТА НА ПРОСЛЕДЯВАЩА МРЕЖА";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Заредени са 8 други домейна";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Шифрована връзка";
+
diff --git a/DuckDuckGo/bg.lproj/Settings.strings b/DuckDuckGo/bg.lproj/Settings.strings
index 6887796705..961ce72b2a 100644
--- a/DuckDuckGo/bg.lproj/Settings.strings
+++ b/DuckDuckGo/bg.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Автоматично изчистване на данните";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Още на duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Настройки";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "По подразбиране";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Поверителност, опростена. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Управление на прозорци за бисквитки";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Защитата на поверителността е активирана за всички сайтове";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Икона";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Още от DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Синхронизиране и архивиране";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Синхронизиране";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Сърфирайте поверително с нашето приложение за Mac ";
diff --git a/DuckDuckGo/cs.lproj/Feedback.strings b/DuckDuckGo/cs.lproj/Feedback.strings
index 816910d59f..a9f2cec279 100644
--- a/DuckDuckGo/cs.lproj/Feedback.strings
+++ b/DuckDuckGo/cs.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, díky! Skončil(a) jsem";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Zavřít";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Podělte se o zpětnou vazbu";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Které webové stránky jsou poškozené?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Nahlásit nefunkční webové stránky";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Podělte se o zpětnou vazbu";
 
diff --git a/DuckDuckGo/cs.lproj/Localizable.strings b/DuckDuckGo/cs.lproj/Localizable.strings
index 1542c6559b..02864ed0e8 100644
--- a/DuckDuckGo/cs.lproj/Localizable.strings
+++ b/DuckDuckGo/cs.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Upravit";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Existující záložky nebudou duplikovány.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Máš překročený limit pro synchronizaci záložek. Zkus pár záložek smazat. Dokud problém nevyřešíš, záložky se nebudou zálohovat.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Synchronizace záložek je pozastavená";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Máš překročený limit pro synchronizaci hesel. Zkus pár hesel smazat. Dokud tenhle problém nevyřešíš, hesla se nebudou zálohovat.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Synchronizace hesel je pozastavená";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Více informací";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "DOBŘE";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Dát do záložek všechny karty?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Naimportuj soubor HTML se záložkami z jiného prohlížeče nebo vyexportuj svoje existující záložky.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Komentáře se nenačetly";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Chybí obsah";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Správa vyskakovacích oken pro souhlas s cookies se neaktivovala";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Obrázky se nenačetly";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Odkazy nebo tlačítka nefungují";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Nemohu se přihlásit";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Něco jiného";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Tato stránka mě požádala o deaktivaci";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Prohlížeč je nekompatibilní";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video se nepřehrálo";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Vyber problém ze seznamu...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VYBER KATEGORII";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Tento problém snáz vyřešíme, když nám nasdílíš další informace";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "POPIŠTE, CO SE STALO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: % @";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Odstranit";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Všechny oblíbené položky na zařízení";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Vyber, které oblíbené položky se mají zobrazit na nové kartě podle jejich původu.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Předvolby zobrazení";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Jenom oblíbené mobilní položky";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokování reklam a vyskakovacích oken";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Otevřít VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Spravovat";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Zapnout oznámení";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Nech si od DuckDuckGo poslat upozornění, když se přeruší připojení nebo se změní stav VPN.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Nech si poslat upozornění, když se přeruší připojení nebo se změní stav VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Upozornění VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Po přerušení automaticky obnovit připojení VPN.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Vždycky zapnuté";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Oznámení sítě VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Ochrana sítě zabraňuje únikům DNS k poskytovateli internetových služeb tím, že směruje dotazy DNS přes tunel VPN na náš vlastní resolver.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Zabezpečený systém DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Nastavení sítě VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otevřít v jiné aplikaci?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Odeslání anonymní zprávy o nefunkčním webu nám pomůže tyto problémy řešit a vylepšovat aplikaci.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Vyhledejte nebo zadejte adresu";
 
diff --git a/DuckDuckGo/cs.lproj/PrivacyDashboard.strings b/DuckDuckGo/cs.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..aa68ffa1dc
--- /dev/null
+++ b/DuckDuckGo/cs.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Stránky jsou hlavní sledovací sítí";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Zkuste to znovu";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Data jsou nezašifrovaná";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Nahlásit nefunkční webové stránky";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Zkontrolujte připojení k internetu a zkuste to znovu.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Rozšířené hodnocení";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Štítek";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "A jéje, to nefungovalo";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Hodnocení ochrany soukromí";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Tlačítko";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "ZÁSADY OCHRANY SOUKROMÍ";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Obnovit statistiky sledovací sítě";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Tlačítko";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŠIFROVANÉ PŘIPOJENÍ";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Tlačítko";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Nechráněné stránky";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Blokované sítě";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 blokovaných trackerů";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Nahlásit nefunkční webové stránky";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Zásady ochrany soukromí";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Nejčastější provinilci";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Štítek";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nebyly nalezeny žádné postupy na ochranu soukromí";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Nechráněné stránky";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Štítek";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Správné postupy ochrany soukromí";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Ochrana osobních údajů na webových stránkách";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Ochrana osobních údajů na webových stránkách";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "NEJČASTĚJŠÍ DELIKVENTI SLEDOVACÍ SÍTĚ";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Šifrované připojení";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Dočasně jsme zakázali ochranu osobních údajů, protože se zdá, že porušuje podmínky této stránky.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Hlavní sítě zablokovány";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FREKVENCE SLEDOVACÍ SÍTĚ";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Načteno dalších 8 domén";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Šifrované připojení";
+
diff --git a/DuckDuckGo/cs.lproj/Settings.strings b/DuckDuckGo/cs.lproj/Settings.strings
index 965b4ff82e..bb12c152b4 100644
--- a/DuckDuckGo/cs.lproj/Settings.strings
+++ b/DuckDuckGo/cs.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automaticky vymazat data";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Více na duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nastavení";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Výchozí";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Ochrana soukromí, zjednodušená. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Správa vyskakovacích oken ohledně cookies";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Ochrana osobních údajů povolena pro všechny weby";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Další od DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronizace a zálohování";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronizace";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Anonymní brouzdání po internetu s naší aplikací pro Mac ";
diff --git a/DuckDuckGo/da.lproj/Feedback.strings b/DuckDuckGo/da.lproj/Feedback.strings
index 9ef0f1d21d..8d15d853f7 100644
--- a/DuckDuckGo/da.lproj/Feedback.strings
+++ b/DuckDuckGo/da.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nej tak. jeg er færdig";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Luk";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Del feedback";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Hvilket websted er ødelagt?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Rapporter ødelagt websted";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Del feedback";
 
diff --git a/DuckDuckGo/da.lproj/Localizable.strings b/DuckDuckGo/da.lproj/Localizable.strings
index 3b9fcbc22c..a0e9bb2c37 100644
--- a/DuckDuckGo/da.lproj/Localizable.strings
+++ b/DuckDuckGo/da.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Rediger";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Eksisterende bogmærker duplikeres ikke.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Du har overskredet grænsen for bogmærkesynkronisering. Prøv at slette nogle bogmærker. Dine bogmærker vil ikke blive sikkerhedskopieret, før dette er løst.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Bogmærkesynkronisering er sat på pause";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Du har overskredet grænsen for synkronisering af adgangskoder. Prøv at slette nogle adgangskoder. Dine adgangskoder vil ikke blive sikkerhedskopieret, før dette er løst.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Synkronisering af adgangskoder er sat på pause";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Mere info";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "Okay";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Bogmærk alle faner?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importér en HTML-fil med bogmærker fra en anden browser, eller eksportér dine eksisterende bogmærker.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Kommentarer blev ikke indlæst";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Indhold mangler";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Cookie-pop op blev ikke administreret";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Billeder blev ikke indlæst";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Links eller knapper fungerer ikke";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Jeg kan ikke logge ind";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Noget andet";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Webstedet bad mig om at deaktivere";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Browseren er inkompatibel";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Videoen blev ikke spillet";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Vælg dit emne fra listen ...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VÆLG EN KATEGORI";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Flere detaljer kan hjælpe os med at løse dette problem";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "BESKRIV, HVAD DER SKETE";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Fjern";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Alle favoritter på enheden";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Vælg, hvilke favoritter der skal vises på en ny fane baseret på deres oprindelse.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Indstillinger for visning";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Kun favoritter på mobil";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokering af annoncer og pop op-vinduer";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Åbn VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Administrer";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Slå notifikationer til";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Tillad DuckDuckGo at give dig besked, hvis din forbindelse falder ud, eller VPN-status ændres.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Få besked, hvis din forbindelse falder ud, eller VPN-status ændres.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-advarsler";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Gendan automatisk en VPN-forbindelse efter afbrydelse.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Altid aktiv";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-meddelelser";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection forhindrer DNS-lækager til din internetudbyder ved at dirigere DNS-forespørgsler gennem VPN-tunnelen til vores egen resolver.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Sikker DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-indstillinger";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Åbn i en anden app?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Indsendelse af en anonym webstedsrapport om brud hjælper os med at debugge disse problemer og forbedre appen.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Søg eller indtast adresse";
 
diff --git a/DuckDuckGo/da.lproj/PrivacyDashboard.strings b/DuckDuckGo/da.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..48b888961d
--- /dev/null
+++ b/DuckDuckGo/da.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Websted er et stort tracker-netværk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Prøv igen";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Data er ikke krypterede";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Rapporter ødelagt websted";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Kontroller din internetforbindelse, og prøv igen.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Forstærket grad";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etiket";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Åh nej, det fungerede ikke";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Grad af privatliv";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Knap";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "Praksis for beskyttelse af privatlivets fred";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Nulstil statistik for tracker-netværk";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Knap";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "Krypteret forbindelse";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Knap";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Ubeskyttede websteder";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Netværk blokeret";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 trackere blokeret";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Rapporter ødelagt websted";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Praksis for beskyttelse af privatlivets fred";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Primære overtrædere";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etiket";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Ingen praksis for beskyttelse af privatlivets fred fundet";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Ubeskyttede websteder";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etiket";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "God praksis for beskyttelse af privatlivets fred";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Webstedets beskyttelse af personlige oplysninger";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Webstedets beskyttelse af personlige oplysninger";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "DE STØRSTE LOVOVERTRÆDERE FRA TRACKER-NETVÆRK";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Krypteret forbindelse";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Vi har midlertidigt deaktiveret beskyttelse af privatlivets fred, da det ser ud til at ødelægge dette websted.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Store netværk blokeret";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "TRACKER NETVÆRKSFREKVENS";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 andre domæner indlæst";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Krypteret forbindelse";
+
diff --git a/DuckDuckGo/da.lproj/Settings.strings b/DuckDuckGo/da.lproj/Settings.strings
index 631f1f1c56..b0c910808b 100644
--- a/DuckDuckGo/da.lproj/Settings.strings
+++ b/DuckDuckGo/da.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Ryd data automatisk";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Mere på duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Indstillinger";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Tema";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Fortrolighed, helt enkelt. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Administrer cookie pop op-vinduer";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Databeskyttelse aktiveret for alle websteder";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mere fra DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronisering og sikkerhedskopiering";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronisering";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Browse privat med vores app til Mac ";
diff --git a/DuckDuckGo/de.lproj/Feedback.strings b/DuckDuckGo/de.lproj/Feedback.strings
index 1e29dbe8a2..5630ec0bc1 100644
--- a/DuckDuckGo/de.lproj/Feedback.strings
+++ b/DuckDuckGo/de.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nein danke. Ich bin fertig";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Schließen";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Feedback teilen";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Welche Website ist fehlerhaft?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Fehlerhafte Website melden";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Feedback teilen";
 
diff --git a/DuckDuckGo/de.lproj/Localizable.strings b/DuckDuckGo/de.lproj/Localizable.strings
index 3a0b2d35d1..6f59a19e6e 100644
--- a/DuckDuckGo/de.lproj/Localizable.strings
+++ b/DuckDuckGo/de.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Bearbeiten";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Bestehende Lesezeichen werden nicht kopiert.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Du hast das Limit für die Synchronisierung von Lesezeichen überschritten. Versuche, einige Lesezeichen zu löschen. Bis dieses Problem behoben ist, werden deine Lesezeichen nicht gesichert.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Lesezeichen-Synchronisierung ist angehalten";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Du hast das Limit für die Synchronisierung von Passwörtern überschritten. Versuche, einige Passwörter zu löschen. Bis dieses Problem behoben ist, werden deine Passwörter nicht gesichert.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Passwortsynchronisierung ist angehalten";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Mehr erfahren";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Alle Tabs mit Lesezeichen versehen?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importiere eine HTML-Datei mit Lesezeichen aus einem anderen Browser oder exportieren deine vorhandenen Lesezeichen.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Kommentare wurden nicht geladen";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Inhalt fehlt";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Cookie-Pop-up wurde nicht verwaltet";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Bilder wurden nicht geladen";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Links oder Schaltflächen funktionieren nicht";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Ich kann mich nicht anmelden";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Etwas anderes";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Die Seite hat mich aufgefordert zu deaktivieren";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Der Browser ist nicht kompatibel";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video wurde nicht abgespielt";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Wähle dein Problem aus der Liste aus...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "EINE KATEGORIE AUSWÄHLEN";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Das Teilen weiterer Details kann uns helfen, dieses Problem zu lösen";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "BESCHREIBE, WAS PASSIERT IST";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "Bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Entfernen";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Alle Gerätefavoriten";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Wähle aus, welche Favoriten auf in einem neuen Tab angezeigt werden sollen, je nachdem, woher sie stammen.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Anzeigeeinstellungen";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Nur mobile Favoriten";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blockieren von Werbungen und Pop-ups";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "VPN öffnen";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Verwalten";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Benachrichtigungen aktivieren";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Erlaube DuckDuckGo, dich zu benachrichtigen, wenn deine Verbindung abbricht oder sich dein VPN-Status ändert.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Lass dich benachrichtigen, wenn deine Verbindung abbricht oder sich der VPN-Status ändert.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-Benachrichtigungen";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Stelle eine VPN-Verbindung nach einer Unterbrechung automatisch wieder her.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Immer aktiviert";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-Benachrichtigungen";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection verhindert DNS-Lecks zu deinem Internetanbieter, indem DNS-Anfragen über den VPN-Tunnel an unseren eigenen Resolver weitergeleitet werden.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Sicheres DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-Einstellungen";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "In einer anderen App öffnen?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Das Senden eines anonymen Berichts über fehlerhafte Websites hilft uns, diese Probleme zu beheben und die App zu verbessern.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Adresse suchen oder eingeben";
 
diff --git a/DuckDuckGo/de.lproj/PrivacyDashboard.strings b/DuckDuckGo/de.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..7173449fbc
--- /dev/null
+++ b/DuckDuckGo/de.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Diese Website gehört zu einem großen Tracker-Netzwerk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Erneut versuchen";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Die Daten sind unverschlüsselt";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Fehlerhafte Website melden";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Überprüfe deine Internetverbindung und versuche es erneut.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Erhöhte Stufe";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Oh, das hat nicht funktioniert";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Datenschutz-Stufe";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Schaltfläche";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "DATENSCHUTZPRAKTIKEN";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Tracker-Netzwerk-Statistiken zurücksetzen";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Schaltfläche";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "Verschlüsselte Verbindung";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Schaltfläche";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Ungeschützte Websites";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Netzwerke wurden blockiert";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 Tracker wurden blockiert";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Fehlerhafte Website melden";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Datenschutzpraktiken";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Hartnäckigste Tracker";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Keine Datenschutzpraktiken gefunden";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Ungeschützte Websites";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Gute Datenschutzpraktiken";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Datenschutz der Website";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Datenschutz der Website";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "HARTNÄCKIGSTE TRACKER-NETZWERKE";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Verschlüsselte Verbindung";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Wir haben den Datenschutz vorübergehend deaktiviert, da die Seite derzeit dadurch gestört wird.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Große Netzwerke wurden blockiert";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "TRACKER-NETZWERK-HÄUFIGKEIT";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 weitere Domains geladen";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Verschlüsselte Verbindung";
+
diff --git a/DuckDuckGo/de.lproj/Settings.strings b/DuckDuckGo/de.lproj/Settings.strings
index 49d0dd41f7..739a017f02 100644
--- a/DuckDuckGo/de.lproj/Settings.strings
+++ b/DuckDuckGo/de.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Daten automatisch löschen";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Mehr auf duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Einstellungen";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standard";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Datenschutz, vereinfacht. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Cookie-Pop-ups verwalten";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Datenschutz für alle Websites aktiviert";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Symbol";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mehr von DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronisieren und sichern";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronisieren";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Privat browsen mit unserer App für Mac ";
diff --git a/DuckDuckGo/el.lproj/Feedback.strings b/DuckDuckGo/el.lproj/Feedback.strings
index f79eaed2c7..8bdc855b3f 100644
--- a/DuckDuckGo/el.lproj/Feedback.strings
+++ b/DuckDuckGo/el.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Όχι ευχαριστώ! Τελείωσα";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Κλείσιμο";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Κοινοποίηση σχολίου";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Ποιος ιστότοπος είναι κατεστραμμένος;";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Αναφορά ιστότοπου που δεν λειτουργεί";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Κοινοποίηση σχολίου";
 
diff --git a/DuckDuckGo/el.lproj/Localizable.strings b/DuckDuckGo/el.lproj/Localizable.strings
index b416648110..ff3591fc75 100644
--- a/DuckDuckGo/el.lproj/Localizable.strings
+++ b/DuckDuckGo/el.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Επεξεργασία";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Οι υπάρχοντες σελιδοδείκτες δεν θα αναπαραχθούν.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Έχετε υπερβεί το όριο συγχρονισμού σελιδοδεικτών. Προσπαθήστε να διαγράψετε ορισμένους σελιδοδείκτες. Μέχρι να επιλυθεί το πρόβλημα αυτό, δεν θα δημιουργηθούν αντίγραφα ασφαλείας για τους σελιδοδείκτες σας.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Ο συγχρονισμός σελιδοδεικτών έχει τεθεί σε παύση";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Έχετε υπερβεί το όριο συγχρονισμού κωδικών πρόσβασης. Προσπαθήστε να διαγράψετε κάποιους κωδικούς πρόσβασης. Μέχρι να επιλυθεί το πρόβλημα αυτό, δεν θα δημιουργηθούν αντίγραφα ασφαλείας για τους κωδικούς πρόσβασής σας.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Ο συγχρονισμός κωδικών πρόσβασης έχει τεθεί σε παύση";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Μάθετε περισσότερα";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "Εντάξει";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Προσθήκη σελιδοδείκτη για όλες τις καρτέλες;";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Κάντε εισαγωγή ενός αρχείου HTML με σελιδοδείκτες από άλλο πρόγραμμα περιήγησης, ή κάντε εξαγωγή των σελιδοδεικτών που διαθέτετε ήδη.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Τα σχόλια δεν φορτώθηκαν";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Το περιεχόμενο λείπει";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Δεν έγινε διαχείριση του αναδυόμενου παραθύρου για cookies";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Οι εικόνες δεν φορτώθηκαν";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Οι σύνδεσμοι ή τα κουμπιά δεν λειτουργούν";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Δεν μπορώ να συνδεθώ";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Κάτι άλλο";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Ο ιστότοπος μου ζήτησε να απενεργοποιήσω";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Το πρόγραμμα περιήγησης είναι ασύμβατο";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Το βίντεο δεν αναπαράχθηκε";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Επιλέξτε το πρόβλημα που αντιμετωπίζετε, από τη λίστα...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "ΕΠΙΛΕΞΤΕ ΚΑΤΗΓΟΡΙΑ";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Η κοινοποίηση περισσότερων λεπτομερειών μπορεί να μας βοηθήσει να επιλύσουμε το πρόβλημα αυτό";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "ΠΕΡΙΓΡΑΨΤΕ ΤΙ ΣΥΝΕΒΗ";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "κάδος: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Αφαίρεση";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Αγαπημένα όλων των συσκευών";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Επιλέξτε ποια αγαπημένα θα εμφανίζονται σε μια νέα καρτέλα με βάση την προέλευσή τους.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Προτιμήσεις προβολής";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Αγαπημένα μόνο για κινητά";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Αποκλεισμός διαφημίσεων και αναδυόμενων παραθύρων";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Ανοικτό VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Διαχείριση";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Ενεργοποίηση ειδοποιήσεων";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Επιτρέψτε στο DuckDuckGo να σας ειδοποιεί εάν η ισχύς της σύνδεσή σας μειωθεί ή αλλάξει η κατάσταση του VPN.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Ειδοποιηθείτε εάν η ισχύς της σύνδεσής σας μειωθεί ή αλλάξει η κατάσταση του VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Ειδοποιήσεις VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Αυτόματη αποκατάσταση μιας σύνδεσης VPN έπειτα από διακοπή.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Πάντα σε λειτουργία";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Ειδοποιήσεις VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Η Προστασία δικτύου αποτρέπει διαρροές DNS προς τον πάροχο υπηρεσιών διαδικτύου σας, δρομολογώντας ερωτήματα DNS μέσω της σήραγγας VPN στο δικό μας πρόγραμμα επίλυσης.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Ασφαλές DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Ρυθμίσεις VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Άνοιγμα σε άλλη εφαρμογή;";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Η υποβολή μιας ανώνυμης αναφοράς για σπασμένους συνδεσμους μασ βοηθά να πραγματοποιήσουμε επανόρθωση των εντοπισμένων σφαλμάτων και προβλημάτων αυτών των ζητημάτων και να βελτιώσουμε την εφαρμογή.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Αναζήτηση ή εισαγωγή διεύθυνσης";
 
diff --git a/DuckDuckGo/el.lproj/PrivacyDashboard.strings b/DuckDuckGo/el.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..75c7e9766a
--- /dev/null
+++ b/DuckDuckGo/el.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Ο ιστότοπος είναι κύριο δίκτυο παρακολούθησης";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Προσπαθήστε ξανά";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Τα δεδομένα δεν είναι κρυπτογραφημένα";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Αναφορά ιστότοπου που δεν λειτουργεί";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και προσπαθήστε ξανά.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Βελτιωμένη βαθμολογία";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Ωχ, όχι! Δεν λειτούργησε αυτό";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Βαθμολογία ιδιωτικότητας";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Κουμπί";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "ΠΡΑΚΤΙΚΕΣ ΙΔΙΩΤΙΚΟΤΗΤΑΣ";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Επαναφορά στατιστικών δικτύου παρακολούθησης";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Κουμπί";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ΚΡΥΠΤΟΓΡΑΦΗΜΕΝΗ ΣΥΝΔΕΣΗ";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Κουμπί";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Μη προστατευόμενοι ιστότοποι";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Αποκλείστηκαν δίκτυα";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Αποκλείστηκαν 8 εφαρμογές παρακολούθησης";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Αναφορά ιστότοπου που δεν λειτουργεί";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Πρακτικές ιδιωτικότητας";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Κορυφαίοι παραβάτες";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Δεν βρέθηκαν πρακτικές προστασίας προσωπικών δεδομένων";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Μη προστατευόμενοι ιστότοποι";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Ορθές πρακτικές ιδιωτικότητας";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Προστασία της ιδιωτικότητας του ιστότοπου";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Προστασία της ιδιωτικότητας του ιστότοπου";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "ΚΟΡΥΦΑΙΟΙ ΠΑΡΑΒΑΤΕΣ ΤΟΥ ΔΙΚΤΥΟΥ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Κρυπτογραφημένη σύνδεση";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Απενεργοποιήσαμε προσωρινά την Προστασία προσωπικών δεδομένων καθώς φαίνεται ότι ρίχνει τον ιστότοπο.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Αποκλείστηκαν κύρια δίκτυα";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "ΣΥΧΝΟΤΗΤΑ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ ΔΙΚΤΥΟΥ";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 ακόμη τομείς φορτώθηκαν";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Κρυπτογραφημένη σύνδεση";
+
diff --git a/DuckDuckGo/el.lproj/Settings.strings b/DuckDuckGo/el.lproj/Settings.strings
index 38a6b1ac4b..a05763b68c 100644
--- a/DuckDuckGo/el.lproj/Settings.strings
+++ b/DuckDuckGo/el.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Αυτόματη απαλοιφή δεδομένων";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Περισσότερα στη διεύθυνση duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ρυθμίσεις";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Προεπιλογή";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Η ιδιωτικότητα απλοποιημένη. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Διαχείριση αναδυόμενων παραθύρων cookies";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Η προστασία προσωπικών δεδομένων είναι ενεργοποιημένη για όλους τους ιστότοπους";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Εικονίδιο";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Περισσότερα από το DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Συγχρονισμός και δημιουργία αντιγράφων ασφαλείας";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Συγχρονισμός";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Περιηγηθείτε ιδιωτικά με την εφαρμογή μας για Mac ";
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index c8d01d8d47..14489e1a91 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -769,6 +769,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Import an HTML file of bookmarks from another browser, or export your existing bookmarks.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Comments didn’t load";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Content is missing";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Cookie pop-up wasn't managed";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Images didn’t load";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Links or buttons don’t work";
+
+/* Broken Site Category */
+"brokensite.category.login" = "I can’t sign in";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Something else";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "The site asked me to disable";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "The browser is incompatible";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video didn’t play";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Pick your issue from the list...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SELECT A CATEGORY";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Sharing more details can help us address this issue";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "DESCRIBE WHAT HAPPENED";
+
 /* Title for a section containing only items from past month */
 "date.range.past-month" = "Past month";
 
@@ -1621,6 +1663,9 @@ https://duckduckgo.com/mac";
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Open in Another App?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Submitting an anonymous broken site report helps us debug these issues and improve the app.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Search or enter address";
 
diff --git a/DuckDuckGo/es.lproj/Feedback.strings b/DuckDuckGo/es.lproj/Feedback.strings
index 897984c7a4..a81befc8d5 100644
--- a/DuckDuckGo/es.lproj/Feedback.strings
+++ b/DuckDuckGo/es.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "No, gracias. He terminado";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Cerrar";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Compartir opiniones";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "¿Qué sitio web no funciona?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Informar de sitio web dañado";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Compartir opiniones";
 
diff --git a/DuckDuckGo/es.lproj/Localizable.strings b/DuckDuckGo/es.lproj/Localizable.strings
index ed3a0d69b7..9262ddf95a 100644
--- a/DuckDuckGo/es.lproj/Localizable.strings
+++ b/DuckDuckGo/es.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Editar";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Los marcadores existentes no se duplicarán.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Has superado el límite de sincronización de marcadores. Prueba a eliminar algunos marcadores. No se realizará una copia de seguridad de los marcadores hasta que se resuelva esto.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "La sincronización de marcadores está en pausa";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Ha superado el límite de sincronización de contraseñas. Prueba a eliminar algunas contraseñas. No se realizará una copia de seguridad de las contraseñas hasta que se resuelva esto.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "La sincronización de contraseñas está en pausa";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Más información";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "De acuerdo";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "¿Añadir todas las pestañas a marcadores?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importa un archivo HTML de marcadores desde otro navegador o exporta tus marcadores existentes.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "No se han cargado los comentarios";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Falta contenido";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "No se ha gestionado la ventana emergente de cookies";
+
+/* Broken Site Category */
+"brokensite.category.images" = "No se han cargado las imágenes";
+
+/* Broken Site Category */
+"brokensite.category.links" = "No funcionan los enlaces o botones";
+
+/* Broken Site Category */
+"brokensite.category.login" = "No puedo iniciar sesión";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Otro problema";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "El sitio me pidió que desactivara";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "El navegador es incompatible";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "No se ha reproducido el vídeo";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Elige tu problema en la lista...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SELECCIONA UNA CATEGORÍA";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Si compartes más detalles, nos ayudarás a resolver esta incidencia";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "DESCRIBE QUÉ PASÓ";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Eliminar";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Todos los favoritos del dispositivo";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Elige qué favoritos mostrar en una nueva pestaña en función de su origen.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Preferencias de visualización";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Solo favoritos móviles";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Bloquear anuncios y mensajes emergentes";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Abrir VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Gestionar";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Activar notificaciones";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Permite que DuckDuckGo te notifique si tu conexión se cae o si cambia el estado de la VPN.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Recibe notificaciones si tu conexión se cae o cambia el estado de la VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Alertas de VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Restaura automáticamente una conexión VPN después de una interrupción.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Siempre activado";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Notificaciones de VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "La protección de red evita las filtraciones DNS a tu proveedor de servicios de internet redirigiendo las consultas de DNS a través del túnel VPN a nuestro propio <em>resolver</em>.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "DNS seguro";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Configuración de VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "¿Abrir en otra aplicación?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Enviar un informe anónimo del sitio dañado nos ayuda a depurar estos problemas y mejorar la aplicación.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Buscar o introducir dirección";
 
diff --git a/DuckDuckGo/es.lproj/PrivacyDashboard.strings b/DuckDuckGo/es.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..45827fcbba
--- /dev/null
+++ b/DuckDuckGo/es.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "El sitio web es una de las principales redes de rastreadores";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.ejemplo.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Intentar de nuevo";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Los datos no están cifrados";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Informar de sitio web dañado";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Comprueba tu conexión a internet e inténtalo de nuevo.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Nivel incrementado";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Vaya, no ha funcionado";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.ejemplo.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Grado de privacidad";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Botón";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRACTICAS DE PRIVACIDAD";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Reiniciar las estadísticas de la red de rastreadores";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Botón";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "CONEXIÓN CIFRADA";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.ejemplo.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Botón";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.ejemplo.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Sitios no protegidos";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Redes bloqueadas";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 rastreadores bloqueados";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Informar de sitio web dañado";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Prácticas de privacidad";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Principales culpables";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "No se han encontrado prácticas de privacidad";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Sitios no protegidos";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etiqueta";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Buenas prácticas de privacidad";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Protección de privacidad del sitio web";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Protección de privacidad del sitio web";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "PRINCIPALES CULPABLES DE LAS REDES DE RASTREADORES";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Conexión cifrada";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Hemos desactivado temporalmente la protección de privacidad, ya que parece que está causando errores en el sitio.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Redes principales bloqueadas";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FRECUENCIA DE REDES DE RASTREADORES";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Otros 8 dominios cargados";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Conexión cifrada";
+
diff --git a/DuckDuckGo/es.lproj/Settings.strings b/DuckDuckGo/es.lproj/Settings.strings
index 90ce5a3ace..98762d2786 100644
--- a/DuckDuckGo/es.lproj/Settings.strings
+++ b/DuckDuckGo/es.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Borrar datos automáticamente";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Más información en duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ajustes";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Predeterminado";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "La privacidad, simplificada. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Administrar ventanas emergentes de cookies";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Protección de privacidad habilitada para todos los sitios";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icono";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Más sobre DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronización y copia de seguridad";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronizar";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Navega de forma privada con nuestra aplicación para Mac ";
diff --git a/DuckDuckGo/et.lproj/Feedback.strings b/DuckDuckGo/et.lproj/Feedback.strings
index fa4a347aff..55e2028121 100644
--- a/DuckDuckGo/et.lproj/Feedback.strings
+++ b/DuckDuckGo/et.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Tänan, ei! Olen lõpetanud";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Sulge";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Jaga tagasisidet";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Milline veebisait on katki?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Teata mittetoimivast saidist";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Jaga tagasisidet";
 
diff --git a/DuckDuckGo/et.lproj/Localizable.strings b/DuckDuckGo/et.lproj/Localizable.strings
index f777ed9d3c..3df8179e8c 100644
--- a/DuckDuckGo/et.lproj/Localizable.strings
+++ b/DuckDuckGo/et.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Redigeeri";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Olemasolevaid järjehoidjaid ei dubleerita.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Oled järjehoidjate sünkroonimise limiidi ületanud. Proovi mõned järjehoidjad kustutada. Kuni see pole lahendatud, ei varundata sinu järjehoidjaid.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Järjehoidjate sünkroonimine on peatatud";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Oled paroolide sünkroonimise limiidi ületanud. Proovi mõned paroolid kustutada. Kuni see pole lahendatud, ei varundata sinu paroole.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Paroolide sünkroonimine on peatatud";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Loe edasi";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Kas lisada kõik vahekaardid järjehoidjasse?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Impordi järjehoidjate HTML-fail teisest brauserist või ekspordi oma olemas olevad järjehoidjad.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Kommentaare ei laaditud";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Sisu puudub";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Küpsise hüpikakent ei hallatud";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Pilte ei laaditud";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Lingid või nupud ei töötanud";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Ma ei saa sisse logida";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Midagi muud";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Sait palus mul välja lülitada";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Brauser ei ühildu";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Videot ei esitatud";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Vali loendist oma probleem...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VALI KATEGOORIA";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Probleemi täpsem kirjeldamine võib meil aidata seda lahendada";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "KIRJELDAGE TOIMUNUT";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "andmekogum: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Eemaldage";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Kõik seadme lemmikud";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Vali, milliseid lemmikuid uuel vahekaardil kuvada, lähtudes nende päritolust.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Kuvamise seaded";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Ainult mobiililemmikud";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklaami ja hüpikakende blokeerimine";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Ava VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Halda";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Lülita teavitused sisse";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Lubab DuckDuckGol sulle teada anda, kui sinu ühendus katkeb või VPN-i olek muutub.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Saad teate, kui sinu ühendus katkeb või VPN-i olek muutub.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-i hoiatused";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "VPN-ühendus taastatakse pärast katkestust automaatselt.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Alati sisse lülitatud";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-i teavitused";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection takistab DNS-i lekkeid sinu internetiteenuse pakkujale, suunates DNS-päringud läbi VPN-tunneli meie enda aadressiteisendusteenusesse.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Turvaline DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-i seaded";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Avada teises rakenduses?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Anonüümse katkise saidi aruande esitamine aitab meil neid probleeme siluda ja rakendust täiustada.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Otsi või sisesta aadress";
 
diff --git a/DuckDuckGo/et.lproj/PrivacyDashboard.strings b/DuckDuckGo/et.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..d5425f6da1
--- /dev/null
+++ b/DuckDuckGo/et.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Sait on peamine jälgimisvõrk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Proovi uuesti";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Andmed on krüptimata";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Teata mittetoimivast saidist";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Kontrolli oma internetiühendust ja proovi uuesti.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Täiustatud aste";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Silt";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Oih, see ei toiminud";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Privaatsusaste";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Nupp";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRIVAATUSUPRAKTIKAD";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Lähtesta jälgimisvõrkude statistika";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Nupp";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "KRÜPTITUD ÜHENDUS";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Nupp";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Kaitseta saidid";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Võrgud blokeeritud";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 jälgijat blokeeritud";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Teata mittetoimivast saidist";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Privaatsuspõhimõtted";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Suurimad rikkujad";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Privaatsuspõhimõtteid ei leitud";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Kaitseta saidid";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Head privaatsustavad";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Saidi privaatsuse kaitse";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Saidi privaatsuse kaitse";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "JÄLGIMISVÕRGU SUURIMAD RIKKUJAD";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Krüptitud ühendus";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Keelasime ajutiselt privaatsuse kaitse, kuna näib, et see kahjustab seda saiti.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Suured võrgud blokeeritud";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "JÄLGIJA VÕRGU SAGEDUS";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 muud domeeni laaditud";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Krüptitud ühendus";
+
diff --git a/DuckDuckGo/et.lproj/Settings.strings b/DuckDuckGo/et.lproj/Settings.strings
index 14d97bb0ae..5cb1f1e951 100644
--- a/DuckDuckGo/et.lproj/Settings.strings
+++ b/DuckDuckGo/et.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Kustuta andmed automaatselt";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Lisateave: duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Seaded";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Vaikimisi";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Privaatsus, lihtsalt. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Halda küpsiste hüpikaknaid";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privaatsuse kaitse on lubatud kõigil saitidel";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikoon";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Veel DuckDuckGo'lt";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sünkroonimine ja varundamine";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sünkrooni";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Sirvi privaatselt meie Maci rakendusega ";
diff --git a/DuckDuckGo/fi.lproj/Feedback.strings b/DuckDuckGo/fi.lproj/Feedback.strings
index c2142a90a6..aef969e8ca 100644
--- a/DuckDuckGo/fi.lproj/Feedback.strings
+++ b/DuckDuckGo/fi.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ei kiitos! Valmista";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Sulje";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Jaa palaute";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Mikä verkkosivusto on viallinen?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Ilmoita viallisesta sivustosta";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Jaa palaute";
 
diff --git a/DuckDuckGo/fi.lproj/Localizable.strings b/DuckDuckGo/fi.lproj/Localizable.strings
index 626d914125..2f5ff76343 100644
--- a/DuckDuckGo/fi.lproj/Localizable.strings
+++ b/DuckDuckGo/fi.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Muokkaa";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Olemassa olevia kirjanmerkkejä ei kopioida.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Olet ylittänyt kirjanmerkkien synkronointirajan. Yritä poistaa joitakin kirjanmerkkejä. Kirjanmerkkejäsi ei varmuuskopioida ennen kuin tämä ongelma on ratkaistu.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Kirjanmerkkien synkronointi on keskeytetty";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Olet ylittänyt salasanojen synkronointirajan. Yritä poistaa joitakin salasanoja. Salasanojasi ei varmuuskopioida ennen kuin tämä ongelma on ratkaistu.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Salasanojen synkronointi on keskeytetty";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Lue lisää";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Lisätäänkö kaikki välilehdet kirjanmerkkeihin?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Tuo HTML-kirjanmerkkitiedosto toisesta selaimesta tai vie olemassa olevat kirjanmerkkisi.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Kommentit eivät latautuneet";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Sisältöä puuttuu";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Evästeen ponnahdusikkunaa ei hallittu";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Kuvat eivät latautuneet";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Linkit tai painikkeet eivät toimi";
+
+/* Broken Site Category */
+"brokensite.category.login" = "En pysty kirjautumaan sisään";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Jotain muuta";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Sivusto pyysi minua poistamaan käytöstä";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Selain ei ole yhteensopiva";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Videota ei toistettu";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Valitse ongelma luettelosta...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VALITSE KATEGORIA";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Lisätiedot saattavat auttaa meitä ratkaisemaan tämän ongelman";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "KUVAILE MITÄ TAPAHTUI";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Poista";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Kaikki laitteen suosikit";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Valitse alkuperän perusteella, mitkä suosikit näytetään uudessa välilehdessä.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Näytön asetukset";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Vain mobiilisuosikit";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Mainosten ja ponnahdusikkunoiden esto";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Avaa VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Hallitse";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Ota ilmoitukset käyttöön";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Anna DuckDuckGon ilmoittaa sinulle, jos yhteys katkeaa tai VPN:n tila muuttuu.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Saat ilmoituksen, jos yhteytesi katkeaa tai VPN:n tila muuttuu.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-ilmoitukset";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Palauta VPN-yhteys automaattisesti keskeytyksen jälkeen.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Aina käytössä";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-ilmoitukset";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection estää DNS-vuodot internetpalveluntarjoajallesi ohjaamalla DNS-pyynnöt VPN-verkon kautta omalle välittäjällemme.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Suojattu DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-asetukset";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Avataanko toisessa sovelluksessa?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Anonyymin raportin lähettäminen toimimattomasta sivustosta auttaa meitä korjaamaan nämä ongelmat ja parantamaan sovellusta.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Hae tai anna osoite";
 
diff --git a/DuckDuckGo/fi.lproj/PrivacyDashboard.strings b/DuckDuckGo/fi.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..2e02e8efdb
--- /dev/null
+++ b/DuckDuckGo/fi.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Sivusto on merkittävä seurantaverkosto";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.esimerkki.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Yritä uudelleen";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Tiedot ovat salaamattomia";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Ilmoita viallisesta sivustosta";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "PAHIMMAT SEURANTAVERKOSTOT";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Tarkista internetyhteytesi ja yritä uudelleen.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Parannettu arvosana";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Hups, ei toiminut";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.esimerkki.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Tietosuoja-arvosana";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Painike";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "TIETOSUOJAKÄYTÄNNÖT";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Nollaa seurantaverkostojen tilastot";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "PAHIMMAT SEURANTAVERKOSTOT";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Painike";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "SALATTU YHTEYS";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.esimerkki.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Painike";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.esimerkki.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Suojaamattomat sivustot";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Verkostoja estetty";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 seurainta estetty";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Ilmoita viallisesta sivustosta";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Tietosuojakäytännöt";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Pahimmat seuraajat";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Tietosuojakäytäntöjä ei löytynyt";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Suojaamattomat sivustot";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Hyvät tietosuojakäytännöt";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Sivuston yksityisyydensuoja";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "PAHIMMAT SEURANTAVERKOSTOT";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Sivuston yksityisyydensuoja";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "PAHIMMAT SEURANTAVERKOSTOT";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Salattu yhteys";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Yksityisyyden suoja on väliaikaisesti poistettu käytöstä, koska se näyttäisi rikkovan tämän sivun.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Tärkeitä verkostoja estetty";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "SEURANTAVERKOSTOJEN YLEISYYS";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 Muuta verkkotunnusta ladattu";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Salattu yhteys";
+
diff --git a/DuckDuckGo/fi.lproj/Settings.strings b/DuckDuckGo/fi.lproj/Settings.strings
index f684826ce3..11b81ffefe 100644
--- a/DuckDuckGo/fi.lproj/Settings.strings
+++ b/DuckDuckGo/fi.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Tyhjennä tiedot automaattisesti";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Lisätietoa: duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Asetukset";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Oletus";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Itsestään selvää tietosuojaa. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Evästeiden hallinnan ponnahdusikkunat";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Tietosuoja on käytössä kaikilla sivustoilla";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Kuvake";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Lisää DuckDuckGolta";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronoi ja varmuuskopioi";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronoi";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Selaa yksityisesti Mac-sovelluksellamme ";
diff --git a/DuckDuckGo/fr.lproj/Feedback.strings b/DuckDuckGo/fr.lproj/Feedback.strings
index 31997163c4..e829b3329b 100644
--- a/DuckDuckGo/fr.lproj/Feedback.strings
+++ b/DuckDuckGo/fr.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Non merci ! J'ai terminé";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Fermer";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Partagez vos commentaires";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Quel site Web pose problème ?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Signaler un problème de site";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Partagez vos commentaires";
 
diff --git a/DuckDuckGo/fr.lproj/Localizable.strings b/DuckDuckGo/fr.lproj/Localizable.strings
index 2b4df59dc5..e29c841bb2 100644
--- a/DuckDuckGo/fr.lproj/Localizable.strings
+++ b/DuckDuckGo/fr.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Modifier";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Les signets existants ne seront pas dupliqués.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Vous avez dépassé le nombre maximal de signets à synchroniser. Veuillez en supprimer quelques-uns pour pouvoir sauvegarder vos signets.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "La synchronisation des signets est suspendue";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Vous avez dépassé le nombre maximal de mots de passe à synchroniser. Veuillez en supprimer quelques-uns pour pouvoir sauvegarder vos mots de passe.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "La synchronisation des mots de passe est suspendue";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "En savoir plus";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Ajouter tous les onglets aux signets ?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importez un fichier HTML de signets à partir d'un autre navigateur, ou exportez vos signets existants.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Les commentaires n'ont pas pu être chargés";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Le contenu est manquant";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "La fenêtre contextuelle des cookies n'a pas été gérée";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Les images n'ont pas pu être chargées";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Les liens ou les boutons ne fonctionnent pas";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Je ne peux pas me connecter";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Autre chose";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Le site m'a demandé de désactiver";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Le navigateur est incompatible";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "La vidéo n'a pas été lue";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Sélectionnez votre problème dans la liste...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SÉLECTIONNER UNE CATÉGORIE";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Le fait de partager plus d'informations peut nous aider à résoudre ce problème";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "DÉCRIVEZ CE QU'IL S'EST PASSÉ";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "case : %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Supprimer";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Tous les favoris de l'appareil";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Choisissez les favoris à afficher dans un nouvel onglet en fonction de leur origine.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Préférences d'affichage";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Favoris sur mobile uniquement";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Bloquer les publicités et les fenêtres contextuelles";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Ouvrir le VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Gérer";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Activer les notifications";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Autorisez DuckDuckGo à vous avertir si votre connexion échoue ou si l'état de votre VPN change.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Recevez une notification si votre connexion échoue ou si l'état de votre VPN change.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Alertes VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Restaurez automatiquement une connexion VPN après une interruption.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Toujours activé";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Notifications VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection empêche les fuites DNS vers votre fournisseur de services Internet en acheminant les requêtes DNS via le tunnel VPN vers notre propre résolveur.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "DNS sécurisé";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Paramètres VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Ouvrir dans une autre application ?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "La soumission d'un rapport anonyme pour signaler le mauvais fonctionnement du site nous aide à déboguer ces problèmes et à améliorer l'application.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Rechercher ou saisir une adresse";
 
diff --git a/DuckDuckGo/fr.lproj/PrivacyDashboard.strings b/DuckDuckGo/fr.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..59c30dea8b
--- /dev/null
+++ b/DuckDuckGo/fr.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Le site est un réseau majeur de traqueurs";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.exemple.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Réessayer";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Les données ne sont pas chiffrées";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Signaler un problème de site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Vérifiez votre connexion Internet, puis réessayez.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Degré amélioré";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Oups, cela n'a pas fonctionné";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.exemple.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Degré de confidentialité";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Bouton";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRATIQUES DE CONFIDENTIALITÉ";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Réinitialiser les statistiques du réseau de traqueurs";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Bouton";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "CONNEXION CHIFFRÉE";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.exemple.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Bouton";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.exemple.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Sites non protégés";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Réseaux bloqués";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 traqueurs bloqués";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Signaler un problème de site";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Pratiques de confidentialité";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Principaux coupables";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Aucune pratique de confidentialité trouvée";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Sites non protégés";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Bonnes pratiques de confidentialité";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Protection de la confidentialité du site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Protection de la confidentialité du site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "PRINCIPAUX RÉSEAUX DE TRAQUEURS";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Connexion chiffrée";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Nous avons temporairement désactivé la protection de la confidentialité car elle semble perturber ce site.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Réseaux majeurs bloqués";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FRÉQUENCE DU RÉSEAU DE TRAQUEURS";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 autres domaines chargés";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Connexion chiffrée";
+
diff --git a/DuckDuckGo/fr.lproj/Settings.strings b/DuckDuckGo/fr.lproj/Settings.strings
index 2fc2c6d4d7..b4e289ee89 100644
--- a/DuckDuckGo/fr.lproj/Settings.strings
+++ b/DuckDuckGo/fr.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Effacer automatiquement les données";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Pour en savoir plus, visitez duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Paramètres";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Défaut";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "La confidentialité, simplifiée. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gérer les fenêtres contextuelles (cookies)";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "La protection de la confidentialité est activée pour tous les sites";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icône";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Plus de la part de DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronisation et sauvegarde";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronisation";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Naviguez incognito avec notre application pour Mac ";
diff --git a/DuckDuckGo/hr.lproj/Feedback.strings b/DuckDuckGo/hr.lproj/Feedback.strings
index 0789000dcd..db97dd3363 100644
--- a/DuckDuckGo/hr.lproj/Feedback.strings
+++ b/DuckDuckGo/hr.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, hvala! Završio/la sam";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Zatvori";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Podijeli povratne informacije";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Koje je web-mjesto neispravno?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Prijavi neispravno web-mjesto";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Podijeli povratne informacije";
 
diff --git a/DuckDuckGo/hr.lproj/Localizable.strings b/DuckDuckGo/hr.lproj/Localizable.strings
index 442bb1fb10..47220b3f4c 100644
--- a/DuckDuckGo/hr.lproj/Localizable.strings
+++ b/DuckDuckGo/hr.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Uredi";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Postojeće knjižne oznake neće se duplicirati.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Prekoračeno je ograničenje sinkronizacije oznaka. Pokušaj izbrisati neke oznake. Dok se to ne riješi, tvoje se oznake neće sigurnosno kopirati.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Sinkronizacija oznaka je pauzirana";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Prekoračeno je ograničenje sinkronizacije lozinki. Pokušaj izbrisati neke lozinke. Dok se to ne riješi, tvoje se lozinke neće sigurnosno kopirati.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Sinkronizacija lozinki je pauzirana";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Saznajte više";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "U redu";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Označi sve kartice?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Uvezite HTML datoteku oznaka iz drugog preglednika ili izvezite postojeće oznake.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Komentari se nisu učitali";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Nedostaje sadržaj";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Nisu određena pravila za skočne prozore kolačića";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Slike se nisu učitale";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Poveznice ili gumbi ne funkcioniraju";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Ne mogu se prijaviti";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Nešto drugo";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Web-mjesto zatražilo je da onemogućim";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Preglednik nije kompatibilan";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Videozapis se nije reproducirao";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Odaberi svoj problem s popisa...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "ODABERI KATEGORIJU";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Dijeljenje više pojedinosti može nam pomoći u rješavanju ovog problema";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "OPIŠITE ŠTO SE DOGODILO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Ukloni";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Svi favoriti na uređaju";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Odaberi koje favorite želiš prikazati na novoj kartici na temelju njihove izvorne lokacije.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Željeni prikaz";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Samo favoriti na mobilnom uređaju";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokiranje oglasa i skočnih prozora";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Otvori VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Upravljanje";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Uključi obavijesti";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Dopusti DuckDuckGou da te obavijesti ako se tvoja veza prekine ili se status VPN-a promijeni.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Primaj obavijesti ako se tvoja veza prekine ili se status VPN-a promijeni.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN upozorenja";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Automatski obnovi VPN vezu nakon prekida.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Uvijek uključeno";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN obavijesti";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Mrežna zaštita sprječava curenje DNS-a tvom davatelju internetskih usluga usmjeravanjem DNS upita kroz VPN tunel na naš vlastiti rješavač.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Siguran DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN postavke";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otvori u drugoj aplikaciji?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Slanje anonimnog izvješća o neispravnom web-mjestu pomaže nam da ispravimo te probleme i poboljšamo aplikaciju.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Pretraži ili unesi adresu";
 
diff --git a/DuckDuckGo/hr.lproj/PrivacyDashboard.strings b/DuckDuckGo/hr.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..f27dae05e4
--- /dev/null
+++ b/DuckDuckGo/hr.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Web-mjesto glavna je mreža za praćenje";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Pokušaj ponovo";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Podaci nisu šifrirani";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Prijavi neispravno web-mjesto";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "NAJVEĆI PREKRŠITELJI OD MREŽA ZA PRAĆENJE";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Provjeri svoju internetsku vezu i pokušaj ponovo.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Poboljšana ocjena";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "O ne, to nije uspjelo";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Ocjena zaštite privatnosti";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Gumb";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRAKSE ZAŠTITE PRIVATNOSTI";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Poništi mrežnu statistiku tragača";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "NAJČEŠĆI MREŽNI TRAGAČI";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Gumb";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŠIFRIRANA VEZA";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Gumb";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Nezaštićena web-mjesta";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Mreže blokirane";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Blokirano 8 tragača";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Prijavi neispravno web-mjesto";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Prakse zaštite privatnosti";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Najčešći tragači";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nisu pronađene prakse zaštite privatnosti";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Nezaštićena web-mjesta";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Dobre prakse zaštite privatnosti";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Zaštita privatnosti web-mjesta";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "NAJČEŠĆI MREŽNI TRAGAČI";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Zaštita privatnosti web-mjesta";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "NAJČEŠĆI MREŽNI TRAGAČI";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Šifrirana veza";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Privremeno smo onemogućili zaštitu privatnosti jer se čini da narušava ovo web-mjesto.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Glavne mreže su blokirane";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "UČESTALOST MREŽNIH TRAGAČA";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Učitano je još 8 domena";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Šifrirana veza";
+
diff --git a/DuckDuckGo/hr.lproj/Settings.strings b/DuckDuckGo/hr.lproj/Settings.strings
index 5b4efa5072..522994e162 100644
--- a/DuckDuckGo/hr.lproj/Settings.strings
+++ b/DuckDuckGo/hr.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automatsko brisanje podataka";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Više na duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Postavke";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Zadano";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Zaštita privatnosti, pojednostavljeno. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Upravljanje skočnim prozorima kolačića";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Zaštita privatnosti omogućena za sva web-mjesta";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Više od DuckDuckGoa";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinkronizacija i sigurnosno kopiranje";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinkronizacija";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Pretražujte privatno s našom aplikacijom za Mac ";
diff --git a/DuckDuckGo/hu.lproj/Feedback.strings b/DuckDuckGo/hu.lproj/Feedback.strings
index 47b8cd039d..ad536e2dd3 100644
--- a/DuckDuckGo/hu.lproj/Feedback.strings
+++ b/DuckDuckGo/hu.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nem, köszönöm. Kész vagyok.";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Bezárás";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Visszajelzés megosztása";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Melyik weboldal nem működik?”";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Hibás weboldal jelentése";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Visszajelzés megosztása";
 
diff --git a/DuckDuckGo/hu.lproj/Localizable.strings b/DuckDuckGo/hu.lproj/Localizable.strings
index 7fb08d0a2e..340223040d 100644
--- a/DuckDuckGo/hu.lproj/Localizable.strings
+++ b/DuckDuckGo/hu.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Szerkesztés";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "A meglévő könyvjelzők nem kettőződnek.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Túllépted a szinkronizálható könyvjelzők maximális számát. Próbálj törölni néhány könyvjelzőt. Amíg ezt nem sikerül megoldani, a könyvjelzőkről nem készül biztonsági másolat.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "A könyvjelzők szinkronizálása szünetel";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Túllépted a szinkronizálható jelszavak maximális számát. Próbálj törölni néhány jelszót. Amíg ezt nem sikerül megoldani, a jelszavakról nem készül biztonsági másolat.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "A jelszavak szinkronizálása szünetel";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "További részletek";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Az összes lapot könyvjelzőzöd?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Könyvjelzőket tartalmazó HTML-fájl importálása másik gépről, vagy a meglévő könyvjelzők exportálása.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "A megjegyzések nem töltődtek be";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Hiányzik a tartalom";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "A felugró sütiablak nem lett kezelve";
+
+/* Broken Site Category */
+"brokensite.category.images" = "A képek nem töltődtek be";
+
+/* Broken Site Category */
+"brokensite.category.links" = "A hivatkozások vagy a gombok nem működnek";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Nem tudok bejelentkezni";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Valami más";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "A webhely kérte tőlem a letiltást";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "A böngésző nem kompatibilis";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "A videót nem játszotta le";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Válaszd ki a problémát a listából…";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VÁLASSZ KATEGÓRIÁT";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "A további részletek segítségünkre lehetnek a probléma megoldásában";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "ESEMÉNY LEÍRÁSA";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "gyűjtő: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Eltávolítás";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Eszközön lévő minden kedvenc";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Válaszd ki, hogy az eredetük alapján melyik kedvencek jelenjenek meg az új lapon.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Megjelenítési beállítások";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Csak mobilon lévő kedvencek";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Hirdetések és felugró ablakok letiltása";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "VPN megnyitása";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Kezelés";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Értesítések bekapcsolása";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Engedélyezd, hogy a DuckDuckGo értesítsen, ha a kapcsolat megszakad vagy a VPN állapota megváltozik.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Kapj értesítést, ha a kapcsolat megszakad vagy a VPN állapota megváltozik.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-figyelmeztetések";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "A VPN-kapcsolat automatikus helyreállítása megszakítás után.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Mindig be van kapcsolva";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-értesítések";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "A hálózatvédelem megakadályozza a DNS-szivárgást az internetszolgáltatód felé azáltal, hogy a DNS-lekérdezéseket a VPN-alagúton keresztül a saját feloldónkhoz irányítja.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Biztonságos DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-beállítások";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Megnyitás másik alkalmazásban?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Egy hibás webhelyről szóló névtelen bejelentés segít a hibakeresésben és az alkalmazás fejlesztésében.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Keresés vagy cím megadása";
 
diff --git a/DuckDuckGo/hu.lproj/PrivacyDashboard.strings b/DuckDuckGo/hu.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..59afe9e620
--- /dev/null
+++ b/DuckDuckGo/hu.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "A weboldal egy nagy nyomkövető-hálózat";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Próbáld újra";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Az adatok nincsenek titkosítva";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Hibás weboldal jelentése";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Ellenőrizd az internetkapcsolatodat, és próbáld újra.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Emelt fokozat";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Címke";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Hát, ez nem vált be.";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Adatvédelmi fokozat";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Gomb";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "ADATVÉDELMI GYAKORLATOK";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Nyomkövető hálózati statisztikák visszaállítása";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Gomb";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "TITKOSÍTOTT KAPCSOLAT";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Gomb";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Védelem nélküli weboldalak";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Hálózatok blokkolva";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 nyomkövető blokkolva";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Hibás weboldal jelentése";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Adatvédelmi gyakorlatok";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Fő bűnösök";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Címke";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nem találhatók adatvédelmi gyakorlatok";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Védelem nélküli weboldalak";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Címke";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Jó adatvédelmi gyakorlatok";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "A weboldal adatvédelme";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "A weboldal adatvédelme";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "A NYOMKÖVETŐ-HÁLÓZAT LEGNAGYOBB BŰNELKÖVETŐI";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Titkosított kapcsolat";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Ideiglenesen letiltottuk az adatvédelmet, mert úgy tűnik, hogy kárt okoz ezen a webhelyen.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Fő blokkolt hálózatok";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "NYOMKÖVETŐ HÁLÓZAT GYAKORISÁGA";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 másik tartomány betöltve";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Titkosított kapcsolat";
+
diff --git a/DuckDuckGo/hu.lproj/Settings.strings b/DuckDuckGo/hu.lproj/Settings.strings
index b6f3f5cc23..e3b5199113 100644
--- a/DuckDuckGo/hu.lproj/Settings.strings
+++ b/DuckDuckGo/hu.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Adatok automatikus törlése";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "További információk a duckduckgo.com/about oldalon";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Beállítások";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Alapértelmezett";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Adatvédelem, leegyszerűsítve. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Felugró sütiablakok kezelése";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Adatvédelem engedélyezve minden weboldalhoz";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Továbbiak a DuckDuckGótól";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Szinkronizálás és biztonsági mentés";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Szinkronizálás";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Privát böngészés Maces alkalmazásunkkal ";
diff --git a/DuckDuckGo/it.lproj/Feedback.strings b/DuckDuckGo/it.lproj/Feedback.strings
index 02bd8b8089..57876c9c21 100644
--- a/DuckDuckGo/it.lproj/Feedback.strings
+++ b/DuckDuckGo/it.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "No, grazie! Ho finito";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Chiudi";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Condividi feedback";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Quale sito web è danneggiato?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Segnala sito danneggiato";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Condividi feedback";
 
diff --git a/DuckDuckGo/it.lproj/Localizable.strings b/DuckDuckGo/it.lproj/Localizable.strings
index 327788f150..70109a5069 100644
--- a/DuckDuckGo/it.lproj/Localizable.strings
+++ b/DuckDuckGo/it.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Modifica";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "I segnalibri già presenti non saranno duplicati.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Hai superato il limite di sincronizzazione dei segnalibri. Prova a eliminarne qualcuno. Fino a quando il problema non verrà risolto, non sarà eseguito il backup dei tuoi segnalibri.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "La sincronizzazione dei segnalibri è in pausa";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Hai superato il limite di sincronizzazione delle password. Prova a eliminarne qualcuna. Fino a quando il problema non verrà risolto, non sarà eseguito il backup delle tue password.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "La sincronizzazione delle password è in pausa";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Ulteriori informazioni";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Creare un segnalibro con tutte le schede?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importa un file HTML di segnalibri da un altro browser o esporta i segnalibri esistenti.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "I commenti non sono stati caricati";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Manca il contenuto";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Il pop-up dei cookie non era gestito";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Le immagini non sono state caricate";
+
+/* Broken Site Category */
+"brokensite.category.links" = "I collegamenti o i pulsanti non funzionano";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Non riesco ad accedere";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Qualcos'altro";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Il sito mi ha chiesto di disabilitare";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Il browser non è compatibile";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Il video non è stato riprodotto";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Seleziona il problema dall'elenco...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SELEZIONA UNA CATEGORIA";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Condividere maggiori dettagli può aiutarci a risolvere questo problema";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "DESCRIVI COSA È SUCCESSO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Rimuovi";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Tutti i preferiti sul dispositivo";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Scegli i preferiti da visualizzare in una nuova scheda in base alla loro origine.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Preferenze di visualizzazione";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Solo preferiti sul dispositivo mobile";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blocco di annunci e popup";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Apri VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Gestisci";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Attiva le notifiche";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Consenti a DuckDuckGo di inviarti notifiche se la tua connessione si interrompe o lo stato della VPN cambia.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Ricevi una notifica se la tua connessione si interrompe o lo stato della VPN cambia.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Avvisi VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Ripristina automaticamente una connessione VPN dopo un'interruzione.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Sempre attiva";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Notifiche VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection previene le fughe di DNS verso il tuo Internet Service Provider instradando le query DNS tramite tunneling VPN verso il nostro resolver.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "DNS sicuro";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Impostazioni VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Aprire in un'altra app?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "L'invio di un rapporto sul sito non funzionante nell'anonimato ci consente di eseguire il debug di questi problemi e migliorare l'app.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Cerca o digita l'indirizzo";
 
diff --git a/DuckDuckGo/it.lproj/PrivacyDashboard.strings b/DuckDuckGo/it.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..9bee227e61
--- /dev/null
+++ b/DuckDuckGo/it.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Il sito è una rete di tracciamento principale";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Riprova";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "I dati non sono crittografati";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Segnala sito danneggiato";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Verifica la tua connessione a Internet e riprova.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Punteggio migliorato";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etichetta";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Non ha funzionato";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Valutazione dell’affidabilità dei siti";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Pulsante";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRATICHE DI PRIVACY";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Reimposta le statistiche sulle reti dei sistemi di tracciamento";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Pulsante";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "CONNESSIONE CRITTOGRAFATA";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Pulsante";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Siti non protetti";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Reti bloccate";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 sistemi di tracciamento bloccati";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Segnala sito danneggiato";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Pratiche di privacy";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Minacce principali";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etichetta";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Pratiche di privacy non trovate";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Siti non protetti";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etichetta";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Buone pratiche di privacy";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Tutela della privacy del sito";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Tutela della privacy del sito";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "PRINCIPALI MINACCE DELLE RETI DI TRACCIAMENTO";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Connessione crittografata";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Abbiamo temporaneamente disabilitato la Tutela della privacy poiché sembra che stia interrompendo il funzionamento del sito.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Reti principali bloccate";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FREQUENZA RETI DEI SISTEMI DI TRACCIAMENTO";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 altri domini caricati";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Connessione crittografata";
+
diff --git a/DuckDuckGo/it.lproj/Settings.strings b/DuckDuckGo/it.lproj/Settings.strings
index ca6f845e18..c50d0f31a9 100644
--- a/DuckDuckGo/it.lproj/Settings.strings
+++ b/DuckDuckGo/it.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Cancellazione automatica dei dati";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Scopri di più su duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Impostazioni";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Predefinito";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "La privacy semplificata. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gestisci popup dei cookie";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Tutela della privacy attivata per tutti i siti";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Ulteriori informazioni su DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronizzazione e backup";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronizzazione";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Naviga in privato con la nostra app per Mac ";
diff --git a/DuckDuckGo/lt.lproj/Feedback.strings b/DuckDuckGo/lt.lproj/Feedback.strings
index 48c7338f83..018d11813a 100644
--- a/DuckDuckGo/lt.lproj/Feedback.strings
+++ b/DuckDuckGo/lt.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, ačiū! Pakaks";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Uždaryti";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Bendrinti atsiliepimą";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Kuri svetainė neveikia?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Pranešti apie sugadintą svetainę";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Bendrinti atsiliepimą";
 
diff --git a/DuckDuckGo/lt.lproj/Localizable.strings b/DuckDuckGo/lt.lproj/Localizable.strings
index 716ca0ad61..3a1bb62474 100644
--- a/DuckDuckGo/lt.lproj/Localizable.strings
+++ b/DuckDuckGo/lt.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Redaguoti";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Esamos žymės nebus kopijuojamos.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Viršijote žymių sinchronizavimo limitą. Pabandykite ištrinti kai kurias žymes. Kol ši problema nebus išspręsta, nebus kuriamos atsarginės jūsų žymių kopijos.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Žymių sinchronizavimas pristabdytas";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Viršijote slaptažodžių sinchronizavimo limitą. Pabandykite ištrinti kai kuriuos slaptažodžius. Kol ši problema nebus išspręsta, nebus kuriamos atsarginės jūsų slaptažodžių kopijos.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Slaptažodžių sinchronizavimas pristabdytas";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Sužinoti daugiau";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "GERAI";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Pažymėti visus skirtukus?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Eksportuoti HTML žymelių failą iš kitos naršyklės arba eksportuoti esamas žymeles.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Komentarai neįkelti";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Trūksta turinio";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Iškylantysis slapukų langas nebuvo sutvarkytas";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Vaizdai neįkelti";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Nuorodos ar mygtukai neveikia";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Negaliu prisijungti";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Kažkas kito";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Svetainė paprašė manęs išjungti";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Naršyklė nesuderinama";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Vaizdo įrašas nepaleistas";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Pasirinkite problemą iš sąrašo...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "PASIRINKITE KATEGORIJĄ";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Jei pasidalinsime daugiau informacijos, galime padėti išspręsti šią problemą";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "APRAŠYKITE, KAS ATSITIKO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "talpykla: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Pašalinti";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Visi įrenginio mėgstamiausi";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Pasirinkite, kuriuos mėgstamiausius rodyti naujame skirtuke pagal jų vietą.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Ekrano nuostatos";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Tik mobiliojo mėgstamiausi";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklamų ir iššokančiųjų langų blokavimas";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Atviras VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Tvarkyti";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Įjungti pranešimus";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Leiskite „DuckDuckGo“ pranešti, jei nutrūksta ryšys arba pasikeičia VPN būsena.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Gaukite pranešimą, jei nutrūksta ryšys arba pasikeičia VPN būsena.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN įspėjimai";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Automatiškai atkurti VPN ryšį po nutrūkimo.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Visada įjungta";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN pranešimai";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Tinklo apsauga apsaugo nuo DNS nutekėjimo interneto paslaugų teikėjui, nukreipdama DNS užklausas per VPN tunelį į mūsų trūkumo šalinimo įrankį.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Saugi DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN nustatymai";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Atidaryti kitoje programoje?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Pateikdami anoniminę sugadintos svetainės ataskaitą, galime padėti išspręsti šias problemas ir patobulinti programėlę.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Ieškoti arba įvesti adresą";
 
diff --git a/DuckDuckGo/lt.lproj/PrivacyDashboard.strings b/DuckDuckGo/lt.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..a539b39a57
--- /dev/null
+++ b/DuckDuckGo/lt.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Svetainė yra didelis stebėjimo priemonių tinklas";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Bandyti dar kartą";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Duomenys nėra šifruojami";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Pranešti apie sugadintą svetainę";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Patikrinkite savo interneto ryšį ir bandykite dar kartą.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Pagerintas laipsnis";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etiketė";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Oi, nepavyko";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Privatumo laipsnis";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Mygtukas";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRIVATUMO PRAKTIKA";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Iš naujo nustatykite stebėjimo priemonės tinklo statistiką";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Mygtukas";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŠIFRUOTAS RYŠYS";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Mygtukas";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Neapsaugotos svetainės";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Tinklai užblokuoti";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Užblokuotos 8 stebėjimo priemonės";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Pranešti apie sugadintą svetainę";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Privatumo praktika";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Populiariausi pažeidėjai";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etiketė";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nerasta jokių privatumo praktikų";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Neapsaugotos svetainės";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etiketė";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Gera privatumo praktika";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Svetainės privatumo apsauga";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Svetainės privatumo apsauga";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "DAŽNIAUSI PAŽEIDĖJAI SEKIKLIŲ TINKLE";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Šifruotas ryšys";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Laikinai išjungiame privatumo apsaugą, kadangi atrodo, kad ji trukdo šios svetainės veikimui.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Pagrindiniai tinklai užblokuoti";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "STEBĖJIMO PRIEMONĖS TINKLO DAŽNIS";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Įkelti 8 kiti domenai";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Šifruotas ryšys";
+
diff --git a/DuckDuckGo/lt.lproj/Settings.strings b/DuckDuckGo/lt.lproj/Settings.strings
index 4f67084ae3..c5ccd972b3 100644
--- a/DuckDuckGo/lt.lproj/Settings.strings
+++ b/DuckDuckGo/lt.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automatiškai valyti duomenis";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Daugiau informacijos rasite duckdukgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nustatymai";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Numatytoji";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Supaprastintas privatumas. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Valdyti slapukų iššokančiuosius langus";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privatumo apsauga įjungta visose svetainėse";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "„DuckDuckGo“";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Piktograma";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Daugiau iš „DuckDuckGo“";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinchronizuoti ir kurti atsarginę kopiją";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinchronizuoti";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Naršykite privačiai su mūsų „Mac“ skirta programa ";
diff --git a/DuckDuckGo/lv.lproj/Feedback.strings b/DuckDuckGo/lv.lproj/Feedback.strings
index 7054c522ab..b497d9cf11 100644
--- a/DuckDuckGo/lv.lproj/Feedback.strings
+++ b/DuckDuckGo/lv.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nē, paldies! Es pabeidzu.";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Aizvērt";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Kopīgot atsauksmi";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Kura vietne ir bojāta?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Ziņot par bojātu vietni";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Kopīgot atsauksmi";
 
diff --git a/DuckDuckGo/lv.lproj/Localizable.strings b/DuckDuckGo/lv.lproj/Localizable.strings
index 09a7d5fa0a..02d64bd141 100644
--- a/DuckDuckGo/lv.lproj/Localizable.strings
+++ b/DuckDuckGo/lv.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Rediģēt";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Esošās grāmatzīmes netiks dublētas.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Tu esi pārsniedzis grāmatzīmju sinhronizācijas ierobežojumu. Mēģini izdzēst dažas grāmatzīmes. Kamēr šī problēma nebūs atrisināta, grāmatzīmes netiks dublētas.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Grāmatzīmju sinhronizācija ir apturēta";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Tu esi pārsniedzis paroļu sinhronizācijas ierobežojumu. Mēģini izdzēst dažas paroles. Kamēr šī problēma nebūs atrisināta, paroles netiks dublētas.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Paroļu sinhronizācija ir apturēta";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Uzzināt vairāk";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "Labi";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Vai pievienot grāmatzīmes visām cilnēm?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importē grāmatzīmju HTML failu no citas pārlūkprogrammas vai eksportē esošās grāmatzīmes.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Komentāri netika ielādēti";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Trūkst satura";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Sīkfailu uznirstošais logs netika pārvaldīts";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Attēli netika ielādēti";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Saites vai pogas nedarbojas";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Es nevaru pierakstīties";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Kaut kas cits";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Vietne pieprasīja atspējošanu";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Pārlūks nav saderīgs";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video netika demonstrēts";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Norādi problēmu sarakstā...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "ATLASĪT KATEGORIJU";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Sīkākas informācijas sniegšana var mums palīdzēt atrisināt šo problēmu";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "APRAKSTI NOTIKUŠO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Noņemt";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Visu ierīču izlase";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Izvēlies, kurus izlases vienumus rādīt jaunā cilnē, pamatojoties uz to izcelsmi.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Displeja preferences";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Tikai mobilā izlase";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklāmu un uznirstošo logu bloķēšana";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Atvērt VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Pārvaldīt";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Ieslēgt paziņojumus";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Ļauj DuckDuckGo tev paziņot, ja savienojums pārtrūkst vai mainās VPN statuss.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Saņem paziņojumu, ja savienojums pārtrūkst vai mainās VPN statuss.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN brīdinājumi";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Automātiski atjaunot VPN savienojumu pēc pārtraukuma.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Vienmēr ieslēgts";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN paziņojumi";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Tīkla aizsardzība novērš DNS noplūdi uz tavu interneta pakalpojumu sniedzēju, novirzot DNS vaicājumus caur VPN tuneli uz mūsu pašu atrisinātāju.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Drošs DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN iestatījumi";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Vai atvērt citā lietotnē?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Ja iesniegsi anonīmu ziņojumu par bojātu vietni, mēs varēsim atkļūdot šīs problēmas un uzlabot lietotni.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Meklē vai ievadi adresi";
 
diff --git a/DuckDuckGo/lv.lproj/PrivacyDashboard.strings b/DuckDuckGo/lv.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..4a1ff6a91e
--- /dev/null
+++ b/DuckDuckGo/lv.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Vietne ir lielākais izsekotāju tīkls";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.piemērs.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Mēģini vēlreiz";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Dati nav šifrēti";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Ziņot par bojātu vietni";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Pārbaudi interneta savienojumu un mēģini vēlreiz.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Uzlabots līmenis";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etiķete";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Ak, vai, tas nepalīdzēja.";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.piemērs.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Privātuma līmenis";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Poga";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRIVĀTUMA PRAKSE";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Atiestatīt izsekotāju tīklu statistiku";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Poga";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŠIFRĒTS SAVIENOJUMS";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.piemērs.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Poga";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.piemērs.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Neaizsargātas vietnes";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Tīkli ir bloķēti";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 izsekotāji ir bloķēti";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Ziņot par bojātu vietni";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Privātuma prakse";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Lielākie pārkāpēji";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etiķete";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Privātuma prakse nav atrasta";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Neaizsargātas vietnes";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etiķete";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Laba privātuma prakse";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Vietnes privātuma aizsardzība";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Vietnes privātuma aizsardzība";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "IZSEKOTĀJU TĪKLA LIELĀKIE PĀRKĀPĒJI";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Šifrēts savienojums";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Mēs īslaicīgi atspējojām privātuma aizsardzību, jo šķiet, ka tā traucē šīs vietnes darbību.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Lielākie tīkli ir bloķēti";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "IZSEKOTĀJU TĪKLU ATRAŠANAS BIEŽUMS";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Ielādēti 8 citi domēni";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Šifrēts savienojums";
+
diff --git a/DuckDuckGo/lv.lproj/Settings.strings b/DuckDuckGo/lv.lproj/Settings.strings
index 23f21ecfb1..1cb5ae932d 100644
--- a/DuckDuckGo/lv.lproj/Settings.strings
+++ b/DuckDuckGo/lv.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automātiski notīrīt datus";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Vairāk vietnē duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Iestatījumi";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Noklusējums";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Privātums – vienkāršots. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Pārvaldīt sīkfailu uznirstošos logus";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privātuma aizsardzība ir iespējota visām vietnēm";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Vairāk no DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinhronizācija un dublēšana";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinhronizēt";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Pārlūko privāti, izmantojot mūsu Mac lietotni ";
diff --git a/DuckDuckGo/nb.lproj/Feedback.strings b/DuckDuckGo/nb.lproj/Feedback.strings
index ccff489698..20b8629dd4 100644
--- a/DuckDuckGo/nb.lproj/Feedback.strings
+++ b/DuckDuckGo/nb.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nei takk. Jeg er ferdig.";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Lukk";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Del tilbakemelding";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Hvilket nettsted fungerer ikke?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Rapporter nettstedfeil";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Del tilbakemelding";
 
diff --git a/DuckDuckGo/nb.lproj/Localizable.strings b/DuckDuckGo/nb.lproj/Localizable.strings
index 29ea848984..5ace68b096 100644
--- a/DuckDuckGo/nb.lproj/Localizable.strings
+++ b/DuckDuckGo/nb.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Rediger";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Eksisterende bokmerker blir ikke duplisert.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Du har overskredet grensen for synkronisering av bokmerker. Prøv å slette noen bokmerker. Inntil dette er løst, blir ikke bokmerkene sikkerhetskopiert.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Synkronisering av bokmerker er satt på pause";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Du har overskredet grensen for synkronisering av passord. Prøv å slette noen passord. Inntil dette er løst, blir ikke passordene sikkerhetskopiert.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Synkronisering av passord er satt på pause";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Finn ut mer";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Legg til alle faner i bokmerker?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importer en HTML-fil med bokmerker fra en annen nettleser, eller eksporter dine eksisterende bokmerker.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Kommentarene ble ikke lastet inn";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Innhold mangler";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Popup-vinduet om informasjonskapsler ble ikke håndtert";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Bildene ble ikke lastet inn";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Lenker eller knapper fungerer ikke";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Jeg kan ikke logge inn";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Noe annet";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Nettstedet ba meg om å deaktivere";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Nettleseren er inkompatibel";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video ble ikke avspilt";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Velg problemet ditt fra listen …";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VELG EN KATEGORI";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Hvis du gir oss flere detaljer, kan det hjelpe oss å løse dette problemet";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "BESKRIV HVA SOM SKJEDDE";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Fjern";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Alle favoritter på enheten";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Velg hvilke favoritter som skal vises på en ny fane basert på opprinnelsen deres.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Visningsinnstillinger";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Kun favoritter på mobil";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokkering av reklame og popups";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Åpne VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Administrere";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Slå på varslinger";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Tillat DuckDuckGo å varsle deg hvis tilkoblingen blir brutt eller VPN-statusen endret.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Få varsel hvis tilkoblingen blir brutt eller VPN-statusen endret.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-varsler";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Gjenopprett automatisk VPN-tilkobling etter avbrudd.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Alltid på";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-varsler";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Nettverksbeskyttelse forhindrer DNS-lekkasjer til internettleverandøren din ved å rute DNS-forespørsler gjennom VPN-tunnelen til vår egen resolver.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Sikker DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-innstillinger";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Åpne i en annen app?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Når du sender inn en anonym rapport om nettstedfeil, hjelper det oss med å feilsøke disse problemene og forbedre appen.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Søk eller skriv inn adresse";
 
diff --git a/DuckDuckGo/nb.lproj/PrivacyDashboard.strings b/DuckDuckGo/nb.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..a4c696de3d
--- /dev/null
+++ b/DuckDuckGo/nb.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Nettstedet er et stort sporingsnettverk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Prøv igjen";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Data er ikke kryptert";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Rapporter nettstedfeil";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "DE VERSTE SPORINGSNETTVERKENE";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Kontroller internettforbindelsen og prøv igjen.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Forsterket grad";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etikett";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Ops, det virket ikke";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Grad av personvern";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Knapp";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PERSONVERNPRAKSIS";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Nullstill tall for sporingsnettverk";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "DE VERSTE SPORINGSNETTVERKENE";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Knapp";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "KRYPTERT TILKOBLING";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Knapp";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Ubeskyttede nettsteder";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Nettverk blokkert";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 sporere blokkert";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Rapporter nettstedfeil";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Personvernpraksis";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Verste syndere";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etikett";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Ingen personvernpraksis funnet";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Ubeskyttede nettsteder";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etikett";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "God personvernpraksis";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Personvern for side";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "DE VERSTE SPORINGSNETTVERKENE";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Personvern for side";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "DE VERSTE SPORINGSNETTVERKENE";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Kryptert tilkobling";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Vi har midlertidig deaktivert personvernbeskyttelse, da det ser ut til å få nettstedet til å slutte å fungere.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Større nettverk blokkert";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FOREKOMST AV SPORINGSNETTVERK";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 andre domener lastet";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Kryptert tilkobling";
+
diff --git a/DuckDuckGo/nb.lproj/Settings.strings b/DuckDuckGo/nb.lproj/Settings.strings
index 8c3750d5fb..bbd8470e81 100644
--- a/DuckDuckGo/nb.lproj/Settings.strings
+++ b/DuckDuckGo/nb.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Slett data automatisk";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Mer på duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Innstillinger";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standard";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Personvern gjort enkelt. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Administrer vinduer om informasjonskapsler";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Personvernbeskyttelse aktivert for alle nettsteder";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mer fra DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronisering og sikkerhetskopiering";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkr.";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Surf privat med vår app for Mac ";
diff --git a/DuckDuckGo/nl.lproj/Feedback.strings b/DuckDuckGo/nl.lproj/Feedback.strings
index 343f7a90aa..0aa9568bb8 100644
--- a/DuckDuckGo/nl.lproj/Feedback.strings
+++ b/DuckDuckGo/nl.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nee, bedankt! Ik ben klaar";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Sluiten";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Feedback delen";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Welke website is defect?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Defecte website melden";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Feedback delen";
 
diff --git a/DuckDuckGo/nl.lproj/Localizable.strings b/DuckDuckGo/nl.lproj/Localizable.strings
index 0d8da8c2e0..0a52970964 100644
--- a/DuckDuckGo/nl.lproj/Localizable.strings
+++ b/DuckDuckGo/nl.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Bewerken";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Bestaande bladwijzers worden niet gedupliceerd.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Je hebt de synchronisatielimiet voor bladwijzers overschreden. Probeer enkele bladwijzers te verwijderen. Er wordt geen back-up van je bladwijzers gemaakt totdat dit probleem is opgelost.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Synchronisatie van bladwijzers is gepauzeerd";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Je hebt de synchronisatielimiet voor wachtwoorden overschreden. Probeer enkele wachtwoorden te verwijderen. Er wordt geen back-up van je wachtwoorden gemaakt totdat dit probleem is opgelost.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Synchronisatie van wachtwoorden is gepauzeerd";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Meer informatie";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Alle tabbladen toevoegen als bladwijzer?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importeer een HTML-bestand met bladwijzers uit een andere browser of exporteer je bestaande bladwijzers.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Opmerkingen zijn niet geladen";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Inhoud ontbreekt";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Cookie-pop-up is niet beheerd";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Afbeeldingen zijn niet geladen";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Links of knoppen werken niet";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Ik kan niet inloggen";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Iets anders";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "De site heeft me gevraagd om uit te schakelen";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "De browser is niet compatibel";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video werd niet afgespeeld";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Kies je probleem in de lijst ...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SELECTEER EEN CATEGORIE";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Deel meer details om ons te helpen dit probleem op te lossen";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "BESCHRIJF WAT ER IS GEBEURD";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Verwijderen";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Alle favorieten op apparaat";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Kies welke favorieten je op een nieuw tabblad wilt weergeven op basis van hun herkomst.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Weergavevoorkeuren";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Alleen mobiele favorieten";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Advertentie- en pop-upblokkering";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "VPN openen";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Beheren";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Meldingen inschakelen";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Ontvang meldingen van DuckDuckGo als je verbinding wegvalt of de VPN-status verandert.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Ontvang een melding als je verbinding wegvalt of de VPN-status verandert.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-meldingen";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Herstel een VPN-verbinding automatisch na onderbreking.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Altijd aan";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-meldingen";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Netwerkbeveiliging voorkomt DNS-lekken naar je internetprovider door DNS-aanvragen via de VPN-tunnel naar onze eigen resolver te routeren.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Veilige DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-instellingen";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Openen in een andere app?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Als je een anoniem rapport voor een defecte site indient, kunnen we deze problemen oplossen en de app verbeteren.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Zoek of voer een adres in";
 
diff --git a/DuckDuckGo/nl.lproj/PrivacyDashboard.strings b/DuckDuckGo/nl.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..8b2c5e1cbe
--- /dev/null
+++ b/DuckDuckGo/nl.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Site is groot trackernetwerk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.voorbeeld.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Probeer het opnieuw";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Gegevens zijn niet versleuteld";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Defecte website melden";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "TOPOVERTREDERS TRACKERNETWERK";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Controleer je internetverbinding en probeer het opnieuw.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Verbeterde klasse";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Er is iets fout gegaan";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.voorbeeld.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Privacyklasse";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Knop";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRIVACYPRAKTIJKEN";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Trackernetwerkstatistieken resetten";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "TOPOVERTREDERS TRACKERNETWERK";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Knop";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "GECODEERDE VERBINDING";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.voorbeeld.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Knop";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.voorbeeld.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Onbeschermde sites";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Netwerken geblokkeerd";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 trackers geblokkeerd";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Defecte website melden";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Privacypraktijken";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Topovertreders";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Geen privacypraktijken gevonden";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Onbeschermde sites";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Goede privacypraktijken";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Privacybescherming van de site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "TOPOVERTREDERS TRACKERNETWERK";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Privacybescherming van de site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "TOPOVERTREDERS TRACKERNETWERK";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Gecodeerde verbinding";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "We hebben privacybescherming tijdelijk uitgeschakeld, omdat het erop lijkt dat deze site hierdoor niet goed meer werkt.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Grote netwerken geblokkeerd";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "TRACKERNETWERKFREQUENTIE";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 andere domeinen geladen";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Gecodeerde verbinding";
+
diff --git a/DuckDuckGo/nl.lproj/Settings.strings b/DuckDuckGo/nl.lproj/Settings.strings
index 99c32eca3e..96c60260cb 100644
--- a/DuckDuckGo/nl.lproj/Settings.strings
+++ b/DuckDuckGo/nl.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Gegevens automatisch wissen";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Meer informatie op duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Instellingen";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standaard";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Privacy, vereenvoudigd. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Cookiepop-ups beheren";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Privacybescherming ingeschakeld voor alle sites";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Pictogram";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Meer over DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronisatie en back-up";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchroniseren";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Browse privé met onze app voor Mac ";
diff --git a/DuckDuckGo/pl.lproj/Feedback.strings b/DuckDuckGo/pl.lproj/Feedback.strings
index d1b3e2eebe..020beeb122 100644
--- a/DuckDuckGo/pl.lproj/Feedback.strings
+++ b/DuckDuckGo/pl.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nie, dziękuję, skończyłem(-am)";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Zamknij";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Podziel się opinią";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Która witryna nie działa poprawnie?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Zgłoś uszkodzoną witrynę";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Podziel się opinią";
 
diff --git a/DuckDuckGo/pl.lproj/Localizable.strings b/DuckDuckGo/pl.lproj/Localizable.strings
index f283b6e277..a9577094e3 100644
--- a/DuckDuckGo/pl.lproj/Localizable.strings
+++ b/DuckDuckGo/pl.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Edytuj";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Istniejące zakładki nie zostaną zduplikowane.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Przekroczono limit synchronizacji zakładek. Spróbuj usunąć niektóre zakładki. Dopóki ten problem nie zostanie rozwiązany, nie będzie tworzona kopia zapasowa zakładek.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Synchronizacja zakładek jest wstrzymana";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Przekroczono limit synchronizacji haseł. Spróbuj usunąć niektóre hasła. Dopóki ten problem nie zostanie rozwiązany, nie będzie tworzona kopia zapasowa haseł.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Synchronizacja haseł jest wstrzymana";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Dowiedz się więcej";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Dodać wszystkie karty do zakładek?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Zaimportuj plik HTML z zakładkami z innej przeglądarki lub wyeksportuj istniejące zakładki.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Nie wczytano komentarzy";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Brakuje treści";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Nie zarządzano wyskakującymi okienkami plików cookie";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Obrazy nie zostały wczytane";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Łącza lub przyciski nie działają";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Nie mogę się zalogować";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Coś innego";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Witryna poprosiła mnie o wyłączenie";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Przeglądarka jest niezgodna";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Film nie został odtworzony";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Wybierz problem z listy...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "WYBIERZ KATEGORIĘ";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Udostępnienie szczegółowych informacji może pomóc nam rozwiązać ten problem";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "OPISZ, CO SIĘ STAŁO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "Zbiór: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Usuń";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Ulubione na urządzeniu";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Wybierz, które ulubione elementy mają być wyświetlane na nowej karcie w oparciu o ich źródło.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Preferencje wyświetlania";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Tylko ulubione z urządzeń mobilnych";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokowanie reklam i wyskakujących okienek";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Otwórz VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Zarządzaj";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Włącz powiadomienia";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Zezwól na powiadomienia DuckDuckGo o zerwaniu połączenia lub zmianie stanu VPN.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Otrzymuj powiadomienia o zerwaniu połączenia lub zmianie stanu VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Alerty VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Automatycznie przywracaj połączenie VPN po jego przerwaniu.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Zawsze włączone";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Powiadomienia VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Ochrona sieci zapobiega wyciekom DNS do dostawcy usług internetowych poprzez kierowanie zapytań DNS przez tunel VPN do naszego mechanizmu rozpoznawania nazw.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Bezpieczny DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Ustawienia VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otworzyć w innej aplikacji?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Przesłanie anonimowego raportu o uszkodzonej witrynie pomaga nam debugować te problemy i ulepszać aplikację.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Wyszukaj lub wprowadź adres";
 
diff --git a/DuckDuckGo/pl.lproj/PrivacyDashboard.strings b/DuckDuckGo/pl.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..356608dbb3
--- /dev/null
+++ b/DuckDuckGo/pl.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Strona stanowi główną sieć skryptów śledzących";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.domena.pl";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Spróbuj ponownie";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Dane są niezaszyfrowane";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Zgłoś uszkodzoną witrynę";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Sprawdź połączenie internetowe i spróbuj ponownie.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Podwyższony poziom";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etykieta";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Niestety to nie zadziałało";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.domena.pl";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Poziom prywatności";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Przycisk";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "POLITYKA PRYWATNOŚCI";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Zresetuj statystyki sieciowe modułu śledzącego";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Przycisk";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "POŁĄCZENIE ZASZYFROWANE";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.domena.pl";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Przycisk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.domena.pl";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Niezabezpieczone witryny";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Zablokowano sieci";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Zablokowano 8 skryptów śledzących";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Zgłoś uszkodzoną witrynę";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Polityka prywatności";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Najwięksi sprawcy";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etykieta";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nie znaleziono polityk prywatności";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Niezabezpieczone witryny";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etykieta";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Dobra polityka prywatności";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Ochrona prywatności witryny";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Ochrona prywatności witryny";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "SIECI SKRYPTÓW ŚLEDZĄCYCH – NAJWIĘKSI SPRAWCY";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Połączenie zaszyfrowane";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Tymczasowo wyłączyliśmy ochronę prywatności, ponieważ wygląda na to, że zniekształca tę witrynę.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Zablokowane główne sieci";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "CZĘSTOTLIWOŚĆ SIECI SKRYPTÓW ŚLEDZĄCYCH";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Załadowano 8 innych domen";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Połączenie zaszyfrowane";
+
diff --git a/DuckDuckGo/pl.lproj/Settings.strings b/DuckDuckGo/pl.lproj/Settings.strings
index 4afbe423ff..0ce1fa9ac0 100644
--- a/DuckDuckGo/pl.lproj/Settings.strings
+++ b/DuckDuckGo/pl.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automatyczne czyszczenie danych";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Więcej informacji: duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ustawienia";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Domyślny";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Prywatność – jeszcze prostsza. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Zarządzaj okienkami z prośbą o zgodę";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Ochrona prywatności włączona dla wszystkich witryn";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Więcej możliwości DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronizacja i kopia zapasowa";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronizacja";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Przeglądaj prywatnie za pomocą aplikacji dla komputerów Mac ";
diff --git a/DuckDuckGo/pt.lproj/Feedback.strings b/DuckDuckGo/pt.lproj/Feedback.strings
index 5fe33ac432..ec88efdd05 100644
--- a/DuckDuckGo/pt.lproj/Feedback.strings
+++ b/DuckDuckGo/pt.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Não, obrigado! Terminei";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Fechar";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Partilhar comentários";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Que site está com falhas?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Denunciar site danificado";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Partilhar comentários";
 
diff --git a/DuckDuckGo/pt.lproj/Localizable.strings b/DuckDuckGo/pt.lproj/Localizable.strings
index 8aa6300773..929e1ca91a 100644
--- a/DuckDuckGo/pt.lproj/Localizable.strings
+++ b/DuckDuckGo/pt.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Editar";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Os marcadores existentes não serão duplicados.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Excedeste o limite de sincronização de favoritos. Experimenta eliminar alguns favoritos. Não é possível fazer uma cópia de segurança dos favoritos até este problema estar resolvido.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "A sincronização de favoritos está em pausa";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Excedeste o limite de sincronização de palavras-passe. Experimenta eliminar algumas palavras-passe. Não é possível fazer uma cópia de segurança das palavras-passe até este problema estar resolvido.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "A sincronização de palavras-passe está em pausa";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Saiba mais";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Marcar todos os separadores?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importe um ficheiro HTML de marcadores de outro navegador ou exporte os seus marcadores existentes.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Os comentários não carregaram";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Falta conteúdo";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Não foi feita a gestão do pop-up de cookies";
+
+/* Broken Site Category */
+"brokensite.category.images" = "As imagens não carregaram";
+
+/* Broken Site Category */
+"brokensite.category.links" = "As ligações ou os botões não funcionam";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Não consigo iniciar sessão";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Outra coisa";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "O site pediu-me para desativar";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "O navegador é incompatível";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "O vídeo não foi reproduzido";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Escolhe o teu problema na lista…";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SELECIONA UMA CATEGORIA";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Indica mais detalhes para nos ajudares a resolver este problema";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "DESCREVER O QUE ACONTECEU";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "grupo: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Remover";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Todos os favoritos no dispositivo";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Escolhe os favoritos a apresentar num novo separador com base na respetiva origem.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Preferências de apresentação";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Apenas favoritos em dispositivos móveis";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Bloquear anúncios e pop-ups";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Abrir VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Gerir";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Ativar as notificações";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Permite que o DuckDuckGo te notifique se a tua ligação cair ou o estado da VPN mudar.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Recebe uma notificação se a tua ligação cair ou o estado da VPN mudar.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Alertas de VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Restaurar automaticamente uma ligação VPN após a interrupção.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Sempre ligada";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Notificações da VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "A Network Protection impede fugas de DNS para o teu fornecedor de serviços de internet ao encaminhar as consultas de DNS através do túnel da VPN para o nosso resolvedor.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "DNS seguro";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Definições da VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Abrir noutra aplicação?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "O envio de um relatório anónimo de site com problemas ajuda-nos a depurar e a melhorar a aplicação.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Pesquisar ou inserir endereço";
 
diff --git a/DuckDuckGo/pt.lproj/PrivacyDashboard.strings b/DuckDuckGo/pt.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..9508ef3c61
--- /dev/null
+++ b/DuckDuckGo/pt.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "O site é uma grande rede de rastreadores";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.exemplo.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Tentar novamente";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Os dados não estão encriptados";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Denunciar site danificado";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Verifique a sua ligação e tente de novo.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Grau melhorado";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Rótulo";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Oh, não funcionou";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.exemplo.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Grau de privacidade";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Botão";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRÁTICAS DE PRIVACIDADE";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Repor as estatísticas da rede de rastreamento";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Botão";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "LIGAÇÃO ENCRIPTADA";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.exemplo.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Botão";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.exemplo.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Sites desprotegidos";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Redes bloqueadas";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 rastreadores bloqueados";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Denunciar site danificado";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Práticas de privacidade";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Principais infratores";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Rótulo";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Não foram encontradas práticas de privacidade";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Sites desprotegidos";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Rótulo";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Boas práticas de privacidade";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Proteção de Privacidade do Site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Proteção de Privacidade do Site";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "PRINCIPAIS INFRATORES DA REDE DE RASTREAMENTO";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Ligação encriptada";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Desativámos temporariamente a Proteção de Privacidade, pois parece estar a bloquear este site.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Redes principais bloqueadas";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FREQUÊNCIA DE REDE DE RASTREAMENTO";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 domínios adicionais carregados";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Ligação encriptada";
+
diff --git a/DuckDuckGo/pt.lproj/Settings.strings b/DuckDuckGo/pt.lproj/Settings.strings
index f136fee8f4..e7f04d47c8 100644
--- a/DuckDuckGo/pt.lproj/Settings.strings
+++ b/DuckDuckGo/pt.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Limpar os dados automaticamente";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Mais em duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Definições";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Predefinido";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Privacidade, simplificada. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gerir pop-ups de cookies";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Proteção de Privacidade ativa para todos os sites";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ícone";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mais da DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronização e cópia de segurança";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronizar";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Navegue em privado com a nossa aplicação para Mac ";
diff --git a/DuckDuckGo/ro.lproj/Feedback.strings b/DuckDuckGo/ro.lproj/Feedback.strings
index a0d66fdd73..c2715d7fcf 100644
--- a/DuckDuckGo/ro.lproj/Feedback.strings
+++ b/DuckDuckGo/ro.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nu mulțumesc! Am terminat";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Închidere";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Partajează feedback";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Ce site este defect?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Raportați site-ul defect";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Partajează feedback";
 
diff --git a/DuckDuckGo/ro.lproj/Localizable.strings b/DuckDuckGo/ro.lproj/Localizable.strings
index 2dcbdc6a07..0064a3f2b3 100644
--- a/DuckDuckGo/ro.lproj/Localizable.strings
+++ b/DuckDuckGo/ro.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Editați";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Marcajele existente nu vor fi duplicate.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Ai depășit limita de sincronizare a marcajelor. Încearcă să ștergi unele marcaje. Până la rezolvarea acestei probleme, nu se va efectua copierea de rezervă pentru marcajele tale.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Sincronizarea marcajelor este întreruptă";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Ai depășit limita de sincronizare a parolelor. Încearcă să ștergi câteva parole. Până la rezolvarea acestei probleme, nu se va efectua copierea de rezervă pentru parolele tale.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Sincronizarea parolelor este întreruptă";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Află mai multe";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Marchezi toate filele?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importă un fișier HTML sau marcaje dintr-un alt browser sau exportă marcajele tale existente.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Comentariile nu s-au încărcat";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Conținutul lipsește";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Fereastra pop-up privind modulele cookie nu a fost gestionată";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Imaginile nu s-au încărcat";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Linkurile sau butoanele nu funcționează";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Nu mă pot conecta";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Altceva";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Site-ul mi-a cerut să dezactivez";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Browserul este incompatibil";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Videoclipul nu s-a redat";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Alegeți problema ta din listă...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "SELECTEAZĂ O CATEGORIE";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Comunicarea mai multor detalii ne poate ajuta să rezolvăm această problemă";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "DESCRIE CE S-A INTAMPLAT";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Elimină";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Toate favoritele de pe dispozitiv";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Alege ce favorite să afișezi într-o filă nouă în funcție de originea lor.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Preferințe de afișare";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Doar favoritele pentru mobil";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blocarea anunțurilor și ferestrelor pop-up";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Deschide VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Gestionează";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Activează Notificările";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Permite ca DuckDuckGo să te înștiințeze dacă conexiunea ta devine mai slabă sau dacă starea VPN-ului se schimbă.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Primește o notificare dacă conexiunea ta devine mai slabă sau dacă starea VPN-ului se schimbă.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Alerte VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Restaurează automat o conexiune VPN după întrerupere.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Întotdeauna activat";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Notificări VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection previne scurgerile DNS către furnizorul tău de servicii de internet prin direcționarea interogărilor DNS prin tunelul VPN către propriul nostru resolver.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "DNS securizat";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Setări VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Deschizi în altă aplicație?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Trimiterea unui raport anonim al unui site care nu funcționează ne ajută să corectăm aceste probleme și să îmbunătățim aplicația.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Caută sau introdu adresa";
 
diff --git a/DuckDuckGo/ro.lproj/PrivacyDashboard.strings b/DuckDuckGo/ro.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..740dd3c4ee
--- /dev/null
+++ b/DuckDuckGo/ro.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Site-ul este o rețea mare de instrumente de urmărire";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Încearcă din nou";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Datele sunt necriptate";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Raportați site-ul defect";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Verifică conexiunea la internet și încearcă din nou.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Grad mărit";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Of, nu a funcționat";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Grad de confidențialitate";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Buton";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRACTICI DE CONFIDENȚIALITATE";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Resetează statisticile despre rețelele de urmărire";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Buton";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "CONEXIUNE CRIPTATĂ";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Buton";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Site-uri neprotejate";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Rețele blocate";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 instrumente de urmărire blocate";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Raportați site-ul defect";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Practici privind confidențialitatea";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Principalii urmăritori";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nu s-au găsit practici privind confidențialitatea";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Site-uri neprotejate";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Bune practici privind confidențialitatea";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Protecția confidențialității site-ului";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Protecția confidențialității site-ului";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "CEI MAI MARI INFRACTORI ÎN CADRUL REȚELELOR DE COOKIE-URI DE URMĂRIRE";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Conexiune criptată";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Am dezactivat temporar protecția confidențialității, deoarece pare să spargă acest site.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Rețele principale blocate";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FRECVENȚA REȚELELOR URMĂRITOARE";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 alte domenii încărcate";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Conexiune criptată";
+
diff --git a/DuckDuckGo/ro.lproj/Settings.strings b/DuckDuckGo/ro.lproj/Settings.strings
index 4404ec5c0d..c2b63de768 100644
--- a/DuckDuckGo/ro.lproj/Settings.strings
+++ b/DuckDuckGo/ro.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Șterge automat datele";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Aflați mai multe la duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Setări";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Implicită";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Despre confidențialitate, pe scurt. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Gestionare pop-up-uri pentru module cookie";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Protecția confidențialității este activată pentru toate site-urile";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Pictogramă";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mai multe de la DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sincronizare și copiere de rezervă";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sincronizare";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Răsfoiește în mod privat, cu aplicația noastră pentru Mac ";
diff --git a/DuckDuckGo/ru.lproj/Feedback.strings b/DuckDuckGo/ru.lproj/Feedback.strings
index 7b1bd5e71e..b34300f93c 100644
--- a/DuckDuckGo/ru.lproj/Feedback.strings
+++ b/DuckDuckGo/ru.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Нет, спасибо. У меня пока всё";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Закрыть";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Оставьте нам отзыв";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "На каком сайте возникает проблема?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Сообщить о неработающем сайте";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Оставьте нам отзыв";
 
diff --git a/DuckDuckGo/ru.lproj/Localizable.strings b/DuckDuckGo/ru.lproj/Localizable.strings
index c36a7b98e5..4b79bf5001 100644
--- a/DuckDuckGo/ru.lproj/Localizable.strings
+++ b/DuckDuckGo/ru.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Редактировать";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Существующие закладки дублироваться не будут.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Вы превысили лимит синхронизации закладок. Попробуйте удалить некоторые из них. Пока вы не устраните эту проблему, резервная копия закладок создаваться не будет.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Синхронизация закладок приостановлена";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Вы превысили лимит синхронизации паролей. Попробуйте удалить некоторые из них. Пока вы не устраните эту проблему, резервная копия закладок создаваться не будет.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Синхронизация паролей приостановлена";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Узнать больше";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "Хорошо";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Добавить все вкладки в закладки?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Импортировать файл HTML с закладками из другого браузера или экспортировать свои закладки.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Не загружаются комментарии";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Отсутствует содержимое";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Не выбраны настройки во всплывающем окне куки-файлов";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Не загружаются изображения";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Не работают ссылки или кнопки";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Не удается войти";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Что-то другое";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Сайт попросил меня отключить";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Несовместимость браузера";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Не воспроизводится видео";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Выберите проблему из списка...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "ВЫБЕРИТЕ КАТЕГОРИЮ";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Более подробная информация поможет нам быстрее найти решение";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "ОПИШИТЕ, ЧТО СЛУЧИЛОСЬ";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "контейнер: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Удалить";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Избранное со всех устройств";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Выберите, какие избранные объекты показывать в новой вкладке (в зависимости от места их нахождения).";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Настройки отображения";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Только избранное с телефона";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Блокировка рекламы и всплывающих окон";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Открыть настройки VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Настроить";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Включить уведомления";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Разрешить DuckDuckGo уведомлять вас о разрыве соединения или изменении состояния VPN.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "DuckDuckGo оповестит вас о разрыве соединения или изменении состояния VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Оповещения о VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Автоматически восстанавливать VPN-соединение в случае его прерывания.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Всегда включено";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Уведомления о VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Защита сети предотвращает утечку данных через DNS вашему интернет-провайдеру, направляя DNS-запросы через VPN-туннель к нашему собственному сопоставителю.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Безопасный DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Настройки VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Открыть в другом приложении?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Отправка анонимной жалобы на неработающий сайт помогает нам решить эти проблемы и улучшить приложение.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Введите поисковый запрос или адрес сайта";
 
diff --git a/DuckDuckGo/ru.lproj/PrivacyDashboard.strings b/DuckDuckGo/ru.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..75181675d4
--- /dev/null
+++ b/DuckDuckGo/ru.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Этот сайт — крупная сеть трекеров";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Повторите попытку";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Данные не шифруются";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Сообщить о неработающем сайте";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Проверьте подключение к интернету и повторите попытку.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Повышенный рейтинг конфиденциальности";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Метка";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Ой, не сработало";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Рейтинг конфиденциальности";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Кнопка";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "УРОВЕНЬ КОНФИДЕНЦИАЛЬНОСТИ";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Сброс статистики сетей трекеров";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Кнопка";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ЗАШИФРОВАННОЕ СОЕДИНЕНИЕ";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Кнопка";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Незащищенные сайты";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Заблокированы сети трекеров";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Заблокировано 8 трекеров";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Сообщить о неработающем сайте";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Уровень конфиденциальности";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Главные шпионы";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Метка";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Уровень конфиденциальности не определен";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Незащищенные сайты";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Метка";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Высокий уровень конфиденциальности";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Защита конфиденциальности сайта";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Защита конфиденциальности сайта";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "ОСНОВНЫЕ СЕТИ ТРЕКЕРОВ, ПРЕДСТАВЛЯЮЩИЕ УГРОЗУ КОНФИДЕНЦИАЛЬНОСТИ";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Зашифрованное соединение";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Мы временно отключили функцию защиты конфиденциальности, так как она мешала работе сайта.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Заблокированы крупные сети трекеров";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "ЧАСТОТА БЛОКИРОВАНИЯ";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Загружено еще 8 доменов";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Зашифрованное соединение";
+
diff --git a/DuckDuckGo/ru.lproj/Settings.strings b/DuckDuckGo/ru.lproj/Settings.strings
index 6b54a2d6c0..7f84888c62 100644
--- a/DuckDuckGo/ru.lproj/Settings.strings
+++ b/DuckDuckGo/ru.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Автоудаление данных";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Подробнее на https://duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Настройки";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "По умолчанию";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Максимум конфиденциальности, минимум усилий. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Управление окнами выбора куки-файлов";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Защита конфиденциальности включена на всех сайтах";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Значок";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "DuckDuckGo также предлагает...";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Синхронизация и резервное копирование";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Синхронизация";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Интернет без трекеров с нашим приложением для Mac ";
diff --git a/DuckDuckGo/sk.lproj/Feedback.strings b/DuckDuckGo/sk.lproj/Feedback.strings
index 01a325f548..41fb371247 100644
--- a/DuckDuckGo/sk.lproj/Feedback.strings
+++ b/DuckDuckGo/sk.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nie, vďaka! Skončil/skončila som";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Zatvoriť";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Zdieľať spätnú väzbu";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Ktorá webová stránka je nefunkčná?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Nahlásiť nefunkčnú stránku";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Zdieľať spätnú väzbu";
 
diff --git a/DuckDuckGo/sk.lproj/Localizable.strings b/DuckDuckGo/sk.lproj/Localizable.strings
index bfa9a50608..2cc71be60f 100644
--- a/DuckDuckGo/sk.lproj/Localizable.strings
+++ b/DuckDuckGo/sk.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Upraviť";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Existujúce záložky sa nebudú duplikovať.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Prekročili ste limit na synchronizáciu záložiek. Skúste niektoré záložky odstrániť. Kým to nevyriešite, vaše záložky sa nebudú zálohovať.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Synchronizácia záložiek je pozastavená.";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Prekročili ste limit na synchronizáciu hesiel. Skúste niektoré heslá odstrániť. Kým to nevyriešite, vaše heslá sa nebudú zálohovať.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Synchronizácia hesiel je pozastavená.";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Zistite viac";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Uložiť všetky karty medzi záložky?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importujte súbor HTML so záložkami z iného prehliadača alebo exportujte svoje existujúce záložky.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Komentáre sa nepodarilo načítať";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Chýba obsah";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Automaticky otvárané okno pre súbory cookie nebolo spravované";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Obrázky sa nepodarilo načítať";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Odkazy alebo tlačidlá nefungujú";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Nemôžem sa prihlásiť";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Niečo iné";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Táto stránka ma požiadala o deaktiváciu";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Prehliadač je nekompatibilný";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video sa neprehráva";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Vyberte problém zo zoznamu...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VYBERTE KATEGÓRIU";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Zdieľanie ďalších podrobností nám môže pomôcť vyriešiť tento problém";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "POPÍŠTE, ČO SA STALO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "vedro: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Odstrániť";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Obľúbené položky zo všetkých zariadení";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Vyberte, ktoré obľúbené položky sa majú zobraziť na novej karte na základe ich zdroja.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Nastavenia zobrazenia";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Iba obľúbené mobilné položky";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokovanie reklám a automaticky otváraných okien";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Otvoriť VPN sieť";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Spravujte stránku";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Zapnúť oznámenia";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Povoľte službe DuckDuckGo, aby vás upozornila, ak dôjde k prerušeniu pripojenia alebo zmene stavu VPN siete.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Dostávajte upozornenia, ak dôjde k prerušeniu pripojenia alebo sa zmení stav VPN siete.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Upozornenia týkajúce sa VPN siete";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Automatické obnovenie pripojenia VPN po prerušení.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Vždy zapnuté";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Oznámenia VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Ochrana siete zabraňuje úniku informácií DNS k poskytovateľovi internetových služieb tým, že presmeruje DNS požiadavky cez VPN tunel na náš vlastný, tzv. „DNS resolver“.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Zabezpečený systém DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Nastavenia siete VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Otvoriť v inej aplikácii?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Odoslaním anonymného hlásenia o nefunkčnom webe nám pomôžete tieto problémy odstrániť a vylepšiť aplikáciu.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Vyhľadajte alebo zadajte adresu";
 
diff --git a/DuckDuckGo/sk.lproj/PrivacyDashboard.strings b/DuckDuckGo/sk.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..98a27974f1
--- /dev/null
+++ b/DuckDuckGo/sk.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Webová stránka je veľkou monitorovacou sieťou";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Skúste to znova";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Údaje sú nezašifrované";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Nahlásiť nefunkčnú stránku";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Skontrolujte svoje internetové pripojenie a skúste znova.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Posilnený stupeň";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Označenie";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Ľutujeme, to nefungovalo";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Stupeň ochrany súkromia";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Tlačidlo";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "SPÔSOBY OCHRANY SÚKROMIA";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Obnoviť štatistiky sledovacích sietí";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Tlačidlo";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŠIFROVANÉ PRIPOJENIE";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Tlačidlo";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Nezabezpečené webové stránky";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Siete boli zablokované";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Zablokovalo sa 8 sledovacích zariadení";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Nahlásiť nefunkčnú stránku";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Spôsoby ochrany súkromia";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Top prenasledovatelia";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Označenie";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Nenašli sa žiadne postupy ochrany súkromia";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Nezabezpečené webové stránky";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Označenie";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Osvedčené spôsoby ochrany súkromia";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Ochrana súkromia stránky";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Ochrana súkromia stránky";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "SLEDOVACIE SIETE S NAJVÄČŠÍMI PRIESTUPKAMI";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Šifrované pripojenie";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Dočasne sme vypli ochranu súkromia, pretože sa zdá, že spôsobuje poruchy na tejto lokalite.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Hlavné siete boli zablokované";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FREKVENCIA SLEDOVACÍCH SIETÍ";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "Bolo načítaných ďalších 8 domén";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Šifrované pripojenie";
+
diff --git a/DuckDuckGo/sk.lproj/Settings.strings b/DuckDuckGo/sk.lproj/Settings.strings
index 5aba47196d..6864fb3a4f 100644
--- a/DuckDuckGo/sk.lproj/Settings.strings
+++ b/DuckDuckGo/sk.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Automaticky vymazať údaje";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Viac informácií na stránke duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nastavenia";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Štandardný";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Súkromie, zjednodušene. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Správa kontextových okien súborov cookie";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Ochrana súkromia je zapnutá pre všetky webové stránky";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Viac od DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synchronizácia a zálohovanie";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synchronizácia";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Prezerajte si súkromne stránky s našou aplikáciou pre Mac ";
diff --git a/DuckDuckGo/sl.lproj/Feedback.strings b/DuckDuckGo/sl.lproj/Feedback.strings
index c4005555fd..a5fbc20190 100644
--- a/DuckDuckGo/sl.lproj/Feedback.strings
+++ b/DuckDuckGo/sl.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Ne, hvala! Zaključil/a sem";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Zapri";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Deli povratne informacije";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Katera spletna stran je poškodovana?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Prijavi nedelujočo stran";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Deli povratne informacije";
 
diff --git a/DuckDuckGo/sl.lproj/Localizable.strings b/DuckDuckGo/sl.lproj/Localizable.strings
index ccf5941d44..47190ef484 100644
--- a/DuckDuckGo/sl.lproj/Localizable.strings
+++ b/DuckDuckGo/sl.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Uredi";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Obstoječi zaznamki ne bodo podvojeni.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Presegli ste omejitev sinhronizacije zaznamkov. Poskusite izbrisati nekaj zaznamkov. Dokler ta težava ne bo odpravljena, zaznamki ne bodo varnostno kopirani.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Sinhronizacija zaznamkov je zaustavljena";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Presegli ste omejitev sinhronizacije gesel. Poskusite izbrisati nekaj gesel. Dokler ta težava ne bo odpravljena, vaša gesla ne bodo varnostno kopirana.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Sinhronizacija gesel je zaustavljena";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Več";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "V REDU";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Želiš dodati vse zavihke med zaznamke?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Uvozite datoteko HTML z zaznamki iz drugega brskalnika ali pa izvozite vaše obstoječe zaznamke.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Komentarji se niso naložili";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Vsebina manjka";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Pojavno okno za piškotke ni bilo upravljano";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Slike se niso naložile";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Povezave ali tipke ne delujejo";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Ne morem se prijaviti";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Nekaj drugega";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Spletišče me je prosilo, da onemogočim";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Brskalnik ni združljiv";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video se ni predvajal";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Svoje vprašanje izberite s seznama ...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "IZBERITE KATEGORIJO";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Če z nami delite več podrobnosti, nam to lahko pomaga pri reševanju te težave";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "OPIŠITE, KAJ SE JE ZGODILO";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "zbiralnik: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Odstrani";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Priljubljene iz vseh naprav";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Izberite priljubljene, ki naj se prikažejo v novem zavihku, glede na njihov izvor.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Nastavitve prikaza";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Priljubljene samo iz mobilne naprave";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blokiranje oglasov in pojavnih oken";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Odpri VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Upravljanje";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Vključite obvestila";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Dovolite, da vas DuckDuckGo obvesti o prekinitvi povezave ali spremembi stanja VPN.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Prejmite obvestilo o prekinitvi povezave ali spremembi stanja VPN.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "Opozorila VPN";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Samodejno obnovite povezavo VPN po prekinitvi.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Vedno vklopljeno";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "Obvestila VPN";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Zaščita omrežja preprečuje uhajanje podatkov DNS k ponudniku internetnih storitev, saj poizvedbe DNS usmerja prek tunela VPN k lastnemu razreševalniku.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Varen DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "Nastavitve VPN";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Odpri v drugi aplikaciji?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Če pošljete poročilo o anonimnem pokvarjenem spletišču, nam pomagate odpraviti napake in izboljšati aplikacijo.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Poišči ali vnesi naslov";
 
diff --git a/DuckDuckGo/sl.lproj/PrivacyDashboard.strings b/DuckDuckGo/sl.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..623216482f
--- /dev/null
+++ b/DuckDuckGo/sl.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Spletno mesto je glavno sledilno omrežje";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Poskusi znova";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Podatki niso šifrirani";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Prijavi nedelujočo stran";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Preverite internetno povezavo in poskusite znova.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Izboljšana ocena";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Oznaka";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Joj, to pa ni uspelo";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Ocena zasebnosti";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Gumb";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "PRAKSE ZASEBNOSTI";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Ponastavi statistične podatke sledilnega omrežja";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Gumb";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŠIFRIRANA POVEZAVA";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Gumb";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Nezaščitene strani";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Blokirana omrežja";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "Blokiranih 8 sledilnikov";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Prijavi nedelujočo stran";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Prakse zasebnosti";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Glavni kršitelji";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Oznaka";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Ni najdenih praks zasebnosti";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Nezaščitene strani";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Oznaka";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Dobre prakse zasebnosti";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Zaščita zasebnosti na strani";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Zaščita zasebnosti na strani";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "GLAVNI KRŠITELJI MED SLEDILNIMI OMREŽJI";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Šifrirana povezava";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Začasno smo onemogočili zaščito zasebnosti, saj se zdi, da zato pride do napak na tem spletnem mestu.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Glavna blokirana omrežja";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "POGOSTOST SLEDENJA OMREŽIJ";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 drugih naloženih domen";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Šifrirana povezava";
+
diff --git a/DuckDuckGo/sl.lproj/Settings.strings b/DuckDuckGo/sl.lproj/Settings.strings
index ec4d2b7bf2..5c032acda2 100644
--- a/DuckDuckGo/sl.lproj/Settings.strings
+++ b/DuckDuckGo/sl.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Samodejno počisti podatke";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Več na duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Nastavitve";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Privzeto";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Zasebnost, poenostavljeno. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Upravljanje pojavnih oken za piškotke";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Zaščita zasebnosti omogočena za vsa spletna mesta";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikona";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Več od iskalnika DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Sinhronizacija in varnostno kopiranje";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Sinhronizacija";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Brskajte zasebno z našo aplikacijo za računalnike Mac ";
diff --git a/DuckDuckGo/sv.lproj/Feedback.strings b/DuckDuckGo/sv.lproj/Feedback.strings
index 426fab986c..1c1dce6277 100644
--- a/DuckDuckGo/sv.lproj/Feedback.strings
+++ b/DuckDuckGo/sv.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Nej tack! Jag är klar.";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Stäng";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Berätta vad du tycker";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Vilken webbplats är skadad?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Rapportera skadad webbplats";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Berätta vad du tycker";
 
diff --git a/DuckDuckGo/sv.lproj/Localizable.strings b/DuckDuckGo/sv.lproj/Localizable.strings
index 5e05b4d917..8cd3fdbc47 100644
--- a/DuckDuckGo/sv.lproj/Localizable.strings
+++ b/DuckDuckGo/sv.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Redigera";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Befintliga bokmärken kommer inte att kopieras.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Du har överskridit gränsen för bokmärkessynkronisering. Ta bort några bokmärken. Dina bokmärken kommer inte att säkerhetskopieras förrän detta har åtgärdats.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Bokmärkessynkronisering är pausad";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Du har överskridit gränsen för lösenordssynkronisering. Ta bort några lösenord. Dina lösenord kommer inte att säkerhetskopieras förrän detta har åtgärdats.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Lösenordssynkronisering är pausad";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Läs mer";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "OK";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Bokmärk alla flikar?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Importera en HTML-fil med bokmärken från en annan webbläsare eller exportera dina befintliga bokmärken.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Kommentarer laddades inte";
+
+/* Broken Site Category */
+"brokensite.category.content" = "Innehåll saknas";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Popup-fönster för cookies hanterades inte";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Bilder laddades inte";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Länkar eller knappar fungerar inte";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Jag kan inte logga in";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Övrigt";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Webbplatsen bad mig att avaktivera";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Webbläsaren är inte kompatibel";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Videon spelades inte upp";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Välj din fråga i listan ...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "VÄLJ EN KATEGORI";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Om du delar mer information kan det hjälpa oss att lösa det här problemet";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "BERÄTTA VAD SOM HÄNDE";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "bucket: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Ta bort";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Alla enhetsfavoriter";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Välj vilka favoriter som ska visas på en ny flik baserat på deras ursprung.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Visningsinställningar";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Endast mobila favoriter";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Blockering av annonser och poppuppfönster";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "Öppna VPN";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Hantera";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Aktivera aviseringar";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Tillåt DuckDuckGo att meddela dig om din anslutning bryts eller VPN-statusen ändras.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Få en avisering om din anslutning bryts eller om VPN-statusen ändras.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN-varningar";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Återställ automatiskt en VPN-anslutning efter avbrott.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Alltid på";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN-aviseringar";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection förhindrar DNS-läckor till din internetleverantör genom att dirigera DNS-frågor genom VPN-tunneln till vår egen resolver.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Säker DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN-inställningar";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Öppna i annan app?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Om du skickar in en anonym anmälan om att webbplatsen inte fungerar hjälper det oss att åtgärda problemet och förbättra appen.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Sök eller ange adress";
 
diff --git a/DuckDuckGo/sv.lproj/PrivacyDashboard.strings b/DuckDuckGo/sv.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..58b58cd04d
--- /dev/null
+++ b/DuckDuckGo/sv.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Webbplatsen är ett större spårningsnätverk";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Försök igen";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Okrypterad data";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Rapportera skadad webbplats";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "Kontrollera din internetanslutning och försök igen.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Förbättrad klass";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Etikett";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Hoppsan, det där fungerade inte";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Sekretessklass";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Knapp";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "INTEGRITETSPRAXIS";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "Återställ statistik för spårningsnätverk";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Knapp";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "KRYPTERAD ANSLUTNING";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Knapp";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Oskyddade webbplatser";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Nätverk blockerade";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 spårare blockerade";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Rapportera skadad webbplats";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Integritetspraxis";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "Främsta syndare";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Etikett";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Ingen integritetspraxis hittades";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Oskyddade webbplatser";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Etikett";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "God integritetspraxis";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Webbplatsens integritetsskydd";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Webbplatsens integritetsskydd";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "SPÅRARNÄTVERKETS FRÄMSTA SYNDARE";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Krypterad anslutning";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Vi har tillfälligt inaktiverat integritetsskydd eftersom det verkade göra att denna webbplats inte fungerade.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Stora nätverk blockerade";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "FREKVENS FÖR SPÅRNINGSNÄTVERK";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 andra domäner lästes in";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Krypterad anslutning";
+
diff --git a/DuckDuckGo/sv.lproj/Settings.strings b/DuckDuckGo/sv.lproj/Settings.strings
index 5a1b5101ff..50d25a1314 100644
--- a/DuckDuckGo/sv.lproj/Settings.strings
+++ b/DuckDuckGo/sv.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Rensa data automatiskt";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Mer på duckduckgo.com/about";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Inställningar";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Standard";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Personlig integritet, förenklad. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Hantera popup-fönster för cookies";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Integritetsskydd aktiverat för alla webbplatser";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Ikon";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "Mer från DuckDuckGo";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Synkronisering och säkerhetskopiering";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Synkronisering";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Surfa privat med vår app för Mac ";
diff --git a/DuckDuckGo/tr.lproj/Feedback.strings b/DuckDuckGo/tr.lproj/Feedback.strings
index 20b5110818..c16a94b613 100644
--- a/DuckDuckGo/tr.lproj/Feedback.strings
+++ b/DuckDuckGo/tr.lproj/Feedback.strings
@@ -10,6 +10,9 @@
 /* Class = "UIButton"; normalTitle = "No Thanks! I’m Done"; ObjectID = "A1s-GY-hbq"; */
 "A1s-GY-hbq.normalTitle" = "Hayır Teşekkürler! Şimdilik Bu Kadar";
 
+/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "cZl-qB-kSL"; */
+"cZl-qB-kSL.title" = "Kapat";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "D8A-B7-Dqu"; */
 "D8A-B7-Dqu.title" = "Geri Bildirim Paylaş";
 
@@ -49,6 +52,9 @@
 /* Class = "UITextField"; placeholder = "Which website is broken?"; ObjectID = "TMj-NM-j3b"; */
 "TMj-NM-j3b.placeholder" = "Hangi web sitesi hatalı?";
 
+/* Class = "UINavigationItem"; title = "Report Broken Site"; ObjectID = "WjT-HM-yim"; */
+"WjT-HM-yim.title" = "Hatalı Siteyi Bildir";
+
 /* Class = "UINavigationItem"; title = "Share Feedback"; ObjectID = "Xb0-Zu-opM"; */
 "Xb0-Zu-opM.title" = "Geri Bildirim Paylaş";
 
diff --git a/DuckDuckGo/tr.lproj/Localizable.strings b/DuckDuckGo/tr.lproj/Localizable.strings
index 4aed95b6cc..1b87ef3f5d 100644
--- a/DuckDuckGo/tr.lproj/Localizable.strings
+++ b/DuckDuckGo/tr.lproj/Localizable.strings
@@ -4,9 +4,6 @@
 /* No comment provided by engineer. */
 "%@ [%@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)" = "%1$@ [%2$@](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)";
 
-/* No comment provided by engineer. */
-"⚠️ FEATURE IS WORK IN PROGRESS ⚠️" = "⚠️ FEATURE IS WORK IN PROGRESS ⚠️";
-
 /* Buton label for Edit action */
 "action.generic.edit" = "Düzenle";
 
@@ -136,24 +133,6 @@
 /* No comment provided by engineer. */
 "alert.message.bookmarkAll" = "Mevcut yer imleri çoğaltılmayacaktır.";
 
-/* Description for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-description" = "Yer işaretleri senkronizasyon sınırını aştınız. Bazı yer işaretlerini silmeyi deneyin. Bu sorun çözülene kadar yer işaretleriniz yedeklenmeyecektir.";
-
-/* Title for alert shown when sync bookmarks paused for too many items */
-"alert.sync-bookmarks-paused-title" = "Yer İşaretleri Senkronizasyonu Duraklatıldı";
-
-/* Description for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-description" = "Şifre senkronizasyon sınırını aştınız. Bazı şifreleri silmeyi deneyin. Bu sorun çözülene kadar şifreleriniz yedeklenmeyecektir.";
-
-/* Title for alert shown when sync credentials paused for too many items */
-"alert.sync-credentials-paused-title" = "Şifre Senkronizasyonu Duraklatıldı";
-
-/* Learn more button in alert */
-"alert.sync-paused-alert-learn-more-button" = "Daha Fazla Bilgi";
-
-/* Confirmation button in alert */
-"alert.sync-paused-alert-ok-button" = "Tamam";
-
 /* Question from confirmation dialog */
 "alert.title.bookmarkAll" = "Tüm Sekmelere Yer İmi Eklensin mi?";
 
@@ -775,6 +754,48 @@
 /* Title of prompt for users where they can choose to import or export an HTML file containing webpage bookmarks */
 "bookmarks.importExport.title" = "Yer işaretleri HTML dosyasını başka bir tarayıcıdan içeri aktarın veya mevcut yer işaretlerinizi dışarı aktarın.";
 
+/* Broken Site Category */
+"brokensite.category.comments" = "Yorumlar yüklenmedi";
+
+/* Broken Site Category */
+"brokensite.category.content" = "İçerik eksik";
+
+/* Broken Site Category */
+"brokensite.category.cookieprompt" = "Çerez açılır penceresi yönetilemedi";
+
+/* Broken Site Category */
+"brokensite.category.images" = "Resimler yüklenmedi";
+
+/* Broken Site Category */
+"brokensite.category.links" = "Bağlantılar veya düğmeler çalışmıyor";
+
+/* Broken Site Category */
+"brokensite.category.login" = "Oturum açamıyorum";
+
+/* Broken Site Category */
+"brokensite.category.other" = "Başka bir şey";
+
+/* Broken Site Category */
+"brokensite.category.paywall" = "Site benden devre dışı bırakmamı istedi";
+
+/* Broken Site Category */
+"brokensite.category.unsupported" = "Tarayıcı uyumsuz";
+
+/* Broken Site Category */
+"brokensite.category.videos" = "Video oynatılamadı";
+
+/* Broken Site Category Placeholder */
+"brokensite.categoryPlaceholder" = "Listeden yaşadığınız sorunu seçin...";
+
+/* Broken Site Category Section Title */
+"brokensite.categoryTitle" = "BİR KATEGORİ SEÇİN";
+
+/* Broken Site Comment Placeholder */
+"brokensite.commentPlaceholder" = "Daha fazla ayrıntı paylaşmak, bu sorunu çözmemize yardımcı olabilir";
+
+/* Broken Site Section Title */
+"brokensite.sectionTitle" = "NE OLDUĞUNU AÇIKLAYIN";
+
 /* No comment provided by engineer. */
 "bucket: %@" = "kova: %@";
 
@@ -1051,18 +1072,6 @@
 /* No comment provided by engineer. */
 "favorite.menu.remove" = "Kaldır";
 
-/* Display Mode for favorites */
-"favorites.settings.all-devices" = "Tüm Cihaz Sık Kullanılanları";
-
-/* Footer of the favorites settings table */
-"favorites.settings.footer" = "Kaynaklarına göre hangi favorilerin yeni bir sekmede görüntüleneceğini seçin.";
-
-/* Header of the favorites settings table */
-"favorites.settings.header" = "Ekran Tercihleri";
-
-/* Display Mode for favorites */
-"favorites.settings.mobile-only" = "Yalnızca Mobil Favoriler";
-
 /* No comment provided by engineer. */
 "feedback.browserFeatures.ads" = "Reklam ve pop-up engelleme";
 
@@ -1429,9 +1438,6 @@
 /* Title for the network protection invite success view */
 "network.protection.invite.success.title" = "Success! You’re in.";
 
-/* Title text for an iOS quick action that opens VPN settings */
-"network.protection.quick-action.open-vpn" = "VPN'i aç";
-
 /* The label for when NetP VPN is connected plus the length of time connected as a formatter HH:MM:SS string */
 "network.protection.status.connected.format" = "Connected - %@";
 
@@ -1471,60 +1477,9 @@
 /* Location label shown in NetworkProtection's status view. */
 "network.protection.status.view.location" = "Location";
 
-/* Label shown on the title of the settings section in NetworkProtection's status view. */
-"network.protection.status.view.settings.section.title" = "Yönet";
-
 /* Title label text for the status view when netP is disconnected */
 "network.protection.status.view.title" = "Network Protection";
 
-/* Title for the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.button.title" = "Bildirimleri Açın";
-
-/* Footer text under the button to link to the iOS app settings and enable notifications app-wide. */
-"network.protection.turn.on.notifications.section.footer" = "Bağlantınız kesilirse veya VPN durumunuz değişirse DuckDuckGo'nun sizi bilgilendirmesine izin verin.";
-
-/* List section footer for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.section.footer" = "Bağlantınız kesilirse veya VPN durumunuz değişirse bildirim alın.";
-
-/* Title for the toggle for VPN alerts. */
-"network.protection.vpn.alerts.toggle.title" = "VPN Uyarıları";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Kesintiden sonra VPN bağlantısını otomatik olarak geri yükleyin.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Her Zaman Açık";
-
-/* Title for the VPN Location screen's All Countries section. */
-"network.protection.vpn.location.all.countries.section.title" = "All Countries";
-
-/* Title for the VPN Location screen's Nearest Available selection item. */
-"network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
-
-/* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
-
-/* Title for the VPN Location screen's Recommended section. */
-"network.protection.vpn.location.recommended.section.title" = "Recommended";
-
-/* Title for the VPN Notifications management screen. */
-"network.protection.vpn.notifications.title" = "VPN Bildirimleri";
-
-/* Label for the Preferred Location VPN Settings item when the nearest available location is selected. */
-"network.protection.vpn.preferred.location.nearest" = "Nearest Available";
-
-/* Title for the Preferred Location VPN Settings item. */
-"network.protection.vpn.preferred.location.title" = "Preferred Location";
-
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Ağ Koruması, DNS sorgularını VPN tüneli üzerinden kendi çözümleyicimize yönlendirerek İnternet Servis Sağlayıcınıza DNS sızıntılarını önler.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Güvenli DNS";
-
-/* Title for the VPN Settings screen. */
-"network.protection.vpn.settings.title" = "VPN Ayarları";
-
 /* Do not translate - stringsdict entry */
 "number.of.tabs" = "number.of.tabs";
 
@@ -1639,6 +1594,9 @@
 /* Alert title */
 "prompt.custom.url.scheme.title" = "Başka Bir Uygulamada Açılsın mı?";
 
+/* No comment provided by engineer. */
+"report.brokensite.header" = "Anonim olarak hatalı site raporu göndermeniz, bu sorunları ayıklamamıza ve uygulamayı geliştirmemize yardımcı olur.";
+
 /* No comment provided by engineer. */
 "search.hint.duckduckgo" = "Adres ara veya gir";
 
diff --git a/DuckDuckGo/tr.lproj/PrivacyDashboard.strings b/DuckDuckGo/tr.lproj/PrivacyDashboard.strings
new file mode 100644
index 0000000000..8a697c7220
--- /dev/null
+++ b/DuckDuckGo/tr.lproj/PrivacyDashboard.strings
@@ -0,0 +1,129 @@
+/* Class = "UILabel"; text = "Site Is a Major Tracker Network"; ObjectID = "0ax-Nd-tDU"; */
+"0ax-Nd-tDU.text" = "Site Önemli İzleyici Ağlarından Biri";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "0SO-8y-5QH"; */
+"0SO-8y-5QH.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Try Again"; ObjectID = "2KC-47-FBo"; */
+"2KC-47-FBo.normalTitle" = "Tekrar Dene";
+
+/* Class = "UILabel"; text = "Data Is Unencrypted"; ObjectID = "2T4-dB-Wu0"; */
+"2T4-dB-Wu0.text" = "Veriler Şifrelenmemiş";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "2xP-ZS-UtN"; */
+"2xP-ZS-UtN.normalTitle" = "Hatalı Siteyi Bildir";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "3UG-EO-bt5"; */
+"3UG-EO-bt5.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
+
+/* Class = "UILabel"; text = "Check your Internet connection and try again."; ObjectID = "3uo-s0-uRc"; */
+"3uo-s0-uRc.text" = "İnternet bağlantınızı kontrol edip tekrar deneyin.";
+
+/* Class = "UILabel"; text = "Enhanced Grade"; ObjectID = "5dV-qp-Hz5"; */
+"5dV-qp-Hz5.text" = "Geliştirilmiş Sınıf";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "6os-4h-chg"; */
+"6os-4h-chg.text" = "Label";
+
+/* Class = "UILabel"; text = "Uh-Oh, That Didn’t Work"; ObjectID = "7k3-Qj-oya"; */
+"7k3-Qj-oya.text" = "Ne Yazık ki Bu İşe Yaramadı";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "7nh-8f-M2e"; */
+"7nh-8f-M2e.text" = "www.example.com";
+
+/* Class = "UILabel"; text = "Privacy Grade"; ObjectID = "7xH-3L-wpf"; */
+"7xH-3L-wpf.text" = "Gizlilik Derecesi";
+
+/* Class = "UITableViewController"; title = "xxx"; ObjectID = "7Z1-eg-OWQ"; */
+"7Z1-eg-OWQ.title" = "xxx";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "8Ec-67-0A8"; */
+"8Ec-67-0A8.normalTitle" = "Düğme";
+
+/* Class = "UILabel"; text = "PRIVACY PRACTICES"; ObjectID = "25V-p3-wsn"; */
+"25V-p3-wsn.text" = "GİZLİLİK UYGULAMALARI";
+
+/* Class = "UIButton"; normalTitle = "Reset Tracker Network Stats"; ObjectID = "953-jn-tmN"; */
+"953-jn-tmN.normalTitle" = "İzleyici Ağ İstatistiklerini Sıfırla";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "aD3-hP-MUU"; */
+"aD3-hP-MUU.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "DGo-7C-PoV"; */
+"DGo-7C-PoV.normalTitle" = "Düğme";
+
+/* Class = "UILabel"; text = "ENCRYPTED CONNECTION"; ObjectID = "dZC-7f-pp3"; */
+"dZC-7f-pp3.text" = "ŞİFRELİ BAĞLANTI";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "edo-u1-cGj"; */
+"edo-u1-cGj.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "eoi-RZ-ibW"; */
+"eoi-RZ-ibW.normalTitle" = "Düğme";
+
+/* Class = "UILabel"; text = "www.example.com"; ObjectID = "F5w-e3-JfY"; */
+"F5w-e3-JfY.text" = "www.example.com";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "fqL-1Q-ilH"; */
+"fqL-1Q-ilH.normalTitle" = "Korumasız Siteler";
+
+/* Class = "UILabel"; text = "Networks Blocked"; ObjectID = "Ge6-9h-2z5"; */
+"Ge6-9h-2z5.text" = "Engellenen Ağlar";
+
+/* Class = "UILabel"; text = "8 Trackers Blocked"; ObjectID = "GZ4-PW-wOG"; */
+"GZ4-PW-wOG.text" = "8 İzleyici Engellendi";
+
+/* Class = "UIButton"; normalTitle = "Report Broken Site"; ObjectID = "hDv-jp-eaS"; */
+"hDv-jp-eaS.normalTitle" = "Hatalı Siteyi Bildir";
+
+/* Class = "UILabel"; text = "Privacy Practices"; ObjectID = "iF1-sO-WXk"; */
+"iF1-sO-WXk.text" = "Gizlilik Uygulamaları";
+
+/* Class = "UILabel"; text = "Top Offenders"; ObjectID = "IPS-SD-65t"; */
+"IPS-SD-65t.text" = "İlk Sıradaki Suçlular";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "J3L-KE-1Vb"; */
+"J3L-KE-1Vb.text" = "Label";
+
+/* Class = "UILabel"; text = "No privacy practices found"; ObjectID = "k0S-dU-EUe"; */
+"k0S-dU-EUe.text" = "Gizlilik Uygulamaları Bulunamadı";
+
+/* Class = "UIButton"; normalTitle = "Unprotected Sites"; ObjectID = "Kme-pZ-l7N"; */
+"Kme-pZ-l7N.normalTitle" = "Korumasız Siteler";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "Mv2-oP-SQd"; */
+"Mv2-oP-SQd.text" = "Label";
+
+/* Class = "UILabel"; text = "Good Privacy Practices"; ObjectID = "oyz-09-obQ"; */
+"oyz-09-obQ.text" = "Öne Çıkan Gizlilik Uygulamaları";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "pW9-ic-ro9"; */
+"pW9-ic-ro9.text" = "Site Gizlilik Koruması";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "rXM-kA-bL0"; */
+"rXM-kA-bL0.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
+
+/* Class = "UILabel"; text = "Site Privacy Protection"; ObjectID = "sr7-Qg-P74"; */
+"sr7-Qg-P74.text" = "Site Gizlilik Koruması";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK TOP OFFENDERS"; ObjectID = "tpT-I9-kDk"; */
+"tpT-I9-kDk.text" = "İZLEYİCİ AĞ İLK SIRADAKİ SUÇLULARI";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "wf1-HZ-e7d"; */
+"wf1-HZ-e7d.text" = "Şifreli Bağlantı";
+
+/* Class = "UILabel"; text = "We temporarily disabled Privacy Protection as it appears to be breaking this site."; ObjectID = "wwe-ee-up0"; */
+"wwe-ee-up0.text" = "Bu sitede hatalara neden olduğu için Gizlilik Korumasını geçici olarak devre dışı bıraktık.";
+
+/* Class = "UILabel"; text = "Major Networks Blocked"; ObjectID = "XzQ-fW-tzk"; */
+"XzQ-fW-tzk.text" = "Engellenen Başlıca Ağlar";
+
+/* Class = "UILabel"; text = "TRACKER NETWORK FREQUENCY"; ObjectID = "Y3q-u7-IeX"; */
+"Y3q-u7-IeX.text" = "İZLEYİCİNİN AĞ İLE KARŞILAŞMA SIKLIĞI";
+
+/* Class = "UILabel"; text = "8 Other Domains Loaded"; ObjectID = "YDP-RX-LaV"; */
+"YDP-RX-LaV.text" = "8 Alan Adı Daha Yüklendi";
+
+/* Class = "UILabel"; text = "Encrypted Connection"; ObjectID = "zz1-Q4-Fxr"; */
+"zz1-Q4-Fxr.text" = "Şifreli Bağlantı";
+
diff --git a/DuckDuckGo/tr.lproj/Settings.strings b/DuckDuckGo/tr.lproj/Settings.strings
index 81c5b0fc5d..f15463e3e5 100644
--- a/DuckDuckGo/tr.lproj/Settings.strings
+++ b/DuckDuckGo/tr.lproj/Settings.strings
@@ -22,6 +22,9 @@
 /* Class = "UILabel"; text = "Automatically Clear Data"; ObjectID = "5YD-Od-uDU"; */
 "5YD-Od-uDU.text" = "Verileri Otomatik Olarak Temizle";
 
+/* Class = "UIButton"; normalTitle = "More at duckduckgo.com/about"; ObjectID = "7nt-uS-sOh"; */
+"7nt-uS-sOh.normalTitle" = "Duckduckgo.com/about adresinde daha fazla bilgi edinin";
+
 /* Class = "UIButton"; normalTitle = "Settings"; ObjectID = "8YG-7Q-Czd"; */
 "8YG-7Q-Czd.normalTitle" = "Ayarlar";
 
@@ -145,6 +148,9 @@
 /* Class = "UILabel"; text = "Default"; ObjectID = "Gbx-kl-uOO"; */
 "Gbx-kl-uOO.text" = "Varsayılan";
 
+/* Class = "UILabel"; text = "Privacy, simplified. "; ObjectID = "gji-Fs-EET"; */
+"gji-Fs-EET.text" = "Gizlilik, basitleştirildi. ";
+
 /* Class = "UILabel"; text = "Manage Cookie Pop-ups"; ObjectID = "GRv-M2-Kx1"; */
 "GRv-M2-Kx1.text" = "Çerez Açılır Pencerelerini Yönetin";
 
@@ -160,6 +166,9 @@
 /* Class = "UILabel"; text = "Privacy Protection enabled for all sites"; ObjectID = "Hu1-5i-vjL"; */
 "Hu1-5i-vjL.text" = "Gizlilik Koruması tüm siteler için etkin";
 
+/* Class = "UIImageView"; accessibilityLabel = "DuckDuckGo"; ObjectID = "iNd-oh-m3g"; */
+"iNd-oh-m3g.accessibilityLabel" = "DuckDuckGo";
+
 /* Class = "UICollectionViewController"; title = "Icon"; ObjectID = "jbD-Oy-Cmw"; */
 "jbD-Oy-Cmw.title" = "Icon";
 
@@ -190,8 +199,8 @@
 /* Class = "UITableViewSection"; headerTitle = "More From DuckDuckGo"; ObjectID = "OxE-MQ-uJk"; */
 "OxE-MQ-uJk.headerTitle" = "DuckDuckGo'dan Daha Fazlası";
 
-/* Class = "UILabel"; text = "Sync & Back Up"; ObjectID = "oXN-ez-gct"; */
-"oXN-ez-gct.text" = "Senkronizasyon ve Yedekleme";
+/* Class = "UILabel"; text = "Sync"; ObjectID = "oXN-ez-gct"; */
+"oXN-ez-gct.text" = "Senkronizasyon";
 
 /* Class = "UILabel"; text = "Browse privately with our app for Mac "; ObjectID = "P0F-ts-ekd"; */
 "P0F-ts-ekd.text" = "Mac için uygulamamızla internette gezinirken gizliliğinizi koruyun ";
diff --git a/DuckDuckGoTests/BrokenSiteReportingTests.swift b/DuckDuckGoTests/BrokenSiteReportingTests.swift
index 2ffc9f0d7b..6c663fda98 100644
--- a/DuckDuckGoTests/BrokenSiteReportingTests.swift
+++ b/DuckDuckGoTests/BrokenSiteReportingTests.swift
@@ -44,7 +44,6 @@ final class BrokenSiteReportingTests: XCTestCase {
 
     func testBrokenSiteReporting() throws {
         let testJSON = data.fromJsonFile(Resource.tests)
-        let testString = String(data: testJSON, encoding: .utf8)
         let testData = try JSONDecoder().decode(BrokenSiteReportingTestData.self, from: testJSON)
 
         referenceTests = testData.reportURL.tests.filter {
@@ -65,6 +64,7 @@ final class BrokenSiteReportingTests: XCTestCase {
             return
         }
         
+        
         os_log("Testing [%s]", type: .info, test.name)
         
         let brokenSiteInfo = BrokenSiteInfo(url: URL(string: test.siteURL),
@@ -81,6 +81,7 @@ final class BrokenSiteReportingTests: XCTestCase {
                                             systemVersion: test.os ?? "",
                                             gpc: test.gpcEnabled)
         
+
         stub(condition: isHost(host)) { request -> HTTPStubsResponse in
             
             guard let requestURL = request.url else {
@@ -116,7 +117,7 @@ final class BrokenSiteReportingTests: XCTestCase {
             return HTTPStubsResponse(data: Data(), statusCode: 200, headers: nil)
         }
         
-        brokenSiteInfo.send(with: test.category, description: "", source: .dashboard)
+        brokenSiteInfo.send(with: test.category, description: "")
     }
 }
 
@@ -134,6 +135,7 @@ private struct ReportURL: Codable {
 }
 
 // MARK: - Test
+
 private struct Test: Codable {
     let name: String
     let siteURL: String
diff --git a/Widgets/bg.lproj/Localizable.strings b/Widgets/bg.lproj/Localizable.strings
index e36bdab9db..642c6a3542 100644
--- a/Widgets/bg.lproj/Localizable.strings
+++ b/Widgets/bg.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Грешка";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Етикет";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Гласово търсене";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Насладете се на поверително търсене и сърфиране в любимите си сайтове само с едно докосване.";
 
diff --git a/Widgets/cs.lproj/Localizable.strings b/Widgets/cs.lproj/Localizable.strings
index 845cf681a1..773e0773d7 100644
--- a/Widgets/cs.lproj/Localizable.strings
+++ b/Widgets/cs.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Chyba";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Štítek";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Hlasové vyhledávání";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Vyhledávejte nebo navštěvujte své oblíbené weby soukromě jediným klepnutím.";
 
diff --git a/Widgets/da.lproj/Localizable.strings b/Widgets/da.lproj/Localizable.strings
index ad5843944c..a97d59db1c 100644
--- a/Widgets/da.lproj/Localizable.strings
+++ b/Widgets/da.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Fejl";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etiket";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Stemmesøgning";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Søg eller besøg dine yndlingssider privat med kun ét tryk.";
 
diff --git a/Widgets/de.lproj/Localizable.strings b/Widgets/de.lproj/Localizable.strings
index 4e8d0d75e5..f2d7ca21a8 100644
--- a/Widgets/de.lproj/Localizable.strings
+++ b/Widgets/de.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Fehler";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Sprachsuche";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Du kannst deine Lieblingswebsites privat durchsuchen und anzeigen – einfach durch Antippen!";
 
diff --git a/Widgets/el.lproj/Localizable.strings b/Widgets/el.lproj/Localizable.strings
index 6aae28ca9a..21fb056360 100644
--- a/Widgets/el.lproj/Localizable.strings
+++ b/Widgets/el.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Σφάλμα";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Φωνητική αναζήτηση";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Κάντε αναζήτηση ή επισκεφτείτε τους αγαπημένους ιστότοπούς σας ιδιωτικά, με μόνο ένα πάτημα.";
 
diff --git a/Widgets/es.lproj/Localizable.strings b/Widgets/es.lproj/Localizable.strings
index 29ba8d8698..74ffef6287 100644
--- a/Widgets/es.lproj/Localizable.strings
+++ b/Widgets/es.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Error";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etiqueta";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Búsqueda por voz";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Busca o visita tus sitios web de forma privada con solo pulsar un botón.";
 
diff --git a/Widgets/et.lproj/Localizable.strings b/Widgets/et.lproj/Localizable.strings
index 87539eae30..9b45e87d3a 100644
--- a/Widgets/et.lproj/Localizable.strings
+++ b/Widgets/et.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Viga";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Silt";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Häälotsing";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Otsi või külasta oma lemmiksaite privaatselt vaid ühe puudutusega.";
 
diff --git a/Widgets/fi.lproj/Localizable.strings b/Widgets/fi.lproj/Localizable.strings
index d3c3815e10..fe34c710fa 100644
--- a/Widgets/fi.lproj/Localizable.strings
+++ b/Widgets/fi.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Virhe";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Äänihaku";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Tee hakuja ja käy lempisivustoillasi yhdellä napautuksella.";
 
diff --git a/Widgets/fr.lproj/Localizable.strings b/Widgets/fr.lproj/Localizable.strings
index 534645bedf..4560cf6c31 100644
--- a/Widgets/fr.lproj/Localizable.strings
+++ b/Widgets/fr.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Erreur";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Recherche vocale";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Recherchez ou visitez vos sites favoris en privé et d'un seul mouvement.";
 
diff --git a/Widgets/hr.lproj/Localizable.strings b/Widgets/hr.lproj/Localizable.strings
index 6f30e34502..109e6b1ab3 100644
--- a/Widgets/hr.lproj/Localizable.strings
+++ b/Widgets/hr.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Pogreška";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Glasovno pretraživanje";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Pretraži ili posjeti svoja omiljena web-mjesta privatno jednim dodirom.";
 
diff --git a/Widgets/hu.lproj/Localizable.strings b/Widgets/hu.lproj/Localizable.strings
index 020c39e048..4bfd4c0c17 100644
--- a/Widgets/hu.lproj/Localizable.strings
+++ b/Widgets/hu.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Hiba";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Címke";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Beszédhangalapú keresés";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Látogasd meg a kedvenc weboldalaidat és keress rajtuk privát módon, mindössze egyetlen koppintással.";
 
diff --git a/Widgets/it.lproj/Localizable.strings b/Widgets/it.lproj/Localizable.strings
index 054ce6c494..40201cee2a 100644
--- a/Widgets/it.lproj/Localizable.strings
+++ b/Widgets/it.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Errore";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etichetta";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Ricerca vocale";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Effettua ricerche o visita i tuoi siti preferiti in incognito con un solo tocco.";
 
diff --git a/Widgets/lt.lproj/Localizable.strings b/Widgets/lt.lproj/Localizable.strings
index 093743ccf9..90cedf4c48 100644
--- a/Widgets/lt.lproj/Localizable.strings
+++ b/Widgets/lt.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Klaida";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etiketė";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Paieška balsu";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Ieškokite arba lankykitės savo mėgstamose svetainėse privačiai vienu bakstelėjimu.";
 
diff --git a/Widgets/lv.lproj/Localizable.strings b/Widgets/lv.lproj/Localizable.strings
index 9a4f7e7289..fad926197f 100644
--- a/Widgets/lv.lproj/Localizable.strings
+++ b/Widgets/lv.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Kļūda";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etiķete";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Balss meklēšana";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Meklē vai atver savas iecienītākās vietnes konfidenciāli, veicot tikai vienu pieskārienu.";
 
diff --git a/Widgets/nb.lproj/Localizable.strings b/Widgets/nb.lproj/Localizable.strings
index f4be22a9a9..e36bae6f85 100644
--- a/Widgets/nb.lproj/Localizable.strings
+++ b/Widgets/nb.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Feil";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etikett";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Talesøk";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Søk eller besøk favorittsider privat med ett trykk.";
 
diff --git a/Widgets/nl.lproj/Localizable.strings b/Widgets/nl.lproj/Localizable.strings
index 18e0f7e4f1..51d9e9e4a8 100644
--- a/Widgets/nl.lproj/Localizable.strings
+++ b/Widgets/nl.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Fout";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Zoeken via spraak";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Zoek of bezoek je favoriete sites in de privémodus met één tik.";
 
diff --git a/Widgets/pl.lproj/Localizable.strings b/Widgets/pl.lproj/Localizable.strings
index a188c79e20..062491c5fa 100644
--- a/Widgets/pl.lproj/Localizable.strings
+++ b/Widgets/pl.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Błąd";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etykieta";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Wyszukiwanie głosowe";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Prywatnie przeszukuj lub odwiedzaj swoje ulubione witryny za pomocą jednego dotknięcia.";
 
diff --git a/Widgets/pt.lproj/Localizable.strings b/Widgets/pt.lproj/Localizable.strings
index 5727c566a8..a4900f4bb6 100644
--- a/Widgets/pt.lproj/Localizable.strings
+++ b/Widgets/pt.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Erro";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Rótulo";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Pesquisa por voz";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Pesquise ou visite os seus sites favoritos de forma privada com apenas um toque.";
 
diff --git a/Widgets/ro.lproj/Localizable.strings b/Widgets/ro.lproj/Localizable.strings
index 8a8bc2c5c3..0f2f18c418 100644
--- a/Widgets/ro.lproj/Localizable.strings
+++ b/Widgets/ro.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Eroare";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Căutare vocală";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Caută sau vizitează site-urile preferate în mod privat cu o singură atingere.";
 
diff --git a/Widgets/ru.lproj/Localizable.strings b/Widgets/ru.lproj/Localizable.strings
index 8559bd3c26..137b724614 100644
--- a/Widgets/ru.lproj/Localizable.strings
+++ b/Widgets/ru.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Ошибка";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Метка";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Голосовой поиск";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Поиск и посещение любимых сайтов без слежки всего в одно касание.";
 
diff --git a/Widgets/sk.lproj/Localizable.strings b/Widgets/sk.lproj/Localizable.strings
index 817d0fd8b6..9f736780af 100644
--- a/Widgets/sk.lproj/Localizable.strings
+++ b/Widgets/sk.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Chyba";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Označenie";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Hlasové vyhľadávanie";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Vyhľadávajte alebo navštevujte svoje obľúbené stránky súkromne iba pomocou jedného kliknutia.";
 
diff --git a/Widgets/sl.lproj/Localizable.strings b/Widgets/sl.lproj/Localizable.strings
index 8f94f58b78..38d7e43b69 100644
--- a/Widgets/sl.lproj/Localizable.strings
+++ b/Widgets/sl.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Napaka";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Oznaka";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Glasovno iskanje";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Samo z enim dotikom zasebno poiščite ali obiščite priljubljena spletna mesta.";
 
diff --git a/Widgets/sv.lproj/Localizable.strings b/Widgets/sv.lproj/Localizable.strings
index 0d06e15192..0ce98e5edd 100644
--- a/Widgets/sv.lproj/Localizable.strings
+++ b/Widgets/sv.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Fel";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Etikett";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Röstsökning";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Gör sökningar eller besök dina favoritwebbplatser privat med ett enda tryck.";
 
diff --git a/Widgets/tr.lproj/Localizable.strings b/Widgets/tr.lproj/Localizable.strings
index ac5a006384..06ad932581 100644
--- a/Widgets/tr.lproj/Localizable.strings
+++ b/Widgets/tr.lproj/Localizable.strings
@@ -1,15 +1,3 @@
-/* No comment provided by engineer. */
-"Connect" = "Connect";
-
-/* No comment provided by engineer. */
-"Disconnect" = "Disconnect";
-
-/* No comment provided by engineer. */
-"Error" = "Hata";
-
-/* No comment provided by engineer. */
-"iOS 17 required" = "iOS 17 required";
-
 /* No comment provided by engineer. */
 "Label" = "Label";
 
@@ -43,9 +31,6 @@
 /* Title shown to the user when adding the Voice Search lock screen widget */
 "lock.screen.widget.voice.title" = "Sesli Arama";
 
-/* No comment provided by engineer. */
-"VPN Not Configured" = "VPN Not Configured";
-
 /* Description of search and favorites widget in widget gallery */
 "widget.gallery.search.and.favorites.description" = "Tek bir dokunuşla favori sitelerinizi gizlice arayın veya ziyaret edin.";
 

From 66d3d1df4219ccec96b43667f488fbbc770c1079 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jacek=20=C5=81yp?= <jlyp@duckduckgo.com>
Date: Thu, 23 Nov 2023 15:17:24 +0100
Subject: [PATCH 13/40] Release 7.97.1 (#2190)

Co-authored-by: Bartek Waresiak <bartek@duckduckgo.com>
Co-authored-by: Dominik Kapusta <dkapusta@duckduckgo.com>
---
 Configuration/Version.xcconfig                |  2 +-
 DuckDuckGo.xcodeproj/project.pbxproj          | 44 +++++++++----------
 .../xcshareddata/swiftpm/Package.resolved     |  6 +--
 DuckDuckGo/AppDelegate.swift                  | 28 +++++++++++-
 DuckDuckGo/BookmarksDatabase.swift            |  4 ++
 DuckDuckGo/Settings.bundle/Root.plist         |  2 +-
 6 files changed, 58 insertions(+), 28 deletions(-)

diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig
index 773b0e1646..698f293328 100644
--- a/Configuration/Version.xcconfig
+++ b/Configuration/Version.xcconfig
@@ -1 +1 @@
-MARKETING_VERSION = 7.97.0
+MARKETING_VERSION = 7.97.1
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index aace48e673..dc6e417ba3 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -7739,7 +7739,7 @@
 				CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -7776,7 +7776,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -7868,7 +7868,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = ShareExtension/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -7895,7 +7895,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8041,7 +8041,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8065,7 +8065,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				INFOPLIST_FILE = DuckDuckGo/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8129,7 +8129,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEAD_CODE_STRIPPING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = Widgets/Info.plist;
@@ -8164,7 +8164,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8198,7 +8198,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = OpenAction/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8228,7 +8228,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8514,7 +8514,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8540,7 +8540,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8572,7 +8572,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8609,7 +8609,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8645,7 +8645,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8680,11 +8680,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 0;
+				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8858,11 +8858,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 0;
+				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8891,10 +8891,10 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 0;
+				CURRENT_PROJECT_VERSION = 1;
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 0;
+				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -9080,7 +9080,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 83.0.0;
+				version = "83.0.0-3";
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index d9cc92bff7..db37a38a84 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "f7e20cd37bbc0d25ae3c3f25ef52d319366613e7",
-          "version": "83.0.0"
+          "revision": "99a64f24becbb11d8ea9da1d2df1ca270e5318a3",
+          "version": "83.0.0-3"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index 9b3a32e512..9c4c6c8d74 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -21,6 +21,7 @@ import UIKit
 import Combine
 import Common
 import Core
+import CoreData
 import UserNotifications
 import Kingfisher
 import WidgetKit
@@ -163,6 +164,29 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
         var shouldResetBookmarksSyncTimestamp = false
 
+        let preMigrationErrorHandling = EventMapping<BookmarkFormFactorFavoritesMigration.MigrationErrors> { _, error, _, _ in
+            if let error = error {
+                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase,
+                           error: error)
+            } else {
+                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase)
+            }
+
+            if shouldPresentInsufficientDiskSpaceAlertAndCrash {
+                return
+            } else {
+                Thread.sleep(forTimeInterval: 1)
+                fatalError("Could not create Bookmarks database stack: \(error?.localizedDescription ?? "err")")
+            }
+        }
+
+        let oldFavoritesOrder = BookmarkFormFactorFavoritesMigration
+            .getFavoritesOrderFromPreV4Model(
+                dbContainerLocation: BookmarksDatabase.defaultDBLocation,
+                dbFileURL: BookmarksDatabase.defaultDBFileURL,
+                errorEvents: preMigrationErrorHandling
+            )
+
         bookmarksDatabase.loadStore { [weak self] context, error in
             guard let context = context else {
                 if let error = error {
@@ -187,7 +211,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
             legacyStorage?.removeStore()
 
             do {
-                BookmarkUtils.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile, in: context)
+                BookmarkFormFactorFavoritesMigration.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile,
+                                                                                          preservingOrderOf: oldFavoritesOrder,
+                                                                                          in: context)
                 if context.hasChanges {
                     try context.save(onErrorFire: .bookmarksMigrationCouldNotPrepareMultipleFavoriteFolders)
                     if let syncDataProviders = self?.syncDataProviders {
diff --git a/DuckDuckGo/BookmarksDatabase.swift b/DuckDuckGo/BookmarksDatabase.swift
index e20d1f74c7..962c552516 100644
--- a/DuckDuckGo/BookmarksDatabase.swift
+++ b/DuckDuckGo/BookmarksDatabase.swift
@@ -39,6 +39,10 @@ public class BookmarksDatabase {
         return url
     }()
 
+    public static var defaultDBFileURL: URL = {
+        return defaultDBLocation.appendingPathComponent("Bookmarks.sqlite", conformingTo: .database)
+    }()
+
     public static func make(location: URL = defaultDBLocation, readOnly: Bool = false) -> CoreDataDatabase {
         os_log("BookmarksDatabase.make - IN - %s", location.absoluteString)
         let bundle = Bookmarks.bundle
diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist
index 52e3696d8c..cb5e57cf93 100644
--- a/DuckDuckGo/Settings.bundle/Root.plist
+++ b/DuckDuckGo/Settings.bundle/Root.plist
@@ -6,7 +6,7 @@
 	<array>
 		<dict>
 			<key>DefaultValue</key>
-			<string>7.97.0</string>
+			<string>7.97.1</string>
 			<key>Key</key>
 			<string>version</string>
 			<key>Title</key>

From 926526d2eee3210ad6f1bf2ac7a75d2e57600c2b Mon Sep 17 00:00:00 2001
From: bwaresiak <bartek@duckduckgo.com>
Date: Thu, 23 Nov 2023 18:32:48 +0100
Subject: [PATCH 14/40] Update BSK ref to latest one (#2191)

Task/Issue URL: https://app.asana.com/0/414235014887631/1206016824928730/f
Tech Design URL:
CC:

Description:

Update BSK ref to match latest release (including changes from hotfix branch).
---
 DuckDuckGo.xcodeproj/project.pbxproj                          | 2 +-
 .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 90f3626e81..f39b50db1f 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9143,7 +9143,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = "83.0.0-3";
+				version = 85.0.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 6dd9deb9e3..4ecab7d302 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "99a64f24becbb11d8ea9da1d2df1ca270e5318a3",
-          "version": "83.0.0-3"
+          "revision": "5b84e6d0cd9b28b1a324538c98156576015981a1",
+          "version": "85.0.0"
         }
       },
       {

From 85b88812ba367e024272b0a76e9f4bb40cb12988 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jacek=20=C5=81yp?= <jlyp@duckduckgo.com>
Date: Fri, 24 Nov 2023 14:39:16 +0100
Subject: [PATCH 15/40] Release 7.98.0 (#2193)

Co-authored-by: Bartek Waresiak <bartek@duckduckgo.com>
Co-authored-by: Dominik Kapusta <dkapusta@duckduckgo.com>
---
 DuckDuckGo.xcodeproj/project.pbxproj          | 44 +++++++++----------
 .../xcshareddata/swiftpm/Package.resolved     |  8 ++--
 DuckDuckGo/AppDelegate.swift                  | 28 +++++++++++-
 DuckDuckGo/BookmarksDatabase.swift            |  4 ++
 fastlane/README.md                            |  8 ----
 5 files changed, 57 insertions(+), 35 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 6e9a784388..eb4194b496 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -7802,7 +7802,7 @@
 				CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -7839,7 +7839,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -7931,7 +7931,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = ShareExtension/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -7958,7 +7958,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8104,7 +8104,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8128,7 +8128,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				INFOPLIST_FILE = DuckDuckGo/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8192,7 +8192,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEAD_CODE_STRIPPING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = Widgets/Info.plist;
@@ -8227,7 +8227,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8261,7 +8261,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = OpenAction/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8291,7 +8291,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8577,7 +8577,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8603,7 +8603,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8635,7 +8635,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8672,7 +8672,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8708,7 +8708,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8743,11 +8743,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 2;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8921,11 +8921,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 2;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8954,10 +8954,10 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 2;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -9143,7 +9143,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 84.1.1;
+				version = 85.0.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index a9e3205a3a..b5914796a8 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "b97c451037f7a24aef6389be8252df301d2294cd",
-          "version": "84.1.1"
+          "revision": "5b84e6d0cd9b28b1a324538c98156576015981a1",
+          "version": "85.0.0"
         }
       },
       {
@@ -33,8 +33,8 @@
         "repositoryURL": "https://github.com/duckduckgo/content-scope-scripts",
         "state": {
           "branch": null,
-          "revision": "254b23cf292140498650421bb31fd05740f4579b",
-          "version": "4.40.0"
+          "revision": "b7ad9843e70cede0c2ca9c4260d970f62cb28156",
+          "version": "4.52.0"
         }
       },
       {
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index 3732a3fd5e..3633513de4 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -21,6 +21,7 @@ import UIKit
 import Combine
 import Common
 import Core
+import CoreData
 import UserNotifications
 import Kingfisher
 import WidgetKit
@@ -167,6 +168,29 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
         var shouldResetBookmarksSyncTimestamp = false
 
+        let preMigrationErrorHandling = EventMapping<BookmarkFormFactorFavoritesMigration.MigrationErrors> { _, error, _, _ in
+            if let error = error {
+                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase,
+                           error: error)
+            } else {
+                Pixel.fire(pixel: .bookmarksCouldNotLoadDatabase)
+            }
+
+            if shouldPresentInsufficientDiskSpaceAlertAndCrash {
+                return
+            } else {
+                Thread.sleep(forTimeInterval: 1)
+                fatalError("Could not create Bookmarks database stack: \(error?.localizedDescription ?? "err")")
+            }
+        }
+
+        let oldFavoritesOrder = BookmarkFormFactorFavoritesMigration
+            .getFavoritesOrderFromPreV4Model(
+                dbContainerLocation: BookmarksDatabase.defaultDBLocation,
+                dbFileURL: BookmarksDatabase.defaultDBFileURL,
+                errorEvents: preMigrationErrorHandling
+            )
+
         bookmarksDatabase.loadStore { [weak self] context, error in
             guard let context = context else {
                 if let error = error {
@@ -191,7 +215,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
             legacyStorage?.removeStore()
 
             do {
-                BookmarkUtils.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile, in: context)
+                BookmarkFormFactorFavoritesMigration.migrateToFormFactorSpecificFavorites(byCopyingExistingTo: .mobile,
+                                                                                          preservingOrderOf: oldFavoritesOrder,
+                                                                                          in: context)
                 if context.hasChanges {
                     try context.save(onErrorFire: .bookmarksMigrationCouldNotPrepareMultipleFavoriteFolders)
                     if let syncDataProviders = self?.syncDataProviders {
diff --git a/DuckDuckGo/BookmarksDatabase.swift b/DuckDuckGo/BookmarksDatabase.swift
index e20d1f74c7..962c552516 100644
--- a/DuckDuckGo/BookmarksDatabase.swift
+++ b/DuckDuckGo/BookmarksDatabase.swift
@@ -39,6 +39,10 @@ public class BookmarksDatabase {
         return url
     }()
 
+    public static var defaultDBFileURL: URL = {
+        return defaultDBLocation.appendingPathComponent("Bookmarks.sqlite", conformingTo: .database)
+    }()
+
     public static func make(location: URL = defaultDBLocation, readOnly: Bool = false) -> CoreDataDatabase {
         os_log("BookmarksDatabase.make - IN - %s", location.absoluteString)
         let bundle = Bookmarks.bundle
diff --git a/fastlane/README.md b/fastlane/README.md
index 452c9fec13..5ca5e832ea 100644
--- a/fastlane/README.md
+++ b/fastlane/README.md
@@ -85,14 +85,6 @@ Makes Alpha release build and uploads it to TestFlight
 
 Increment build number based on version in App Store Connect
 
-### setup_e2e_tests
-
-```sh
-[bundle exec] fastlane setup_e2e_tests
-```
-
-Setup Maestro e2e tests
-
 ----
 
 This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.

From 28c6d98e969b7b46ef914e25ed40e14e0e751d60 Mon Sep 17 00:00:00 2001
From: Lorenzo Mattei <lore.mattei@gmail.com>
Date: Fri, 24 Nov 2023 16:03:55 +0100
Subject: [PATCH 16/40] Fix sync Form Factor specific favorites tests (#2164)

---
 .maestro/sync_tests/03_recover_account.yaml | 35 +++++++++++++----
 .maestro/sync_tests/04_sync_data.yaml       | 42 ++++++++++++++++-----
 2 files changed, 60 insertions(+), 17 deletions(-)

diff --git a/.maestro/sync_tests/03_recover_account.yaml b/.maestro/sync_tests/03_recover_account.yaml
index d20cbf3b3b..1cd62c3a81 100644
--- a/.maestro/sync_tests/03_recover_account.yaml
+++ b/.maestro/sync_tests/03_recover_account.yaml
@@ -19,20 +19,39 @@ tags:
 - tapOn:
     id: searchEntry
 - inputText: ${CODE}
+
+- evalScript: ${output.counter = 0}
 - repeat:
     while:
-      notVisible: "Select All"
+      true: ${output.counter < 3}
+      notVisible: Select All
     commands:
-      - tapOn:
-            id: searchEntry
-- tapOn: Select All
+      - longPressOn: 
+          id: "searchEntry"
+      - evalScript: ${output.counter = output.counter + 1}
+
+- tapOn: 'Select All'
 - tapOn: Cut
-- tapOn:
-    id: searchEntry
-- longPressOn:
-    id: searchEntry
+- evalScript: ${output.counter = 0}
+- repeat:
+    while:
+      true: ${output.counter < 3}
+      notVisible: Paste
+    commands:
+      - tapOn: 
+          id: "searchEntry"
+      - evalScript: ${output.counter = output.counter + 1}
 - tapOn: Paste
 - tapOn: Cancel
+
+- tapOn: Close Tabs and Clear Data
+- tapOn: Close Tabs and Clear Data
+- runFlow:
+    when:
+      visible:
+        text: Cancel
+    commands:
+      - tapOn: Cancel
 #</WORKAROUND>
 
 # Recover Account test
diff --git a/.maestro/sync_tests/04_sync_data.yaml b/.maestro/sync_tests/04_sync_data.yaml
index 329b22bb80..79f2f68cea 100644
--- a/.maestro/sync_tests/04_sync_data.yaml
+++ b/.maestro/sync_tests/04_sync_data.yaml
@@ -56,18 +56,28 @@ tags:
 - tapOn:
     id: searchEntry
 - inputText: ${CODE}
+
+- evalScript: ${output.counter = 0}
 - repeat:
     while:
-      notVisible: "Select All"
+      true: ${output.counter < 3}
+      notVisible: Select All
     commands:
-      - tapOn:
-            id: searchEntry
-- tapOn: Select All
+      - longPressOn: 
+          id: "searchEntry"
+      - evalScript: ${output.counter = output.counter + 1}
+
+- tapOn: 'Select All'
 - tapOn: Cut
-- tapOn:
-    id: searchEntry
-- longPressOn:
-    id: searchEntry
+- evalScript: ${output.counter = 0}
+- repeat:
+    while:
+      true: ${output.counter < 3}
+      notVisible: Paste
+    commands:
+      - tapOn: 
+          id: "searchEntry"
+      - evalScript: ${output.counter = output.counter + 1}
 - tapOn: Paste
 - tapOn: Cancel
 
@@ -76,7 +86,7 @@ tags:
 - runFlow:
     when:
       visible:
-        text: "Cancel"
+        text: Cancel
     commands:
       - tapOn: Cancel
 #</WORKAROUND>
@@ -119,8 +129,22 @@ tags:
 - assertVisible: NFL.com | Official Site of the National Football League
 - assertVisible: AS.com - Diario online deportivo. Fútbol, motor y mucho más
 - tapOn: Bookmarks
+
+# Only expect local favorites when Share Favorites is off
 - tapOn: Favorites
 - assertVisible: DuckDuckGo — Privacy, simplified.
+
+# Enable Share Favorites and expect all favorites
+- tapOn: Done
+- tapOn: Settings
+- tapOn: Sync & Back Up
+- scroll
+- assertVisible: Share Favorites
+- tapOn: "0"
+- tapOn: Settings
+- tapOn: Done
+- tapOn: Bookmarks
+- tapOn: Favorites
 - assertVisible: NFL.com | Official Site of the National Football League
 - assertVisible: DuckDuckGo · GitHub
 - assertVisible: Stack Overflow - Where Developers Learn, Share, & Build Careers

From ceaa553a9c45afd007d2eaa9422f2a5fe5fb0e06 Mon Sep 17 00:00:00 2001
From: Christopher Brind <brindy@duckduckgo.com>
Date: Fri, 24 Nov 2023 16:01:23 +0000
Subject: [PATCH 17/40] bump bsk for CBR energy usage  (#2195)

Task/Issue URL: https://app.asana.com/0/414235014887631/1206018890798709/f
---
 DuckDuckGo.xcodeproj/project.pbxproj                        | 2 +-
 .../xcshareddata/swiftpm/Package.resolved                   | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index eb4194b496..f43086ae8c 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9143,7 +9143,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 85.0.0;
+				version = 85.0.2;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 4ecab7d302..f9c0196d58 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "5b84e6d0cd9b28b1a324538c98156576015981a1",
-          "version": "85.0.0"
+          "revision": "88935a6656c7f0bd9dec75a761463347232f68a1",
+          "version": "85.0.2"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",

From 91ba87bfcd5fb1b5013caca8f1a9cf890b9d6c70 Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Fri, 24 Nov 2023 17:54:38 +0100
Subject: [PATCH 18/40] NetP VPN locations screen (#2183)

---
 DuckDuckGo.xcodeproj/project.pbxproj          |   8 +
 ...orkProtectionConvenienceInitialisers.swift |  10 +-
 DuckDuckGo/NetworkProtectionStatusView.swift  |  12 +-
 .../NetworkProtectionStatusViewModel.swift    |   8 +-
 .../NetworkProtectionVPNLocationView.swift    | 194 ++++--
 ...etworkProtectionVPNLocationViewModel.swift | 159 +++++
 DuckDuckGo/UserText.swift                     |   7 +-
 DuckDuckGo/en.lproj/Localizable.strings       |   6 +
 ...etworkProtectionStatusViewModelTests.swift |   6 +
 ...kProtectionVPNLocationViewModelTests.swift | 639 ++++++++++++++++++
 10 files changed, 993 insertions(+), 56 deletions(-)
 create mode 100644 DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
 create mode 100644 DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index f43086ae8c..b851f0ca1e 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -786,6 +786,8 @@
 		EE9D68DA2AE1659F00B55EF4 /* NetworkProtectionVPNNotificationsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9D68D92AE1659F00B55EF4 /* NetworkProtectionVPNNotificationsViewModel.swift */; };
 		EE9D68DC2AE16AE100B55EF4 /* NotificationsAuthorizationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9D68DB2AE16AE100B55EF4 /* NotificationsAuthorizationController.swift */; };
 		EE9D68DE2AE2A65600B55EF4 /* UserDefaults+NetworkProtection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9D68DD2AE2A65600B55EF4 /* UserDefaults+NetworkProtection.swift */; };
+		EEC02C142B0519DE0045CE11 /* NetworkProtectionVPNLocationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEC02C132B0519DE0045CE11 /* NetworkProtectionVPNLocationViewModel.swift */; };
+		EEC02C162B065BE00045CE11 /* NetworkProtectionVPNLocationViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEC02C152B065BE00045CE11 /* NetworkProtectionVPNLocationViewModelTests.swift */; };
 		EEDFE2DA2AC6ED4F00F0E19C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = EEDFE2DC2AC6ED4F00F0E19C /* Localizable.strings */; };
 		EEEB80A32A421CE600386378 /* NetworkProtectionPacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEEB80A22A421CE600386378 /* NetworkProtectionPacketTunnelProvider.swift */; };
 		EEF0F8CC2ABC832300630031 /* NetworkProtectionDebugFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEF0F8CB2ABC832200630031 /* NetworkProtectionDebugFeatures.swift */; };
@@ -2396,6 +2398,8 @@
 		EE9D68DB2AE16AE100B55EF4 /* NotificationsAuthorizationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsAuthorizationController.swift; sourceTree = "<group>"; };
 		EE9D68DD2AE2A65600B55EF4 /* UserDefaults+NetworkProtection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+NetworkProtection.swift"; sourceTree = "<group>"; };
 		EEB8FDB92A990AEE00EBEDCF /* Configuration-Alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Configuration-Alpha.xcconfig"; path = "Configuration/Configuration-Alpha.xcconfig"; sourceTree = "<group>"; };
+		EEC02C132B0519DE0045CE11 /* NetworkProtectionVPNLocationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionVPNLocationViewModel.swift; sourceTree = "<group>"; };
+		EEC02C152B065BE00045CE11 /* NetworkProtectionVPNLocationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionVPNLocationViewModelTests.swift; sourceTree = "<group>"; };
 		EEDFE2DB2AC6ED4F00F0E19C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		EEDFE2DD2AC6ED5B00F0E19C /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
 		EEDFE2DE2AC6ED5F00F0E19C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -4456,6 +4460,7 @@
 			isa = PBXGroup;
 			children = (
 				EE01EB422AFC1E0A0096AAC9 /* NetworkProtectionVPNLocationView.swift */,
+				EEC02C132B0519DE0045CE11 /* NetworkProtectionVPNLocationViewModel.swift */,
 			);
 			name = PreferredLocation;
 			sourceTree = "<group>";
@@ -4501,6 +4506,7 @@
 				EEFE9C722A603CE9005B0A26 /* NetworkProtectionStatusViewModelTests.swift */,
 				EE0153EA2A6FF970002A8B26 /* NetworkProtectionRootViewModelTests.swift */,
 				EE41BD182A729E9C00546C57 /* NetworkProtectionInviteViewModelTests.swift */,
+				EEC02C152B065BE00045CE11 /* NetworkProtectionVPNLocationViewModelTests.swift */,
 			);
 			name = NetworkProtection;
 			sourceTree = "<group>";
@@ -6395,6 +6401,7 @@
 				989B337522D7EF2100437824 /* EmptyCollectionReusableView.swift in Sources */,
 				8524CC94246C5C8900E59D45 /* DaxDialogViewController.swift in Sources */,
 				F42EF9312614BABE00101FB9 /* ActionSheetDaxDialogViewController.swift in Sources */,
+				EEC02C142B0519DE0045CE11 /* NetworkProtectionVPNLocationViewModel.swift in Sources */,
 				F13B4BC01F180D8A00814661 /* TabsModel.swift in Sources */,
 				02025B0C29884D2C00E694E7 /* AppTrackerData.swift in Sources */,
 				85AE6690209724120014CF04 /* NotificationView.swift in Sources */,
@@ -6647,6 +6654,7 @@
 				026F08B829B7DC480079B9DF /* EmbeddedAppTPDataTests.swift in Sources */,
 				851CD674244D7E6000331B98 /* UserDefaultsExtension.swift in Sources */,
 				850559D223CF710C0055C0D5 /* WebCacheManagerTests.swift in Sources */,
+				EEC02C162B065BE00045CE11 /* NetworkProtectionVPNLocationViewModelTests.swift in Sources */,
 				987130C5294AAB9F00AB05E0 /* BookmarkEditorViewModelTests.swift in Sources */,
 				8341D807212D5E8D000514C2 /* HashExtensionTest.swift in Sources */,
 				C1D21E2F293A599C006E5A05 /* AutofillLoginSessionTests.swift in Sources */,
diff --git a/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift b/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift
index 8cddce00d9..2557f2f1d3 100644
--- a/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift
+++ b/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift
@@ -81,13 +81,19 @@ extension NetworkProtectionVPNSettingsViewModel {
     }
 }
 
-extension NetworkProtectionVPNLocationViewModel {
+extension NetworkProtectionLocationListCompositeRepository {
     convenience init() {
         let tunnelSettings = TunnelSettings(defaults: .networkProtectionGroupDefaults)
-        let locationListRepository = NetworkProtectionLocationListCompositeRepository(
+        self.init(
             environment: tunnelSettings.selectedEnvironment,
             tokenStore: NetworkProtectionKeychainTokenStore()
         )
+    }
+}
+
+extension NetworkProtectionVPNLocationViewModel {
+    convenience init() {
+        let locationListRepository = NetworkProtectionLocationListCompositeRepository()
         self.init(
             locationListRepository: locationListRepository,
             tunnelSettings: TunnelSettings(defaults: .networkProtectionGroupDefaults)
diff --git a/DuckDuckGo/NetworkProtectionStatusView.swift b/DuckDuckGo/NetworkProtectionStatusView.swift
index de8c854726..93c335afdb 100644
--- a/DuckDuckGo/NetworkProtectionStatusView.swift
+++ b/DuckDuckGo/NetworkProtectionStatusView.swift
@@ -113,11 +113,13 @@ struct NetworkProtectionStatusView: View {
     private func connectionDetails() -> some View {
         Section {
             if let location = statusModel.location {
-                NetworkProtectionServerItemView(
-                    imageID: "Server-Location-24",
-                    title: UserText.netPStatusViewLocation,
-                    value: location
-                )
+                NavigationLink(destination: NetworkProtectionVPNLocationView()) {
+                    NetworkProtectionServerItemView(
+                        imageID: "Server-Location-24",
+                        title: UserText.netPStatusViewLocation,
+                        value: location
+                    )
+                }
             }
             if let ipAddress = statusModel.ipAddress {
                 NetworkProtectionServerItemView(
diff --git a/DuckDuckGo/NetworkProtectionStatusViewModel.swift b/DuckDuckGo/NetworkProtectionStatusViewModel.swift
index 6d6a817072..0a9af7e667 100644
--- a/DuckDuckGo/NetworkProtectionStatusViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionStatusViewModel.swift
@@ -71,7 +71,8 @@ final class NetworkProtectionStatusViewModel: ObservableObject {
     public init(tunnelController: TunnelController = NetworkProtectionTunnelController(),
                 statusObserver: ConnectionStatusObserver = ConnectionStatusObserverThroughSession(),
                 serverInfoObserver: ConnectionServerInfoObserver = ConnectionServerInfoObserverThroughSession(),
-                errorObserver: ConnectionErrorObserver = ConnectionErrorObserverThroughSession()) {
+                errorObserver: ConnectionErrorObserver = ConnectionErrorObserverThroughSession(),
+                locationListRepository: NetworkProtectionLocationListRepository = NetworkProtectionLocationListCompositeRepository()) {
         self.tunnelController = tunnelController
         self.statusObserver = statusObserver
         self.serverInfoObserver = serverInfoObserver
@@ -85,6 +86,11 @@ final class NetworkProtectionStatusViewModel: ObservableObject {
         setUpStatusMessagePublishers()
         setUpDisableTogglePublisher()
         setUpServerInfoPublishers()
+
+        // Prefetching this now for snappy load times on the locations screens
+        Task {
+            _ = try? await locationListRepository.fetchLocationList()
+        }
     }
 
     private func setUpIsConnectedStatePublishers() {
diff --git a/DuckDuckGo/NetworkProtectionVPNLocationView.swift b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
index b9d2a337fd..dc673400e3 100644
--- a/DuckDuckGo/NetworkProtectionVPNLocationView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
@@ -28,73 +28,173 @@ struct NetworkProtectionVPNLocationView: View {
 
     var body: some View {
         List {
-            Text("⚠️ FEATURE IS WORK IN PROGRESS ⚠️")
-            Section {
-                Button(action: model.onNearestItemSelection) {
-                    Text(UserText.netPPreferredLocationNearest)
-                }
-            }
-            Section {
-                ForEach(model.countryItems) { item in
-                    Button(action: {
-                        model.onCountryItemSelection(countryID: item.countryID)
-                    }, label: {
-                        Text(item.localizedName)
-                    })
-                }
-            }
+            nearest(isSelected: model.isNearestSelected)
+            countries()
         }
-        .animation(.default, value: model.countryItems.isEmpty)
         .applyInsetGroupedListStyle()
-        .navigationTitle("VPN Location").onAppear {
+        .animation(.default, value: model.state.isLoading)
+        .navigationTitle(UserText.netPVPNLocationTitle)
+        .onAppear {
             Task {
                 await model.onViewAppeared()
             }
         }
     }
-}
-
-import NetworkProtection
 
-final class NetworkProtectionVPNLocationViewModel: ObservableObject {
-    private let locationListRepository: NetworkProtectionLocationListRepository
-    private let tunnelSettings: TunnelSettings
-    @Published public var countryItems: [NetworkProtectionVPNCountryItemModel] = []
-
-    init(locationListRepository: NetworkProtectionLocationListRepository, tunnelSettings: TunnelSettings) {
-        self.locationListRepository = locationListRepository
-        self.tunnelSettings = tunnelSettings
+    @ViewBuilder
+    private func nearest(isSelected: Bool) -> some View {
+        Section {
+            ChecklistItem(
+                isSelected: isSelected,
+                action: {
+                    Task {
+                        await model.onNearestItemSelection()
+                    }
+                }, label: {
+                    Text(UserText.netPPreferredLocationNearest)
+                        .foregroundStyle(Color.textPrimary)
+                        .font(.system(size: 16))
+                }
+            )
+        } header: {
+            Text(UserText.netPVPNLocationRecommendedSectionTitle)
+                .foregroundStyle(Color.textPrimary)
+        } footer: {
+            Text(UserText.netPVPNLocationRecommendedSectionFooter)
+                .foregroundStyle(Color.textSecondary)
+                .font(.system(size: 13))
+                .padding(.top, 6)
+        }
     }
 
-    @MainActor
-    func onViewAppeared() async {
-        guard let list = try? await locationListRepository.fetchLocationList() else { return }
-        self.countryItems = list.map(NetworkProtectionVPNCountryItemModel.init(netPLocation:))
+    @ViewBuilder
+    private func countries() -> some View {
+        Section {
+            switch model.state {
+            case .loading:
+                EmptyView()
+                .listRowBackground(Color.clear)
+            case .loaded(let countryItems):
+                ForEach(countryItems) { item in
+                    CountryItem(itemModel: item) {
+                        Task {
+                            await model.onCountryItemSelection(id: item.id)
+                        }
+                    } cityPickerAction: { cityId in
+                        Task {
+                            await model.onCountryItemSelection(id: item.id, cityId: cityId)
+                        }
+                    }
+                }
+            }
+        } header: {
+            Text(UserText.netPVPNLocationAllCountriesSectionTitle)
+                .foregroundStyle(Color.textPrimary)
+        }
+        .animation(.default, value: model.state.isLoading)
     }
+}
+
+@available(iOS 15, *)
+private struct CountryItem: View {
+    let itemModel: NetworkProtectionVPNCountryItemModel
+    let action: () -> Void
+    let cityPickerAction: (String?) -> Void
 
-    func onNearestItemSelection() {
-        tunnelSettings.selectedLocation = .nearest
+    init(itemModel: NetworkProtectionVPNCountryItemModel, action: @escaping () -> Void, cityPickerAction: @escaping (String?) -> Void) {
+        self.itemModel = itemModel
+        self.action = action
+        self.cityPickerAction = cityPickerAction
     }
 
-    func onCountryItemSelection(countryID: String) {
-        let location = NetworkProtectionSelectedLocation(country: countryID)
-        tunnelSettings.selectedLocation = .location(location)
+    var body: some View {
+        ChecklistItem(
+            isSelected: itemModel.isSelected,
+            action: action,
+            label: {
+                Text(itemModel.emoji)
+                VStack(alignment: .leading, spacing: 4) {
+                    Text(itemModel.title)
+                        .font(.system(size: 16))
+                        .foregroundStyle(Color.textPrimary)
+                    if let subtitle = itemModel.subtitle {
+                        Text(subtitle)
+                            .font(.system(size: 13))
+                            .foregroundStyle(Color.textSecondary)
+                    }
+                }
+                if itemModel.shouldShowPicker {
+                    Spacer()
+                    Menu {
+                        ForEach(itemModel.cityPickerItems) { cityItem in
+                            MenuItem(isSelected: cityItem.isSelected, title: cityItem.name) {
+                                cityPickerAction(cityItem.id)
+                            }
+                        }
+                    } label: {
+                        Image(systemName: "ellipsis.circle")
+                            .resizable()
+                            .frame(width: 22, height: 22)
+                    }
+                }
+            }
+        )
     }
 }
 
-struct NetworkProtectionVPNCountryItemModel: Identifiable {
-    let countryID: String
-    let localizedName: String
-    let cities: [String]
-    var id: String {
-        "\(countryID) - \(cities.count) cities"
+@available(iOS 15, *)
+private struct ChecklistItem<Content>: View where Content: View {
+    let isSelected: Bool
+    let action: () -> Void
+    @ViewBuilder let label: () -> Content
+
+    var body: some View {
+        Button(
+            action: action,
+            label: {
+                HStack(spacing: 12) {
+                    Image(systemName: "checkmark")
+                        .tint(.controlColor)
+                        .if(!isSelected) {
+                            $0.hidden()
+                        }
+                    label()
+                }
+            }
+        )
+        .tint(Color(designSystemColor: .textPrimary))
+        .listRowInsets(EdgeInsets(top: 14, leading: 16, bottom: 14, trailing: 16))
     }
+}
+
+@available(iOS 15, *)
+private struct MenuItem: View {
+    let isSelected: Bool
+    let title: String
+    let action: () -> Void
 
-    init(netPLocation: NetworkProtectionLocation) {
-        self.countryID = netPLocation.country
-        self.localizedName = Locale.current.localizedString(forRegionCode: countryID) ?? countryID
-        self.cities = netPLocation.cities.map(\.name)
+    var body: some View {
+        Button(
+            action: action,
+            label: {
+                HStack(spacing: 12) {
+                    Text(title)
+                    Spacer()
+                    Image(systemName: "checkmark")
+                        .if(!isSelected) {
+                            $0.hidden()
+                        }
+                }
+            }
+        )
+        .tint(Color(designSystemColor: .textPrimary))
     }
 }
 
+private extension Color {
+    static let textPrimary = Color(designSystemColor: .textPrimary)
+    static let textSecondary = Color(designSystemColor: .textSecondary)
+    static let controlColor = Color(designSystemColor: .accent)
+}
+
 #endif
diff --git a/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift b/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
new file mode 100644
index 0000000000..c67feabce2
--- /dev/null
+++ b/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
@@ -0,0 +1,159 @@
+//
+//  NetworkProtectionVPNLocationViewModel.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import Foundation
+import Combine
+import NetworkProtection
+
+final class NetworkProtectionVPNLocationViewModel: ObservableObject {
+    private let locationListRepository: NetworkProtectionLocationListRepository
+    private let tunnelSettings: TunnelSettings
+    @Published public var state: LoadingState
+    @Published public var isNearestSelected: Bool
+
+    enum LoadingState {
+        case loading
+        case loaded(countryItems: [NetworkProtectionVPNCountryItemModel])
+
+        var isLoading: Bool {
+            switch self {
+            case .loading:
+                return true
+            case .loaded:
+                return false
+            }
+        }
+    }
+
+    init(locationListRepository: NetworkProtectionLocationListRepository, tunnelSettings: TunnelSettings) {
+        self.locationListRepository = locationListRepository
+        self.tunnelSettings = tunnelSettings
+        state = .loading
+        self.isNearestSelected = tunnelSettings.selectedLocation == .nearest
+    }
+
+    func onViewAppeared() async {
+        await reloadList()
+    }
+
+    func onNearestItemSelection() async {
+        tunnelSettings.selectedLocation = .nearest
+        await reloadList()
+    }
+
+    func onCountryItemSelection(id: String, cityId: String? = nil) async {
+        let location = NetworkProtectionSelectedLocation(country: id, city: cityId)
+        tunnelSettings.selectedLocation = .location(location)
+        await reloadList()
+    }
+    
+    @MainActor
+    private func reloadList() async {
+        guard let list = try? await locationListRepository.fetchLocationList() else { return }
+        let selectedLocation = self.tunnelSettings.selectedLocation
+        let isNearestSelected = selectedLocation == .nearest
+
+        let countryItems = list.map { currentLocation in
+            let isCountrySelected: Bool
+            let isNearestCitySelected: Bool
+            var cityPickerItems: [CityItem]
+
+            switch selectedLocation {
+            case .location(let location):
+                isCountrySelected = location.country == currentLocation.country
+                isNearestCitySelected = location.city == nil && isCountrySelected
+                cityPickerItems = currentLocation.cities.map { currentCity in
+                    let isCitySelected = currentCity.name == location.city
+                    return CityItem(city: currentCity, isSelected: isCitySelected)
+                }
+            case .nearest:
+                isCountrySelected = false
+                isNearestCitySelected = false
+                cityPickerItems = currentLocation.cities.map { currentCity in
+                    CityItem(city: currentCity, isSelected: false)
+                }
+            }
+
+            let nearestItem = CityItem(
+                city: nil,
+                isSelected: isNearestCitySelected
+            )
+            cityPickerItems.insert(nearestItem, at: 0)
+
+            return NetworkProtectionVPNCountryItemModel(
+                netPLocation: currentLocation,
+                isSelected: isCountrySelected,
+                cityPickerItems: cityPickerItems
+            )
+        }
+        self.isNearestSelected = isNearestSelected
+        state = .loaded(countryItems: countryItems)
+    }
+}
+
+private typealias CountryItem = NetworkProtectionVPNCountryItemModel
+private typealias CityItem = NetworkProtectionVPNCityItemModel
+
+struct NetworkProtectionVPNCountryItemModel: Identifiable {
+    let isSelected: Bool
+    var id: String
+    let emoji: String
+    let title: String
+    let subtitle: String?
+    let cityPickerItems: [NetworkProtectionVPNCityItemModel]
+    let shouldShowPicker: Bool
+
+    fileprivate init(netPLocation: NetworkProtectionLocation, isSelected: Bool, cityPickerItems: [NetworkProtectionVPNCityItemModel]) {
+        self.isSelected = isSelected
+        self.id = netPLocation.country
+        self.title = Locale.current.localizedString(forRegionCode: id) ?? id
+        let hasMultipleCities = netPLocation.cities.count > 1
+        self.subtitle = hasMultipleCities ? UserText.netPVPNLocationCountryItemFormattedCitiesCount(netPLocation.cities.count) : nil
+        self.cityPickerItems = cityPickerItems
+        self.emoji = Self.flag(country: netPLocation.country)
+        self.shouldShowPicker = hasMultipleCities
+    }
+
+    static func flag(country: String) -> String {
+        let flagBase = UnicodeScalar("🇦").value - UnicodeScalar("A").value
+
+        let flag = country
+            .uppercased()
+            .unicodeScalars
+            .compactMap({ UnicodeScalar(flagBase + $0.value)?.description })
+            .joined()
+        return flag
+    }
+}
+
+struct NetworkProtectionVPNCityItemModel: Identifiable {
+    let id: String?
+    let name: String
+    let isSelected: Bool
+
+    fileprivate init(city: NetworkProtectionLocation.City?, isSelected: Bool) {
+        self.id = city?.name
+        self.name = city?.name ?? UserText.netPPreferredLocationNearest
+        self.isSelected = isSelected
+    }
+}
+
+#endif
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 08452d8e89..836fd5538a 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -651,10 +651,15 @@ In addition to the details entered into this form, your app issue report will co
     static let netPStatusViewErrorConnectionFailedMessage = NSLocalizedString("network.protection.status.view.error.connection.failed.message", value: "Please try again later.", comment: "Generic connection failed error message shown in NetworkProtection's status view.")
     static let netPPreferredLocationSettingTitle = NSLocalizedString("network.protection.vpn.preferred.location.title", value: "Preferred Location", comment: "Title for the Preferred Location VPN Settings item.")
     static let netPPreferredLocationNearest = NSLocalizedString("network.protection.vpn.preferred.location.nearest", value: "Nearest Available", comment: "Label for the Preferred Location VPN Settings item when the nearest available location is selected.")
+    static let netPVPNLocationTitle = NSLocalizedString("network.protection.vpn.location.title", value: "VPN Location", comment: "Title for the VPN Location screen.")
     static let netPVPNLocationRecommendedSectionTitle = NSLocalizedString("network.protection.vpn.location.recommended.section.title", value: "Recommended", comment: "Title for the VPN Location screen's Recommended section.")
+    static let netPVPNLocationRecommendedSectionFooter = NSLocalizedString("network.protection.vpn.location.recommended.section.footer", value: "Automatically connect to the nearest server we can find", comment: "Footer describing the VPN Location screen's Recommended section which just has Nearest Available.")
     static let netPVPNLocationAllCountriesSectionTitle = NSLocalizedString("network.protection.vpn.location.all.countries.section.title", value: "All Countries", comment: "Title for the VPN Location screen's All Countries section.")
     static let netPVPNLocationNearestAvailableItemTitle = NSLocalizedString("network.protection.vpn.location.nearest.available.item.title", value: "Nearest Available", comment: "Title for the VPN Location screen's Nearest Available selection item.")
-    static let netPVPNLocationRecommendedSectionFooter = NSLocalizedString("network.protection.vpn.location.recommended.section.footer", value: "Automatically connect to the nearest server we can find", comment: "Footer describing the VPN Location screen's Recommended section which just has Nearest Available.")
+    static func netPVPNLocationCountryItemFormattedCitiesCount(_ count: Int) -> String {
+        let message = NSLocalizedString("network.protection.vpn.location.country.item.formatted.cities.count", value: "%d cities", comment: "Subtitle of countries item when there are multiple cities, example : ")
+        return message.format(arguments: count)
+    }
     static let netPAlwaysOnSettingTitle = NSLocalizedString("network.protection.vpn.always.on.setting.title", value: "Always On", comment: "Title for the Always on VPN setting item.")
     static let netPAlwaysOnSettingFooter = NSLocalizedString("network.protection.vpn.always.on.setting.footer", value: "Automatically restore a VPN connection after interruption.", comment: "Footer text for the Always on VPN setting item.")
     static let netPSecureDNSSettingTitle = NSLocalizedString("network.protection.vpn.secure.dns.setting.title", value: "Secure DNS", comment: "Title for the Always on VPN setting item.")
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index 14489e1a91..222c2d7150 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -1528,6 +1528,9 @@ https://duckduckgo.com/mac";
 /* Title for the VPN Location screen's All Countries section. */
 "network.protection.vpn.location.all.countries.section.title" = "All Countries";
 
+/* Subtitle of countries item when there are multiple cities, example :  */
+"network.protection.vpn.location.country.item.formatted.cities.count" = "%d cities";
+
 /* Title for the VPN Location screen's Nearest Available selection item. */
 "network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
 
@@ -1537,6 +1540,9 @@ https://duckduckgo.com/mac";
 /* Title for the VPN Location screen's Recommended section. */
 "network.protection.vpn.location.recommended.section.title" = "Recommended";
 
+/* Title for the VPN Location screen. */
+"network.protection.vpn.location.title" = "VPN Location";
+
 /* Title for the VPN Notifications management screen. */
 "network.protection.vpn.notifications.title" = "VPN Notifications";
 
diff --git a/DuckDuckGoTests/NetworkProtectionStatusViewModelTests.swift b/DuckDuckGoTests/NetworkProtectionStatusViewModelTests.swift
index 18cb7e3ee4..4858680264 100644
--- a/DuckDuckGoTests/NetworkProtectionStatusViewModelTests.swift
+++ b/DuckDuckGoTests/NetworkProtectionStatusViewModelTests.swift
@@ -54,6 +54,12 @@ final class NetworkProtectionStatusViewModelTests: XCTestCase {
         super.tearDown()
     }
 
+    func testInit_prefetchesLocationList() throws {
+        let locationListRepo = MockNetworkProtectionLocationListRepository()
+        viewModel = NetworkProtectionStatusViewModel(locationListRepository: locationListRepo)
+        waitFor(condition: locationListRepo.didCallFetchLocationList)
+    }
+
     func testStatusUpdate_connected_setsIsNetPEnabledToTrue() throws {
         whenStatusUpdate_connected()
     }
diff --git a/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift b/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift
new file mode 100644
index 0000000000..8bfdafd4db
--- /dev/null
+++ b/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift
@@ -0,0 +1,639 @@
+//
+//  NetworkProtectionVPNLocationViewModelTests.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import XCTest
+import NetworkProtection
+import NetworkExtension
+import NetworkProtectionTestUtils
+@testable import DuckDuckGo
+
+// swiftlint:disable type_body_length
+// swiftlint:disable file_length
+
+final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
+    private var listRepository: MockNetworkProtectionLocationListRepository!
+    private var tunnelSettings: TunnelSettings!
+    private var viewModel: NetworkProtectionVPNLocationViewModel!
+
+    @MainActor
+    override func setUp() {
+        super.setUp()
+        listRepository = MockNetworkProtectionLocationListRepository()
+        let testDefaults = UserDefaults(suiteName: #file + Thread.current.debugDescription)!
+        tunnelSettings = TunnelSettings(defaults: testDefaults)
+        viewModel = NetworkProtectionVPNLocationViewModel(locationListRepository: listRepository, tunnelSettings: tunnelSettings)
+    }
+
+    override func tearDown() {
+        tunnelSettings.selectedLocation = .nearest
+        tunnelSettings = nil
+        listRepository = nil
+        viewModel = nil
+        super.tearDown()
+    }
+
+    // MARK: onViewAppeared
+
+    func test_onViewAppeared_setsCorrectCountryTitle() async throws {
+        try await assertOnListLoadSetsCorrectCountryTitle { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_setsCountryID() async throws {
+        try await assertOnListLoadSetsCorrectCountryID { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_setsCorrectEmoji() async throws {
+        try await assertOnListLoadSetsCorrectEmoji { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_selectedCountryFromSettings_isSelectedSetToTrue() async throws {
+        try await assertOnListLoad_countryIsSelected { [weak self] testCaseCountryId in
+            self?.tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: testCaseCountryId))
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_NOTSelectedCountryFromSettings_isSelectedSetToFalse() async throws {
+        try await assertOnListLoad_isSelectedSetToFalse { [weak self] in
+            self?.tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: "US"))
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_nearestSelectedInSettings_isNearestSelectedSetToTrue() async throws {
+        try await assertNearestSelectedSetToTrue { [weak self] in
+            self?.tunnelSettings.selectedLocation = .nearest
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_nearestNOTSelectedInSettings_isNearestSelectedSetToFalse() async throws {
+        try await assertNearestSelectedSetToFalse { [weak self] testCaseCountryId in
+            self?.tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: testCaseCountryId))
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_countryHas1City_subtitleIsNil() async throws {
+        try await assertOnListLoad_countryWith1City_hasNilSubtitle { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_countryHas1City_shouldShowPickerIsFalse() async throws {
+        try await assertOnListLoad_countryWith1City_shouldShowPickerIsFalse { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_countryHasMoreThan1City_shouldShowPickerIsTrue() async throws {
+        try await assertOnListLoad_countryHasMoreThan1City_shouldShowPickerIsTrue { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_countryHasMoreThan1City_subtitleShowsCityCount() async throws {
+        try await assertOnListLoad_countryHasMoreThan1City_subtitleShowsCityCount { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_showsCityTitles() async throws {
+        try await assertOnListLoad_showsCityTitles { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_cityIsSelected_itemIsSelected() async throws {
+        try await assertOnListLoad_itemIsSelected { [weak self] testCase in
+            self?.tunnelSettings.selectedLocation = .location(testCase)
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onViewAppeared_cityIsNOTSelected_itemIsNOTSelected() async throws {
+        let countries: [NetworkProtectionLocation] = [
+            try .testData(country: "NL", cityNames: ["Rotterdam", "Amsterdam"]),
+            try .testData(country: "DE", cityNames: ["Berlin", "Frankfurt", "Bremen"])
+        ]
+
+        listRepository.stubLocationList = countries
+        tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: "US", city: "New York"))
+        await viewModel.onViewAppeared()
+        let selectedItems = try loadedItems().flatMap { $0.cityPickerItems }.filter(\.isSelected)
+        XCTAssertEqual(selectedItems.count, 0)
+    }
+
+    func test_onViewAppeared_countryWithoutCityIsSelected_nearestItemIsSelected() async throws {
+        try await assertOnListLoad_nearestItemIsSelected { [weak self] testCase in
+            self?.tunnelSettings.selectedLocation = .location(testCase)
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    // MARK: onNearestItemSelection
+
+    func test_onNearestItemSelection_setsCorrectCountryTitle() async throws {
+        try await assertOnListLoadSetsCorrectCountryTitle { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_setsCountryID() async throws {
+        try await assertOnListLoadSetsCorrectCountryID { [weak self] in
+            await self?.viewModel.onViewAppeared()
+        }
+    }
+
+    func test_onNearestItemSelection_setsCorrectEmoji() async throws {
+        try await assertOnListLoadSetsCorrectEmoji { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_isNearestSelectedSetToTrue() async throws {
+        try await assertNearestSelectedSetToTrue { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_countryHas1City_subtitleIsNil() async throws {
+        try await assertOnListLoad_countryWith1City_hasNilSubtitle { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_countryHas1City_shouldShowPickerIsFalse() async throws {
+        try await assertOnListLoad_countryWith1City_shouldShowPickerIsFalse { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_countryHasMoreThan1City_shouldShowPickerIsTrue() async throws {
+        try await assertOnListLoad_countryHasMoreThan1City_shouldShowPickerIsTrue { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_countryHasMoreThan1City_subtitleShowsCityCount() async throws {
+        try await assertOnListLoad_countryHasMoreThan1City_subtitleShowsCityCount { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    func test_onNearestItemSelection_showsCityTitles() async throws {
+        try await assertOnListLoad_showsCityTitles { [weak self] in
+            await self?.viewModel.onNearestItemSelection()
+        }
+    }
+
+    // MARK: onCountryItemSelection
+
+    func test_onCountryItemSelection_setsCorrectCountryTitle() async throws {
+        try await assertOnListLoadSetsCorrectCountryTitle { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_setsCountryID() async throws {
+        try await assertOnListLoadSetsCorrectCountryID { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_setsCorrectEmoji() async throws {
+        try await assertOnListLoadSetsCorrectEmoji { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_selectedCountryFromSettings_isSelectedSetToTrue() async throws {
+        try await assertOnListLoad_countryIsSelected { [weak self] testCaseCountryId in
+            await self?.viewModel.onCountryItemSelection(id: testCaseCountryId)
+        }
+    }
+
+    func test_onCountryItemSelection_NOTSelectedCountry_isSelectedSetToFalse() async throws {
+        try await assertOnListLoad_isSelectedSetToFalse { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "US")
+        }
+    }
+
+    func test_onCountryItemSelection_isNearestSelectedSetToFalse() async throws {
+        try await assertNearestSelectedSetToFalse { [weak self] testCaseCountryId in
+            await self?.viewModel.onCountryItemSelection(id: testCaseCountryId)
+        }
+    }
+
+    func test_onCountryItemSelection_countryHas1City_subtitleIsNil() async throws {
+        try await assertOnListLoad_countryWith1City_hasNilSubtitle { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_countryHas1City_shouldShowPickerIsFalse() async throws {
+        try await assertOnListLoad_countryWith1City_shouldShowPickerIsFalse { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_countryHasMoreThan1City_shouldShowPickerIsTrue() async throws {
+        try await assertOnListLoad_countryHasMoreThan1City_shouldShowPickerIsTrue { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_countryHasMoreThan1City_subtitleShowsCityCount() async throws {
+        try await assertOnListLoad_countryHasMoreThan1City_subtitleShowsCityCount { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_showsCityTitles() async throws {
+        try await assertOnListLoad_showsCityTitles { [weak self] in
+            await self?.viewModel.onCountryItemSelection(id: "NL", cityId: "Rotterdam")
+        }
+    }
+
+    func test_onCountryItemSelection_cityIsSelected_itemIsSelected() async throws {
+        try await assertOnListLoad_itemIsSelected { [weak self] testCase in
+            await self?.viewModel.onCountryItemSelection(id: testCase.country, cityId: testCase.city)
+        }
+    }
+
+    func test_onCountryItemSelection_countryWithoutCityIsSelected_nearestItemIsSelected() async throws {
+        try await assertOnListLoad_nearestItemIsSelected { [weak self] testCase in
+            await self?.viewModel.onCountryItemSelection(id: testCase.country, cityId: testCase.city)
+        }
+    }
+
+    // MARK: Assertions
+
+    func assertOnListLoadSetsCorrectCountryTitle(when functionUnderTest: () async -> Void,
+                                                 file: StaticString = #file,
+                                                 line: UInt = #line) async throws {
+        let titlesForLocationsIDs = [
+            "NL": "Netherlands",
+            "DE": "Germany",
+            "SE": "Sweden"
+        ]
+        let countryIds = Array(titlesForLocationsIDs.keys)
+        try stubLocationList(with: countryIds)
+
+        await functionUnderTest()
+
+        let items = try loadedItems()
+
+        for i in 0..<countryIds.count {
+            XCTAssertEqual(items[i].title, titlesForLocationsIDs[countryIds[i]], file: file, line: line)
+        }
+    }
+
+    func assertOnListLoadSetsCorrectCountryID(when functionUnderTest: () async -> Void,
+                                              file: StaticString = #file,
+                                              line: UInt = #line) async throws {
+        let iDsForLocationsIDs = [
+            "NL": "NL",
+            "DE": "DE",
+            "SE": "SE"
+        ]
+        let countryIds = Array(iDsForLocationsIDs.keys)
+        try stubLocationList(with: countryIds)
+
+        await functionUnderTest()
+
+        let items = try loadedItems()
+
+        for i in 0..<countryIds.count {
+            XCTAssertEqual(items[i].id, iDsForLocationsIDs[countryIds[i]], file: file, line: line)
+        }
+    }
+
+    func assertOnListLoadSetsCorrectEmoji(when functionUnderTest: () async -> Void,
+                                          file: StaticString = #file,
+                                          line: UInt = #line) async throws {
+        let emojisForLocationsIDs = [
+            "NL": "🇳🇱",
+            "DE": "🇩🇪",
+            "SE": "🇸🇪"
+        ]
+        let countryIds = Array(emojisForLocationsIDs.keys)
+        try stubLocationList(with: countryIds)
+
+        await functionUnderTest()
+
+        let items = try loadedItems()
+
+        for i in 0..<countryIds.count {
+            XCTAssertEqual(items[i].emoji, emojisForLocationsIDs[countryIds[i]], file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_countryIsSelected(when functionUnderTestWithTestCaseID: (String) async -> Void,
+                                            file: StaticString = #file,
+                                            line: UInt = #line) async throws {
+        let countryIds = ["NL", "DE", "SE"]
+        try stubLocationList(with: countryIds)
+
+        for i in 0..<countryIds.count {
+            await functionUnderTestWithTestCaseID(countryIds[i])
+
+            let items = try loadedItems()
+
+            XCTAssertTrue(items[i].isSelected, file: file, line: line)
+        }
+    }
+
+    func assertNearestSelectedSetToTrue(when functionUnderTest: () async -> Void,
+                                        file: StaticString = #file,
+                                        line: UInt = #line) async throws {
+        try stubLocationList(with: ["NL", "DE", "SE"])
+
+        await functionUnderTest()
+
+        XCTAssertTrue(viewModel.isNearestSelected, file: file, line: line)
+    }
+
+    func assertNearestSelectedSetToFalse(when functionUnderTestWithTestCaseID: (String) async -> Void,
+                                         file: StaticString = #file,
+                                         line: UInt = #line) async throws {
+        let countryIds = ["NL", "DE", "SE"]
+        try stubLocationList(with: countryIds)
+
+        for i in 0..<countryIds.count {
+            await functionUnderTestWithTestCaseID(countryIds[i])
+
+            XCTAssertFalse(viewModel.isNearestSelected, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_countryWith1City_hasNilSubtitle(when functionUnderTest: () async -> Void,
+                                                          file: StaticString = #file,
+                                                          line: UInt = #line) async throws {
+        let countryIds = ["NL", "DE", "SE"]
+        let countries: [NetworkProtectionLocation] = try countryIds.map { id in
+            try .testData(country: id, cityNames: ["A city"])
+        }
+        listRepository.stubLocationList = countries
+
+        await functionUnderTest()
+
+        let items = try loadedItems()
+
+        for i in 0..<countryIds.count {
+            XCTAssertNil(items[i].subtitle, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_countryWith1City_shouldShowPickerIsFalse(when functionUnderTest: () async -> Void,
+                                                                   file: StaticString = #file,
+                                                                   line: UInt = #line) async throws {
+        let countryIds = ["NL", "DE", "SE"]
+        let countries: [NetworkProtectionLocation] = try countryIds.map { id in
+            try .testData(country: id, cityNames: ["A city"])
+        }
+        listRepository.stubLocationList = countries
+        await functionUnderTest()
+        let items = try loadedItems()
+
+        for i in 0..<countryIds.count {
+            XCTAssertFalse(items[i].shouldShowPicker, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_countryHasMoreThan1City_shouldShowPickerIsTrue(when functionUnderTest: () async -> Void,
+                                                                         file: StaticString = #file,
+                                                                         line: UInt = #line) async throws {
+        let countryIds = ["NL", "DE", "SE"]
+        var countries = [NetworkProtectionLocation]()
+
+        for i in 0..<countryIds.count {
+            var cities = [String]()
+            // Add an increasing number of cities above 2
+            for j in 0..<i+2 {
+                cities.append("City \(j)")
+            }
+            let country = try NetworkProtectionLocation.testData(country: countryIds[i], cityNames: cities)
+            countries.append(country)
+        }
+
+        listRepository.stubLocationList = countries
+        await functionUnderTest()
+        let items = try loadedItems()
+
+        for i in 0..<countryIds.count {
+            XCTAssertTrue(items[i].shouldShowPicker, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_countryHasMoreThan1City_subtitleShowsCityCount(when functionUnderTest: () async -> Void,
+                                                                         file: StaticString = #file,
+                                                                         line: UInt = #line) async throws {
+        struct TestCase {
+            let countryId: String
+            let citiesCount: Int
+            let expectedSubtitle: String
+        }
+        let testCases: [TestCase] = [
+            .init(countryId: "NL", citiesCount: 2, expectedSubtitle: "2 cities"),
+            .init(countryId: "DE", citiesCount: 3, expectedSubtitle: "3 cities"),
+            .init(countryId: "SE", citiesCount: 14, expectedSubtitle: "14 cities")
+        ]
+        let countries: [NetworkProtectionLocation] = try testCases.map { testCase in
+            var cities = [String]()
+            for i in 0..<testCase.citiesCount {
+                cities.append("City \(i)")
+            }
+            return try .testData(country: testCase.countryId, cityNames: cities)
+        }
+
+        listRepository.stubLocationList = countries
+
+        await functionUnderTest()
+
+        let items = try loadedItems()
+
+        for i in 0..<testCases.count {
+            XCTAssertEqual(items[i].subtitle, testCases[i].expectedSubtitle, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_isSelectedSetToFalse(when functionUnderTest: () async -> Void,
+                                               file: StaticString = #file,
+                                               line: UInt = #line) async throws {
+        let countryIds = ["NL", "DE", "SE"]
+        let countries: [NetworkProtectionLocation] = try countryIds.map { id in
+            try .testData(country: id)
+        }
+        listRepository.stubLocationList = countries
+
+        await functionUnderTest()
+
+        for i in 0..<countryIds.count {
+            let items = try loadedItems()
+
+            XCTAssertFalse(items[i].isSelected, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_showsCityTitles(when functionUnderTest: () async -> Void,
+                                          file: StaticString = #file,
+                                          line: UInt = #line) async throws {
+        struct TestCase {
+            let countryId: String
+            let cityTitles: [String]
+        }
+        let testCases: [TestCase] = [
+            .init(countryId: "NL", cityTitles: ["Rotterdam", "Amsterdam"]),
+            .init(countryId: "DE", cityTitles: ["Berlin", "Frankfurt", "Bremen"])
+        ]
+        let countries: [NetworkProtectionLocation] = try testCases.map { testCase in
+            return try .testData(country: testCase.countryId, cityNames: testCase.cityTitles)
+        }
+        listRepository.stubLocationList = countries
+
+        await functionUnderTest()
+
+        let items = try loadedItems()
+
+        for testCaseIndex in 0..<testCases.count {
+            let testCase = testCases[testCaseIndex]
+            let countryItem = items[testCaseIndex]
+            for cityIndex in 0..<testCase.cityTitles.count {
+                // First cityPickerItem title is always nearest
+                XCTAssertEqual(testCase.cityTitles[cityIndex], countryItem.cityPickerItems[cityIndex+1].name, file: file, line: line)
+            }
+        }
+    }
+
+    func assertOnListLoad_itemIsSelected(when functionUnderTestWithTestCase: (NetworkProtectionSelectedLocation) async -> Void,
+                                         file: StaticString = #file,
+                                         line: UInt = #line) async throws {
+        let countries: [NetworkProtectionLocation] = [
+            try .testData(country: "NL", cityNames: ["Rotterdam", "Amsterdam"]),
+            try .testData(country: "DE", cityNames: ["Berlin", "Frankfurt", "Bremen"])
+        ]
+
+        let selectionTestCases: [NetworkProtectionSelectedLocation] = [
+            .init(country: "NL", city: "Amsterdam"),
+            .init(country: "DE", city: "Frankfurt")
+        ]
+
+        listRepository.stubLocationList = countries
+
+        for testCase in selectionTestCases {
+            await functionUnderTestWithTestCase(testCase)
+            let selectedItems = try loadedItems().flatMap { $0.cityPickerItems }.filter(\.isSelected)
+            XCTAssertEqual(selectedItems.count, 1, file: file, line: line)
+            XCTAssertEqual(selectedItems.first?.id, testCase.city, file: file, line: line)
+        }
+    }
+
+    func assertOnListLoad_nearestItemIsSelected(when functionUnderTestWithTestCase: (NetworkProtectionSelectedLocation) async -> Void,
+                                                file: StaticString = #file,
+                                                line: UInt = #line) async throws {
+        let countries: [NetworkProtectionLocation] = [
+            try .testData(country: "NL", cityNames: ["Rotterdam", "Amsterdam"]),
+            try .testData(country: "DE", cityNames: ["Berlin", "Frankfurt", "Bremen"]),
+            try .testData(country: "SE", cityNames: ["Stockholm", "Malmö", "Helsingborg"])
+        ]
+
+        let selectionTestCases: [NetworkProtectionSelectedLocation] = [
+            .init(country: "NL"),
+            .init(country: "SE")
+        ]
+
+        listRepository.stubLocationList = countries
+
+        for testCase in selectionTestCases {
+            await functionUnderTestWithTestCase(testCase)
+            let selectedItems = try loadedItems().flatMap { $0.cityPickerItems }.filter(\.isSelected)
+            XCTAssertEqual(selectedItems.count, 1, file: file, line: line)
+            XCTAssertNil(selectedItems.first?.id, file: file, line: line)
+            XCTAssertEqual(
+                selectedItems.first?.name,
+                UserText.netPVPNLocationNearestAvailableItemTitle,
+                file: file,
+                line: line
+            )
+        }
+    }
+
+    // MARK: Helpers
+
+    private func stubLocationList(with countryIDs: [String]) throws {
+        let countries: [NetworkProtectionLocation] = try countryIDs.map { id in
+            try .testData(country: id)
+        }
+        listRepository.stubLocationList = countries
+    }
+
+    private func loadedItems() throws -> [NetworkProtectionVPNCountryItemModel] {
+        guard case .loaded(let items) = viewModel.state else {
+            throw TestError.notLoadedState
+        }
+        return items
+    }
+
+    private enum TestError: Error {
+        case notLoadedState
+    }
+}
+
+// swiftlint:enable type_body_length
+
+final class MockNetworkProtectionLocationListRepository: NetworkProtectionLocationListRepository {
+    var stubLocationList: [NetworkProtectionLocation] = []
+    var stubError: Error?
+    var didCallFetchLocationList: Bool = false
+
+    func fetchLocationList() async throws -> [NetworkProtectionLocation] {
+        didCallFetchLocationList = true
+        if let stubError {
+            throw stubError
+        }
+        return stubLocationList
+    }
+}
+
+extension NetworkProtectionLocation {
+    static func testData(country: String = "", cityNames: [String] = []) throws -> Self {
+        let cities = cityNames.map { ["name": $0] }
+        let dict: [String: Encodable] = ["country": country, "cities": cities]
+        let wrappedDict = dict.mapValues(EncodableWrapper.init(wrapped:))
+        let data = try JSONEncoder().encode(wrappedDict)
+        return try JSONDecoder().decode(Self.self, from: data)
+    }
+}
+
+struct EncodableWrapper: Encodable {
+    let wrapped: Encodable
+
+    func encode(to encoder: Encoder) throws {
+        try self.wrapped.encode(to: encoder)
+    }
+}
+
+// swiftlint:enable file_length

From e705831ea0e1cc0ff69efb1cf45794207c377102 Mon Sep 17 00:00:00 2001
From: Sam Symons <sam@samsymons.com>
Date: Fri, 24 Nov 2023 21:08:41 -0800
Subject: [PATCH 19/40] NetP waitlist (#2160)

Task/Issue URL: https://app.asana.com/0/0/1205955597252314/f
Tech Design URL:
CC:

Description:

This PR adds the iOS NetP waitlist.
---
 Core/FeatureFlag.swift                        |   4 +-
 Core/UserDefaultsPropertyWrapper.swift        |   1 +
 DuckDuckGo.xcodeproj/project.pbxproj          |  48 +++
 DuckDuckGo/AppDelegate+Waitlists.swift        |  97 +++++
 DuckDuckGo/AppDelegate.swift                  |  32 +-
 .../VPN Waitlist/Card-16.imageset/Card-16.pdf | Bin 0 -> 3961 bytes
 .../Card-16.imageset/Contents.json            |  15 +
 .../Waitlist/VPN Waitlist/Contents.json       |   6 +
 .../InvitedVPNWaitlist.imageset/Contents.json |  12 +
 .../InvitedVPNWaitlist.imageset/Gift-96.pdf   | Bin 0 -> 9684 bytes
 .../JoinVPNWaitlist.imageset/Contents.json    |  12 +
 .../Network-Protection-VPN-96.pdf             | Bin 0 -> 15349 bytes
 .../JoinedVPNWaitlist.imageset/Contents.json  |  12 +
 .../JoinedVPNWaitlist.imageset/Success-96.pdf | Bin 0 -> 13451 bytes
 .../Rocket-16.imageset/Contents.json          |  15 +
 .../Rocket-16.imageset/Rocket-16.pdf          | Bin 0 -> 4812 bytes
 .../Shield-16.imageset/Contents.json          |  15 +
 .../Shield-16.imageset/Shield-16.pdf          | Bin 0 -> 2579 bytes
 .../VPN-Ended.imageset/Contents.json          |  12 +
 .../VPN-Ended.imageset/VPN-Ended.pdf          | Bin 0 -> 11455 bytes
 DuckDuckGo/Debug.storyboard                   | 115 +++++-
 DuckDuckGo/Info.plist                         |   1 +
 DuckDuckGo/MacBrowserWaitlist.swift           |   2 +-
 .../NetworkProtectionAccessController.swift   | 125 ++++++
 ...orkProtectionTermsAndConditionsStore.swift |  32 ++
 .../NetworkProtectionTunnelController.swift   |   4 +
 DuckDuckGo/SettingsViewController.swift       |  47 ++-
 DuckDuckGo/UserText.swift                     |  47 ++-
 DuckDuckGo/VPNWaitlist.swift                  | 118 ++++++
 .../VPNWaitlistDebugViewController.swift      | 199 +++++++++
 ...listTermsAndConditionsViewController.swift |  73 ++++
 DuckDuckGo/VPNWaitlistUserText.swift          |  67 +++
 DuckDuckGo/VPNWaitlistView.swift              | 387 ++++++++++++++++++
 DuckDuckGo/VPNWaitlistViewController.swift    | 153 +++++++
 DuckDuckGo/WaitlistViews.swift                |  12 +-
 DuckDuckGo/WindowsBrowserWaitlist.swift       |   2 +-
 DuckDuckGo/en.lproj/Localizable.strings       |  92 ++++-
 ...tworkProtectionAccessControllerTests.swift | 183 +++++++++
 .../WindowsBrowserWaitlistTests.swift         |   1 -
 .../Network/ProductWaitlistRequest.swift      |   2 +-
 .../Waitlist/Views/RoundedButtonStyle.swift   |  34 +-
 .../Waitlist/Sources/Waitlist/Waitlist.swift  |   4 +-
 .../Sources/WaitlistMocks/TestWaitlist.swift  |   2 +-
 43 files changed, 1920 insertions(+), 63 deletions(-)
 create mode 100644 DuckDuckGo/AppDelegate+Waitlists.swift
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Card-16.pdf
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Gift-96.pdf
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Network-Protection-VPN-96.pdf
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Success-96.pdf
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Rocket-16.pdf
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Shield-16.pdf
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json
 create mode 100644 DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/VPN-Ended.pdf
 create mode 100644 DuckDuckGo/NetworkProtectionAccessController.swift
 create mode 100644 DuckDuckGo/NetworkProtectionTermsAndConditionsStore.swift
 create mode 100644 DuckDuckGo/VPNWaitlist.swift
 create mode 100644 DuckDuckGo/VPNWaitlistDebugViewController.swift
 create mode 100644 DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift
 create mode 100644 DuckDuckGo/VPNWaitlistUserText.swift
 create mode 100644 DuckDuckGo/VPNWaitlistView.swift
 create mode 100644 DuckDuckGo/VPNWaitlistViewController.swift
 create mode 100644 DuckDuckGoTests/NetworkProtectionAccessControllerTests.swift

diff --git a/Core/FeatureFlag.swift b/Core/FeatureFlag.swift
index c31da129d1..2f0819907d 100644
--- a/Core/FeatureFlag.swift
+++ b/Core/FeatureFlag.swift
@@ -32,12 +32,14 @@ public enum FeatureFlag: String {
     case incontextSignup
     case appTrackingProtection
     case networkProtection
+    case networkProtectionWaitlistAccess
+    case networkProtectionWaitlistActive
 }
 
 extension FeatureFlag: FeatureFlagSourceProviding {
     public var source: FeatureFlagSource {
         switch self {
-        case .debugMenu, .sync, .appTrackingProtection, .networkProtection:
+        case .debugMenu, .sync, .appTrackingProtection, .networkProtection, .networkProtectionWaitlistAccess, .networkProtectionWaitlistActive:
             return .internalOnly
         case .autofillCredentialInjecting:
             return .remoteReleasable(.subfeature(AutofillSubfeature.credentialsAutofill))
diff --git a/Core/UserDefaultsPropertyWrapper.swift b/Core/UserDefaultsPropertyWrapper.swift
index 47c17546f9..d675ee1bfa 100644
--- a/Core/UserDefaultsPropertyWrapper.swift
+++ b/Core/UserDefaultsPropertyWrapper.swift
@@ -103,6 +103,7 @@ public struct UserDefaultsWrapper<T> {
         case syncCredentialsPausedErrorDisplayed = "com.duckduckgo.ios.sync-credentialsPausedErrorDisplayed"
 
         case networkProtectionDebugOptionAlwaysOnDisabled = "com.duckduckgo.network-protection.always-on.disabled"
+        case networkProtectionWaitlistTermsAndConditionsAccepted = "com.duckduckgo.ios.vpn.terms-and-conditions-accepted"
 
         case addressBarPosition = "com.duckduckgo.ios.addressbarposition"
         case showFullSiteAddress = "com.duckduckgo.ios.showfullsiteaddress"
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index b851f0ca1e..72d2198df7 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -296,8 +296,18 @@
 		4B948E2629DCCDB9002531FA /* Persistence in Frameworks */ = {isa = PBXBuildFile; productRef = 4B948E2529DCCDB9002531FA /* Persistence */; };
 		4BB7CBB02AF59C310014A35F /* VPNWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */; };
 		4BBBBA872B02E85400D965DA /* DesignResourcesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 4BBBBA862B02E85400D965DA /* DesignResourcesKit */; };
+		4BBBBA8D2B031B4200D965DA /* VPNWaitlistDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBBBA892B031B4200D965DA /* VPNWaitlistDebugViewController.swift */; };
+		4BBBBA8E2B031B4200D965DA /* VPNWaitlistViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBBBA8A2B031B4200D965DA /* VPNWaitlistViewController.swift */; };
+		4BBBBA8F2B031B4200D965DA /* VPNWaitlistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBBBA8B2B031B4200D965DA /* VPNWaitlistView.swift */; };
+		4BBBBA902B031B4200D965DA /* VPNWaitlist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBBBA8C2B031B4200D965DA /* VPNWaitlist.swift */; };
+		4BBBBA922B03291700D965DA /* VPNWaitlistUserText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBBBA912B03291700D965DA /* VPNWaitlistUserText.swift */; };
 		4BC21A2F27238B7500229F0E /* RunLoopExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC21A2C272388BD00229F0E /* RunLoopExtensionTests.swift */; };
 		4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */; };
+		4BCD14632B05AF2B000B1E4C /* NetworkProtectionAccessController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCD14622B05AF2B000B1E4C /* NetworkProtectionAccessController.swift */; };
+		4BCD14672B05B682000B1E4C /* NetworkProtectionTermsAndConditionsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCD14662B05B682000B1E4C /* NetworkProtectionTermsAndConditionsStore.swift */; };
+		4BCD14692B05BDD5000B1E4C /* AppDelegate+Waitlists.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCD14682B05BDD5000B1E4C /* AppDelegate+Waitlists.swift */; };
+		4BCD146B2B05C4B5000B1E4C /* VPNWaitlistTermsAndConditionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCD146A2B05C4B5000B1E4C /* VPNWaitlistTermsAndConditionsViewController.swift */; };
+		4BCD146D2B05DB09000B1E4C /* NetworkProtectionAccessControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCD146C2B05DB09000B1E4C /* NetworkProtectionAccessControllerTests.swift */; };
 		4BE2756827304F57006B20B0 /* URLRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE27566272F878F006B20B0 /* URLRequestExtension.swift */; };
 		4BEF65692989C2FC00B650CB /* AdapterSocketEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D307A2989C0C400918636 /* AdapterSocketEvent.swift */; };
 		4BEF656A2989C2FC00B650CB /* ProxyServerEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D307C2989C0C600918636 /* ProxyServerEvent.swift */; };
@@ -1318,8 +1328,18 @@
 		4B83397229AFB8D2003F7EA9 /* AppTrackingProtectionFeedbackModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionFeedbackModel.swift; sourceTree = "<group>"; };
 		4B83397429AFBCE6003F7EA9 /* AppTrackingProtectionFeedbackModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionFeedbackModelTests.swift; sourceTree = "<group>"; };
 		4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNWidget.swift; sourceTree = "<group>"; };
+		4BBBBA892B031B4200D965DA /* VPNWaitlistDebugViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNWaitlistDebugViewController.swift; sourceTree = "<group>"; };
+		4BBBBA8A2B031B4200D965DA /* VPNWaitlistViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNWaitlistViewController.swift; sourceTree = "<group>"; };
+		4BBBBA8B2B031B4200D965DA /* VPNWaitlistView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNWaitlistView.swift; sourceTree = "<group>"; };
+		4BBBBA8C2B031B4200D965DA /* VPNWaitlist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNWaitlist.swift; sourceTree = "<group>"; };
+		4BBBBA912B03291700D965DA /* VPNWaitlistUserText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNWaitlistUserText.swift; sourceTree = "<group>"; };
 		4BC21A2C272388BD00229F0E /* RunLoopExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunLoopExtensionTests.swift; sourceTree = "<group>"; };
 		4BC6DD1B2A60E6AD001EC129 /* ReportBrokenSiteView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportBrokenSiteView.swift; sourceTree = "<group>"; };
+		4BCD14622B05AF2B000B1E4C /* NetworkProtectionAccessController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionAccessController.swift; sourceTree = "<group>"; };
+		4BCD14662B05B682000B1E4C /* NetworkProtectionTermsAndConditionsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionTermsAndConditionsStore.swift; sourceTree = "<group>"; };
+		4BCD14682B05BDD5000B1E4C /* AppDelegate+Waitlists.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Waitlists.swift"; sourceTree = "<group>"; };
+		4BCD146A2B05C4B5000B1E4C /* VPNWaitlistTermsAndConditionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNWaitlistTermsAndConditionsViewController.swift; sourceTree = "<group>"; };
+		4BCD146C2B05DB09000B1E4C /* NetworkProtectionAccessControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionAccessControllerTests.swift; sourceTree = "<group>"; };
 		4BE27566272F878F006B20B0 /* URLRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = URLRequestExtension.swift; path = ../DuckDuckGo/URLRequestExtension.swift; sourceTree = "<group>"; };
 		4BFB911A29B7D9530014D4B7 /* AppTrackingProtectionStoringModelPerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionStoringModelPerformanceTests.swift; sourceTree = "<group>"; };
 		56244C1C2A137B1900EDF259 /* WaitlistViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistViews.swift; sourceTree = "<group>"; };
@@ -3441,6 +3461,7 @@
 				56244C1C2A137B1900EDF259 /* WaitlistViews.swift */,
 				37FCAAA0299117F9000E420A /* MacBrowser */,
 				37FCAAA129911801000E420A /* WindowsBrowser */,
+				4BBBBA882B031B3300D965DA /* VPN */,
 				8524AAAB2A3888FE00EEC6D2 /* Waitlist.xcassets */,
 			);
 			name = Waitlist;
@@ -3466,6 +3487,18 @@
 			name = AppTrackingProtection;
 			sourceTree = "<group>";
 		};
+		4BBBBA882B031B3300D965DA /* VPN */ = {
+			isa = PBXGroup;
+			children = (
+				4BBBBA8C2B031B4200D965DA /* VPNWaitlist.swift */,
+				4BBBBA892B031B4200D965DA /* VPNWaitlistDebugViewController.swift */,
+				4BBBBA8B2B031B4200D965DA /* VPNWaitlistView.swift */,
+				4BBBBA8A2B031B4200D965DA /* VPNWaitlistViewController.swift */,
+				4BCD146A2B05C4B5000B1E4C /* VPNWaitlistTermsAndConditionsViewController.swift */,
+			);
+			name = VPN;
+			sourceTree = "<group>";
+		};
 		830FA79B1F8E81FB00FCE105 /* ContentBlocker */ = {
 			isa = PBXGroup;
 			children = (
@@ -4442,6 +4475,8 @@
 				EE0153E02A6EABE0002A8B26 /* NetworkProtectionConvenienceInitialisers.swift */,
 				EE458D0C2AB1DA4600FC651A /* EventMapping+NetworkProtectionError.swift */,
 				EE9D68DB2AE16AE100B55EF4 /* NotificationsAuthorizationController.swift */,
+				4BCD14622B05AF2B000B1E4C /* NetworkProtectionAccessController.swift */,
+				4BCD14662B05B682000B1E4C /* NetworkProtectionTermsAndConditionsStore.swift */,
 			);
 			name = Helpers;
 			sourceTree = "<group>";
@@ -4506,6 +4541,7 @@
 				EEFE9C722A603CE9005B0A26 /* NetworkProtectionStatusViewModelTests.swift */,
 				EE0153EA2A6FF970002A8B26 /* NetworkProtectionRootViewModelTests.swift */,
 				EE41BD182A729E9C00546C57 /* NetworkProtectionInviteViewModelTests.swift */,
+				4BCD146C2B05DB09000B1E4C /* NetworkProtectionAccessControllerTests.swift */,
 				EEC02C152B065BE00045CE11 /* NetworkProtectionVPNLocationViewModelTests.swift */,
 			);
 			name = NetworkProtection;
@@ -5107,6 +5143,7 @@
 				CB24F70E29A3EB15006DCC58 /* AppConfigurationURLProvider.swift */,
 				84E341951E2F7EFB00BDBA6F /* AppDelegate.swift */,
 				85DB12EC2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift */,
+				4BCD14682B05BDD5000B1E4C /* AppDelegate+Waitlists.swift */,
 				98B31291218CCB8C00E54DE1 /* AppDependencyProvider.swift */,
 				85BA58591F3506AE00C6E8CA /* AppSettings.swift */,
 				85BA58541F34F49E00C6E8CA /* AppUserDefaults.swift */,
@@ -5221,6 +5258,7 @@
 				F143C32C1E4A9A4800CFDE3A /* UIViewControllerExtension.swift */,
 				F1DE78591E5CD2A70058895A /* UIViewExtension.swift */,
 				F1F5337B1F26A9EF00D80D4F /* UserText.swift */,
+				4BBBBA912B03291700D965DA /* VPNWaitlistUserText.swift */,
 				986DA94924884B18004A7E39 /* WebViewTransition.swift */,
 				EE9D68D72AE15AD600B55EF4 /* UIApplicationExtension.swift */,
 			);
@@ -6224,6 +6262,7 @@
 				C1CDA3162AFB9C7F006D1476 /* AutofillNeverPromptWebsitesManager.swift in Sources */,
 				F1CA3C371F045878005FADB3 /* PrivacyStore.swift in Sources */,
 				37FCAAC029930E26000E420A /* FailedAssertionView.swift in Sources */,
+				4BBBBA922B03291700D965DA /* VPNWaitlistUserText.swift in Sources */,
 				F4E1936625AF722F001D2666 /* HighlightCutOutView.swift in Sources */,
 				1E162605296840D80004127F /* Triangle.swift in Sources */,
 				B609D5522862EAFF0088CAC2 /* InlineWKDownloadDelegate.swift in Sources */,
@@ -6247,6 +6286,7 @@
 				B652DF12287C336E00C12A9C /* ContentBlockingUpdating.swift in Sources */,
 				314C92BA27C3E7CB0042EC96 /* QuickLookContainerViewController.swift in Sources */,
 				855D914D2063EF6A00C4B448 /* TabSwitcherTransition.swift in Sources */,
+				4BBBBA8F2B031B4200D965DA /* VPNWaitlistView.swift in Sources */,
 				CB258D1229A4F24900DEBA24 /* ConfigurationManager.swift in Sources */,
 				8546A54A2A672959003929BF /* MainViewController+Email.swift in Sources */,
 				F4F6DFB226E6AEC100ED7E12 /* AddOrEditBookmarkViewController.swift in Sources */,
@@ -6315,6 +6355,7 @@
 				85DFEDED24C7CCA500973FE7 /* AppWidthObserver.swift in Sources */,
 				4B6484F327FD1E350050A7A1 /* MenuControllerView.swift in Sources */,
 				1EE7C299294227EC0026C8CB /* AutoconsentSettingsViewController.swift in Sources */,
+				4BCD14632B05AF2B000B1E4C /* NetworkProtectionAccessController.swift in Sources */,
 				1E8AD1D527C2E22900ABA377 /* DownloadsListSectionViewModel.swift in Sources */,
 				4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */,
 				31584616281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift in Sources */,
@@ -6380,6 +6421,7 @@
 				02341FA62A4379CC008A1531 /* OnboardingStepViewModel.swift in Sources */,
 				850365F323DE087800D0F787 /* UIImageViewExtension.swift in Sources */,
 				373608922ABB430D00629E7F /* FavoritesDisplayMode+UserDefaults.swift in Sources */,
+				4BBBBA8D2B031B4200D965DA /* VPNWaitlistDebugViewController.swift in Sources */,
 				C160544129D6044D00B715A1 /* AutofillInterfaceUsernameTruncator.swift in Sources */,
 				02A54A9A2A094A17000C8FED /* AppTPHomeView.swift in Sources */,
 				31C70B5528045E3500FB6AD1 /* SecureVaultErrorReporter.swift in Sources */,
@@ -6407,6 +6449,7 @@
 				85AE6690209724120014CF04 /* NotificationView.swift in Sources */,
 				1EA51376286596A000493C6A /* PrivacyIconLogic.swift in Sources */,
 				980891A92238504B00313A70 /* UILabelExtension.swift in Sources */,
+				4BCD146B2B05C4B5000B1E4C /* VPNWaitlistTermsAndConditionsViewController.swift in Sources */,
 				984D035A24ACCC7D0066CFB8 /* TabViewCell.swift in Sources */,
 				31951E8E2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift in Sources */,
 				F194FAED1F14E2B3009B4DF8 /* UIFontExtension.swift in Sources */,
@@ -6438,6 +6481,7 @@
 				C17B595A2A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift in Sources */,
 				8531A08E1F9950E6000484F0 /* UnprotectedSitesViewController.swift in Sources */,
 				CBD4F13C279EBF4A00B20FD7 /* HomeMessage.swift in Sources */,
+				4BBBBA8E2B031B4200D965DA /* VPNWaitlistViewController.swift in Sources */,
 				3132FA2C27A07A1B00DD7A12 /* FilePreview.swift in Sources */,
 				85C861E628FF1B5F00189466 /* HomeViewSectionRenderersExtension.swift in Sources */,
 				F1D477C61F2126CC0031ED49 /* OmniBarState.swift in Sources */,
@@ -6455,6 +6499,7 @@
 				31C70B5B2804C61000FB6AD1 /* SaveAutofillLoginManager.swift in Sources */,
 				85449EFD23FDA71F00512AAF /* KeyboardSettings.swift in Sources */,
 				980891A222369ADB00313A70 /* FeedbackUserText.swift in Sources */,
+				4BCD14692B05BDD5000B1E4C /* AppDelegate+Waitlists.swift in Sources */,
 				988F3DD3237DE8D900AEE34C /* ForgetDataAlert.swift in Sources */,
 				850ABD012AC3961100A733DF /* MainViewController+Segues.swift in Sources */,
 				9817C9C321EF594700884F65 /* AutoClear.swift in Sources */,
@@ -6462,11 +6507,13 @@
 				85EE7F572246685B000FE757 /* WebContainerViewController.swift in Sources */,
 				1EC458462948932500CB2B13 /* UIHostingControllerExtension.swift in Sources */,
 				1E4DCF4E27B6A69600961E25 /* DownloadsListHostingController.swift in Sources */,
+				4BCD14672B05B682000B1E4C /* NetworkProtectionTermsAndConditionsStore.swift in Sources */,
 				020108A129A5610C00644F9D /* AppTPActivityHostingViewController.swift in Sources */,
 				C1F341C92A6926920032057B /* EmailAddressPromptViewController.swift in Sources */,
 				02025B0F29884DC500E694E7 /* AppTrackerDataParser.swift in Sources */,
 				027F48742A4B5904001A1C6C /* AppTPAboutView.swift in Sources */,
 				311BD1B12836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift in Sources */,
+				4BBBBA902B031B4200D965DA /* VPNWaitlist.swift in Sources */,
 				B652DF13287C373A00C12A9C /* ScriptSourceProviding.swift in Sources */,
 				854A012B2A54412600FCC628 /* ActivityViewController.swift in Sources */,
 				F1CA3C391F045885005FADB3 /* PrivacyUserDefaults.swift in Sources */,
@@ -6682,6 +6729,7 @@
 				F1D477C91F2139410031ED49 /* SmallOmniBarStateTests.swift in Sources */,
 				987130C9294AAB9F00AB05E0 /* BookmarkUtilsTests.swift in Sources */,
 				C1BF0BA929B63E2200482B73 /* AutofillLoginPromptViewModelTests.swift in Sources */,
+				4BCD146D2B05DB09000B1E4C /* NetworkProtectionAccessControllerTests.swift in Sources */,
 				EE3B226B29DE0F110082298A /* MockInternalUserStoring.swift in Sources */,
 				987130C8294AAB9F00AB05E0 /* BookmarksTestHelpers.swift in Sources */,
 				F198D7981E3A45D90088DA8A /* WKWebViewConfigurationExtensionTests.swift in Sources */,
diff --git a/DuckDuckGo/AppDelegate+Waitlists.swift b/DuckDuckGo/AppDelegate+Waitlists.swift
new file mode 100644
index 0000000000..83f5a84a24
--- /dev/null
+++ b/DuckDuckGo/AppDelegate+Waitlists.swift
@@ -0,0 +1,97 @@
+//
+//  AppDelegate+Waitlists.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+import BackgroundTasks
+import NetworkProtection
+
+extension AppDelegate {
+
+    func checkWaitlists() {
+        checkWindowsWaitlist()
+
+#if NETWORK_PROTECTION
+        checkNetworkProtectionWaitlist()
+#endif
+        checkWaitlistBackgroundTasks()
+
+    }
+
+    private func checkWindowsWaitlist() {
+        WindowsBrowserWaitlist.shared.fetchInviteCodeIfAvailable { error in
+            guard error == nil else { return }
+            WindowsBrowserWaitlist.shared.sendInviteCodeAvailableNotification()
+        }
+    }
+
+#if NETWORK_PROTECTION
+    private func checkNetworkProtectionWaitlist() {
+        VPNWaitlist.shared.fetchInviteCodeIfAvailable { [weak self] error in
+            guard error == nil else {
+#if !DEBUG
+                // If the user already has an invite code but their auth token has gone missing, attempt to redeem it again.
+                let tokenStore = NetworkProtectionKeychainTokenStore()
+                let waitlistStorage = VPNWaitlist.shared.waitlistStorage
+                if error == .alreadyHasInviteCode,
+                   let inviteCode = waitlistStorage.getWaitlistInviteCode(),
+                   !tokenStore.isFeatureActivated {
+                    self?.fetchVPNWaitlistAuthToken(inviteCode: inviteCode)
+                }
+#endif
+                return
+
+            }
+
+            guard let inviteCode = VPNWaitlist.shared.waitlistStorage.getWaitlistInviteCode() else {
+                return
+            }
+
+            self?.fetchVPNWaitlistAuthToken(inviteCode: inviteCode)
+        }
+    }
+#endif
+
+    private func checkWaitlistBackgroundTasks() {
+        BGTaskScheduler.shared.getPendingTaskRequests { tasks in
+            let hasWindowsBrowserWaitlistTask = tasks.contains { $0.identifier == WindowsBrowserWaitlist.backgroundRefreshTaskIdentifier }
+            if !hasWindowsBrowserWaitlistTask {
+                WindowsBrowserWaitlist.shared.scheduleBackgroundRefreshTask()
+            }
+
+#if NETWORK_PROTECTION
+            let hasVPNWaitlistTask = tasks.contains { $0.identifier == VPNWaitlist.backgroundRefreshTaskIdentifier }
+            if !hasVPNWaitlistTask {
+                VPNWaitlist.shared.scheduleBackgroundRefreshTask()
+            }
+#endif
+        }
+    }
+
+#if NETWORK_PROTECTION
+    func fetchVPNWaitlistAuthToken(inviteCode: String) {
+        Task {
+            do {
+                try await NetworkProtectionCodeRedemptionCoordinator().redeem(inviteCode)
+                VPNWaitlist.shared.sendInviteCodeAvailableNotification()
+            } catch {}
+        }
+    }
+#endif
+
+}
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index 3633513de4..f9671de5dd 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -330,6 +330,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         // Having both in `didBecomeActive` can sometimes cause the exception when running on a physical device, so registration happens here.
         AppConfigurationFetch.registerBackgroundRefreshTaskHandler()
         WindowsBrowserWaitlist.shared.registerBackgroundRefreshTaskHandler()
+
+#if NETWORK_PROTECTION
+        VPNWaitlist.shared.registerBackgroundRefreshTaskHandler()
+#endif
+
         RemoteMessaging.registerBackgroundRefreshTaskHandler(
             bookmarksDatabase: bookmarksDatabase,
             favoritesDisplayMode: AppDependencyProvider.shared.appSettings.favoritesDisplayMode
@@ -349,6 +354,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
 #if NETWORK_PROTECTION
         widgetRefreshModel.beginObservingVPNStatus()
+        NetworkProtectionAccessController().refreshNetworkProtectionAccess()
 #endif
 
         return true
@@ -431,18 +437,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
             }
         }
 
-        WindowsBrowserWaitlist.shared.fetchInviteCodeIfAvailable { error in
-            guard error == nil else { return }
-            WindowsBrowserWaitlist.shared.sendInviteCodeAvailableNotification()
-        }
-
-        BGTaskScheduler.shared.getPendingTaskRequests { tasks in
-            let hasWindowsBrowserWaitlistTask = tasks.contains { $0.identifier == WindowsBrowserWaitlist.backgroundRefreshTaskIdentifier }
-            if !hasWindowsBrowserWaitlistTask {
-                WindowsBrowserWaitlist.shared.scheduleBackgroundRefreshTask()
-            }
-        }
-
+        checkWaitlists()
         syncService.scheduler.notifyAppLifecycleEvent()
         fireFailedCompilationsPixelIfNeeded()
         refreshShortcuts()
@@ -838,7 +833,7 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
                                 withCompletionHandler completionHandler: @escaping () -> Void) {
         if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
             let identifier = response.notification.request.identifier
-            if identifier == WindowsBrowserWaitlist.notificationIdentitier {
+            if identifier == WindowsBrowserWaitlist.notificationIdentifier {
                 presentWindowsBrowserWaitlistSettingsModal()
             }
 
@@ -846,6 +841,10 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
             if NetworkProtectionNotificationIdentifier(rawValue: identifier) != nil {
                 presentNetworkProtectionStatusSettingsModal()
             }
+
+            if identifier == VPNWaitlist.notificationIdentifier {
+                presentNetworkProtectionWaitlistModal()
+            }
 #endif
         }
 
@@ -858,6 +857,13 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
     }
 
 #if NETWORK_PROTECTION
+    private func presentNetworkProtectionWaitlistModal() {
+        if #available(iOS 15, *) {
+            let networkProtectionRoot = VPNWaitlistViewController(nibName: nil, bundle: nil)
+            presentSettings(with: networkProtectionRoot)
+        }
+    }
+
     func presentNetworkProtectionStatusSettingsModal() {
         if #available(iOS 15, *) {
             let networkProtectionRoot = NetworkProtectionRootViewController()
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Card-16.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Card-16.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..ead00161852b20d05c5bb2ff0a1871277fdf914d
GIT binary patch
literal 3961
zcmd^COK;pZ5We$Q@Dd;?U@qSeATW^FiBYscQoDx$K@S^Qah$GK?n*A4{`!7HaVg2(
zBFVWr*xXMu!{Ij%j-I?beSM@vU`%nzyN_QO=g*(>)$d<#TfTb#_T!hf8Gzwg{n~D?
zhR<9>@Vr20yYB9GrjUP+@3PLQcmaF6^|rrV@7itib@BfAxR|=Q`#9uHUw6Bkf}OX0
zceiWWp0=oxFJE@|`~#Ol=4V<czlWyPA20>Ye%Q6^8@4)a|GsY8^Rt)y<YNA->DgaQ
z?bWO4qq?f^>LQBdv`L0HH>`?1Ui8hDIiVf-%C(R-q+t0CGeYa6rJgV?v~}KTj$LWt
z6*t01BVFQ%QA{TJ#2e;?4N|Mfk1Sp*r6b<}4Bn^+Nh`2{OpynnjZdLK@KgeF8i?Dg
zDi3=~3Zs0oYPQRUDJ7KjMrKq=>t*7ECFv!$#zB))!Ek7YWD_tfWYEfuCap5sYp#Ta
zi!$&eT+%lA>AX>R05MKT!-9z3B-p4-1vr;t2(T1Pk~(lNl9x7GAjSq~=?q@DC=Iy?
zDHBYDlvL5{nWe{3XxL|Fh4VN(SVv@)l(0*|i6I#a>cEYLmzrB)684aEOi+jzR(lm`
z5b0pF^JbEQA6mmpAkGJkaCm{ROXq+XrK}obYOGHPj0EczOhL*y9}!zH4F(*Y$U7H3
zc_5{eN#=8h0MzGzXj(!nrV!)^8LyN=*d=zPj3Hyl3Q`ReUspg4yP7gaI|?Pq!8J=s
zWUP*$2Z&CfCu>?0eL%+$(rbk%2jNXD?pq(N0|Fm(%!hOkqC*Celty%*=OQ=>JPHL;
zJV_N&Yf@CCVF|frDUmCd1VWNB%}y(dSrQ&m*F=tT*1&Vpixv)AI*y8PP(v(&bGQWv
z)Fk)-TV`KlB>~9Q(p-*=u+}JRP-6#DWrGa*^b^~%-+s7%zyo8DEc!bdh_ZWsP=Z=U
zkFeda8LEXdAx2b*5h@@(P<dz`s0D;yp_uRl&!M5H2m{!GB}!;CFhXro$O^)g_9$1v
ze2f}z(R#eyYZHB>jV=?xG765;Ik}`jkP&DJxiXQfXaHzjRL7tm?l?36w1S8dO$bnM
zc@L=_inT!pMg1C!qK4ZB&5v@T!~p&~MJ~*sN&~4DIfM%JfgLuC5;#A(A?ScQLbpf>
ztq4ZIJBfj++?V%AW(AG}n-V2k77MTj2Ru?Ar>!8|gb>M5$H4}fvZW*0-hs$b(x8c<
z=5TZnUEIlc0@^IPzyuPh)@y^p28b$6C@$DUm3ffmkl4ANaTOR4h!8t!V=lMh1Dnv^
zI8GSvqeV7NDBVO>Q4Uc)NM~|bWX!Cg;m52_p(<DdFAJ9wxM2u>OcvQTfrwk#dfKEy
zv!GVFSx_sch1G_tzHER~qoXWiT99Q-E12)Md^9BZs0%N_0EM2iHgAA;m6YN~wpYQ4
zzgZ(-?e?<F8(7gy#b{<4hbxUrBY_O#n)tq%3%AGrdFHCcTo>P-xvJ<i3!-Blm=KW)
z6|G8}sjD2qCXF2T-2V@Rox)baZgh=0I@>JjWya1!^n3Jbiu5$=zPcaIE{65c=J&5u
z{&(?a-T#?a<CsoA7en<ldoNe3GfpX2ruXH$N557W+h1&MKd--SdOw;!vOz%kmZ&HB
zFLTGo<FR3EUmt$KRQdkEEif|lT{Ha(oL%*71!_+_+|mc4L<YwwSzout+%*f*i|w`>
zdj5gFCZ;33TVJ&Wc+*~9uYdHrge*;;IFuIq@2Zn-JG5KuNDS=3cl7x*a9lzen(;)?
zcmn!%`{nu)u5voTIp2GH(%nH<J@UT?GP6Y2<IEJDu&+B#CqG#a>rHpH)V<%epBT*$
zY`g~PFULe`90y(=+JGLuEs)Ol`U41`Di5U4s~<rIZFQlD(e|MfjaUz*j6)SH6`cmt
zO9(f9g@)bwdeiP0(fji$$bH&(H|;b2^!oDINb%~t>%cEm#(1qRuK#I?3y|9n>)nvq
OG2Tn|<jJeIum1&fP&vi`

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Contents.json
new file mode 100644
index 0000000000..0030995444
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Card-16.imageset/Contents.json	
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "Card-16.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json
new file mode 100644
index 0000000000..73c00596a7
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Contents.json	
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json
new file mode 100644
index 0000000000..0223097db0
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Contents.json	
@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "Gift-96.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Gift-96.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/InvitedVPNWaitlist.imageset/Gift-96.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..41180d6d4063373a4e87e2a6ae4d3acaefac519f
GIT binary patch
literal 9684
zcmeI2%WfUH5r+5u6umJp6F{xzwMk%LAY*$5K@!BVvm0cg9G~$x&?S*Hfs?1tS0uYg
z=?I9t$;!uo-Ts>_)}2*kzj*ulhcmNm(`4p#zWLkVr+NPFyZQXh=ldVu-(TDx>;FRe
z=WsEvi(Tb6zkJEali&Fp|Ll?W*(2SvN1Er1eECwiKVE+jaVPsg?mrx_Ki>Z`JHU4`
z>hAvbcyTqIzdru!)8Y8;$M5G?@5lcg?xufE=WopX@oqwoMK|kwww^xe%jB0W6dk%;
zo}!r#SJS!#CqGpD_~GtwJ%uIM6q23Y5@oWPuO`2^&3Na*QkLI*31$Ld0?VEmTYK=^
z++GQZGJFLQ0yfQusggD8To>9bwA>PSn<H2fQZmyDbvMUdK({|Aa+vJ06-D$>cJV9&
z4`JCLWWsD0Cmav!$vh*H4SZdKtuo$q?#+@!Fkz-iXqE^N<1Sc6o^|msYD5oBUzcEJ
z$3(Cc(RE>T?Sc(RdnL5mqY6eCKwuLwL@>0h>oviI2j!~@hRrU)8uwK&RH+iSR|%x)
zp%OsvqMN3#x)3%K-FTK>J&TKAU@*9|qk^>u6+&$73OI@%s+Ox@DKxcV3tdm<HNR25
z#7D#kSXQ}L4^#=&PgM_x?$4^POE7UWe7p)~{OCYUFm*F^yu&nLO|a@_R>Tm&(DG^g
z9Hw8UpQr2T&n1HG7euf{OErQ$3g_ur5u6sAZNivg@uGf-;8@rTMk36&2#$+&#F~uD
zV${$cwiR{AD<iLDcoGE_`N$w>Pso}$*M)+3NLVb=dk<Fhmk6U&12FGS?Uy3UIxBJ@
zi>y^Z#R#K_$FER|62eYY3&-%F>xqXL=D~yVB_6WM_<?(rCbUwQu;qu`1S6A4)NL!W
zO3rBdk_eXkQ!o(>qUzQv*nl*_h6q-{*2NLRM#K=o(6X*q1uHx#UsbRY!ODFVj9jJ?
z)>lcAPSZmr5JVo;S6#^047;&(kVI4xtCciYjeaVIB4VFh?W0&&9IjCmB7&*fu!XKC
zKGOU~`4S%yH^Z{Zy?UTZsD7$?I85r#s;^5hakH{fh+q&^2U5WXMC~(RO|a@_Nvtn|
zp=Di9{o!E*yDx}f%@{Tn?|)VRpQeznTkzK{`0EzDlH4?)w6^&2E!ax{YniN>trye!
zE;}uuNm2Zs6~AUNW!vt1Mya~j2--1Smpc5>D<v>&DD+O=Q3F7r4Yzx7pu-iBlCTX|
zOdn2PDFG?}TE(Hu=x}9Nhb!_hL564R*I>N5znJ{|{AkKhdP7}b^cxGMj_J$OS4v>e
zFXiEGv_`2~oMm*lBBe~O!xhs9rKE@wkj+`#sPNvF(c#Ll4p(H<uR5o`eZq0=wy$G0
z$|oBvm4Rr<=CrzumNuI`1s;gwrJtqubBq<{{A?n%&_-uN?P&Ajvq@B99knV)W>*g(
z(-J6TmdxBJwa5rMLlY>iqoDxsIT?dy6=V??&4|S^irTsfD#f16E7i8lTep%B8iofo
zmZf2l8aLZ{1X;{GDbYLFHAkt9|3q2=RjZ|T5jg^@bWn-{6cdr7gJ?T?M=jLWpvFl%
zH_A(gsH^B%<cHdHAU!oTVu+M81M0(WNwH~NWx$jjX!eoHIW#+}BGz@{ng>;Qtd{de
ziP+Tx%_mT3c66(1i?b)pXpM2H?j<fMP4y>2;0Z6g9D1bZIXDG&`OV~z_Ea3)CmdQ1
zH<HV?6s6Rhp3X-c942=M*Glkea;QrjJc#Ixmeq|0Zw+gbUZ7*13H;<d;|UP|)7jYB
z5JpU<f#onEar~ugJQe85few?(Ii^VD_Nf|cw!ETzRfIBISS!)DhXJnK<dTDd76u(0
z!hmhH28k|j=>g>DAA~`w1RsV$-rZNjz^O4c3_4WYtMEl5qXTg-gsNfCQLpwU9ksUu
zrtCnok5tZ~*-;g-trLk>)eo-SIO^EQXZH|jKH*KHBR_Rcr)pJsqx!E?9*ZZtB(99j
zw<IRvfgQ?ol2uZ5lUPoanrS7yw@1Z>B&9Fuly&lx;4r(NTqwUfrF)IOb1KWDsI+C5
zL4>$Jn7ATWk)@9%3%6G7YBI`3w*=m+X!i}!T0O9>j;L%tiJ&tB+9T5ukcQyQLtO8v
zNh-}gQhcJ)=@h#^^|d=j{UzP*N^?GUwDaC6c5Ga`qr*rPFI<ciX_t$|hef0`Iayh4
z*2yU}uG>vIXlEzaRjbQ(NLv2g`P3aGb2V_ZVXV7?nY+0!DeTEH8>g+x7-nshhMZYE
zz^<Gm4CP;UAd1z@DG(c*uH1u4jIy(%jwS)y<>AO&GP|Yh$+Z$DH7R&GfNc|7sRQ~*
zk~jMZ*_Z&U59EkaCnh<mYPM2{#KNXvET=<#94$v>fm8cNq(i!@RFeBRT&)q=A3Dpr
zYKNql>`vQpLar28B7R3vct>^l2dMH%t+{ieGWM0ai1;X$eXJl{q^YV)K47{wv-?Pu
zy;JPG_q97#O6lLU<5=}nb-Eq_`Yve7(W1Im8h%^xG(2g~&p86cn$vVgQPSv_!zPLm
zssRPrU7JgC{<PVUIHy;L(xbgZ=8h_rPH%Xtb2=u$c|u%S=u|qSM26B=Y3Rcf;}!bi
zmL=$>gxJn)e&sp>o$V?(eJK0j;*v?8R)RBs8f=QBE2Q<2!#pZ|1&IUW5=D$*KlM(I
z4kNb=E>e)m?O1kfMsmE6t<TPaar#WZJ!5lfFRpMvsNZN{Hcn309D>Y?$w#RIH>!OO
zR%rmF$mU6o5uL@Kfs_eey1c>VfU#9jkZ>D8S2m2~Ks~y(oNETVS-gsuIY%yRVBBUG
zsNR{&4M|vOipmw6UpW#c8&S;48YFHCUk}4bvc__E6kMPv7KT~VbLG|yCiy7_TCliZ
zDwe}_yHY*Zi3}DEkqjN$f}bT*VN0*V)s&%65*DcclQhgL-H;QS$|=Q=;n<jtGB1vk
zXpW^t8!p-+TC<&~;*mMO*pW6Z1|$L^f3T1gN2%uD(+6=RYEH{oDWoHQQMLdpr`T&A
zFjB#04R<ExEZSoOZYsT{mFK}*<dL3~muP&GmkiIjTn|-5nh6ui$$guLchGox=`sy%
zh4WT+HnA^WO`heobsS6YnMpRokYnZscZ6)<LQ6V?HuEsaTRfIl6`v&Al3F@sxUg}S
zVp0-ynJIT|NZ{Z@qMx2e?kt*2(o!3mL+VkLoG8sHQa!82M299qR1u-|Sg&J=tU;}L
zW0$FTQ8n0LP||%^9SQV*8<bLjkjGKa#0wMi$P98rND!w1q>f*>)Fs>oknkg@Fbb2m
zl}g-mKd?h2fSi(~Co)Y3F$umQ7hjDU2@M62DEg`jiLrP76clT7K|=h_XA0u3Tio!p
zvu$ZhjF7U@L1np9Qx)`875YB~7>*V_sdPRg4Q5*MaxuxRuM3_eCFsUIJqJ~Cl8`(J
zrC@7bu>;a28tDg^>`h!Ul7h#PC1gm1569AxIzwqVt|RTY^*Hdrkp!;|+;U@jGVaDT
z6USlY69q0+$^K`gYmRr}r9^^aF=J`@LPBSgd^{zZB!p6ule?LXFW^`td%`CKi^Dv?
zXh;m1S1_GDXpX|ilUU?RPXdL#g!8O3c7c@Ho$3c69h82t<k?frccaS(D(&l&{ZkeB
zDy4p+gVM8p!9oi<e7W=6>+75QyZNWT*6(x9|MKsD9Ov`57axxe_~Y@zr;G1zKF>d4
zy;jHQL)H_LO>2#v(!1l`&9AqI<J~OZ3cYLOUfo>ZAFo+aKBU>fw->iyGyYMa;d2{-
z`e#PJ|MUS?XOZCDysz`>=2zyL6aMc&21?}5fszP#rwj67QWN~u#r?(Q&BupRKi?jI
zp4NGrs`&EvjGK@}f!j|$eURULy+c%ikDyE<JAvdj_rXN!7J}y?<kvp&{`TV2<?(is
z@2-CL8g+bgcXM_8cK+tmhi|J=&fneK+|MF#QSkZuPyac>efd7=;`Y9XlYO+)ix+SH
H^uvDv9PwaX

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json
new file mode 100644
index 0000000000..e9f9e938f0
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Contents.json	
@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "Network-Protection-VPN-96.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Network-Protection-VPN-96.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinVPNWaitlist.imageset/Network-Protection-VPN-96.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2e31d6e5ae561f6dee47d54a3eec79ec0e4d5458
GIT binary patch
literal 15349
zcmeI(TaTnybq3)3`W1D91d*otJ0B!uDL#Nuf*^J-kWem$cH0aZPn(%`g!Ak3y!-oV
zS9Q;T+Y!o@TgcR`+NX7X*V?;&_WMtN^`bq^heLa8j`x51%i(zZ<u8vn|M~s5cgLGQ
z{O(VGxx0Np^LO*_cW=Ia`17$d@bjJY>$msceS0;b{CoSZ%-JS>VZFC6-@N<w<=eYA
zx8J|_{cnyBZ@;^HME>ZbeTOf;`_n@?%dhU=ezVg)zk7H8-P_x{cV*|#{`T<eFCJb#
z+-?7A%m3ZJJT|AP$=~s#kGB8qvp@d${%^-W`nr7ETt2MRnKTXOPyc0-v%GtFd-w92
z!(R_KpS8!Y-yPcX_jQ#Q^;7+>?@rC!cSCpV)>AjkYd0Qmzd1CgVVIk7weh$NeLMKD
zPDs=7-R+x0H=mYfY=`l<FWIigZw`HP>ZWz=hU0MR$Ej`mW8a>pd0Lv`xSslDUApFq
z)DEY4?Aoq9-X1Ok+u4cQVHz`XX#1%dkFD9=+V{)R9&0-eLx1diyUxS9WcFwq1B{$c
z)3OZ9bnKVYIxMTz+wRoj1&{rDnuoSsmgAVMn;El*5Z7^-Tg1Md=H40C)6&n&6i$|T
zTpJrBO-nb;NJHPXV`u6>pq3`54#(p_k+vnxxt~dF-=d#REol@XUUuzHgVo06GVXOG
zxU|i3O^jN`X<A3)hGm||_V^*`-yZ&a`0DWH@E?c6-J36WQ}8L?a)>u<ZZo!BzAx0i
zQh&giDE}vC`f<+0T3AirGm;;4rgk~?)5^Y&FFNklwQV=?Cgf&m`j(F|^=V?>P0V}U
ztmZ}6ofyirPLGI!!oKg}dMtnKhM}F0uOE@u)7tQ_?$}Notnb(U_+s<Kj>+@SZr~47
zA&v%&6QghY)4(1XeZ~&+GV*>thSrD=A@<A6xsGjHPm9=%3-_|XeCpSs?G{7X^vch;
z*Qr~(zHKnOSe`r*a`x!=q8m?qzALkdXdIg%(n6huEM9-&U9Dpj+S+vde~&zN$+(S{
zy_a!p3F3;1p>dtF`irhV&0RMQg2som@(;Z%ZnAq>KUXi~x6eyi(?8YAenf8C6KF|E
ze_#rib6nEn(@!^lXpe~>dyakj_5SbkAs&By^CTG#=VVxu(ue0gU8Va!&g;v(kAHi-
z`R#YFA6|X?`uk+h$E$zfU&*Qols|6b2Ub3lZvGib{^qkTxjy>%^j`E&_U{Yjvtj$9
z+rIcfT8PE%2HRA7mA9_!^^t8zkWqP+)>B1JXN5GUzIbjO`B<DcjuuH4{L}s8kyXjC
z#XlZ7K6}m00G_k^6;Av6yBB@>&pEHk=vNZl0VyQ4Np4TgH=o}9_p95x&wu^#@slqO
zSO2<wcR_GK?>PcqVqyJMzg&W&GVllo`P6oM+8O)&iK9<H1j7l6odg0DZ5XtbbKo}6
zOX%%S%bGv=VmP%UVnQ?swT$!rVF(f`UuB6hyb16#R%i#S%CaK*w$a>KOQ7|wlr_pn
zmdea7tM|u>Yx^_Lm2!LNPV=VxN`szk;|w^qkSqy-<-}L}WnOEZGt_gvMr$&@zns23
zEnzH&**TOu5GEk<EQi}bVh3#_hl1H#{4}TbObcVOPSs9j?21x&Xvn70Dr3ys0`Ta@
z7%A8NcE;AE-t)OO#+sa=o_=F2$oS0R{?&rA%VAr9+#{P^UfV`=7TFAh39WC8p*dh=
zljH2CullK!=z4efN~7sb${S+~G=H{-x?kq)c2mz48;KHVww}IPVCAsdX_dq6#h$CY
zUZcg#*!ad61b$^eJ7bkn8M{4P(RRi*GgBOGjFIyD{&PVGiNYl=KhuNZzHay6<@p}0
z(pWo4%TZJwP1Et<X_I?unPu2LcsfCDU=7;3S?Ts+ZipjaDb%*%O9T|f0YH&xmIaHp
zjZ`I(Xy@BuKr8ZFxY4pX;Ci-@;Z%5O)O@?msFc`b{&AtPhl#~ER+{3%ibXJNU7exs
z7Yk|4bB21ZScnoSWm-KwE6rLd>vj(J_^@8&5U-n6mR(}TF0XiS;!mN4F^g6cu8dt#
z3J;OZ6|FD^H9^qi7B<3Ii3R(9d&G$6*K=)*(OJB1KmEoSW-Eu=SIdgB%VAq!DmC+2
zUK?YS64}fw9!}pFL*qSBdg{lbjSgkkPo+dZLGScaX^LT{Q3Mjklqc05>VC12m>Heb
zbHzrY1e&d<uNGK2tae)EaC@lsT;=r|EoN2{MHo}0SEJe)o3ANVKUbp)W9@EcOSB)x
zs##zA&tnfRIO>@mTq8zTr2A6}j<U8i^HT~=L+7UyT(HIeYYHwEP=(1gWPhLyx{8}y
z{L^m}2A}7@+72acpMz#20R!93gnFUXec%78E^w7lG`ff0VJxt()SbaW9bPGcg!}MH
zs~_I~sxFX3v?GqXO&wkjT!&Z6;{Z86yUpB|!X){{CxU*ie2Y%5WEuHtnqDQUt1sXG
zsy%1AEBS(lXQk~cNlN7p;@tPElme5t;gwcD)RiiwE)d|dFIrDkhgWIV;gxbN-)9-_
zSof(PO2@HV^$yd%*A~}n^8wKFv9#|s>+0e552fEYb-LqMP+u<Fzm_xS^zV)r(q$1s
zsspvn_Ej#QuD-1sUueM)?=4;ha#`g<s*7A{wXRV=d|-Sf{b(^?j;jINYG1-~vBgqg
zr^0p*vB`Ull-nX^w*$L9>D4yNq}3`wxN#ZQc7bFr)ULvZxQF@R+J!c|gDH~<x(-x2
zjqO}2^b3&-&rK`uI&Z&%p=Z>W`k4K-@O5kf(6wUVC=-OQRLF?ytnGSKi@34r6v%95
zSsT|cNY!2#h)WeyDH<QcB(wEh*BN#dS7kdgg6ZqbNbt->CH7juL$j=kJ-ZHL>(*yT
z-@CAT5&DJ3u>vMja$JoZw6FU`+qc~MbP%a^w0iOB#>st2-8$6C@^j=njg7W%My_o`
zG@*4qD1bv7z<INUu4!uByFke~n+}KBFzT{0gk$z@#|5yw=yT9H?+2B|6|LMBy=M=v
z>%GlipLbzLDD7Ah%<3Mh*V)-DQ4Qsuj=X2g!Q<}9mW9t3OLQI4I?$%w(P_1FSmLBS
z)@lb%EZR*8%DwViPlIugTHh?WY15@2#Spwoj%zy&`VRDfI_tk{1k-0UwvAl-MbUs}
z!6~<R##Nd-h`~DB?49ZkK^MS@vij_HPyNHDQ1F&?yt-<%i~9~Yf9#UkqNcJ()q0>j
zrwDCoS5PZFOg+^X8tZnS(u3tLFiKr(WUl*Iai}g6lz-u2!udwyIZk<Xa^p7IW`EN{
zm}T}x9n!y8a~EUpF86h+EOs$tp{zqUqk9xK;4YANXExUxn~|pvX;VytaE(WohYg!W
z8=HR4id|%`$joe7bqUL6ot%BrWO{yU(^AxtKAZPWUTH<<O~<(Dq*BSk6;GGF(MG_7
z%-x()=t7HV#B2tcFR_CCDs)=LCf4M(mH5pb)NxBcDSzWbi=G?*oHXf%o?V#Di#ivi
zMk@XED%8hl9KI!?(E3?;iY2BA;QBPQaY$$~JLiS9bQ{Q5*hxI&)$YXHHnVP*%wz0$
zc4N#k&`70kM)p_s9&|<B`ldfRaSD5DHt?R@M=NUwA~%~BrAxYtbPX(3whW}e<#I(D
zL({wCa$VL=u8fMz1>s(?>lUeVo-|Zv&AeQX+Z&Zm{43O1&r-!NbGjeyd223<T_3CO
z(RxBz3vKL&G{DMiSMIsZW?^kFRNLEm-7m8svKaf^T;~QbH|6|=-MEMAwJyyje>p-F
zMokMqd`x~3*4PzV>xMGt8MNkxHL+JGx$6PSZSQtv=cp`@W?4oq^xVDiJLkbyT7@FF
zK(mIM;(>`6_C}@S#Dq}Y(wQwd&HS1yLMuKN8qFkPRNCz!3bi3oR-#4#8ab2MAji^;
z8@j>4Z6QNWqfKl~qElCiljjA-5yI-`zKko|isO6q$<#v1-5>{89*v9rYm?Hmah*Hb
zw63MZl_4WZqpa1gv07XfFX9gpV)`zt6j98EeK?gSj=Wmzi^ubj63cYdwuBXvb(v{B
znQ3s%d+n!}1IHEi17i%Uyk_@j_$(chF1N;rl)fxZMF0cSBe7!Fjej65TI#}lLLlkL
z7?E8=qB2?HZ|9A}c#L5Q+R}mGEWBEcn8eY|1IMnDB#HodRWC?!>TVHfeIh7#siLsE
zVedldU63_Hxb>iefAK0)D;hvtSg|H+`f?N`bmty+r8~lqQ8dWoY4~<o>?m+o)65u)
z12o;3$15tEh)2IFo+1sDwqPr1aU<?H_e9*`ViBnMXgqIp2c4Y8$OJPJm|fH6wwir5
zg56XaiGn$o=LC*Pqd3fEJPz5rXii><Ea|`{H6f*MRwOa<9?{EcEN5XnHXSC>cAMJE
zQEnDUED^%VZ7~5kHdB`_P|AMHMw(2%Ty`HVUAH(&aGbqdg?9{9Rt_om6t+N0ZYLb1
zV22WzoYNzgd<~CEwho*Oy9xwI<R<ur<UJ2lLE@&dp%Rt6=$Sx2&MV;MzygP4B<#S%
zLnDkv`qL=-pX&)J+*ID<EsR?l@u9(nao*Etz`_(x7nzh$nyn-T%(V0x3p3SA9M~;x
zB-}(foU$LhiAig++&9FqU{WEIf?F|Gur^h~5Bh0&*6QH1sm$4N<qRMQqzSlTP2LXC
zS0ynfg6+YATu`0IMd%(!O>vH4;U=+gfj}5cOcGC6kg48D2%l0SVkfC_2_P66Q3fOJ
zyC!rL$W%!sW9d|{qDUq3E0KQR0>Y39k`?V<n(?u7fxuL$37`?`xwwi=MoC77Z)F+J
zsGzqzR{~CQ_72I(xoM^*I}Tohg&6E-oFu_qDImVNiK!mAl1vS{Z)TyO5|d$Rl_ro_
zWWaEeA;+CUlEpV<z{CL6I5FFq90i78oCOes1{>wN4$TXYg`#)|oX6U?GcWNTMnf9>
zIfoV>nuYe0(dWEGDKz8qRs=>6#n@hEdtB8zQu)4N8eF5GLsbrK5q^`r652uzBp4I~
zUb9<x$|;j;IW7qgK}QL?wn;@3^~(>Tu@m-e$K3PyWJR+@Tc{)Z;9Er)d}8%Ujx4l1
zvQcMBf$w4W)UUxCLRpYSa=!dO!1Qrgu`Wq5S>0xWt*q_rK`UHm(;~T^^KPYalpuZ3
zq~O@gNacCFJ+pfTR5V4Zf?J`<@&#AR+MUNW4g|&u0kVO!OAFh(y$S9RE16{jXcLgg
zu0jCyZ0v}fAaGaIgwqrHI5myraS*$a>9NXflW{^*VhQD21O>R*D7Q|6OVP){<sn#E
zSc^*J5{mec$ciX~LuJ8a7M>%2l4MM<#8E~hEBP#?PhM)peN-LlO^Z)PNjprf<h{9M
zwB&DqoaX@n>{RjsW;ZWq#?Yj+d__t^*;9HQ7fw?&lmO)llQ3C0=S)SRG!q_`4uU5~
z%?)STC?Jz!CalAhMe1AvE&;tHZKzQ!!pu`%BLWbir+Ds>O{BMZGbW{W?$3(@fZKM&
z91(B;TK2?qNca;Z^JJ@-NUqk1h;!i-oB~RW1PMxpqqT%b`ZHU_9@k7{6N|tOsYuV0
zxJodxv@?Y&DT}TdDbDTXCD_f59@A=hc^O$;T$NQgQ=%;LPy&R<ok_zaDV7BM0|cIv
zZb5|>RBY@G4~=Y<Qb(GSx`Y=Jh)|QS%gMZSEiSeM?&Rc>yc`><+59DsYq=Y^6$p*C
z;WxBB-&|-VSIL<w+N+Vw(!tV};3vXMG9DTjM&AjMS`A5gX1lahL8n9k&=vB6xlhaL
z!plf|Yf3<v{E`zvHC#gM5j{+{3q7P55lW$00kpzS+pTE<1a<Gw8TZv}FGNv~=%_U~
zR11oqGfdFT{vR;1;(igmz&#s4a><?oS#Y+jk@O*Vq&jwd=1BG>Q?Mhd6m$BmBnylY
z=?kKYWaYPVOPxSe1UI#_q`~c2fj5$29h?Gz016>JCb9`otzcWHhN2Op?^$ascjJLB
zqBCiz;>j&s&W$jfsf6J9u=VhnXE@+fx=1#OAT3a2`#!UgK@upth+FAis7qDfVi0wv
zG~+_DX?ifl3F3e$EHD7L$1xlcAj-`#tVh@d_Moc4T7oYQnAgiO^A-@=9B|bjOZEbz
z76DG+wj$WMwFXgV6_)^NZ)ZzZLd#G&%_;L_Qf>?glYmPpA!2o$k`t7U962W>tB0tg
z7(y~c3DXj6u>6Pkjy%5lm-3i74=JW658R&B7hkw0DR5!QQTZ*hm4+=R^;gj6;}7Lo
zJ0}(SI8P9SPG8Z1C>BV2Mbztv)p78sT)PdINeB@Ul`s9+mWW(>gj5hBBS?{TA%UVm
ze?(cQ(&EHt3Q#6gg-wCSU@!Mj6yZtOO3jjBqy|V)B&`a^k4U5~V1~3$y*;Ei3zuvc
zFy5jkcR!-B4&G|L^JFnVa4%3LAxmf_g34T8Ep$S?=zkFcgr)}uvs~oI9GPk`eHAI=
zcwf%xgNi3j$<wg8D%pN{k*41eMk_7v3!*yZOr=2z3QKNYo?WlylD|^GSMM;`WF5sB
z8|g4UzOUqPt7pu4&9d)TDIEKJu1bq4dcj6es<f1LGHiLzvaMbzs>$;iu4n>TPFh#0
z+|>OlB_2UDA{ib<Sa1wx-CmY!iV6=n(pt)e5B%skO(-jjmY)|0i!qu?Ny)8+CQn>w
z#keHgv=PrUoox10n!BD?PnBu?%-hcZ$I8hX2rM;`CxvHTp{T4@fdH73Q}@jaC5ccJ
zFJ`~ZgMJ0CEowyZ?my~Pg5YE)<2(%C`vf7mS;*^xtC>|gV1*Wgg#NnNe160s^3W<D
z_UhXr8%d<|TMRy2XI}Ai6@Q-l{v#cO{1uQ{+WZMPHCDa<Aps{rzf1~@EFW~`B@e}F
zx<ES(j+#LEq%L@{0IndAyxW(|lq1Eu`6HO>YC;vKRhC-iygFzqg95OXl5(BeO4WBB
zRgYNSNN(qnNC`ilFYtF7HpErF!RPryrNpkv@T*bv%eqpf)CI0uK>NA!JB2z9KQJhu
zV+pNuWsJP0YZ^o#5UZ9_>?<=s!=z!h4W{MQnqV@6MZuv`VoHx)qE+sdlIT#{l*!)v
zC=pO7hq~%YHkQhy<9)xReIKP!c)6ZRQrM(dPhKgNztU{mMgcDBHNf-r<=x?jXjNxd
z<95v^%Q0)vc-OwXn`kF*#Ez<s;8A7(OsXY`cN&eFFV)(rY%1kZK7OV@%vHOU_aAnL
zl%JbSlq=hZxX@EtYy(8jlfgQ!S_|Bv#0J7DMR~EUb!BID(JMQvi(Y-$Pf>^0McG+B
zY$Xb!V&;?W1G=~U>$(?GUD$ecTs^S$DzWl)*`hLkIZ7oJo&CMvgXJ;$_V7Qyg}eMB
zO!7K^k@xxk`sU63!@J`j^ZP=7`|mA(|MKhoXOK6)z5DXj%OCqo#jJGsaU?yRe?)Tg
z$^Dy$yEk^s3;Oe~H-DesV?HQicG}fL`$F6J$Z`Me)t3&dHps~1`Ou%-f0ya+vG8vD
z(d7BjzO;4CdYF87+4REwCodmfzP|tZ@#Md~z5D8r$bZ;0o&O$H*+3`y{+Dy*@A&3S
z%Khe3l6vDY2~K`GN;~rDDAgeb@>iGd@)q?8DFyx`68z7Lo|3@HC!{oLpOA86dnP@+
zefjG3-P=Rd@S9I5;pgw}zq$Lx@#n9;{Kck;o6qm>sUcD>n!Wkr)&JZ@V)Xg$;pN+h
SBE!6KT@OF|*=N7|)&Bw;x74u!

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json
new file mode 100644
index 0000000000..3d42417002
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Contents.json	
@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "Success-96.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Success-96.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/JoinedVPNWaitlist.imageset/Success-96.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..98e6385c2434da37526178fc927ecc729ad24316
GIT binary patch
literal 13451
zcmb`OTW=<}k%sTTU(q)Pk_Gaq$>tFV0<4b+c8z#v_98%#3t5)!2{e);X%=>V{XTDz
zO|}kRJIE?P+*4wa#bVW42T~t>_37uobLV_Ixn*7MzW&>3S$_Zf<>J48`r&%H`17B>
z{@eA{BQ$<4{`30wyT|Vr&%igG^u_(%haV0M_V4yP<7td<neYDc_Th)i`|I1QpI-d_
zkIUozhwCTgKm4Ju@b<&kk0#6KclYl*?alSW-G}?D>j$koMt=P9-H*#(mi4^a&-|!q
zC#A4|{gtWUe0aRSzI=cB`{{S<Ij`BR8Mgj0N%Jeab1gN;u=sSYDSIE5tM@0jPrIJW
zzPN864_CJ*7tU$(rEbes&MCO+$^w&#RdQZ}JI5{6P#3?Rw-7gG4eL23?`k~IwtU{w
z>U~|VPW#BX<g?%08vSx}Af~hPDU`6ddJX}Z!xG!Lw7Ak1iIc>9Y{3V=?KDk?2wPm;
z80Qx>5jLMoTGBa3WDn@e)!??Wl=E6*WNTNiZusW({ps7&?diWxr|a8qy5jkg&7EXZ
z&G@#I^n0UjgZc|5i4^~jCOItX7j18M5c7aPyG1_qW?1C(0DWD2_T%FhZyzrouWj^a
z-u`oSxeVjk*L}+O^j{aBIph2I%jM$B4>ynRez^JRXBIp#zB2Ppy7-seM&f+;aJpbO
z`VT7j^zQW&))BQ6_Hi6=97G*(N1I)lI{m54pH&|g**tCE(P7_w?g~TE>$&^nD<h4>
z|Lvxio=Db_4{&G_b?d$O^!k6^U0uKV;^XC$x2MCut{#AtuA6bZ1DJ3klX#s+kCVE9
z^DNGvy(<OB1y<yL`a$yNAA*(W&b|UGehGMQ-fHo{N?gx%^;-f~{5hl$S6qM6w)0vu
zz_lE>w{s{3FUE7DKbKsxW6sE&VRacGh}+qx>Tz<YnsciQG}d9jkrpIT^{hR(nKRm)
zab3b#i8+(ai6l^WnI>(@KDoy(nRBj$0U&*>P0n2=bj&`{-9h$Ao4Xv`%=wBwg<7^$
z0-ZO6Dn*$8{$#s%K8nandG*UAxu&GJG*))LVFuFXCLK#1A-lzM>{9%S=-PRyg8OQc
zCqXQmammJMGmyag$~YU<S+7n-^F>0}T;%3drQLONBHD??Ws-)-oi!b{c6AzyY=ldM
z4l;o*3_A%nU#iI0MV_RwwaI$*n*O9#+)>uMExubtM6L1-og16(R<SDR?6htbc;{d~
z7zNRn(3H^*dzNBl6C5h0yRIT?8h%X>mxmC<2MM=Bm{Ja`iitKKvh+oCQ0592mxnN&
zlnyda)?xCR&lVxfOR*bPWAg37G{qw66nT*P)>vY&UcIJ4Dc0EmD&+fY>y)*n8@3Ru
zXFI`_Ou$Z+)MN2PZz+exCwFODjEd-HDcNBuoW_m|Bo~GYxCVX%E(G{%!v#EJ&`4I;
zIsZFwqYfwiX1s&d?YtuTK-Zd+%wo#4)7buy{lGnT$(&;)4^r*8FlB;jwuBK3*$=d_
z%gN2&r$)v~(sSx`Jl}vp2>Sk%x=wLNb2DM>f!4ecOg?Z68w|a#PH9Tez`<}WHCe-e
zf-Nr4IM1*S#DJFD?&Up$8-H$k4xHUs>E@KXo{@gYbf68{58Pvy%sE!-o^Eks%G4o&
zIMHR_!j2rGja^P|_Wp`KP0wVmEzY?ne^&ZTE^qdn7pOhX9cWGdRF*Wk5At&&vOVmX
z<lO98wkHV`=SZ8I=SkMQ>-j({X3yw(awC7WIngsw-0V3pr!*yd_M*!6km*31vQO@@
zOS1?04J(ZUH8K0qw^%`x>yl$3lQgzCSeb8XW2_<_>*Sk`+h8+gRXZ(}=rIY&2ML#L
z$;D&^LxgIo03aH6u7oU8g`h4Epu~@aHhzJmC9v{IvY=TAa)Xum!am<vg!$M^s;(w#
zk6oBSnj#O@u{E1d`(+U)JVR=o|C9!*&4~O%=mV|q4%-{tw&&+Md}_X&f78#=dNGxz
z$7#GR@;$NLLll{&+jFe#iRF$2Z5r+*4Z9tzN3$J^9IbW;GmUnNJZyGs?P#(iw>p|^
z59UXcoupy1gY{^#V-d4ht2e9niq5{QwQQh5&Q#!hW{cTtC>5KXGz#sQsb7~oxrw&L
zIr0!rkjglbE5MC+tkJDDk{K-{nKX>6M4<=cCU=F~6*6L|`#O_`^j)6GJtVia_jSCu
zSK-8z=SXAir~AIbgF|y0s)23T`TG;Ob$4N?-RBOp;Wr2F=3vwkWNt0@rW)ANjHaPw
z=~M$yEt+l%G=n7a%}FynS2ZxXnX_TPa^kVl%_+192O>c24soDO*(dkdC3B9IXr+wo
zWXc3pbAskm_5*F~a&j~0EBch()pMlH5jMGg#&9r#_fLo(SlK){?6zEd;iC^LJLjM%
zcVD;7$2>>neH8Qesg9&R7xps7xidAQ3b8R65%Kw&lXQi&U9?G@yBf1i(%7i%ERHBW
zf*eKXNP4jH7UOz-x02rvk|{co_6}C74h=QQP9_jj-pOo9N5Le)<GM@|0b5H@*7jhQ
zsIwGgXiM3A7I`wAEQ4DIJWgQ@3j^LhMeZaR#?}Ta^MM|!Drm{INTwnn0;GyO7}OAE
zkfz9kb!^S%>rrATL1y*szgchWS9c-{5QFg%z?yR<IqcI;<W{L3sg&p$Qg1HSiR1))
zNWdEEOvpiX2~*~qN(`mod?Bm+SNWA3t<at3Nz;j>DXkdy&aF-)oyt&Cq?|C=TT4<X
z#g!b16!x!_+z01r6woV-kyfZ$kf|mbH`WnVO-&#kG*wF0jU>M^;zo!c?MRZdL7e@_
zz6xpRXh`njID~YsY~0lT^I9K`;PFBKHAkR1FSN|JO23BE$l5fX7AQSTnxlA@`Zc*q
z>85j!w|UtQDg_z><vtE`t|6jx=`7Qq)&8mRYFG>5L)D&RtO_(D(?)7PX;wG|l9z;Q
zwUJCoKRN_g)IhKqD@RWO=3|Ij#g@+2Ii@Vx3VDc?hXpU=JSe*qlyVe5{t&WE$84aM
z#{W{HZI@DrvbpRrGFbXRR;=_h`h2Nksl@r#s-ub{Ocv{gyrQ08@`rIC<AXgB*1dDB
zS)iT#s*~|6$Avi((bUA&$tYWlYMfv)zLvCBaMiD<o8t&Ntc24DIbHN{OqyAl_tp!V
zRE!myNn|8_LP7^e<iQUNq^)e%2q$zGwiW->vDR47s162GE1Qgoigjfkttq(W@&Tj4
zBqb5FDbb*jJe?5|8#oNaw?eMYt_GMdS`U9e7%iL&1(1C3g?9e=gQ12`;Ed!uvufgm
ze%WKFS2+#9RUxpfbf7qw?VMt$!Qv^|I_?&sR7W3;NCnW)@nqvDFevzTicAw551`|q
zp{cSag&_hlQ!%~UxNV`Ufs$=WG~PfXB*!&}4jFf>Rk4JznPosZzJNG&-r&M@1L#AM
zXG^PB*M*rRz>@QDUMr4q?wqJYP)wiB`n`LDSnF02QAzVsD^Jejc@zHc^oL$tWew8!
zz$(#o;K(^El&Fr}vp~|E7R9s=1rl|f+rKufma8U|fbR^dIyx~H3=h|gHCK92gpWQF
zo9^6`rjrUQj&>Y45o63ZNONIz!gguMm@A>Ba<+XowZWT!bJ<C|I!ys5b#8=ov`=`T
zjV&u7YL{BSQrm>UO#fD}h$)b<V9?LBo!1ER6H5r%z>u`vw`Z14bSCv7Xp;amy<*sn
zIQNGsB}}}PB3(5CqBhPV$bJA=J`vy3v=|ct&wb?3>m&_jAEY@((qUM{=I2+cgYq**
zM>H$CKxOxddq(>J=R}bjI1BHHO|+6Qv~5++0WcK65C`XWl_;>SE3Tws$9@*9#3{T|
zgdAzzA~^jc6@&q*m6Pl<2C^6+$Zl@;wTTcO<X4-6i~!Fi6<D^&9ZjHWQ$7YLcu+%M
z+>DYC(B=YgbRP=`2~;KMzzwtm;#}RbVj!c<#9ZQd^?`7KWH0P?(k$2jJzNqWMuJ1&
zTEM90j9eO1VJICqEG_Kh3c?DzE~BNl31~WOg)##1kma~%GT!JA72>X(gSK}a9!OK!
z2jYGzW43vCW7ToW0!}h~lMbbkIw*x5d(i!uawjmi@0E0h{y#N=fO9AXRN6?JS}g9$
zQ%CtZJWLv{G7e-?=fTYx=Mf**J{ZFg@?bP$FC5oyUWZM8ujt<mc_Jky{|cr~c$(Nd
zX-BX;PzSip8TsuCeN5T`r6+Nq1iR>9IY|es9K<Q%K<T-?*S2gpyH`lW+N!|cb3L_l
zn3;OfKKk#}5-8lMQX3MuJlXi#GLN$3t0Fhup(kODysSFid8#C;)StSOQh;VX;yqrf
zCmAYfqskXRQ>BP*Y$;TEwvhmKNWPM4%k%^V%tt1Z004lSo(^#-lVd5|^KVjiNNXVv
zvzCG$f{@OOHK)jn3^9<wkPAlKjmW_zERi^G$|FH}&uy6{S8k*8th9|h#DPA5Y0}FO
ze!0>vLI^0_;bQ&juHi&vA^1b&>KQ)Zn(0YIAl85omP;eDUZc?OMCE`e)g*fpVx7sG
zD%~cn7*(uuB@BFT8woQ-0979TXd#Cr)5_$^`x>iqh&PsD2D}vzH&rmmIz`OIRfuI=
z8QGL&Des}`RQ^mzTgmg347o(^$_{8ZkrxsY*`4xB(>3*|j{cS7d}2w%xpc+Y;>GwF
zzoSt=|A8O7eDYvCRj;Z(k6Ez@%5=b?ED4KItHLU6UC&@Qj%(7DN{FC@CDDzG9{7}E
z7;KlkC8WaXGK@`<r{aH+{8pzMJT<sIs4+BCj>slmAxC1jnS4`wB)4+Fc6&O6VPO?6
zli~J5C7WkFsVcUEuC-P0dsEZI6Du(zkSX|xFqAil$|VAA3VAXff}}ims$>$fS1Jva
zORSlRvuH%NMGVUtR<K>O2ZY3^FdHRp*<MSjn1~yZTd4(s(wYUlAL=R~s&l_?c?m+2
za!VaNKElwbg_NuF>qtI9+-3cjx_$jv$6?O%oyQ9FRI-2K7_q`*O#N8@Z-AgNMJ%QF
zi8XF`FHXd{A{v%Y)=8nTl0#5jtFlA!l<uVZ1S~Wn9+U*T+#pfeSV0aIEmiXF%E`4}
z2=Nx3b4a8jjt5~l4l|>;Dpi9E2_4}Es_QG&B}A8U4OUo$K#F1Qz(VjwR7yjx>iZil
zDi^!aMH5@0TLbHwlN#U%MI%uS3}y>Bq}~juDk3{nd;)6335`c=<PI?60_;HzO)Nr4
zhWKm@N|8K5FJO;0sqvBS(vE;eTY}a+qbit#rK+AqZPEaRFK!P7gXG<s@nMtLA~eb_
zk|zm@PwBOqnF*{$N_eE95HI;G!D1ZqSHOnDQWc83s68Y*lCk4@y0Jcxs4(dRNV5kb
zJ^jRXMbaV5nJB*5VBaP#1o~T5ZQ=%yOHC6Fo4_MwfF4P$6-=3N(i{Pa(==bD6C%Lp
zo{=|zC=om*0VH+Nb3cz4KmlK9)<L0NOydy>6}&d4K*1OwL@th)l-g=skc*NAV?_WV
zPi$0;A(cM3cEcu=QBiE^UW43}PMofXRs5@EhxM(fS5wkdAzDEJ_FJ2RfS&1HNT&{6
zDY2BLvuSA=`Oq@WLtUdNN8?d|`i*3}(8z(4MtQgD=?uHUp!L2G2f-Fa39PGFx3YJ7
zM#dMwQIi3Sz$X|LQKKZsNoYM91t?KFR)G!S#7AZxxF2F$C<}*xQm{KABrihbU3_RO
zxCn6S5fwg;4Y6b@LS$Va5mFu1lpq!iql3q<Xiq2yRYju*o$%p2bdIoLK{Enwf?7w6
zqIpRQf#HJI7_K@LTA4ZqS&flLKI-2~Vvt*nGXCqc1yZh|@M`#CQiBSsrSGT^q^c0y
z=9J8mWsahNkfM<L5Ce=tk4w-_F}@m~fuYs;z!n!x>_?=`ZAF$R3U<Xwz;LJ(EFgmc
z&25WY5_nr4&1o_!(w$(_ShOOO_|#J|m{NP$RD&i98H*}LHGr`vOFR_ax%a_R>BXQT
zBBS+buuqVg^^^+R`zZR08!5hyg2p9SAwJKGDDxKH$$}WnO?*P_;-jI#O3+sF6*EX)
zvSwZ~(c{1_&9q6}bdRG@Ohi?<#3k4%!hm*!V4@jn<H8=j3)#?+;02Q<1(J7i1HgxZ
zWj2I|MjoW-K!0}wXT`S`%tDIgM5t4xVfBn8C#8kN6pWEL$ZYw*Fl{&|qojl3fH*$P
zU=j+<SbPc!7z$Y>fdiM<#c9@4L4HNqj|5O~N`@noPO|Z-!^>RkhC3`fZqS<B6n0EB
zRPoD{{DOsvJk>H}t(QO~bcNPs#!70E!$YmjqO3;?bAG(4VhqaA4NK<(%AjG7x~OLq
z*AdE+u{ai{&jyLi5LH3)oC8yc6BTD14C00n0iKW;FH2Fr!WK<8oT&mUR+p&#Wi<JW
zIe|+Gd!S6=*Saes9fcLU!;dThb7-!$JvvFZaWpHXyg7~?M@1`<bg@Ss$_9Zkp@7=B
z1V_0BJ0#`7VvGoI$VABi36(~|cY!rX^hA{2!b+cq^)1v;URZ}0T#+y~3(1{caWWFu
zbjr&K<GS2LQ|3@y0*jl}3T&58iK=&`)?8GY4)8D|r`j5mK$rE5S)0rQA2)6gPInTF
zBti<Kn30l3CIF4&#u|*qC}IONJpsq&;0B4g8v_uaa!(;dG;aL2@nB@?mV<T#803Y6
zE-)t`Za^2%2e-&=a2l4k*@+}dGSxD{?AQ%^P-BuWdS;n?(<%V+ZY)UWOdUZR*o+ZF
z->`2;%8r3M&JSEtK1P;>A0dqni?Rt=RFX#bLj@4oAULMoV?X3H;=mqBS(R_7N5HSU
zzR6XUXi(^p%E?Drj>5y9+he69g);D0GDT&n%JC?FBv~vZ6RHc0ros#w**yDenIH>_
z5|#Ye7~S`YkEE#?9dqfql4#^<`Va->i-L>G^`5VH$dzAtiVvpuhuYKzv5Xhd#Ja=Z
zhy45P?cL+U@)!Lbg<e^=zZd!H^1J?L92Z|+fAjA0pZ$vr%{2eGL$Aa4KQ#H|?)LHe
zmK6zdgZP#Hp5$?%ur<=*`L;;ywYeUa|Hr#;5OvWG-YmPspWJ<b*S(Pcq5WmZ{t%oZ
z=Qx#i_%K$SJOAYJ@$%;GyQjQA-d}%vk{6wX<n4#|Xv*lI_a7~wpM^GW`=Jl`f`oC~
zFUKhI@0TP%^w}uVq^BgV6{#qnjDkc;`joWk&pw`$h<-ci@&5AN&Gr3B>iy%VDEBuH
zcki!%yZq+eH@|HvzIbzYhkm6#JH(5(@BVQuU2sefkC*q4rX6rP)YC^FefFo%{}*2!
Bc@qEt

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Contents.json
new file mode 100644
index 0000000000..b23b52c784
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Contents.json	
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "Rocket-16.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Rocket-16.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Rocket-16.imageset/Rocket-16.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c7dd245c4f70b7d00e0f11741f062be0d312edad
GIT binary patch
literal 4812
zcmd^@TaOz>5QX38SM*CHK-zKjy<0+&$W;gsVV4Ia#Dn8Zk_E3FYzHO$dcNwh$6oKE
zfOy0YyW=x`sXBG4s@o4<Jb89u``mTbh*`h<wKL|+FU{=7kM9OE`|10azYdEX7@yg<
z!|KiMt#J&z+(XYd>-X<YCbaM4yEbQ>c*S~~`D*)az8O}FkGI}Ge7Ilg>ix@I+w|Fb
zbF;@Thwb|PW-)Aai)rMeN9zyfXCu9|&+);g19W`)g{7Fe-ED^XO*eZo{BgY)E}uU#
zkFQR@Ew<h7ojpvSmcE#tPTo1^Y%0du-bWjgGmD#U8h7_$yI6HP)`jA%xo~~T;%zoJ
zos~X@>_avez7HYi>P+ojNyRd7f=VBydY?|_F1p-jZws3fy;5BX-W(z6lXqUSnWjo_
zLsY95-L!-B)wvX$IoffACWB9ATGv}~u42iw!wEJSa-X-0?ydS80<IJ_I+qlD7+J8G
zW~=%qIp*kLAr%+>ZOB*eoSe*6U#$2lux0yDv$c__M@U=|uh3ztz*@;RH5v|Es8!YD
z74{u0ImHe(pG;<C_TnOuLm1;Ox3Il2_j#;Ly#AtFbwB)T$u&9RFZO?0a-nxM#DY*`
zpF*rILU!%5AX;J`duMGxK&g+}x@?X0y$cenH=z%Z1g+Q~vlDc?=tA!;FMR_`^hw8o
z)H;rXLdFGh2rfra)m*$zb$xNg^2mD0WmluI*hHkUPKb`H&XdP6gk&}PHAX9und)&W
zv1UNR%cE+~=3;Y2-PL6&6eN<S_#hx5Nlc;bX=@2q)W0a92D8Kt3wvI%Ad<xy6jyA_
z8N@}gBp`@O!YhhNtrFD=Rdy`7nAm61h#hT@+X5MpA|R3y^N>TrhRBj0zL^(#VpTE6
z^=RE9_hlEc-orSUO*uMUG$wLhmyqmy)<wz8m_!#9hn83ib5y%tu?U&XWEWyAAVelH
zJoO&?pb{iU3zdtmz>QbQBk2??X|@E*Q5>1k1VzXz^hO^F@qk?^wP+M_CJ7bER6Jw>
z5ipG~;0sC|JGA%(_zlH)La$QNkOn8Z1_FUzN=%y?EYXU99)kiJU>pGaAh_z%s2X1(
zMIi)IsbNfI<>V0)4rWwC=#j7Zz(~w2Y#|K_sRjtOO}|7z=fbY!Lij;T&H(}x^MUf&
zvY=}5X;`4{ViiGl$VdaoGd?D*_Mi|0rL2=hRIp%)!dpeLJISVbPDUkUm5C?=OQ@tE
zlM)ID@D&2}#u1Q=;wz<9xv^FVCEO5s!pqd;5^>dr6C*APm7dxdvZ#efs}fg-_A~ry
zlCdj+hE^7V8d0Y_%pnNgs+bF<R3}r0oeQ)U-dCFw<SnTY75kJYEc8uS^bsn9j??z#
zrDSaI$uUqDq!n2LyTCU}Y0>x~6iA9%5YWBGxbQ$)XZ$`Vr8Nh9qD)84>f$f}sz?#q
z4Q+s;j&rQ$G&UZ7=wc)wdFSb@PHPZV-qTmddK2+BRg6Rs1OTrf?`-`g0V;hFY9#U1
z@)E5!Bn+sbie{}x(GbD*Hjn}!G@HFaQF|=gL$IcEYso1l0*jIONw783&ezvnk&7g%
z8L5K#Atg-ZIN<S8Y#HU`bHZQj)*S+gz86^%DEG*zu)ktH(CUdR5){u;4J!m)yBw%Z
zl#4c!h6SJco^auju9FI7r6tE5i~d8SLKEJiUNZ2LjS9OHDy4@*d@lNQL*)zv8kt=X
zXc82C1JV9TRiH%XkkU933jJK6g0`S;p*crE$`m(57^9w&h=^3F=u)wYO2{k9TH(~8
zEnIszg+tqh_M1%hj41UP;+LQ*aH@^Y*OZ`8DoP8bCg}F)gi6Muv5<}o%%oY)G)YSV
zCYJ1-5Ei{r4`F&-;Q)k@lr%>{RRxwxP_QSpBO;4viwG1;g{X3#UA378in{~Mc;z@(
zG7hRLYy$<9;aWS&w4OF9N954dz$)mDGZbAR(HymoCn*A#%D!X^G1!*0mo=h`cEh$S
z{UT9P@s;A4sp)j}Ohdv~jZw;&gqn4GMj?E3*YX09sR0cnJxXf<67?LS<2aCb^m&gA
zngH8DsT)?W_D6W0^qSJ?HDtW6kffpm8q6``pIu|Z|NR<setY_KrcQU8<MoQFb<d@X
zsx_h0B+ZxeJx{RX46Tr_|1RtrwlVA|e~LQUd=mBjwYA+#f1)yKq>tCfryq9DuXgj@
z(B40_?cddR^X+f#X}tOB*IW10<8}7-)9krX$?Y%1x8L3QHsdDz)$-lj`KOmY+;;D*
zp}_unK6&zY%RPKJy3JyT{GddgFtxwZ=L19k=$br(vp3sr2DMMt++yxYPF-+}Qb^O*
zoFq@S{%W;a@3!V=y`UdmdNF@9?1ArwSJ(4L|MIG@D;<9|P+1&)s(8F!?S>UQDgy`b
zh5jP3Gj$K0@TAb_f&Luw&GjoxHR{2oIavI7{hqn@j{RGZla(m9r%S1a+iAz6=a1*R
z`Evc{_S_Gf;dRG(z;<Ki=wFj)YSDo2Ke~Z_%xVw$c4|L^Xj5mSGQIR1qQKvVIG~@8
z3ij?O$8qUwqUV-y261<qpxtJEy&N{3();xj$o*`)z8O9@pIyKDe581Gxn9Gs(%0fO
bySn~!P%a>MyPI!zjUCps-Gc{Dzkl`@f>htx

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Contents.json
new file mode 100644
index 0000000000..510acba745
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Contents.json	
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "Shield-16.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Shield-16.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/Shield-16.imageset/Shield-16.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..677edb434b04e64e0c5890edd3905cb8c1120d2d
GIT binary patch
literal 2579
zcmZveUvFDC48`B?r_f7*c0grO)L)<|u%_!UY{R;AZ^a%w=eEs|*jwxlT|fPP)U}he
znI97QSft3qLrRZczkKyne4Qq7!R`L|b8_z4Gxz-YG;c5L>lE+ftDolW`@;vPfakVr
zf4G^~*VF3d{LkfPKL7rOJ9~5g+h#xgJ&6zF<HBk2^mg_Cztti&y3O@;yYJy*zu8X3
z=hT`6C)uYSwMTai*kjAu3~Uv+yXsT!MT?W-Lj?;!y>kq^3@TEJ+f2=8%_ZQ^z|@ks
z?nB9?_2I4bk`qu$8fzY>HVz=vNrD%xE#NTuT5C+Kg0ESMV4S@6mI^EJwyld{F{CKT
ztRvKrN;Ncu-ZIt^>lgx2tM8?XrKI@oV&Sl_*QVX9@g907T2@lB)?_Q3z{%LDqJr=2
zW5W@V;|Gh_%sTrjghbZrwUtn?&d{UX;*B0Jp$zNZTS)`cgu`(*OfB9aPl%i#DMpnZ
zy0hP6u4F*21Pf;@QmrN1!RmuF$<;-#MWYgzcu5ixr}-o#UtybcyP!{>qQ+4tic&RE
zyntbfvA8R0*AvwVV6pce^1w7VX=x}=SW@<qgw&5nFCZbS;&!nkz0HtNjnu&WYa@ZH
zfhARoL!lUI3`2YY9*(g!u!Z-#3_96$3nHA-wB%}(64Qwd(_Zj7HX)~lG{~?nQHh9p
zP>Ys1Cj`+`31Ub3W{F5bq<&T_LBZ_97wTC`nuAuLDlvBSV6~^FqXdYy=QQLJG{7mb
zl~y|jLrbY<OCU<qOnDa3b(5_6n4^*v{!k~4NH#=Q`PKGe(X8Ahwi*V6lR6ZK46~+1
z7F1D@Gp$-AE&D1m>&C-_=H5&ns58XLa!9sj7JB{;^z<(-DFoeTZOt*!=Nd8~1W7Fs
zB2DS7n9|83#uk)NJ7tB7(NNL)KN3WWMRasgr8V$IF|0R8oJNn0QDc79^n0|eXuZIF
zWKeJj9RUrco9w`H%YyE};IA)H6|_rpEUnCZD%62uhEfn5I~gM3hymq=bnVF+oqb9d
znT8gdszVC+3=wNFYI_(S8A~Gy8@r>su%Nl<X0v95G5k!rqqs>5-KV`)y3bU@lAgHZ
znhcf#SY0Y}EnBO|C;=X??_nd^2BFq8Bopf5vb55(Ri9cfa*dRfZp<hsqcA&|fhbvs
z5F#>aB|v5)LDSGg%E00@pwiV=%+gFLPt*kZjO2`^F~;Dl<eu<sN=i%l_$k=*WpXj?
zPy7jE&rDUrP@EMn(Yox5{4-gM8Y@Q_B(em87{X{0KqaWYh$h<H_LbJ7ZHBU#!Gz0o
zA+T^1pvgdei&|;IMW@Lq(xyzaqnMG`L&B{L@4lI~)31}=-^a`Obd%eqz1;B9wcTFu
z43)c!fA#HlyF2XN+uwNz@LB!#?_aZ9y<WeckHF9K#pU|N?vr~vhLK(DcMH2Vm#hA6
zb@FsR?{^<>HuK)uQ{(*T?rgU`%v(;hcg6{Py}ki+`3T*6jTm(MN?HAQc|oYoGB|gq
zbIx`jv6Tn$??LW)Vn*KcWC`wX54=nKY<*Z??cRTB`srqVH}Qg)mR#+xE18#r13rEj
z%wy%Yw-AE-5{iLo_%(#izk(v-`Wj+9o}k0c`toYNnRvFXes~ETkN3Ol`H6dcdGTZ+
lWp%#W9h@aR2wuIp{5%u=c)qP~4kI0gSDhX``tFxk{{i7b5<ma|

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json
new file mode 100644
index 0000000000..b87a2c36f5
--- /dev/null
+++ b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/Contents.json	
@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "VPN-Ended.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/VPN-Ended.pdf b/DuckDuckGo/Assets.xcassets/Waitlist/VPN Waitlist/VPN-Ended.imageset/VPN-Ended.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a34830d0e08e54aa50cb9677a3dce866c9c98902
GIT binary patch
literal 11455
zcmeI2TaO&Y702J_Q}hcGL`rYhrK`FnWGTLYP=X+K9*|HTmhoVW_F{I&5#-b7_phox
z-8;MBCCXbES$6w$)v0s8Re$vL^Uwb5`n=n@Zs@MR`*GKGpMKh%{o|K+hwki~ufF^7
zus;IhclNi#)tloFooC_82KxNw`u)4jhVuXVuI#BBUxDxD{Ob1I`OV>K|I5AiUv$Tt
z_lG;+Cr{c5uik%mEVO)feRJ7hFAulZ?{D^p+j8=YpO2rvI-Va7^?$DXvp?^K-sgc|
z_vA_a({?|7di`_vEwA;G*Y=R&0*ce}^iMWH%kA;zaDKV_X?OO*b#HEWZh3E;|7=h8
z&dvRt!Z^5Y>c@K4{&F|;E=|d2&JE?qL!P}Gb9cMH+Bx43A;svs1!L?kce!_Yaw%?r
zzMrC-!`%7ahtZAW%E;K~5PV48e&<{t9Pe|Nd!Od$UFQ)@%7e?DOTG7Tn1H!{8iF5u
z=W{=Dewf(oV?TQDJZFr3@Od0^=Tjf^G-RGQ*o~7Pw8y(RI^VgePh+0J&F<WXDUW07
zT<$0D<{^~b!x;Q1n2%{@54h6+E0bU&4>{Dc^E~*mK;aZboe%x&eSinfDFWr}P~<hw
z8yIJ!gdo;7P}Jc#C9@lG&chIbp0dk>hjN65vZDA#E&+WEv2zh6P04|MEOOB~zK?E{
z1~;$)*gU7Q+g8r7JtUX9i`}|(?vn(K1jau4*+IqJ$K)a+1>{qjA#v_Q8YL5`fosS~
zNoJINz%&5KNFWAI8l?sTt*otWZR>`9#u=tjq}WP`jy`4-<oo1NIxzsbqAEzi4(Dlt
z&SKck6?_0ueyr<|VA(oARZJVxe8`6PyB~Jn@2+-#-|Y@pubV&dq>!^yNU5=B3R&+9
zG#FG7sl}q=-QS=?MIpIn4KXJ{ATL3{oN-yXh9y0ny+~!{(=WTTFW+Ar-@d!}#gLvZ
zjSEs-xVrPNA@%D@|Jy6aN3RU)$`72rjex&;dLf;^7GcLb!fv4+<yRp$eVsi&{Oj%h
z@bdGg-LqG_&HwhdYiuN)lv4+@i0zZT9McjM2>{#hI4)7~^g-b<^l8G}h**8Byj|{m
zKfCBBMZ$5`4<q+|&MpR`3zp3eZO}s^ij-G=T9y-)DuPjAr=rbWJ;=#ne2>pf1mDn4
zLM0Rq?8HUO7&t~H#~?T^F;%~Hm0M^46Nn-KsFEDk^R%z9Muc7H!fE@U^$D05gL+5o
zh99xfI7GC<Dps2u_GFvD>MYqbd0i+2Eif@gZm`^CjBOx=hXL6b%oqcc5DXC0Xt47d
zW3vL-LRVvKP!L+EuZ$r|<FLNUM7c!{4T1Dy@~Q{bfTo<|kWFO_7zB#1B}}0L(~mJB
zT{q`67@Dq9Zj4C<O&4~a_7(9;c}3vWMw)dQ^=5&_q1ma)VZYk5$?F1`%uHFXFh;yL
zqcX+}VvOx~8(3qkni=}3j3MRw{<8*VRX1MM%_BXSMAH0LMME|9QsA6A?m+6)uM{{q
zJGz;?NYNfgc|(?!+>3`T9vpiTn<F2S{;HMMhnNvZc_kE+mdnG00Iw(#71p7v2VqB&
z=*ZhS0V{@~onF{Omlnq*E0*61k)}%pIjk`3fn%V7azPfRSP&`=cAoYrL_>qor6@w4
zbYoblN10+w#54|Dd`Jsp@*a{jgpz(uUd4kKm>8R6`i**HYy)YpHXdw@Q44|~iw!YW
zVnI8vF;+deShu22$vv)kaHGC5hA550#+X7=lS7LS9)3(-l`(WC*+h<}-oo#y9wBfc
z#~5o5#+Y;+3UJH*SfyMUBNkM#p$j`t`<mStU9u4=0nHlqW`V|`*{R84zcYI_d0haL
znPKCVF&DQ6)EK*Oc>CQ3))=d1Miqt$SA(_l%pUG~aQGb_Y!PFvr$6k#oLj>a%vI_C
zk%E`>XQ}Rw6#PF*!HPNmUnw{~dccsdvg(2Ack9!K{g-h=*|i2u4JASlbcI=zedtv~
zut_M6sfMoz8YT*wN|Bvs5S4LlxxqFMr>_h_DgPFvc8nd|Bw)*pg}VWAe6)Pk$JXPR
z12k?vEMHTFoiF*8p8R3?p1v{!cjP-30+hw-!%Eviq(O?DPFC4V1by;qbDpiTV{Ex`
zW6KS)mGAwx%N$Ex!Xi%V{q9c2V$8!h!{azHj8Hi+CqSuA#%vRK7;o|ZQlpx}O-=92
zqo|t6qG@o6@j*SW40jlo@LNI1h(XB-@PZ7?NNuESu)W4*d$sA7G}IACu9RtwH-=^$
z&xDAa-*APMaXWK`Q4-M^WF}<PzqZoPRA%$2nHe<z_;AiJ^oj9{XD+2V+eGE2f_I>q
zbi;&vHD_a9N8!cjDNU0`N@dQ*qhLeInF<t`=4@kBIW|!VhfHm(-OSk{y`m;}r~p~6
zb2bz73S)OfhT}YJr*CjGPIxC`w>cZ}$xXxPIeR;2n`vfeKhUsIS+zMERF>a%&bGp^
zOPjM9bUSC;0GB!2M78Ic?QQ046BE)QGHBe++29(1r@Wc78Pn^W%|P2Zn*q%<FEsD^
zQyF;uqz<_9WXANcQ-ng5&ZizmSS8qa?-N5*aqcqxK2A|%br}~YTJVI{X)7{DM<tI_
z5Up6l#E=2+9Fc?Sb?UZ^S7>JFUCQ_w@hze%7XUE?9T=f7FJ=<SlywE|nLcBF69#6>
z<S1BVWQV~bZ7T;v$Y<az>!PGiSa3$lZUCTGf(VltI+v3eH3rn8X+WC7tj3*Yc_svC
zyaDn_#!5X7v1LNAfGD+-^KhU@w*tp;40G*G79dO$DVRrVONg|S2q(@+LTwj827}*#
zz(?aiYd9C1YzrZ<o~Z7?w)2EkG?URBJwi7gxWXn{(mB8YI1Q@VJDokA1<n;pkY&=!
z_!U@+-orm$1Q85)%9NQo`%E_xG_9Vef)kVDZh_VhAIx;W_&PXIl|~13s*Vv5JAu*J
zjFBEMAxfVl$`v-@nL!h9=rkxX1rJX6Lc!@00hJCE8w_|2p3Q_jN~MB9c-CB;Xjti7
zVQOix&S}~%G$(-afT9SM2C7If0mw06#X*QNWc3xJuJup@!3Qx0(b-^2>(p8~E)R5+
zLj!2NXl=rT0ePBWU0OT<L;~D-j5%@p!ODP96qPeEpHZ(GP3CFn9_khl^5)j1;%h*(
z&8j&{qTu6Zh^Q$6xCtPjz#}OD-yLa0G5q_k{of?o7E{P9+#qq*BZ3N6I*-yh0uS`W
z_!KRk0X4_cMGBm(K&q~sut*th;^F`gC&qE<kT4PyJ%t!Zlq-x-Kv<C9Y*&JkFw8_F
zYkDx@vUU56h2dY33m}IIbcuCJ;#N4C>odqYdy&gO+!s8*=IY_6$Bwolo-oasTMbKq
zB^E0J69mxt$lZtv6y2H-;YuuqIyMnb@#iq&vNaYrpduepiwH#KK&E6LtKR|Hs#ebw
zGd=|(9->wx&?%y|mB<k<Vs26r2T1@W7zitBxu*!cEff|AR7_a$%?rW}H3r-7bW4>o
z*IpoRCsXQF$B}|_NQzNhqrqJ%QMjz~7`cLe!pQL-YKOp07WZkS9-_{KG>|YAsX~^<
zsgt4$(pSFGI1eBdpte$;%;bwY%Vk+vrwhh1DV@1CYb6jkNF~URCL^?4J}SLb%fFfP
z+o^#%t>|)`n2<vV#>E9x*~-9c<{FHUN#0PnAWl+c5hMa6)oi}XX@x;CvLMJ3J69;)
zS5(<tA)!FkdJVSK(F&#HP{u+<hOovs<r%XV166w=BvE)7Q0q_z(W!#C))mNeq1ftJ
zhq;!mG}&{Rp_7#dvN)-zSsziKcs66!8xWq2z_rzYX7zV!pGOXpqZMu>d~RY(_*CQc
zo5N%?ZqhdPr-JvA=^K}nBfh%=3BKeMUqD=(PLvJ|)VLu=?_9`AXr&mI6@v$uuAa*P
zubDdPcg*C_#$x>FhwB&So-)$5is?U3<;K@wurQJ`P#U@zF#o0tR@LR`vuX#3vYwV>
za0WAN8YY9-d7Et6=u)Dwb=12`L%I;*;@S~YkqyPc#Oxe#i+ZS`mWoqKbxMmQNJOd;
zN5VZ73xy9wfUbs_F;`iy;x~}0Md~+#^k$s`JuFdEHEj4UF;wjr%i6KU4s}^V#;J-D
zeWY&WR{ONZ1)I$UjadxQfK-gSF;|ggq3R)+ZQiUiJr|m38x~s#M1V-y%=Zo(iy<hH
z(+TC0Cx%sWCSgQrYc;=BPG+VhTP^*;BYk8vePZG@1d)|C%>_j?r9Da}vSn(nmX+FC
z=xJsuzq$w9n2WuoR<RlJgTNJMar)oW??k(CX>Bxjj3R7Sij}2iCLL75+zAYBPOflc
zjg~2P!;8TlX2tAd!-?U02)4nue7x}J3SuN0Ru$PTS>bLXuN8-<aNw2>?&yaEk*<sg
z#9GEY6X9$Ha_c}sC^w^g9Wv?*6hn?M<xaSZfp7^rFi}BrGbk$MgB#%~9@>Z`yB2B*
z2kjKzt}r79oCa-2mgdrcIIu`7d8VAQ1Tt7$$uXXE7gGq|BrPahkk~qVXs<R?7(=j$
zfvfyvmaA;cS9E1TdB-P0iZ6|I3)yUEPC~`MM*9`xCfwW6y25IbG`yP!vxLT~E#9ig
zfW_%Fl(}<$n?UMze<9pJMhEx|xKdmY78)=QV~v&NkP=}R<*x=~QZW^67v4$nw$!xr
zz<47t>?t%bF<^9%Ro%(B)u|Of7zfId(w`+Kh#aC!8K8~pR_YjL8TbP(OV5ObVa7C`
zv{^J>D#Deb@Bq3z^(}=XbyIbpxUkE@2GgY<iHR0PA(Mh!U&7IJkmePC9QA8e0mPOz
zk(@$iD+%9Eyp|O@N)=WqNoCa^<TX;5z8%wNeIz0v)K895R|e`UOtk<o^-z)(F^}$_
zAp>98Q3-EBj8Gcdx)V0WL?$lS7@IJ%qn5!WW_?oz8?4voBnHVtrfvmd`#5K29H*-l
z1|dv-pn@Snl^DHqm6)zEhbmXpQ00oq89Nez=$%1;;O=W^li42l)JvZf)la>c$wmA8
zh@`do`t&bXSJ%he?pu9*sjsx^*Qj5gziA(do_%?E{r3F#e#a?H>!+jW#Xe(wc71g`
zTyY}7%79<%Yt>_iMhj^3t&~8O2Ys0K*SD`BwG#&~yM^Ls*YDZu?$Li+zb9S3x+1%6
zFp0riJ8)(E+4=GO;`+_qtv}x!zTZ)c?5gYP?~cez2M)OXbnC5OM`|fQJ{IIi{Wc)l
zrW25cMR!09y5uDKEgLlvJi+B0Upt<xqH10@9&gUyUL0<A65AKg5!%PM*O!M+x{u$!
t{-lcT?B(_Kv6EQJC&p*5-v0Xlj|l(vcz$y%Ofzno<L;x6UVQc0e*hh`$4LMH

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/Debug.storyboard b/DuckDuckGo/Debug.storyboard
index 0b94ca5c81..9b09d31187 100644
--- a/DuckDuckGo/Debug.storyboard
+++ b/DuckDuckGo/Debug.storyboard
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="fgi-g1-scz">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="fgi-g1-scz">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -100,9 +100,29 @@
                                             <segue destination="LFy-OG-fNH" kind="show" id="DCC-nB-uNh"/>
                                         </connections>
                                     </tableViewCell>
-                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="7ww-90-JRe" style="IBUITableViewCellStyleDefault" id="JCZ-C4-Lqt">
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="fF5-D9-4Dp" style="IBUITableViewCellStyleDefault" id="qss-x4-qfK">
                                         <rect key="frame" x="0.0" y="224" width="414" height="43.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qss-x4-qfK" id="2S0-2U-Ulw">
+                                            <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="VPN Waitlist" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="fF5-D9-4Dp">
+                                                    <rect key="frame" x="20" y="0.0" width="355.5" height="43.5"/>
+                                                    <autoresizingMask key="autoresizingMask"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <nil key="textColor"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                            </subviews>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <segue destination="Epm-vW-SWK" kind="show" id="1qU-ye-Zfb"/>
+                                        </connections>
+                                    </tableViewCell>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="7ww-90-JRe" style="IBUITableViewCellStyleDefault" id="JCZ-C4-Lqt">
+                                        <rect key="frame" x="0.0" y="267.5" width="414" height="43.5"/>
+                                        <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JCZ-C4-Lqt" id="6mZ-6g-zdm">
                                             <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
                                             <autoresizingMask key="autoresizingMask"/>
@@ -121,7 +141,7 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="9tW-s6-Ucm" style="IBUITableViewCellStyleDefault" id="33e-7H-wLX">
-                                        <rect key="frame" x="0.0" y="267.5" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="311" width="414" height="43.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="33e-7H-wLX" id="o8B-m6-aIJ">
                                             <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
@@ -141,7 +161,7 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="2ek-Np-pS5" style="IBUITableViewCellStyleDefault" id="Lxe-cb-Ocp">
-                                        <rect key="frame" x="0.0" y="311" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="354.5" width="414" height="43.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Lxe-cb-Ocp" id="yJy-q8-10T">
                                             <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
@@ -161,7 +181,7 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="3I9-TA-KKr" style="IBUITableViewCellStyleDefault" id="0tb-2l-dsc">
-                                        <rect key="frame" x="0.0" y="354.5" width="414" height="43.5"/>
+                                        <rect key="frame" x="0.0" y="398" width="414" height="43.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0tb-2l-dsc" id="poM-jf-dYy">
                                             <rect key="frame" x="0.0" y="0.0" width="383.5" height="43.5"/>
@@ -181,7 +201,7 @@
                                         </connections>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" tag="665" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="iau-ES-Bnx">
-                                        <rect key="frame" x="0.0" y="398" width="414" height="44.5"/>
+                                        <rect key="frame" x="0.0" y="441.5" width="414" height="44.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="iau-ES-Bnx" id="DHw-no-bUr">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="44.5"/>
@@ -190,7 +210,7 @@
                                         <listContentConfiguration key="contentConfiguration" text="Reset Autoconsent Settings"/>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" tag="670" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="d5f-gY-QEd">
-                                        <rect key="frame" x="0.0" y="442.5" width="414" height="44.5"/>
+                                        <rect key="frame" x="0.0" y="486" width="414" height="44.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="d5f-gY-QEd" id="vx4-HG-neV">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="44.5"/>
@@ -199,7 +219,7 @@
                                         <listContentConfiguration key="contentConfiguration" text="Reset Email Protection InContext Signup"/>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" tag="668" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="checkmark" indentationWidth="10" id="f8n-C1-CnF">
-                                        <rect key="frame" x="0.0" y="487" width="414" height="44.5"/>
+                                        <rect key="frame" x="0.0" y="530.5" width="414" height="44.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="f8n-C1-CnF" id="Gna-nE-FtW">
                                             <rect key="frame" x="0.0" y="0.0" width="370" height="44.5"/>
@@ -208,7 +228,7 @@
                                         <listContentConfiguration key="contentConfiguration" text="Enable Inspectable WebViews" secondaryText=""/>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" tag="669" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="checkmark" indentationWidth="10" id="AgK-xW-xB6">
-                                        <rect key="frame" x="0.0" y="531.5" width="414" height="44.5"/>
+                                        <rect key="frame" x="0.0" y="575" width="414" height="44.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="AgK-xW-xB6" id="onY-PV-AQp">
                                             <rect key="frame" x="0.0" y="0.0" width="370" height="44.5"/>
@@ -217,7 +237,7 @@
                                         <listContentConfiguration key="contentConfiguration" text="Internal User State" secondaryText=""/>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" tag="666" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="Lqc-aq-UoJ">
-                                        <rect key="frame" x="0.0" y="576" width="414" height="44.5"/>
+                                        <rect key="frame" x="0.0" y="619.5" width="414" height="44.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Lqc-aq-UoJ" id="SOZ-8q-BYe">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="44.5"/>
@@ -226,7 +246,7 @@
                                         <listContentConfiguration key="contentConfiguration" text="Crash (fatal error)"/>
                                     </tableViewCell>
                                     <tableViewCell clipsSubviews="YES" tag="667" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="roW-Eb-6hF">
-                                        <rect key="frame" x="0.0" y="620.5" width="414" height="44.5"/>
+                                        <rect key="frame" x="0.0" y="664" width="414" height="44.5"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="roW-Eb-6hF" id="1IO-6X-jOv">
                                             <rect key="frame" x="0.0" y="0.0" width="414" height="44.5"/>
@@ -660,7 +680,7 @@
                 </tableViewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="Vw1-aJ-BgA" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="4042" y="989"/>
+            <point key="canvasLocation" x="4029" y="968"/>
         </scene>
         <!--Sync Info-->
         <scene sceneID="A1E-XU-w8R">
@@ -707,20 +727,83 @@
             </objects>
             <point key="canvasLocation" x="2546" y="968"/>
         </scene>
+        <!--VPN Waitlist-->
+        <scene sceneID="wDD-iF-riz">
+            <objects>
+                <tableViewController id="Epm-vW-SWK" userLabel="VPN Waitlist" customClass="VPNWaitlistDebugViewController" customModule="DuckDuckGo" customModuleProvider="target" sceneMemberID="viewController">
+                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="Y47-Iy-i5u">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <prototypes>
+                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="DetailCell" textLabel="AdP-AA-8eC" detailTextLabel="eq7-NX-zgZ" style="IBUITableViewCellStyleValue1" id="zlu-rx-yhe">
+                                <rect key="frame" x="0.0" y="55.5" width="414" height="43.5"/>
+                                <autoresizingMask key="autoresizingMask"/>
+                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="zlu-rx-yhe" id="fgM-dh-8g6">
+                                    <rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                    <subviews>
+                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="AdP-AA-8eC">
+                                            <rect key="frame" x="20" y="12" width="33" height="20.5"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
+                                            <nil key="textColor"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" id="eq7-NX-zgZ">
+                                            <rect key="frame" x="350" y="12" width="44" height="20.5"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
+                                            <color key="textColor" systemColor="secondaryLabelColor"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                </tableViewCellContentView>
+                            </tableViewCell>
+                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="ActionCell" textLabel="169-2V-3JR" style="IBUITableViewCellStyleDefault" id="nQx-F8-B73">
+                                <rect key="frame" x="0.0" y="99" width="414" height="43.5"/>
+                                <autoresizingMask key="autoresizingMask"/>
+                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="nQx-F8-B73" id="uZy-Sb-88o">
+                                    <rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                    <subviews>
+                                        <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Action" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="169-2V-3JR">
+                                            <rect key="frame" x="20" y="0.0" width="374" height="43.5"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
+                                            <color key="textColor" systemColor="systemBlueColor"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                </tableViewCellContentView>
+                            </tableViewCell>
+                        </prototypes>
+                        <sections/>
+                        <connections>
+                            <outlet property="dataSource" destination="Epm-vW-SWK" id="7wU-Nd-uuz"/>
+                            <outlet property="delegate" destination="Epm-vW-SWK" id="7sH-BQ-Qh2"/>
+                        </connections>
+                    </tableView>
+                    <navigationItem key="navigationItem" title="VPN Waitlist" id="Jdu-5q-Vqr"/>
+                </tableViewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="QaV-OV-ECp" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="4699" y="968"/>
+        </scene>
     </scenes>
     <resources>
         <image name="Logo" width="128" height="128"/>
         <systemColor name="labelColor">
-            <color red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
         <systemColor name="secondaryLabelColor">
-            <color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
+            <color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
         </systemColor>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
         <systemColor name="systemBlueColor">
-            <color red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <color red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
         </systemColor>
     </resources>
 </document>
diff --git a/DuckDuckGo/Info.plist b/DuckDuckGo/Info.plist
index d681c054b6..94ad683aca 100644
--- a/DuckDuckGo/Info.plist
+++ b/DuckDuckGo/Info.plist
@@ -4,6 +4,7 @@
 <dict>
 	<key>BGTaskSchedulerPermittedIdentifiers</key>
 	<array>
+		<string>com.duckduckgo.app.vpnWaitlistStatus</string>
 		<string>com.duckduckgo.app.windowsBrowserWaitlistStatus</string>
 		<string>com.duckduckgo.app.configurationRefresh</string>
 		<string>com.duckduckgo.app.remoteMessageRefresh</string>
diff --git a/DuckDuckGo/MacBrowserWaitlist.swift b/DuckDuckGo/MacBrowserWaitlist.swift
index 60a0bfb413..0779de05b9 100644
--- a/DuckDuckGo/MacBrowserWaitlist.swift
+++ b/DuckDuckGo/MacBrowserWaitlist.swift
@@ -34,7 +34,7 @@ struct MacBrowserWaitlist: Waitlist {
 
     static let backgroundTaskName = "Mac Browser Waitlist Status Task"
     static let backgroundRefreshTaskIdentifier = "com.duckduckgo.app.macBrowserWaitlistStatus"
-    static let notificationIdentitier = "com.duckduckgo.ios.mac-browser.invite-code-available"
+    static let notificationIdentifier = "com.duckduckgo.ios.mac-browser.invite-code-available"
     static let inviteAvailableNotificationTitle = UserText.macWaitlistAvailableNotificationTitle
     static let inviteAvailableNotificationBody = UserText.waitlistAvailableNotificationBody
 
diff --git a/DuckDuckGo/NetworkProtectionAccessController.swift b/DuckDuckGo/NetworkProtectionAccessController.swift
new file mode 100644
index 0000000000..7b1faaacce
--- /dev/null
+++ b/DuckDuckGo/NetworkProtectionAccessController.swift
@@ -0,0 +1,125 @@
+//
+//  NetworkProtectionAccessController.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import Foundation
+import BrowserServicesKit
+import ContentBlocking
+import Core
+import NetworkProtection
+import Waitlist
+
+enum NetworkProtectionAccessType {
+    /// Used if the user does not have waitlist feature flag access
+    case none
+
+    /// Used if the user has waitlist feature flag access, but has not joined the waitlist
+    case waitlistAvailable
+
+    /// Used if the user has waitlist feature flag access, and has joined the waitlist
+    case waitlistJoined
+
+    /// Used if the user has been invited via the waitlist, but needs to accept the Privacy Policy and Terms of Service
+    case waitlistInvitedPendingTermsAcceptance
+
+    /// Used if the user has been invited via the waitlist and has accepted the Privacy Policy and Terms of Service
+    case waitlistInvited
+
+    /// Used if the user has been invited to test Network Protection directly
+    case inviteCodeInvited
+}
+
+protocol NetworkProtectionAccess {
+    func networkProtectionAccessType() -> NetworkProtectionAccessType
+}
+
+struct NetworkProtectionAccessController: NetworkProtectionAccess {
+
+    private let networkProtectionActivation: NetworkProtectionFeatureActivation
+    private let networkProtectionWaitlistStorage: WaitlistStorage
+    private let networkProtectionTermsAndConditionsStore: NetworkProtectionTermsAndConditionsStore
+    private let featureFlagger: FeatureFlagger
+
+    init(
+        networkProtectionActivation: NetworkProtectionFeatureActivation = NetworkProtectionKeychainTokenStore(),
+        networkProtectionWaitlistStorage: WaitlistStorage = WaitlistKeychainStore(waitlistIdentifier: VPNWaitlist.identifier),
+        networkProtectionTermsAndConditionsStore: NetworkProtectionTermsAndConditionsStore = NetworkProtectionTermsAndConditionsUserDefaultsStore(),
+        featureFlagger: FeatureFlagger = AppDependencyProvider.shared.featureFlagger
+    ) {
+        self.networkProtectionActivation = networkProtectionActivation
+        self.networkProtectionWaitlistStorage = networkProtectionWaitlistStorage
+        self.networkProtectionTermsAndConditionsStore = networkProtectionTermsAndConditionsStore
+        self.featureFlagger = featureFlagger
+    }
+
+    func networkProtectionAccessType() -> NetworkProtectionAccessType {
+        // First, check for users who have activated the VPN via an invite code:
+        if networkProtectionActivation.isFeatureActivated && !networkProtectionWaitlistStorage.isInvited {
+            return .inviteCodeInvited
+        }
+
+        // Next, check if the waitlist is still active; if not, the user has no access.
+        let isWaitlistActive = featureFlagger.isFeatureOn(.networkProtectionWaitlistActive)
+        if !isWaitlistActive {
+            return .none
+        }
+
+        // Next, check if a waitlist user has NetP access and whether they need to accept T&C.
+        if networkProtectionActivation.isFeatureActivated && networkProtectionWaitlistStorage.isInvited {
+            if networkProtectionTermsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted {
+                return .waitlistInvited
+            } else {
+                return .waitlistInvitedPendingTermsAcceptance
+            }
+        }
+
+        // Next, check if the user has waitlist access at all and whether they've already joined.
+        let hasWaitlistAccess = featureFlagger.isFeatureOn(.networkProtectionWaitlistAccess)
+        if hasWaitlistAccess {
+            if networkProtectionWaitlistStorage.isOnWaitlist {
+                return .waitlistJoined
+            } else {
+                return .waitlistAvailable
+            }
+        }
+
+        return .none
+    }
+
+    func refreshNetworkProtectionAccess() {
+        guard networkProtectionActivation.isFeatureActivated else {
+            return
+        }
+
+        if !featureFlagger.isFeatureOn(.networkProtectionWaitlistActive) {
+            networkProtectionWaitlistStorage.deleteWaitlistState()
+            try? NetworkProtectionKeychainTokenStore().deleteToken()
+
+            Task {
+                let controller = NetworkProtectionTunnelController()
+                await controller.stop()
+                await controller.removeVPN()
+            }
+        }
+    }
+
+}
+
+#endif
diff --git a/DuckDuckGo/NetworkProtectionTermsAndConditionsStore.swift b/DuckDuckGo/NetworkProtectionTermsAndConditionsStore.swift
new file mode 100644
index 0000000000..46a6c024e2
--- /dev/null
+++ b/DuckDuckGo/NetworkProtectionTermsAndConditionsStore.swift
@@ -0,0 +1,32 @@
+//
+//  NetworkProtectionTermsAndConditionsStore.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+import Core
+
+protocol NetworkProtectionTermsAndConditionsStore {
+    var networkProtectionWaitlistTermsAndConditionsAccepted: Bool { get set }
+}
+
+struct NetworkProtectionTermsAndConditionsUserDefaultsStore: NetworkProtectionTermsAndConditionsStore {
+
+    @UserDefaultsWrapper(key: .networkProtectionWaitlistTermsAndConditionsAccepted, defaultValue: false)
+    var networkProtectionWaitlistTermsAndConditionsAccepted: Bool
+
+}
diff --git a/DuckDuckGo/NetworkProtectionTunnelController.swift b/DuckDuckGo/NetworkProtectionTunnelController.swift
index 96e53f989e..2a1d1b6f8c 100644
--- a/DuckDuckGo/NetworkProtectionTunnelController.swift
+++ b/DuckDuckGo/NetworkProtectionTunnelController.swift
@@ -67,6 +67,10 @@ final class NetworkProtectionTunnelController: TunnelController {
         tunnelManager.connection.stopVPNTunnel()
     }
 
+    func removeVPN() async {
+        try? await tunnelManager?.removeFromPreferences()
+    }
+
     // MARK: - Connection Status Querying
 
     /// Queries Network Protection to know if its VPN is connected.
diff --git a/DuckDuckGo/SettingsViewController.swift b/DuckDuckGo/SettingsViewController.swift
index 4820200190..3a8a70a8a6 100644
--- a/DuckDuckGo/SettingsViewController.swift
+++ b/DuckDuckGo/SettingsViewController.swift
@@ -184,6 +184,10 @@ class SettingsViewController: UITableViewController {
         configureWindowsBrowserWaitlistCell()
         configureSyncCell()
 
+#if NETWORK_PROTECTION
+        updateNetPCellSubtitle(connectionStatus: connectionObserver.recentValue)
+#endif
+
         // Make sure multiline labels are correctly presented
         tableView.setNeedsLayout()
         tableView.layoutIfNeeded()
@@ -355,22 +359,30 @@ class SettingsViewController: UITableViewController {
     private func configureNetPCell() {
         netPCell.isHidden = !shouldShowNetPCell
 #if NETWORK_PROTECTION
+        updateNetPCellSubtitle(connectionStatus: connectionObserver.recentValue)
         connectionObserver.publisher
             .receive(on: DispatchQueue.main)
             .sink { [weak self] status in
-                let detailText: String
-                switch status {
-                case .connected:
-                    detailText = UserText.netPCellConnected
-                default:
-                    detailText = UserText.netPCellDisconnected
-                }
-                self?.netPCell.detailTextLabel?.text = detailText
+                self?.updateNetPCellSubtitle(connectionStatus: status)
             }
             .store(in: &cancellables)
 #endif
     }
 
+#if NETWORK_PROTECTION
+    private func updateNetPCellSubtitle(connectionStatus: ConnectionStatus) {
+        switch NetworkProtectionAccessController().networkProtectionAccessType() {
+        case .none, .waitlistAvailable, .waitlistJoined, .waitlistInvitedPendingTermsAcceptance:
+            netPCell.detailTextLabel?.text = VPNWaitlist.shared.settingsSubtitle
+        case .waitlistInvited, .inviteCodeInvited:
+            switch connectionStatus {
+            case .connected: netPCell.detailTextLabel?.text = UserText.netPCellConnected
+            default: netPCell.detailTextLabel?.text = UserText.netPCellDisconnected
+            }
+        }
+    }
+#endif
+
     private func configureDebugCell() {
         debugCell.isHidden = !shouldShowDebugCell
     }
@@ -426,14 +438,21 @@ class SettingsViewController: UITableViewController {
 #if NETWORK_PROTECTION
     @available(iOS 15, *)
     private func showNetP() {
-        // This will be tidied up as part of https://app.asana.com/0/0/1205084446087078/f
-        let rootViewController = NetworkProtectionRootViewController { [weak self] in
-            self?.navigationController?.popViewController(animated: true)
-            let newRootViewController = NetworkProtectionRootViewController()
-            self?.pushNetP(newRootViewController)
+        switch NetworkProtectionAccessController().networkProtectionAccessType() {
+        case .inviteCodeInvited, .waitlistInvited:
+            // This will be tidied up as part of https://app.asana.com/0/0/1205084446087078/f
+            let rootViewController = NetworkProtectionRootViewController { [weak self] in
+                self?.navigationController?.popViewController(animated: true)
+                let newRootViewController = NetworkProtectionRootViewController()
+                self?.pushNetP(newRootViewController)
+            }
+
+            pushNetP(rootViewController)
+        default:
+            navigationController?.pushViewController(VPNWaitlistViewController(nibName: nil, bundle: nil), animated: true)
         }
-        pushNetP(rootViewController)
     }
+
     @available(iOS 15, *)
     private func pushNetP(_ rootViewController: NetworkProtectionRootViewController) {
         navigationController?.pushViewController(
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 836fd5538a..6b15c281f1 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -622,7 +622,7 @@ In addition to the details entered into this form, your app issue report will co
     public static let netPCellConnected = NSLocalizedString("netP.cell.connected", value: "Connected", comment: "String indicating NetP is connected when viewed from the settings screen")
     public static let netPCellDisconnected = NSLocalizedString("netP.cell.disconnected", value: "Not connected", comment: "String indicating NetP is disconnected when viewed from the settings screen")
 
-    static let netPInviteTitle = NSLocalizedString("network.protection.invite.dialog.title", value: "You're invited to try Network Protection", comment: "Title for the network protection invite screen")
+    static let netPInviteTitle = NSLocalizedString("network.protection.invite.dialog.title", value: "You’re invited to try Network Protection", comment: "Title for the network protection invite screen")
     static let netPInviteMessage = NSLocalizedString("network.protection.invite.dialog.message", value: "Enter your invite code to get started.", comment: "Message for the network protection invite dialog")
     static let netPInviteFieldPrompt = NSLocalizedString("network.protection.invite.field.prompt", value: "Invite Code", comment: "Prompt for the network protection invite code text field")
     static let netPInviteSuccessTitle = NSLocalizedString("network.protection.invite.success.title", value: "Success! You’re in.", comment: "Title for the network protection invite success view")
@@ -889,4 +889,49 @@ But if you *do* want a peek under the hood, you can find more information about
     static let emailProtectionSignInBody = NSLocalizedString("error.email-protection-sign-in.body", value: "Sorry, please sign in again to re-enable Email Protection features on this browser.", comment: "Alert message")
     static let emailProtectionSignInAction = NSLocalizedString("error.email-protection-sign-in.action", value: "Sign In", comment: "Button title to Sign In")
 
+    // MARK: - VPN Waitlist
+
+    static let networkProtectionWaitlistJoinTitle = NSLocalizedString("network-protection.waitlist.join.title", value: "Network Protection Early Access", comment: "Title for Network Protection join waitlist screen")
+    static let networkProtectionWaitlistJoinSubtitle1 = NSLocalizedString("network-protection.waitlist.join.subtitle.1", value: "Secure your connection anytime, anywhere with Network Protection, the VPN from DuckDuckGo.", comment: "First subtitle for Network Protection join waitlist screen")
+    static let networkProtectionWaitlistJoinSubtitle2 = NSLocalizedString("network-protection.waitlist.join.subtitle.2", value: "Join the waitlist, and we’ll notify you when it’s your turn.", comment: "Second subtitle for Network Protection join waitlist screen")
+
+    static let networkProtectionWaitlistJoinedTitle = NSLocalizedString("network-protection.waitlist.joined.title", value: "You’re on the list!", comment: "Title for Network Protection joined waitlist screen")
+    static let networkProtectionWaitlistJoinedWithNotificationsSubtitle1 = NSLocalizedString("network-protection.waitlist.joined.with-notifications.subtitle.1", value: "New invites are sent every few days, on a first come, first served basis.", comment: "Subtitle 1 for Network Protection joined waitlist screen when notifications are enabled")
+    static let networkProtectionWaitlistJoinedWithNotificationsSubtitle2 = NSLocalizedString("network-protection.waitlist.joined.with-notifications.subtitle.2", value: "We’ll notify you when your invite is ready.", comment: "Subtitle 2 for Network Protection joined waitlist screen when notifications are enabled")
+
+    static let networkProtectionWaitlistNotificationTitle = NSLocalizedString("network-protection.waitlist.notification.title", value: "Network Protection is ready!", comment: "Title for Network Protection waitlist notification")
+    static let networkProtectionWaitlistNotificationText = NSLocalizedString("network-protection.waitlist.notification.text", value: "Open your invite", comment: "Title for Network Protection waitlist notification")
+
+    static let networkProtectionWaitlistInvitedTitle = NSLocalizedString("network-protection.waitlist.invited.title", value: "You’re invited to try\nNetwork Protection early access!", comment: "Title for Network Protection invited screen")
+    static let networkProtectionWaitlistInvitedSubtitle = NSLocalizedString("network-protection.waitlist.invited.subtitle", value: "Get an extra layer of protection online with the VPN built for speed and simplicity. Encrypt your internet connection across your entire device and hide your location and IP address from sites you visit.", comment: "Subtitle for Network Protection invited screen")
+
+    static let networkProtectionWaitlistInvitedSection1Title = NSLocalizedString("network-protection.waitlist.invited.section-1.title", value: "Full-device coverage", comment: "Title for section 1 of the Network Protection invited screen")
+    static let networkProtectionWaitlistInvitedSection1Subtitle = NSLocalizedString("network-protection.waitlist.invited.section-1.subtitle", value: "Encrypt online traffic across your browsers and apps.", comment: "Subtitle for section 1 of the Network Protection invited screen")
+
+    static let networkProtectionWaitlistInvitedSection2Title = NSLocalizedString("network-protection.waitlist.invited.section-2.title", value: "Fast, reliable, and easy to use", comment: "Title for section 2 of the Network Protection invited screen")
+    static let networkProtectionWaitlistInvitedSection2Subtitle = NSLocalizedString("network-protection.waitlist.invited.section-2.subtitle", value: "No need for a separate app. Connect in one click and see your connection status at a glance.", comment: "Subtitle for section 2 of the Network Protection invited screen")
+
+    static let networkProtectionWaitlistInvitedSection3Title = NSLocalizedString("network-protection.waitlist.invited.section-3.title", value: "Strict no-logging policy", comment: "Title for section 3 of the Network Protection invited screen")
+    static let networkProtectionWaitlistInvitedSection3Subtitle = NSLocalizedString("network-protection.waitlist.invited.section-3.subtitle", value: "We do not log or save any data that can connect you to your online activity.", comment: "Subtitle for section 3 of the Network Protection invited screen")
+
+    static let networkProtectionWaitlistButtonEnableNotifications = NSLocalizedString("network-protection.waitlist.button.enable-notifications", value: "Enable Notifications", comment: "Enable Notifications button for Network Protection joined waitlist screen")
+    static let networkProtectionWaitlistButtonJoinWaitlist = NSLocalizedString("network-protection.waitlist.button.join-waitlist", value: "Join the Waitlist", comment: "Join Waitlist button for Network Protection join waitlist screen")
+    static let networkProtectionWaitlistButtonAgreeAndContinue = NSLocalizedString("network-protection.waitlist.button.agree-and-continue", value: "Agree and Continue", comment: "Agree and Continue button for Network Protection join waitlist screen")
+    static let networkProtectionWaitlistButtonExistingInviteCode = NSLocalizedString("network-protection.waitlist.button.existing-invite-code", value: "I Have an Invite Code", comment: "Button title for users who already have an invite code")
+
+    static let networkProtectionWaitlistAvailabilityDisclaimer = NSLocalizedString("network-protection.waitlist.availability-disclaimer", value: "Network Protection is free to use during early access.", comment: "Availability disclaimer for Network Protection join waitlist screen")
+
+    static let networkProtectionPrivacyPolicyTitle = NSLocalizedString("network-protection.privacy-policy.title", value: "Privacy Policy", comment: "Privacy Policy title for Network Protection")
+
+    static let networkProtectionWaitlistNotificationAlertDescription = NSLocalizedString("network-protection.waitlist.notification-alert.description", value: "We’ll send you a notification when your invite to test Network Protection is ready.", comment: "Body text for the alert to enable notifications")
+
+    static let networkProtectionWaitlistGetStarted = NSLocalizedString("network-protection.waitlist.get-started", value: "Get Started", comment: "Button title text for the Network Protection waitlist confirmation prompt")
+    static let networkProtectionWaitlistAgreeAndContinue = NSLocalizedString("network-protection.waitlist.agree-and-continue", value: "Agree and Continue", comment: "Title text for the Network Protection terms and conditions accept button")
+
+    static let networkProtectionSettingsSubtitleNotJoined = NSLocalizedString("network-protection.waitlist.settings-subtitle.waitlist-not-joined", value: "Join the private waitlist", comment: "Subtitle text for the Network Protection settings row")
+    static let networkProtectionSettingsSubtitleJoinedButNotInvited = NSLocalizedString("network-protection.waitlist.settings-subtitle.joined-but-not-invited", value: "You’re on the list!", comment: "Subtitle text for the Network Protection settings row")
+    static let networkProtectionSettingsSubtitleJoinedAndInvited = NSLocalizedString("network-protection.waitlist.settings-subtitle.joined-and-invited", value: "Your invite is ready!", comment: "Subtitle text for the Network Protection settings row")
+
+    static let networkProtectionNotificationPromptTitle = NSLocalizedString("network-protection.waitlist.notification-prompt-title", value: "Know the instant you're invited", comment: "Title for the alert to confirm enabling notifications")
+    static let networkProtectionNotificationPromptDescription = NSLocalizedString("network-protection.waitlist.notification-prompt-description", value: "Get a notification when your copy of Network Protection early access is ready.", comment: "Subtitle for the alert to confirm enabling notifications")
 }
diff --git a/DuckDuckGo/VPNWaitlist.swift b/DuckDuckGo/VPNWaitlist.swift
new file mode 100644
index 0000000000..522a31a414
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlist.swift
@@ -0,0 +1,118 @@
+//
+//  VPNWaitlist.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import Foundation
+import BrowserServicesKit
+import Combine
+import Core
+import Waitlist
+import NetworkProtection
+
+final class VPNWaitlist: Waitlist {
+
+    enum AccessType {
+        /// Used if the user does not have waitlist feature flag access
+        case none
+
+        /// Used if the user has waitlist feature flag access, but has not joined the waitlist
+        case waitlistAvailable
+
+        /// Used if the user has waitlist feature flag access, and has joined the waitlist
+        case waitlistJoined
+
+        /// Used if the user has been invited via the waitlist, but needs to accept the Privacy Policy and Terms of Service
+        case waitlistInvitedPendingTermsAcceptance
+
+        /// Used if the user has been invited via the waitlist and has accepted the Privacy Policy and Terms of Service
+        case waitlistInvited
+
+        /// Used if the user has been invited to test Network Protection directly
+        case inviteCodeInvited
+    }
+
+    static let identifier: String = "vpn"
+    static let apiProductName: String = "networkprotection_ios"
+    static let downloadURL: URL = URL.windows
+
+    static let shared: VPNWaitlist = .init()
+
+    static let backgroundTaskName = "VPN Waitlist Status Task"
+    static let backgroundRefreshTaskIdentifier = "com.duckduckgo.app.vpnWaitlistStatus"
+    static let notificationIdentifier = "com.duckduckgo.ios.vpn.invite-code-available"
+    static let inviteAvailableNotificationTitle = UserText.networkProtectionWaitlistNotificationTitle
+    static let inviteAvailableNotificationBody = UserText.networkProtectionWaitlistNotificationText
+
+    var isAvailable: Bool {
+        let hasWaitlistAccess = featureFlagger.isFeatureOn(.networkProtectionWaitlistAccess)
+        let isWaitlistActive = featureFlagger.isFeatureOn(.networkProtectionWaitlistActive)
+        return hasWaitlistAccess && isWaitlistActive
+    }
+
+    var isWaitlistRemoved: Bool {
+        return false
+    }
+
+    let waitlistStorage: WaitlistStorage
+    let waitlistRequest: WaitlistRequest
+    private let featureFlagger: FeatureFlagger
+    private let networkProtectionAccess: NetworkProtectionAccess
+
+    init(store: WaitlistStorage, request: WaitlistRequest, featureFlagger: FeatureFlagger, networkProtectionAccess: NetworkProtectionAccess) {
+        self.waitlistStorage = store
+        self.waitlistRequest = request
+        self.featureFlagger = featureFlagger
+        self.networkProtectionAccess = networkProtectionAccess
+    }
+
+    convenience init(store: WaitlistStorage, request: WaitlistRequest) {
+        self.init(
+            store: store,
+            request: request,
+            featureFlagger: AppDependencyProvider.shared.featureFlagger,
+            networkProtectionAccess: NetworkProtectionAccessController()
+        )
+    }
+
+    var settingsSubtitle: String {
+        switch networkProtectionAccess.networkProtectionAccessType() {
+        case .none:
+            return ""
+        case .waitlistAvailable:
+            return UserText.networkProtectionSettingsSubtitleNotJoined
+        case .waitlistJoined:
+            return UserText.networkProtectionSettingsSubtitleJoinedButNotInvited
+        case .waitlistInvitedPendingTermsAcceptance:
+            return UserText.networkProtectionSettingsSubtitleJoinedAndInvited
+        case .waitlistInvited, .inviteCodeInvited:
+            assertionFailure("These states should use the VPN connection status")
+            return ""
+        }
+    }
+
+}
+
+extension WaitlistViewModel.ViewCustomAction {
+    static var openNetworkProtectionInviteCodeScreen = WaitlistViewModel.ViewCustomAction(identifier: "openNetworkProtectionInviteCodeScreen")
+    static var openNetworkProtectionPrivacyPolicyScreen = WaitlistViewModel.ViewCustomAction(identifier: "openNetworkProtectionPrivacyPolicyScreen")
+    static var acceptNetworkProtectionTerms = WaitlistViewModel.ViewCustomAction(identifier: "acceptNetworkProtectionTerms")
+}
+
+#endif
diff --git a/DuckDuckGo/VPNWaitlistDebugViewController.swift b/DuckDuckGo/VPNWaitlistDebugViewController.swift
new file mode 100644
index 0000000000..6b3fa717ef
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlistDebugViewController.swift
@@ -0,0 +1,199 @@
+//
+//  VPNWaitlistDebugViewController.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import UIKit
+import Core
+import BackgroundTasks
+import Waitlist
+
+final class VPNWaitlistDebugViewController: UITableViewController {
+
+    enum Sections: Int, CaseIterable {
+
+        case waitlistInformation
+        case debuggingActions
+
+    }
+
+    private let waitlistInformationTitles = [
+        WaitlistInformationRows.waitlistTimestamp: "Timestamp",
+        WaitlistInformationRows.waitlistToken: "Token",
+        WaitlistInformationRows.waitlistInviteCode: "Invite Code",
+        WaitlistInformationRows.backgroundTask: "Earliest Refresh Date"
+    ]
+
+    enum WaitlistInformationRows: Int, CaseIterable {
+
+        case waitlistTimestamp
+        case waitlistToken
+        case waitlistInviteCode
+        case backgroundTask
+
+    }
+
+    private let debuggingActionTitles = [
+        DebuggingActionRows.resetTermsAndConditionsAcceptance: "Reset T&C Acceptance",
+        DebuggingActionRows.scheduleWaitlistNotification: "Fire Waitlist Notification in 3 seconds",
+        DebuggingActionRows.setMockInviteCode: "Set Mock Invite Code",
+        DebuggingActionRows.deleteInviteCode: "Delete Invite Code"
+    ]
+
+    enum DebuggingActionRows: Int, CaseIterable {
+
+        case resetTermsAndConditionsAcceptance
+        case scheduleWaitlistNotification
+        case setMockInviteCode
+        case deleteInviteCode
+
+    }
+
+    private let storage = WaitlistKeychainStore(waitlistIdentifier: VPNWaitlist.identifier)
+
+    private var backgroundTaskExecutionDate: String?
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        let clearDataItem = UIBarButtonItem(image: UIImage(systemName: "trash")!,
+                                             style: .done,
+                                             target: self,
+                                             action: #selector(presentClearDataPrompt(_:)))
+        clearDataItem.tintColor = .systemRed
+        navigationItem.rightBarButtonItem = clearDataItem
+
+        BGTaskScheduler.shared.getPendingTaskRequests { tasks in
+            if let task = tasks.first(where: { $0.identifier == VPNWaitlist.backgroundRefreshTaskIdentifier }) {
+                let formatter = DateFormatter()
+                formatter.dateStyle = .short
+                formatter.timeStyle = .medium
+
+                self.backgroundTaskExecutionDate = formatter.string(from: task.earliestBeginDate!)
+
+                DispatchQueue.main.async {
+                    self.tableView.reloadData()
+                }
+            }
+        }
+    }
+
+    override func numberOfSections(in tableView: UITableView) -> Int {
+        return Sections.allCases.count
+    }
+
+    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        switch Sections(rawValue: section)! {
+        case .waitlistInformation: return WaitlistInformationRows.allCases.count
+        case .debuggingActions: return DebuggingActionRows.allCases.count
+        }
+    }
+
+    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let section = Sections(rawValue: indexPath.section)!
+
+        switch section {
+        case .waitlistInformation:
+            let cell = tableView.dequeueReusableCell(withIdentifier: "DetailCell", for: indexPath)
+            let row = WaitlistInformationRows(rawValue: indexPath.row)!
+            cell.textLabel?.text = waitlistInformationTitles[row]
+
+            switch row {
+            case .waitlistTimestamp:
+                if let timestamp = storage.getWaitlistTimestamp() {
+                    cell.detailTextLabel?.text = String(timestamp)
+                } else {
+                    cell.detailTextLabel?.text = "None"
+                }
+
+            case .waitlistToken:
+                cell.detailTextLabel?.text = storage.getWaitlistToken() ?? "None"
+
+            case .waitlistInviteCode:
+                cell.detailTextLabel?.text = storage.getWaitlistInviteCode() ?? "None"
+
+            case .backgroundTask:
+                cell.detailTextLabel?.text = backgroundTaskExecutionDate ?? "None"
+            }
+
+            return cell
+
+        case .debuggingActions:
+            let cell = tableView.dequeueReusableCell(withIdentifier: "ActionCell", for: indexPath)
+            let row = DebuggingActionRows(rawValue: indexPath.row)!
+            cell.textLabel?.text = debuggingActionTitles[row]
+
+            return cell
+        }
+
+    }
+
+    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        let section = Sections(rawValue: indexPath.section)!
+
+        switch section {
+        case .waitlistInformation: break
+        case .debuggingActions:
+            let row = DebuggingActionRows(rawValue: indexPath.row)!
+
+            switch row {
+            case .resetTermsAndConditionsAcceptance:
+                var termsAndConditionsStore = NetworkProtectionTermsAndConditionsUserDefaultsStore()
+                termsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted = false
+            case .scheduleWaitlistNotification:
+                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
+                    self.storage.store(inviteCode: "ABCD1234")
+                    VPNWaitlist.shared.sendInviteCodeAvailableNotification()
+                }
+            case .setMockInviteCode:
+                storage.store(inviteCode: "ABCD1234")
+            case .deleteInviteCode:
+                storage.delete(field: .inviteCode)
+                tableView.reloadData()
+            }
+        }
+
+        tableView.deselectRow(at: indexPath, animated: true)
+        tableView.reloadData()
+    }
+
+    @objc
+    private func presentClearDataPrompt(_ sender: AnyObject) {
+        let alert = UIAlertController(title: "Clear Waitlist Data?", message: nil, preferredStyle: .actionSheet)
+
+        if UIDevice.current.userInterfaceIdiom == .pad {
+            alert.popoverPresentationController?.barButtonItem = (sender as? UIBarButtonItem)
+        }
+
+        alert.addAction(UIAlertAction(title: "Clear Data", style: .destructive, handler: { _ in
+            self.clearDataAndReload()
+        }))
+
+        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
+
+        present(alert, animated: true)
+    }
+
+    private func clearDataAndReload() {
+        storage.deleteWaitlistState()
+        tableView.reloadData()
+    }
+}
+
+#endif
diff --git a/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift b/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift
new file mode 100644
index 0000000000..d1f80e13ca
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift
@@ -0,0 +1,73 @@
+//
+//  VPNWaitlistTermsAndConditionsViewController.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import UIKit
+import SwiftUI
+import Core
+import Waitlist
+
+@available(iOS 15.0, *)
+final class VPNWaitlistTermsAndConditionsViewController: UIViewController {
+
+    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
+        super.init(nibName: nil, bundle: nil)
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        title = UserText.networkProtectionWaitlistJoinTitle
+        addHostingControllerToViewHierarchy()
+    }
+
+    private func addHostingControllerToViewHierarchy() {
+        let waitlistView = VPNWaitlistPrivacyPolicyView { _ in
+            var termsAndConditionsStore = NetworkProtectionTermsAndConditionsUserDefaultsStore()
+            termsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted = true
+
+            self.navigationController?.popToRootViewController(animated: true)
+            let networkProtectionViewController = NetworkProtectionRootViewController()
+            self.navigationController?.pushViewController(networkProtectionViewController, animated: true)
+        }
+
+        let waitlistViewController = UIHostingController(rootView: waitlistView)
+        waitlistViewController.view.backgroundColor = UIColor(designSystemColor: .background)
+
+        addChild(waitlistViewController)
+        waitlistViewController.view.translatesAutoresizingMaskIntoConstraints = false
+        view.addSubview(waitlistViewController.view)
+        waitlistViewController.didMove(toParent: self)
+
+        NSLayoutConstraint.activate([
+            waitlistViewController.view.widthAnchor.constraint(equalTo: view.widthAnchor),
+            waitlistViewController.view.heightAnchor.constraint(equalTo: view.heightAnchor),
+            waitlistViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+            waitlistViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
+        ])
+    }
+
+}
+
+#endif
diff --git a/DuckDuckGo/VPNWaitlistUserText.swift b/DuckDuckGo/VPNWaitlistUserText.swift
new file mode 100644
index 0000000000..08c685910a
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlistUserText.swift
@@ -0,0 +1,67 @@
+//
+//  VPNWaitlistUserText.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+
+// swiftlint:disable line_length
+struct VPNWaitlistUserText {
+
+    static let networkProtectionPrivacyPolicySection1Title = "We don’t ask for any personal information from you in order to use this beta service."
+    static let networkProtectionPrivacyPolicySection1ListMarkdown = "This Privacy Policy is for our limited waitlist beta VPN product.\n\nOur main [Privacy Policy](https://duckduckgo.com/privacy) also applies here."
+
+    static let networkProtectionPrivacyPolicySection2Title = "We don’t keep any logs of your online activity."
+    static let networkProtectionPrivacyPolicySection2List = "That means we have no way to tie what you do online to you as an individual and we don’t have any record of things like:\n    • Website visits\n    • DNS requests\n    • Connections made\n    • IP addresses used\n    • Session lengths"
+
+    static let networkProtectionPrivacyPolicySection3Title = "We only keep anonymous performance metrics that we cannot connect to your online activity."
+    static let networkProtectionPrivacyPolicySection3List = "Our servers store generic usage (for example, CPU load) and diagnostic data (for example, errors), but none of that data is connected to any individual’s activity.\n\nWe use this non-identifying information to monitor and ensure the performance and quality of the service, for example to make sure servers aren’t overloaded."
+
+    static let networkProtectionPrivacyPolicySection4Title = "We use dedicated servers for all VPN traffic."
+    static let networkProtectionPrivacyPolicySection4List = "Dedicated servers means they are not shared with anyone else.\n\nWe rent our servers from providers we carefully selected because they meet our privacy requirements.\n\nWe have strict access controls in place so that only limited DuckDuckGo team members have access to our servers."
+
+    static let networkProtectionPrivacyPolicySection5Title = "We protect and limit use of your data when you communicate directly with DuckDuckGo."
+    static let networkProtectionPrivacyPolicySection5List = "If you reach out to us for support by submitting a bug report or through email and agree to be contacted to troubleshoot the issue, we’ll contact you using the information you provide.\n\nIf you participate in a voluntary product survey or questionnaire and agree to provide further feedback, we may contact you using the information you provide.\n\nWe will permanently delete all personal information you provided to us (email, contact information), within 30 days after closing a support case or, in the case of follow up feedback, within 60 days after ending this beta service."
+
+    static let networkProtectionTermsOfServiceTitle = "Terms of Service"
+
+    static let networkProtectionTermsOfServiceSection1Title = "The service is for limited and personal use only."
+    static let networkProtectionTermsOfServiceSection1List = "This service is provided for your personal use only.\n\nYou are responsible for all activity in the service that occurs on or through your device.\n\nThis service may only be used through the DuckDuckGo app on the device on which you are given access. If you delete the DuckDuckGo app, you will lose access to the service.\n\nYou may not use this service through a third-party client."
+
+    static let networkProtectionTermsOfServiceSection2Title = "You agree to comply with all applicable laws, rules, and regulations."
+    static let networkProtectionTermsOfServiceSection2ListMarkdown = "You agree that you will not use the service for any unlawful, illicit, criminal, or fraudulent purpose, or in any manner that could give rise to civil or criminal liability under applicable law.\n\nYou agree to comply with our [DuckDuckGo Terms of Service](https://duckduckgo.com/terms), which are incorporated by reference."
+
+    static let networkProtectionTermsOfServiceSection3Title = "You must be eligible to use this service."
+    static let networkProtectionTermsOfServiceSection3List = "Access to this beta is randomly awarded. You are responsible for ensuring eligibility.\n\nYou must be at least 18 years old and live in a location where use of a VPN is legal in order to be eligible to use this service."
+
+    static let networkProtectionTermsOfServiceSection4Title = "We provide this beta service as-is and without warranty."
+    static let networkProtectionTermsOfServiceSection4List = "This service is provided as-is and without warranties or guarantees of any kind.\n\nTo the extent possible under applicable law, DuckDuckGo will not be liable for any damage or loss arising from your use of the service. In any event, the total aggregate liability of DuckDuckGo shall not exceed $25 or the equivalent in your local currency.\n\nWe may in the future transfer responsibility for the service to a subsidiary of DuckDuckGo.  If that happens, you agree that references to “DuckDuckGo” will refer to our subsidiary, which will then become responsible for providing the service and for any liabilities relating to it."
+
+    static let networkProtectionTermsOfServiceSection5Title = "We may terminate access at any time."
+    static let networkProtectionTermsOfServiceSection5List = "We reserve the right to revoke access to the service at any time in our sole discretion.\n\nWe may also terminate access for violation of these terms, including for repeated infringement of the intellectual property rights of others."
+
+    static let networkProtectionTermsOfServiceSection6Title = "The service is free during the beta period."
+    static let networkProtectionTermsOfServiceSection6List = "Access to this service is currently free of charge, but that is limited to this beta period.\n\nYou understand and agree that this service is provided on a temporary, testing basis only."
+
+    static let networkProtectionTermsOfServiceSection7Title = "We are continually updating the service."
+    static let networkProtectionTermsOfServiceSection7List = "The service is in beta, and we are regularly changing it.\n\nService coverage, speed, server locations, and quality may vary without warning."
+
+    static let networkProtectionTermsOfServiceSection8Title = "We need your feedback."
+    static let networkProtectionTermsOfServiceSection8List = "You may be asked during the beta period to provide feedback about your experience. Doing so is optional and your feedback may be used to improve the service.\n\nIf you have enabled notifications for the DuckDuckGo app, we may use notifications to ask about your experience. You can disable notifications if you do not want to receive them."
+
+}
+// swiftlint:enable line_length
diff --git a/DuckDuckGo/VPNWaitlistView.swift b/DuckDuckGo/VPNWaitlistView.swift
new file mode 100644
index 0000000000..3e5bb91b92
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlistView.swift
@@ -0,0 +1,387 @@
+//
+//  VPNWaitlistView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import SwiftUI
+import Core
+import Waitlist
+import DesignResourcesKit
+
+@available(iOS 15.0, *)
+struct VPNWaitlistView: View {
+
+    @EnvironmentObject var viewModel: WaitlistViewModel
+
+    var body: some View {
+        switch viewModel.viewState {
+        case .notJoinedQueue:
+            VPNWaitlistSignUpView(requestInFlight: false) { action in
+                Task { await viewModel.perform(action: action) }
+            }
+        case .joiningQueue:
+            VPNWaitlistSignUpView(requestInFlight: true) { action in
+                Task { await viewModel.perform(action: action) }
+            }
+        case .joinedQueue(let state):
+            VPNWaitlistJoinedWaitlistView(notificationState: state) { action in
+                Task { await viewModel.perform(action: action) }
+            }
+        case .invited:
+            VPNWaitlistInvitedView { action in
+                Task { await viewModel.perform(action: action) }
+            }
+        case .waitlistRemoved:
+            fatalError("State not supported for VPN waitlists")
+        }
+    }
+}
+
+@available(iOS 15.0, *)
+struct VPNWaitlistSignUpView: View {
+
+    let requestInFlight: Bool
+
+    let action: WaitlistViewActionHandler
+
+    var body: some View {
+        GeometryReader { proxy in
+            ScrollView {
+                VStack(alignment: .center, spacing: 8) {
+                    HeaderView(imageName: "JoinVPNWaitlist", title: UserText.networkProtectionWaitlistJoinTitle)
+
+                    Text(UserText.networkProtectionWaitlistJoinSubtitle1)
+                        .daxBodyRegular()
+                        .foregroundColor(.waitlistTextSecondary)
+                        .multilineTextAlignment(.center)
+                        .lineSpacing(6)
+
+                    Text(UserText.networkProtectionWaitlistJoinSubtitle2)
+                        .daxBodyRegular()
+                        .foregroundColor(.waitlistTextSecondary)
+                        .multilineTextAlignment(.center)
+                        .lineSpacing(6)
+                        .padding(.top, 18)
+
+                    Button(UserText.networkProtectionWaitlistButtonJoinWaitlist, action: { action(.joinQueue) })
+                        .buttonStyle(RoundedButtonStyle(enabled: !requestInFlight))
+                        .padding(.top, 24)
+
+                    Button(UserText.networkProtectionWaitlistButtonExistingInviteCode, action: {
+                        action(.custom(.openNetworkProtectionInviteCodeScreen))
+                    })
+                        .buttonStyle(RoundedButtonStyle(enabled: true, style: .bordered))
+                        .padding(.top, 18)
+
+                    if requestInFlight {
+                        HStack {
+                            Text(UserText.waitlistJoining)
+                                .daxSubheadRegular()
+                                .foregroundColor(.waitlistTextSecondary)
+
+                            ActivityIndicator(style: .medium)
+                        }
+                        .padding(.top, 14)
+                    }
+
+                    Text(UserText.networkProtectionWaitlistAvailabilityDisclaimer)
+                        .font(.footnote)
+                        .foregroundStyle(Color.secondary)
+                        .padding(.top, 24)
+
+                    Spacer()
+                }
+                .padding([.leading, .trailing], 24)
+                .frame(minHeight: proxy.size.height)
+            }
+        }
+    }
+
+}
+
+// MARK: - Joined Waitlist Views
+
+@available(iOS 15.0, *)
+struct VPNWaitlistJoinedWaitlistView: View {
+
+    let notificationState: WaitlistViewModel.NotificationPermissionState
+
+    let action: (WaitlistViewModel.ViewAction) -> Void
+
+    var body: some View {
+        VStack(spacing: 16) {
+            HeaderView(imageName: "JoinedVPNWaitlist", title: UserText.networkProtectionWaitlistJoinedTitle)
+
+            switch notificationState {
+            case .notificationAllowed:
+                Text(UserText.networkProtectionWaitlistJoinedWithNotificationsSubtitle1)
+                    .daxBodyRegular()
+                    .foregroundColor(.waitlistTextSecondary)
+                    .lineSpacing(6)
+
+                Text(UserText.networkProtectionWaitlistJoinedWithNotificationsSubtitle2)
+                    .daxBodyRegular()
+                    .foregroundColor(.waitlistTextSecondary)
+                    .lineSpacing(6)
+
+            default:
+                Text(UserText.networkProtectionWaitlistJoinedWithNotificationsSubtitle1)
+                    .daxBodyRegular()
+                    .foregroundColor(.waitlistTextSecondary)
+                    .lineSpacing(6)
+
+                if notificationState == .notificationsDisabled {
+                    AllowNotificationsView(action: action)
+                        .padding(.top, 4)
+                } else {
+                    Button(UserText.waitlistNotifyMe) {
+                        action(.requestNotificationPermission)
+                    }
+                    .buttonStyle(RoundedButtonStyle(enabled: true))
+                    .padding(.top, 32)
+                }
+            }
+
+            Spacer()
+        }
+        .padding([.leading, .trailing], 24)
+        .multilineTextAlignment(.center)
+    }
+
+}
+
+@available(iOS 15.0, *)
+private struct AllowNotificationsView: View {
+
+    let action: (WaitlistViewModel.ViewAction) -> Void
+
+    var body: some View {
+
+        VStack(spacing: 20) {
+
+            Text(UserText.waitlistNotificationDisabled)
+                .daxBodyRegular()
+                .foregroundColor(.waitlistTextSecondary)
+                .fixMultilineScrollableText()
+                .lineSpacing(5)
+
+            Button(UserText.waitlistAllowNotifications) {
+                action(.openNotificationSettings)
+            }
+            .buttonStyle(RoundedButtonStyle(enabled: true))
+
+        }
+        .padding(24)
+        .background(Color.waitlistNotificationBackground)
+        .cornerRadius(8)
+        .shadow(color: .black.opacity(0.05), radius: 12, x: 0, y: 4)
+
+    }
+
+}
+
+// MARK: - Invite Available Views
+
+private struct ShareButtonFramePreferenceKey: PreferenceKey {
+    static var defaultValue: CGRect = .zero
+    static func reduce(value: inout CGRect, nextValue: () -> CGRect) {}
+}
+
+@available(iOS 15.0, *)
+struct VPNWaitlistInvitedView: View {
+
+    let benefitsList: [VPNWaitlistBenefit] = [
+        .init(
+            imageName: "Shield-16",
+            title: UserText.networkProtectionWaitlistInvitedSection1Title,
+            subtitle: UserText.networkProtectionWaitlistInvitedSection1Subtitle
+        ),
+        .init(
+            imageName: "Rocket-16",
+            title: UserText.networkProtectionWaitlistInvitedSection2Title,
+            subtitle: UserText.networkProtectionWaitlistInvitedSection2Subtitle
+        ),
+        .init(
+            imageName: "Card-16",
+            title: UserText.networkProtectionWaitlistInvitedSection3Title,
+            subtitle: UserText.networkProtectionWaitlistInvitedSection3Subtitle
+        ),
+    ]
+
+    let action: WaitlistViewActionHandler
+
+    @State private var shareButtonFrame: CGRect = .zero
+
+    var body: some View {
+        GeometryReader { proxy in
+            ScrollView {
+                VStack(alignment: .center, spacing: 0) {
+                    HeaderView(imageName: "InvitedVPNWaitlist", title: UserText.networkProtectionWaitlistInvitedTitle)
+
+                    Text(UserText.networkProtectionWaitlistInvitedSubtitle)
+                        .daxBodyRegular()
+                        .foregroundColor(.waitlistTextSecondary)
+                        .padding(.top, 16)
+                        .lineSpacing(6)
+                        .fixedSize(horizontal: false, vertical: true)
+
+                    VStack(spacing: 16.0) {
+                        ForEach(benefitsList) { WaitlistListEntryView(viewData: $0) }
+                    }
+                    .padding(.top, 24)
+
+                    Button(UserText.networkProtectionWaitlistGetStarted, action: { action(.custom(.openNetworkProtectionPrivacyPolicyScreen)) })
+                        .buttonStyle(RoundedButtonStyle(enabled: true))
+                        .padding(.top, 32)
+
+                    Text(UserText.networkProtectionWaitlistAvailabilityDisclaimer)
+                        .font(.footnote)
+                        .foregroundStyle(Color.secondary)
+                        .padding(.top, 24)
+
+                    Spacer()
+
+                }
+                .frame(maxWidth: .infinity, minHeight: proxy.size.height)
+                .padding([.leading, .trailing], 18)
+                .multilineTextAlignment(.center)
+            }
+        }
+    }
+}
+
+@available(iOS 15.0, *)
+struct VPNWaitlistPrivacyPolicyView: View {
+
+    let action: WaitlistViewActionHandler
+
+    var body: some View {
+        ScrollView {
+            VStack(alignment: .leading, spacing: 0) {
+                Text(UserText.networkProtectionPrivacyPolicyTitle)
+                    .font(.system(size: 17, weight: .bold))
+                    .multilineTextAlignment(.leading)
+                
+                Group {
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection1Title).titleStyle()
+
+                    Text(.init(VPNWaitlistUserText.networkProtectionPrivacyPolicySection1ListMarkdown)).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection2Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection2List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection3Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection3List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection4Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection4List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection5Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionPrivacyPolicySection5List).bodyStyle()
+                }
+                
+                Text(VPNWaitlistUserText.networkProtectionTermsOfServiceTitle)
+                    .font(.system(size: 17, weight: .bold))
+                    .multilineTextAlignment(.leading)
+                    .padding(.top, 28)
+                    .padding(.bottom, 14)
+                
+                Group {
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection1Title).titleStyle(topPadding: 0)
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection1List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection2Title).titleStyle()
+                    Text(.init(VPNWaitlistUserText.networkProtectionTermsOfServiceSection2ListMarkdown)).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection3Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection3List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection4Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection4List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection5Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection5List).bodyStyle()
+                }
+                
+                Group {
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection6Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection6List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection7Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection7List).bodyStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection8Title).titleStyle()
+                    Text(VPNWaitlistUserText.networkProtectionTermsOfServiceSection8List).bodyStyle()
+                }
+
+                Button(UserText.networkProtectionWaitlistAgreeAndContinue, action: { action(.custom(.acceptNetworkProtectionTerms)) })
+                    .buttonStyle(RoundedButtonStyle(enabled: true))
+                    .padding(.top, 24)
+            }
+            .padding(.all, 20)
+        }
+    }
+
+}
+
+struct VPNWaitlistBenefit: Identifiable {
+    let id = UUID()
+    let imageName: String
+    let title: String
+    let subtitle: String
+}
+
+private struct WaitlistListEntryView: View {
+
+    let viewData: VPNWaitlistBenefit
+
+    var body: some View {
+        HStack(alignment: .center, spacing: 16) {
+            Image(viewData.imageName)
+                .frame(maxWidth: 16, maxHeight: 16)
+
+            VStack(alignment: .leading, spacing: 2) {
+                Text(viewData.title)
+                    .font(.system(size: 13, weight: .bold))
+                    .opacity(0.8)
+                    .multilineTextAlignment(.leading)
+                    .frame(maxWidth: .infinity, alignment: .leading)
+
+                Text(viewData.subtitle)
+                    .font(.system(size: 13))
+                    .opacity(0.6)
+                    .multilineTextAlignment(.leading)
+                    .frame(maxWidth: .infinity, alignment: .leading)
+            }
+            .frame(maxWidth: .infinity)
+
+            Spacer()
+        }
+    }
+
+}
+
+private extension Text {
+
+    func titleStyle(topPadding: CGFloat = 24, bottomPadding: CGFloat = 14) -> some View {
+        self
+            .font(.system(size: 13, weight: .bold))
+            .multilineTextAlignment(.leading)
+            .padding(.top, topPadding)
+            .padding(.bottom, bottomPadding)
+    }
+
+    func bodyStyle() -> some View {
+        self
+            .font(.system(size: 13))
+    }
+
+}
+
+#endif
diff --git a/DuckDuckGo/VPNWaitlistViewController.swift b/DuckDuckGo/VPNWaitlistViewController.swift
new file mode 100644
index 0000000000..465a47e34e
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlistViewController.swift
@@ -0,0 +1,153 @@
+//
+//  VPNWaitlistViewController.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import UIKit
+import SwiftUI
+import Core
+import Waitlist
+
+@available(iOS 15.0, *)
+final class VPNWaitlistViewController: UIViewController {
+
+    private let viewModel: WaitlistViewModel
+
+    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
+        self.viewModel = WaitlistViewModel(waitlist: VPNWaitlist.shared)
+        super.init(nibName: nil, bundle: nil)
+        self.viewModel.delegate = self
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        title = UserText.networkProtectionWaitlistJoinTitle
+
+        addHostingControllerToViewHierarchy()
+
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(updateViewState),
+                                               name: UIApplication.didBecomeActiveNotification,
+                                               object: nil)
+
+        NotificationCenter.default.addObserver(self,
+                                               selector: #selector(updateViewState),
+                                               name: WaitlistKeychainStore.inviteCodeDidChangeNotification,
+                                               object: VPNWaitlist.identifier)
+    }
+
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        Task {
+            await self.viewModel.updateViewState()
+        }
+    }
+
+    @objc
+    private func updateViewState() {
+        Task {
+            await self.viewModel.updateViewState()
+        }
+    }
+
+    private func addHostingControllerToViewHierarchy() {
+        let waitlistView = VPNWaitlistView().environmentObject(viewModel)
+        let waitlistViewController = UIHostingController(rootView: waitlistView)
+        waitlistViewController.view.backgroundColor = UIColor(designSystemColor: .background)
+
+        addChild(waitlistViewController)
+        waitlistViewController.view.translatesAutoresizingMaskIntoConstraints = false
+        view.addSubview(waitlistViewController.view)
+        waitlistViewController.didMove(toParent: self)
+
+        NSLayoutConstraint.activate([
+            waitlistViewController.view.widthAnchor.constraint(equalTo: view.widthAnchor),
+            waitlistViewController.view.heightAnchor.constraint(equalTo: view.heightAnchor),
+            waitlistViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+            waitlistViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
+        ])
+    }
+
+}
+
+@available(iOS 15.0, *)
+extension VPNWaitlistViewController: WaitlistViewModelDelegate {
+
+    func waitlistViewModelDidAskToReceiveJoinedNotification(_ viewModel: WaitlistViewModel) async -> Bool {
+        return await withCheckedContinuation { continuation in
+            let alertController = UIAlertController(title: UserText.networkProtectionNotificationPromptTitle,
+                                                    message: UserText.networkProtectionNotificationPromptDescription,
+                                                    preferredStyle: .alert)
+            alertController.overrideUserInterfaceStyle()
+
+            alertController.addAction(title: UserText.waitlistNoThanks) {
+                continuation.resume(returning: false)
+            }
+            let notifyMeAction = UIAlertAction(title: UserText.waitlistNotifyMe, style: .default) { _ in
+                continuation.resume(returning: true)
+            }
+
+            alertController.addAction(notifyMeAction)
+            alertController.preferredAction = notifyMeAction
+
+            present(alertController, animated: true)
+        }
+    }
+
+    func waitlistViewModelDidJoinQueueWithNotificationsAllowed(_ viewModel: WaitlistViewModel) {
+        VPNWaitlist.shared.scheduleBackgroundRefreshTask()
+    }
+
+    func waitlistViewModel(_ viewModel: WaitlistViewModel, didTriggerCustomAction action: WaitlistViewModel.ViewCustomAction) {
+        if action == .openNetworkProtectionInviteCodeScreen {
+            let networkProtectionViewController = NetworkProtectionRootViewController { [weak self] in
+                guard let self = self, let rootViewController = self.navigationController?.viewControllers.first else {
+                    assertionFailure("Failed to show NetP status view")
+                    return
+                }
+
+                let networkProtectionRootViewController = NetworkProtectionRootViewController()
+                self.navigationController?.setViewControllers([rootViewController, networkProtectionRootViewController], animated: true)
+            }
+
+            self.navigationController?.pushViewController(networkProtectionViewController, animated: true)
+        }
+
+        if action == .openNetworkProtectionPrivacyPolicyScreen {
+            let termsAndConditionsViewController = VPNWaitlistTermsAndConditionsViewController()
+            self.navigationController?.pushViewController(termsAndConditionsViewController, animated: true)
+        }
+    }
+
+    func waitlistViewModelDidOpenInviteCodeShareSheet(_ viewModel: WaitlistViewModel, inviteCode: String, senderFrame: CGRect) {
+        // The VPN waitlist doesn't support the share sheet
+    }
+
+    func waitlistViewModelDidOpenDownloadURLShareSheet(_ viewModel: WaitlistViewModel, senderFrame: CGRect) {
+        // The VPN waitlist doesn't support the share sheet
+    }
+
+}
+
+#endif
diff --git a/DuckDuckGo/WaitlistViews.swift b/DuckDuckGo/WaitlistViews.swift
index fcede8ef56..0ced5a5e9f 100644
--- a/DuckDuckGo/WaitlistViews.swift
+++ b/DuckDuckGo/WaitlistViews.swift
@@ -23,11 +23,11 @@ import Waitlist
 struct WaitlistDownloadBrowserContentView: View {
 
     let action: WaitlistViewActionHandler
-    let constants: BrowserDowloadLinkConstants
+    let constants: BrowserDownloadLinkConstants
 
-    init(platform: BrowserDowloadLink, action: @escaping WaitlistViewActionHandler) {
+    init(platform: BrowserDownloadLink, action: @escaping WaitlistViewActionHandler) {
         self.action = action
-        self.constants = BrowserDowloadLinkConstants(platform: platform)
+        self.constants = BrowserDownloadLinkConstants(platform: platform)
     }
 
     @State private var shareButtonFrame: CGRect = .zero
@@ -115,13 +115,13 @@ private struct ShareButtonFramePreferenceKey: PreferenceKey {
     static func reduce(value: inout CGRect, nextValue: () -> CGRect) {}
 }
 
-enum BrowserDowloadLink {
+enum BrowserDownloadLink {
     case windows
     case mac
 }
 
-struct BrowserDowloadLinkConstants {
-    let platform: BrowserDowloadLink
+struct BrowserDownloadLinkConstants {
+    let platform: BrowserDownloadLink
 
     var imageName: String {
         switch platform {
diff --git a/DuckDuckGo/WindowsBrowserWaitlist.swift b/DuckDuckGo/WindowsBrowserWaitlist.swift
index 1cab06d50a..ad628591e1 100644
--- a/DuckDuckGo/WindowsBrowserWaitlist.swift
+++ b/DuckDuckGo/WindowsBrowserWaitlist.swift
@@ -32,7 +32,7 @@ final class WindowsBrowserWaitlist: Waitlist {
 
     static let backgroundTaskName = "Windows Browser Waitlist Status Task"
     static let backgroundRefreshTaskIdentifier = "com.duckduckgo.app.windowsBrowserWaitlistStatus"
-    static let notificationIdentitier = "com.duckduckgo.ios.windows-browser.invite-code-available"
+    static let notificationIdentifier = "com.duckduckgo.ios.windows-browser.invite-code-available"
     static let inviteAvailableNotificationTitle = UserText.windowsWaitlistAvailableNotificationTitle
     static let inviteAvailableNotificationBody = UserText.waitlistAvailableNotificationBody
 
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index 222c2d7150..f10a4c5602 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -1441,11 +1441,101 @@ https://duckduckgo.com/mac";
 /* Title for the Network Protection feature */
 "netP.title" = "Network Protection";
 
+/* Privacy Policy title for Network Protection */
+"network-protection.privacy-policy.title" = "Privacy Policy";
+
+/* Title text for the Network Protection terms and conditions accept button */
+"network-protection.waitlist.agree-and-continue" = "Agree and Continue";
+
+/* Availability disclaimer for Network Protection join waitlist screen */
+"network-protection.waitlist.availability-disclaimer" = "Network Protection is free to use during early access.";
+
+/* Agree and Continue button for Network Protection join waitlist screen */
+"network-protection.waitlist.button.agree-and-continue" = "Agree and Continue";
+
+/* Enable Notifications button for Network Protection joined waitlist screen */
+"network-protection.waitlist.button.enable-notifications" = "Enable Notifications";
+
+/* Button title for users who already have an invite code */
+"network-protection.waitlist.button.existing-invite-code" = "I Have an Invite Code";
+
+/* Join Waitlist button for Network Protection join waitlist screen */
+"network-protection.waitlist.button.join-waitlist" = "Join the Waitlist";
+
+/* Button title text for the Network Protection waitlist confirmation prompt */
+"network-protection.waitlist.get-started" = "Get Started";
+
+/* Subtitle for section 1 of the Network Protection invited screen */
+"network-protection.waitlist.invited.section-1.subtitle" = "Encrypt online traffic across your browsers and apps.";
+
+/* Title for section 1 of the Network Protection invited screen */
+"network-protection.waitlist.invited.section-1.title" = "Full-device coverage";
+
+/* Subtitle for section 2 of the Network Protection invited screen */
+"network-protection.waitlist.invited.section-2.subtitle" = "No need for a separate app. Connect in one click and see your connection status at a glance.";
+
+/* Title for section 2 of the Network Protection invited screen */
+"network-protection.waitlist.invited.section-2.title" = "Fast, reliable, and easy to use";
+
+/* Subtitle for section 3 of the Network Protection invited screen */
+"network-protection.waitlist.invited.section-3.subtitle" = "We do not log or save any data that can connect you to your online activity.";
+
+/* Title for section 3 of the Network Protection invited screen */
+"network-protection.waitlist.invited.section-3.title" = "Strict no-logging policy";
+
+/* Subtitle for Network Protection invited screen */
+"network-protection.waitlist.invited.subtitle" = "Get an extra layer of protection online with the VPN built for speed and simplicity. Encrypt your internet connection across your entire device and hide your location and IP address from sites you visit.";
+
+/* Title for Network Protection invited screen */
+"network-protection.waitlist.invited.title" = "You’re invited to try\nNetwork Protection early access!";
+
+/* First subtitle for Network Protection join waitlist screen */
+"network-protection.waitlist.join.subtitle.1" = "Secure your connection anytime, anywhere with Network Protection, the VPN from DuckDuckGo.";
+
+/* Second subtitle for Network Protection join waitlist screen */
+"network-protection.waitlist.join.subtitle.2" = "Join the waitlist, and we’ll notify you when it’s your turn.";
+
+/* Title for Network Protection join waitlist screen */
+"network-protection.waitlist.join.title" = "Network Protection Early Access";
+
+/* Title for Network Protection joined waitlist screen */
+"network-protection.waitlist.joined.title" = "You’re on the list!";
+
+/* Subtitle 1 for Network Protection joined waitlist screen when notifications are enabled */
+"network-protection.waitlist.joined.with-notifications.subtitle.1" = "New invites are sent every few days, on a first come, first served basis.";
+
+/* Subtitle 2 for Network Protection joined waitlist screen when notifications are enabled */
+"network-protection.waitlist.joined.with-notifications.subtitle.2" = "We’ll notify you when your invite is ready.";
+
+/* Body text for the alert to enable notifications */
+"network-protection.waitlist.notification-alert.description" = "We’ll send you a notification when your invite to test Network Protection is ready.";
+
+/* Subtitle for the alert to confirm enabling notifications */
+"network-protection.waitlist.notification-prompt-description" = "Get a notification when your copy of Network Protection early access is ready.";
+
+/* Title for the alert to confirm enabling notifications */
+"network-protection.waitlist.notification-prompt-title" = "Know the instant you're invited";
+
+/* Title for Network Protection waitlist notification */
+"network-protection.waitlist.notification.text" = "Open your invite";
+
+/* Title for Network Protection waitlist notification */
+"network-protection.waitlist.notification.title" = "Network Protection is ready!";
+
+/* Subtitle text for the Network Protection settings row */
+"network-protection.waitlist.settings-subtitle.joined-and-invited" = "Your invite is ready!";
+
+/* Subtitle text for the Network Protection settings row */
+"network-protection.waitlist.settings-subtitle.joined-but-not-invited" = "You’re on the list!";
+
+/* Subtitle text for the Network Protection settings row */
+"network-protection.waitlist.settings-subtitle.waitlist-not-joined" = "Join the private waitlist";
+
 /* Message for the network protection invite dialog */
 "network.protection.invite.dialog.message" = "Enter your invite code to get started.";
 
 /* Title for the network protection invite screen */
-"network.protection.invite.dialog.title" = "You're invited to try Network Protection";
+"network.protection.invite.dialog.title" = "You’re invited to try Network Protection";
 
 /* Prompt for the network protection invite code text field */
 "network.protection.invite.field.prompt" = "Invite Code";
diff --git a/DuckDuckGoTests/NetworkProtectionAccessControllerTests.swift b/DuckDuckGoTests/NetworkProtectionAccessControllerTests.swift
new file mode 100644
index 0000000000..0e8d5cae7e
--- /dev/null
+++ b/DuckDuckGoTests/NetworkProtectionAccessControllerTests.swift
@@ -0,0 +1,183 @@
+//
+//  NetworkProtectionAccessControllerTests.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import XCTest
+import BrowserServicesKit
+import NetworkProtection
+import NetworkExtension
+import NetworkProtectionTestUtils
+import WaitlistMocks
+@testable import DuckDuckGo
+
+final class NetworkProtectionAccessControllerTests: XCTestCase {
+
+    var internalUserDeciderStore: MockInternalUserStoring!
+    
+    override func setUp() {
+        super.setUp()
+        internalUserDeciderStore = MockInternalUserStoring()
+
+        // True by default until NetP ships, as it is not visible at all to external users.
+        internalUserDeciderStore.isInternalUser = true
+    }
+
+    override func tearDown() {
+        internalUserDeciderStore = nil
+        super.tearDown()
+    }
+
+    func testWhenFeatureFlagsAreDisabled_AndTheUserHasNotBeenDirectlyInvited_ThenNetworkProtectionIsNotAccessible() {
+        let controller = createMockAccessController(
+            isInternalUser: false,
+            featureActivated: false,
+            termsAccepted: false,
+            featureFlagsEnabled: false,
+            hasJoinedWaitlist: false,
+            hasBeenInvited: false
+        )
+
+        XCTAssertEqual(controller.networkProtectionAccessType(), .none)
+    }
+
+    func testWhenFeatureFlagsAreDisabled_AndTheUserHasBeenDirectlyInvited_ThenNetworkProtectionIsNotAccessible() {
+        let controller = createMockAccessController(
+            featureActivated: true,
+            termsAccepted: false,
+            featureFlagsEnabled: false,
+            hasJoinedWaitlist: false,
+            hasBeenInvited: false
+        )
+
+        XCTAssertEqual(controller.networkProtectionAccessType(), .inviteCodeInvited)
+    }
+
+    func testWhenFeatureFlagsAreEnabled_AndTheUserHasNotSignedUp_ThenNetworkProtectionIsAccessible() {
+        let controller = createMockAccessController(
+            featureActivated: false,
+            termsAccepted: false,
+            featureFlagsEnabled: true,
+            hasJoinedWaitlist: false,
+            hasBeenInvited: false
+        )
+
+        XCTAssertEqual(controller.networkProtectionAccessType(), .waitlistAvailable)
+    }
+
+    func testWhenFeatureFlagsAreEnabled_AndTheUserHasSignedUp_ThenNetworkProtectionIsAccessible() {
+        let controller = createMockAccessController(
+            featureActivated: false,
+            termsAccepted: false,
+            featureFlagsEnabled: true,
+            hasJoinedWaitlist: true,
+            hasBeenInvited: false
+        )
+
+        XCTAssertEqual(controller.networkProtectionAccessType(), .waitlistJoined)
+    }
+
+    func testWhenFeatureFlagsAreEnabled_AndTheUserHasBeenInvited_ThenNetworkProtectionIsAccessible() {
+        let controller = createMockAccessController(
+            featureActivated: true,
+            termsAccepted: false,
+            featureFlagsEnabled: true,
+            hasJoinedWaitlist: true,
+            hasBeenInvited: true
+        )
+
+        XCTAssertEqual(controller.networkProtectionAccessType(), .waitlistInvitedPendingTermsAcceptance)
+    }
+
+    func testWhenFeatureFlagsAreEnabled_AndTheUserHasAcceptedTerms_ThenNetworkProtectionIsAccessible() {
+        let controller = createMockAccessController(
+            featureActivated: true,
+            termsAccepted: true,
+            featureFlagsEnabled: true,
+            hasJoinedWaitlist: true,
+            hasBeenInvited: true
+        )
+
+        XCTAssertEqual(controller.networkProtectionAccessType(), .waitlistInvited)
+    }
+
+    // MARK: - Mock Creation
+
+    private func createMockAccessController(
+        isInternalUser: Bool = true,
+        featureActivated: Bool,
+        termsAccepted: Bool,
+        featureFlagsEnabled: Bool,
+        hasJoinedWaitlist: Bool,
+        hasBeenInvited: Bool
+    ) -> NetworkProtectionAccessController {
+        internalUserDeciderStore.isInternalUser = isInternalUser
+
+        let mockActivation = MockNetworkProtectionFeatureActivation()
+        mockActivation.isFeatureActivated = featureActivated
+
+        let mockWaitlistStorage = MockWaitlistStorage()
+
+        if hasJoinedWaitlist {
+            mockWaitlistStorage.store(waitlistTimestamp: 1)
+            mockWaitlistStorage.store(waitlistToken: "token")
+
+            if hasBeenInvited {
+                mockWaitlistStorage.store(inviteCode: "INVITECODE")
+            }
+        }
+
+        let mockTermsAndConditionsStore = MockNetworkProtectionTermsAndConditionsStore()
+        mockTermsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted = termsAccepted
+        let mockFeatureFlagger = createFeatureFlagger(withSubfeatureEnabled: featureFlagsEnabled)
+
+        return NetworkProtectionAccessController(
+            networkProtectionActivation: mockActivation,
+            networkProtectionWaitlistStorage: mockWaitlistStorage,
+            networkProtectionTermsAndConditionsStore: mockTermsAndConditionsStore,
+            featureFlagger: mockFeatureFlagger
+        )
+    }
+
+    private func createFeatureFlagger(withSubfeatureEnabled enabled: Bool) -> DefaultFeatureFlagger {
+        let mockManager = MockPrivacyConfigurationManager()
+        mockManager.privacyConfig = mockConfiguration(subfeatureEnabled: enabled)
+
+        let internalUserDecider = DefaultInternalUserDecider(store: internalUserDeciderStore)
+        return DefaultFeatureFlagger(internalUserDecider: internalUserDecider, privacyConfig: mockManager.privacyConfig)
+    }
+
+    private func mockConfiguration(subfeatureEnabled: Bool) -> PrivacyConfiguration {
+        let mockPrivacyConfiguration = MockPrivacyConfiguration()
+        mockPrivacyConfiguration.isSubfeatureKeyEnabled = { _, _ in
+            return subfeatureEnabled
+        }
+
+        return mockPrivacyConfiguration
+    }
+
+}
+
+private class MockNetworkProtectionTermsAndConditionsStore: NetworkProtectionTermsAndConditionsStore {
+
+    var networkProtectionWaitlistTermsAndConditionsAccepted: Bool = false
+
+}
+
+#endif
diff --git a/DuckDuckGoTests/WindowsBrowserWaitlistTests.swift b/DuckDuckGoTests/WindowsBrowserWaitlistTests.swift
index 388295dbba..b7369ffdb0 100644
--- a/DuckDuckGoTests/WindowsBrowserWaitlistTests.swift
+++ b/DuckDuckGoTests/WindowsBrowserWaitlistTests.swift
@@ -61,7 +61,6 @@ class WindowsBrowserWaitlistTests: XCTestCase {
         let request = MockWaitlistRequest.failure()
         let privacyConfigurationManager: PrivacyConfigurationManagerMock = PrivacyConfigurationManagerMock()
         let privacyConfig = privacyConfigurationManager.privacyConfig as! PrivacyConfigurationMock // swiftlint:disable:this force_cast
-        var enabledFeatures = privacyConfig.enabledFeaturesForVersions
         privacyConfig.enabledFeaturesForVersions[.windowsDownloadLink] = Set([AppVersionProvider().appVersion()!])
 
         let waitlist = WindowsBrowserWaitlist(store: store, request: request, privacyConfigurationManager: privacyConfigurationManager)
diff --git a/LocalPackages/Waitlist/Sources/Waitlist/Network/ProductWaitlistRequest.swift b/LocalPackages/Waitlist/Sources/Waitlist/Network/ProductWaitlistRequest.swift
index 5b9bb09df9..63dab2041f 100644
--- a/LocalPackages/Waitlist/Sources/Waitlist/Network/ProductWaitlistRequest.swift
+++ b/LocalPackages/Waitlist/Sources/Waitlist/Network/ProductWaitlistRequest.swift
@@ -133,7 +133,7 @@ public class ProductWaitlistRequest: WaitlistRequest {
 
     private var endpoint: URL {
 #if DEBUG
-        return URL(string: "https://quackdev.duckduckgo.com/api/auth/waitlist/")!
+        return URL(string: "https://quack.duckduckgo.com/api/auth/waitlist/")!
 #else
         return URL(string: "https://quack.duckduckgo.com/api/auth/waitlist/")!
 #endif
diff --git a/LocalPackages/Waitlist/Sources/Waitlist/Views/RoundedButtonStyle.swift b/LocalPackages/Waitlist/Sources/Waitlist/Views/RoundedButtonStyle.swift
index 8d75337bd6..835d4c073c 100644
--- a/LocalPackages/Waitlist/Sources/Waitlist/Views/RoundedButtonStyle.swift
+++ b/LocalPackages/Waitlist/Sources/Waitlist/Views/RoundedButtonStyle.swift
@@ -21,20 +21,46 @@ import SwiftUI
 
 public struct RoundedButtonStyle: ButtonStyle {
 
+    public enum Style {
+        case solid
+        case bordered
+    }
+
     public let enabled: Bool
+    private let style: Style
 
-    public init(enabled: Bool) {
+    public init(enabled: Bool, style: Style = .solid) {
         self.enabled = enabled
+        self.style = style
     }
 
     public func makeBody(configuration: Self.Configuration) -> some View {
-        configuration.label
+        let backgroundColor: Color
+        let foregroundColor: Color
+        let borderColor: Color
+        let borderWidth: CGFloat
+
+        switch style {
+        case .solid:
+            backgroundColor = enabled ? Color.waitlistBlue : Color.waitlistBlue.opacity(0.2)
+            foregroundColor = Color.waitlistButtonText
+            borderColor = Color.clear
+            borderWidth = 0
+        case .bordered:
+            backgroundColor = Color.clear
+            foregroundColor = Color.waitlistBlue
+            borderColor = Color.waitlistBlue
+            borderWidth = 2
+        }
+
+        return configuration.label
             .daxHeadline()
             .frame(maxWidth: .infinity)
             .padding([.top, .bottom], 16)
-            .background(enabled ? Color.waitlistBlue : Color.waitlistBlue.opacity(0.2))
-            .foregroundColor(.waitlistButtonText)
+            .background(backgroundColor)
+            .foregroundColor(foregroundColor)
             .clipShape(RoundedRectangle(cornerRadius: 8))
+            .overlay(RoundedRectangle(cornerRadius: 8).strokeBorder(borderColor, lineWidth: borderWidth))
     }
 
 }
diff --git a/LocalPackages/Waitlist/Sources/Waitlist/Waitlist.swift b/LocalPackages/Waitlist/Sources/Waitlist/Waitlist.swift
index 0e4d53d398..2d2e0bf270 100644
--- a/LocalPackages/Waitlist/Sources/Waitlist/Waitlist.swift
+++ b/LocalPackages/Waitlist/Sources/Waitlist/Waitlist.swift
@@ -30,7 +30,7 @@ public protocol WaitlistConstants {
     static var backgroundRefreshTaskIdentifier: String { get }
     static var minimumConfigurationRefreshInterval: TimeInterval { get }
 
-    static var notificationIdentitier: String { get }
+    static var notificationIdentifier: String { get }
     static var inviteAvailableNotificationTitle: String { get }
     static var inviteAvailableNotificationBody: String { get }
 }
@@ -189,7 +189,7 @@ public extension Waitlist {
         notificationContent.title = Self.inviteAvailableNotificationTitle
         notificationContent.body = Self.inviteAvailableNotificationBody
 
-        let notificationIdentifier = Self.notificationIdentitier
+        let notificationIdentifier = Self.notificationIdentifier
         let request = UNNotificationRequest(identifier: notificationIdentifier, content: notificationContent, trigger: nil)
 
         UNUserNotificationCenter.current().add(request)
diff --git a/LocalPackages/Waitlist/Sources/WaitlistMocks/TestWaitlist.swift b/LocalPackages/Waitlist/Sources/WaitlistMocks/TestWaitlist.swift
index 9bc1059a64..51236cdf43 100644
--- a/LocalPackages/Waitlist/Sources/WaitlistMocks/TestWaitlist.swift
+++ b/LocalPackages/Waitlist/Sources/WaitlistMocks/TestWaitlist.swift
@@ -42,7 +42,7 @@ public struct TestWaitlist: Waitlist {
     public static var backgroundTaskName: String = "BG Task"
 
     public static var backgroundRefreshTaskIdentifier: String = "bgtask"
-    public static var notificationIdentitier: String = "notification"
+    public static var notificationIdentifier: String = "notification"
     public static var inviteAvailableNotificationTitle: String = "Title"
     public static var inviteAvailableNotificationBody: String = "Body"
 }

From c2b71619a06ef45f3af4982af2ddea217e557b9f Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Mon, 27 Nov 2023 14:46:18 +0100
Subject: [PATCH 20/40] Fix bug where VPN location isn't respected (#2194)

---
 DuckDuckGo.xcodeproj/project.pbxproj                          | 2 +-
 .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 72d2198df7..386610fafa 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9199,7 +9199,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 85.0.2;
+				version = 85.1.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index f9c0196d58..b369637cf4 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "88935a6656c7f0bd9dec75a761463347232f68a1",
-          "version": "85.0.2"
+          "revision": "820203512819e81c4dd5ff0b53711d0010a8253c",
+          "version": "85.1.0"
         }
       },
       {

From 16d042f14e05d25b886784a7a806aea34681492f Mon Sep 17 00:00:00 2001
From: amddg44 <amallon@duckduckgo.com>
Date: Mon, 27 Nov 2023 17:16:24 +0100
Subject: [PATCH 21/40] Autofill pixel parameter removed (#2182)

Task/Issue URL: https://app.asana.com/0/1205278999335242/1205495150811779/f
Tech Design URL:
CC:

Description:
Removes the parameter which distinguishes between the default on or off state of the autofill setting now that new installs are set to enabled by default.
---
 Core/Pixel.swift                              |  2 --
 .../AutofillLoginPromptViewController.swift   | 24 ++++++-----------
 ...ofillLoginSettingsListViewController.swift |  6 ++---
 DuckDuckGo/AutofillSettingStatus.swift        |  4 ---
 ...sswordGenerationPromptViewController.swift | 12 +++------
 DuckDuckGo/SaveLoginViewController.swift      | 27 +++++++------------
 DuckDuckGo/SettingsViewController.swift       |  3 +--
 DuckDuckGo/TabViewController.swift            |  3 +--
 ...bViewControllerBrowsingMenuExtension.swift |  3 +--
 9 files changed, 26 insertions(+), 58 deletions(-)

diff --git a/Core/Pixel.swift b/Core/Pixel.swift
index d358707618..5c24bee78b 100644
--- a/Core/Pixel.swift
+++ b/Core/Pixel.swift
@@ -126,8 +126,6 @@ public struct PixelParameters {
     public static let returnUserErrorCode = "error_code"
     public static let returnUserOldATB = "old_atb"
     public static let returnUserNewATB = "new_atb"
-
-    public static let autofillDefaultState = "default_state"
 }
 
 public struct PixelValues {
diff --git a/DuckDuckGo/AutofillLoginPromptViewController.swift b/DuckDuckGo/AutofillLoginPromptViewController.swift
index 5b00fedf7c..1133e169d2 100644
--- a/DuckDuckGo/AutofillLoginPromptViewController.swift
+++ b/DuckDuckGo/AutofillLoginPromptViewController.swift
@@ -69,11 +69,9 @@ class AutofillLoginPromptViewController: UIViewController {
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
         if trigger == AutofillUserScript.GetTriggerType.autoprompt {
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineAutopromptDisplayed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineAutopromptDisplayed)
         } else {
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualDisplayed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualDisplayed)
         }
     }
     
@@ -97,11 +95,9 @@ class AutofillLoginPromptViewController: UIViewController {
 extension AutofillLoginPromptViewController: UISheetPresentationControllerDelegate {
     func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
         if self.trigger == AutofillUserScript.GetTriggerType.autoprompt {
-            Pixel.fire(pixel: .autofillLoginsAutopromptDismissed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsAutopromptDismissed)
         } else {
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualDismissed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualDismissed)
         }
         completion?(nil, false)
     }
@@ -111,11 +107,9 @@ extension AutofillLoginPromptViewController: AutofillLoginPromptViewModelDelegat
     func autofillLoginPromptViewModel(_ viewModel: AutofillLoginPromptViewModel, didSelectAccount account: SecureVaultModels.WebsiteAccount) {
         
         if trigger == AutofillUserScript.GetTriggerType.autoprompt {
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineAutopromptConfirmed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineAutopromptConfirmed)
         } else {
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualConfirmed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualConfirmed)
         }
 
         if AppDependencyProvider.shared.autofillLoginSession.isValidSession {
@@ -169,11 +163,9 @@ extension AutofillLoginPromptViewController: AutofillLoginPromptViewModelDelegat
     func autofillLoginPromptViewModelDidCancel(_ viewModel: AutofillLoginPromptViewModel) {
         dismiss(animated: true) {
             if self.trigger == AutofillUserScript.GetTriggerType.autoprompt {
-                Pixel.fire(pixel: .autofillLoginsAutopromptDismissed,
-                           withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+                Pixel.fire(pixel: .autofillLoginsAutopromptDismissed)
             } else {
-                Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualDismissed,
-                           withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+                Pixel.fire(pixel: .autofillLoginsFillLoginInlineManualDismissed)
             }
             
             self.completion?(nil, false)
diff --git a/DuckDuckGo/AutofillLoginSettingsListViewController.swift b/DuckDuckGo/AutofillLoginSettingsListViewController.swift
index 89fa680bc1..aa1966ef0f 100644
--- a/DuckDuckGo/AutofillLoginSettingsListViewController.swift
+++ b/DuckDuckGo/AutofillLoginSettingsListViewController.swift
@@ -693,11 +693,9 @@ extension AutofillLoginSettingsListViewController: AutofillLoginDetailsViewContr
 extension AutofillLoginSettingsListViewController: EnableAutofillSettingsTableViewCellDelegate {
     func enableAutofillSettingsTableViewCell(_ cell: EnableAutofillSettingsTableViewCell, didChangeSettings value: Bool) {
         if value {
-            Pixel.fire(pixel: .autofillLoginsSettingsEnabled,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsSettingsEnabled)
         } else {
-            Pixel.fire(pixel: .autofillLoginsSettingsDisabled,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsSettingsDisabled)
         }
         
         viewModel.isAutofillEnabledInSettings = value
diff --git a/DuckDuckGo/AutofillSettingStatus.swift b/DuckDuckGo/AutofillSettingStatus.swift
index ccbabfd07c..4e7ed3f789 100644
--- a/DuckDuckGo/AutofillSettingStatus.swift
+++ b/DuckDuckGo/AutofillSettingStatus.swift
@@ -30,8 +30,4 @@ struct AutofillSettingStatus {
         let canAuthenticate = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error)
         return appSettings.autofillCredentialsEnabled && canAuthenticate
     }
-
-    static var defaultState: String {
-        return appSettings.autofillCredentialsHasBeenEnabledAutomaticallyIfNecessary ? "on" : "off"
-    }
 }
diff --git a/DuckDuckGo/PasswordGenerationPromptViewController.swift b/DuckDuckGo/PasswordGenerationPromptViewController.swift
index e0e015466b..4ac1c56edb 100644
--- a/DuckDuckGo/PasswordGenerationPromptViewController.swift
+++ b/DuckDuckGo/PasswordGenerationPromptViewController.swift
@@ -49,8 +49,7 @@ class PasswordGenerationPromptViewController: UIViewController {
 
         setupPasswordGenerationPromptView()
 
-        Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptDisplayed,
-                   withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+        Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptDisplayed)
     }
 
     private func setupPasswordGenerationPromptView() {
@@ -68,8 +67,7 @@ class PasswordGenerationPromptViewController: UIViewController {
 
 extension PasswordGenerationPromptViewController: UISheetPresentationControllerDelegate {
     func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
-            Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptDismissed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptDismissed)
 
         self.completion?(false)
     }
@@ -77,8 +75,7 @@ extension PasswordGenerationPromptViewController: UISheetPresentationControllerD
 
 extension PasswordGenerationPromptViewController: PasswordGenerationPromptViewModelDelegate {
     func passwordGenerationPromptViewModelDidSelect(_ viewModel: PasswordGenerationPromptViewModel) {
-        Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptConfirmed,
-                   withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+        Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptConfirmed)
 
         dismiss(animated: true) {
             self.completion?(true)
@@ -86,8 +83,7 @@ extension PasswordGenerationPromptViewController: PasswordGenerationPromptViewMo
     }
 
     func passwordGenerationPromptViewModelDidCancel(_ viewModel: PasswordGenerationPromptViewModel) {
-        Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptDismissed,
-                   withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+        Pixel.fire(pixel: .autofillLoginsPasswordGenerationPromptDismissed)
 
         dismiss(animated: true) {
             self.completion?(false)
diff --git a/DuckDuckGo/SaveLoginViewController.swift b/DuckDuckGo/SaveLoginViewController.swift
index 056546bed6..e23d42d1f5 100644
--- a/DuckDuckGo/SaveLoginViewController.swift
+++ b/DuckDuckGo/SaveLoginViewController.swift
@@ -72,11 +72,9 @@ class SaveLoginViewController: UIViewController {
         }
         switch viewModel.layoutType {
         case .newUser, .saveLogin:
-            Pixel.fire(pixel: .autofillLoginsSaveLoginModalDismissed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsSaveLoginModalDismissed)
         case .savePassword:
-            Pixel.fire(pixel: .autofillLoginsSavePasswordModalDismissed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsSavePasswordModalDismissed)
         case .updateUsername:
             Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalDismissed)
         case .updatePassword:
@@ -98,11 +96,9 @@ class SaveLoginViewController: UIViewController {
         
         switch saveViewModel.layoutType {
         case .newUser, .saveLogin:
-            Pixel.fire(pixel: .autofillLoginsSaveLoginModalDisplayed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsSaveLoginModalDisplayed)
         case .savePassword:
-            Pixel.fire(pixel: .autofillLoginsSavePasswordModalDisplayed,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsSavePasswordModalDisplayed)
         case .updateUsername:
             Pixel.fire(pixel: .autofillLoginsUpdateUsernameModalDisplayed)
         case .updatePassword:
@@ -116,11 +112,9 @@ extension SaveLoginViewController: SaveLoginViewModelDelegate {
         switch viewModel.layoutType {
         case .saveLogin, .savePassword, .newUser:
             if viewModel.layoutType == .savePassword {
-                Pixel.fire(pixel: .autofillLoginsSavePasswordModalConfirmed,
-                           withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+                Pixel.fire(pixel: .autofillLoginsSavePasswordModalConfirmed)
             } else {
-                Pixel.fire(pixel: .autofillLoginsSaveLoginModalConfirmed,
-                           withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+                Pixel.fire(pixel: .autofillLoginsSaveLoginModalConfirmed)
             }
             delegate?.saveLoginViewController(self, didSaveCredentials: credentialManager.credentials)
         case .updatePassword, .updateUsername:
@@ -152,8 +146,7 @@ extension SaveLoginViewController: SaveLoginViewModelDelegate {
         alertController.overrideUserInterfaceStyle()
 
         let disableAction = UIAlertAction(title: UserText.autofillKeepEnabledAlertDisableAction, style: .cancel) { _ in
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptAutofillDisabled,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptAutofillDisabled)
             if isSelfPresentingAlert {
                 self.delegate?.saveLoginViewControllerDidCancel(self)
             }
@@ -161,8 +154,7 @@ extension SaveLoginViewController: SaveLoginViewModelDelegate {
         }
 
         let keepUsingAction = UIAlertAction(title: UserText.autofillKeepEnabledAlertKeepUsingAction, style: .default) { _ in
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptAutofillKept,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptAutofillKept)
             if isSelfPresentingAlert {
                 self.delegate?.saveLoginViewControllerDidCancel(self)
             }
@@ -176,8 +168,7 @@ extension SaveLoginViewController: SaveLoginViewModelDelegate {
         if isAlreadyDismissed {
             delegate?.saveLoginViewController(self, didRequestPresentConfirmKeepUsingAlertController: alertController)
         } else {
-            Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptShown,
-                       withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+            Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptShown)
             present(alertController, animated: true)
         }
     }
diff --git a/DuckDuckGo/SettingsViewController.swift b/DuckDuckGo/SettingsViewController.swift
index 3a8a70a8a6..0f52a73f5a 100644
--- a/DuckDuckGo/SettingsViewController.swift
+++ b/DuckDuckGo/SettingsViewController.swift
@@ -399,8 +399,7 @@ class SettingsViewController: UITableViewController {
             syncDataProviders: syncDataProviders
         )
         autofillController.delegate = self
-        Pixel.fire(pixel: .autofillSettingsOpened,
-                   withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+        Pixel.fire(pixel: .autofillSettingsOpened)
         navigationController?.pushViewController(autofillController, animated: animated)
     }
     
diff --git a/DuckDuckGo/TabViewController.swift b/DuckDuckGo/TabViewController.swift
index e54ad09196..22e662952d 100644
--- a/DuckDuckGo/TabViewController.swift
+++ b/DuckDuckGo/TabViewController.swift
@@ -2569,8 +2569,7 @@ extension TabViewController: SaveLoginViewControllerDelegate {
     
     func saveLoginViewController(_ viewController: SaveLoginViewController,
                                  didRequestPresentConfirmKeepUsingAlertController alertController: UIAlertController) {
-        Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptShown,
-                   withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+        Pixel.fire(pixel: .autofillLoginsFillLoginInlineDisablePromptShown)
         present(alertController, animated: true)
     }
 }
diff --git a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift
index 8c9e3a274b..835f9eb89d 100644
--- a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift
+++ b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift
@@ -369,8 +369,7 @@ extension TabViewController {
     }
     
     private func onOpenAutofillLoginsAction() {
-        Pixel.fire(pixel: .browsingMenuAutofill,
-                   withAdditionalParameters: [PixelParameters.autofillDefaultState: AutofillSettingStatus.defaultState])
+        Pixel.fire(pixel: .browsingMenuAutofill)
         delegate?.tabDidRequestAutofillLogins(tab: self)
     }
     

From 8263fbe91fbd6781d6a1285871c78d4f32b3f787 Mon Sep 17 00:00:00 2001
From: Dominik Kapusta <dkapusta@duckduckgo.com>
Date: Mon, 27 Nov 2023 17:45:38 +0100
Subject: [PATCH 22/40] Fix migrating from Bookmarks V2 and older (#2196)

Co-authored-by: Chris Brind <brindy@duckduckgo.com>
---
 DuckDuckGo.xcodeproj/project.pbxproj                          | 2 +-
 .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 386610fafa..b1832a4068 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9199,7 +9199,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 85.1.0;
+				version = 85.1.1;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index b369637cf4..1eb97f222f 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "820203512819e81c4dd5ff0b53711d0010a8253c",
-          "version": "85.1.0"
+          "revision": "543e1d7ed9b5743d4e6b0ebe18a5fbf8f1441f02",
+          "version": "85.1.1"
         }
       },
       {

From ac1cd2cd66f47be5517e2ba2e5b5f4ddb4758cf9 Mon Sep 17 00:00:00 2001
From: Diego Rey Mendez <diegoreymendez@users.noreply.github.com>
Date: Tue, 28 Nov 2023 03:18:24 +0100
Subject: [PATCH 23/40] Update BSK for VPN settings (#2165)

Task/Issue URL: https://app.asana.com/0/0/1205958731729756/f

BSK PR: duckduckgo/BrowserServicesKit#565
macOS PR: duckduckgo/macos-browser#1858

Description

Updates BSK with the latest changes.
---
 DuckDuckGo.xcodeproj/project.pbxproj          |  2 +-
 .../xcshareddata/swiftpm/Package.resolved     |  4 ++--
 ...orkProtectionConvenienceInitialisers.swift | 17 ++++++-------
 ...etworkProtectionVPNLocationViewModel.swift | 14 +++++------
 ...kProtectionVPNNotificationsViewModel.swift | 10 ++++----
 ...etworkProtectionVPNSettingsViewModel.swift |  8 +++----
 ...kProtectionVPNLocationViewModelTests.swift | 24 +++++++++----------
 ...etworkProtectionPacketTunnelProvider.swift |  6 ++---
 8 files changed, 41 insertions(+), 44 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index b1832a4068..bd0be4db88 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9199,7 +9199,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 85.1.1;
+				version = 86.0.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 1eb97f222f..548739b3ef 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "543e1d7ed9b5743d4e6b0ebe18a5fbf8f1441f02",
-          "version": "85.1.1"
+          "revision": "1331652ad0dc21c23b495b4a9a42e2a0eb44859d",
+          "version": "86.0.0"
         }
       },
       {
diff --git a/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift b/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift
index 2557f2f1d3..193e9c959b 100644
--- a/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift
+++ b/DuckDuckGo/NetworkProtectionConvenienceInitialisers.swift
@@ -54,9 +54,9 @@ extension NetworkProtectionKeychainTokenStore {
 
 extension NetworkProtectionCodeRedemptionCoordinator {
     convenience init() {
-        let tunnelSettings = TunnelSettings(defaults: .networkProtectionGroupDefaults)
+        let settings = VPNSettings(defaults: .networkProtectionGroupDefaults)
         self.init(
-            environment: tunnelSettings.selectedEnvironment,
+            environment: settings.selectedEnvironment,
             tokenStore: NetworkProtectionKeychainTokenStore(),
             errorEvents: .networkProtectionAppDebugEvents
         )
@@ -65,27 +65,24 @@ extension NetworkProtectionCodeRedemptionCoordinator {
 
 extension NetworkProtectionVPNNotificationsViewModel {
     convenience init() {
-        let notificationsSettingsStore = NetworkProtectionNotificationsSettingsUserDefaultsStore(userDefaults: .networkProtectionGroupDefaults)
         self.init(
             notificationsAuthorization: NotificationsAuthorizationController(),
-            notificationsSettingsStore: notificationsSettingsStore
+            settings: VPNSettings(defaults: .networkProtectionGroupDefaults)
         )
     }
 }
 
 extension NetworkProtectionVPNSettingsViewModel {
     convenience init() {
-        self.init(
-            tunnelSettings: TunnelSettings(defaults: .networkProtectionGroupDefaults)
-        )
+        self.init(settings: VPNSettings(defaults: .networkProtectionGroupDefaults))
     }
 }
 
 extension NetworkProtectionLocationListCompositeRepository {
     convenience init() {
-        let tunnelSettings = TunnelSettings(defaults: .networkProtectionGroupDefaults)
+        let settings = VPNSettings(defaults: .networkProtectionGroupDefaults)
         self.init(
-            environment: tunnelSettings.selectedEnvironment,
+            environment: settings.selectedEnvironment,
             tokenStore: NetworkProtectionKeychainTokenStore()
         )
     }
@@ -96,7 +93,7 @@ extension NetworkProtectionVPNLocationViewModel {
         let locationListRepository = NetworkProtectionLocationListCompositeRepository()
         self.init(
             locationListRepository: locationListRepository,
-            tunnelSettings: TunnelSettings(defaults: .networkProtectionGroupDefaults)
+            settings: VPNSettings(defaults: .networkProtectionGroupDefaults)
         )
     }
 }
diff --git a/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift b/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
index c67feabce2..38dfdd1b66 100644
--- a/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
@@ -25,7 +25,7 @@ import NetworkProtection
 
 final class NetworkProtectionVPNLocationViewModel: ObservableObject {
     private let locationListRepository: NetworkProtectionLocationListRepository
-    private let tunnelSettings: TunnelSettings
+    private let settings: VPNSettings
     @Published public var state: LoadingState
     @Published public var isNearestSelected: Bool
 
@@ -43,11 +43,11 @@ final class NetworkProtectionVPNLocationViewModel: ObservableObject {
         }
     }
 
-    init(locationListRepository: NetworkProtectionLocationListRepository, tunnelSettings: TunnelSettings) {
+    init(locationListRepository: NetworkProtectionLocationListRepository, settings: VPNSettings) {
         self.locationListRepository = locationListRepository
-        self.tunnelSettings = tunnelSettings
+        self.settings = settings
         state = .loading
-        self.isNearestSelected = tunnelSettings.selectedLocation == .nearest
+        self.isNearestSelected = settings.selectedLocation == .nearest
     }
 
     func onViewAppeared() async {
@@ -55,20 +55,20 @@ final class NetworkProtectionVPNLocationViewModel: ObservableObject {
     }
 
     func onNearestItemSelection() async {
-        tunnelSettings.selectedLocation = .nearest
+        settings.selectedLocation = .nearest
         await reloadList()
     }
 
     func onCountryItemSelection(id: String, cityId: String? = nil) async {
         let location = NetworkProtectionSelectedLocation(country: id, city: cityId)
-        tunnelSettings.selectedLocation = .location(location)
+        settings.selectedLocation = .location(location)
         await reloadList()
     }
     
     @MainActor
     private func reloadList() async {
         guard let list = try? await locationListRepository.fetchLocationList() else { return }
-        let selectedLocation = self.tunnelSettings.selectedLocation
+        let selectedLocation = self.settings.selectedLocation
         let isNearestSelected = selectedLocation == .nearest
 
         let countryItems = list.map { currentLocation in
diff --git a/DuckDuckGo/NetworkProtectionVPNNotificationsViewModel.swift b/DuckDuckGo/NetworkProtectionVPNNotificationsViewModel.swift
index 62833eb25a..096f2194c9 100644
--- a/DuckDuckGo/NetworkProtectionVPNNotificationsViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionVPNNotificationsViewModel.swift
@@ -31,16 +31,16 @@ enum NetworkProtectionNotificationsViewKind: Equatable {
 
 final class NetworkProtectionVPNNotificationsViewModel: ObservableObject {
     private var notificationsAuthorization: NotificationsAuthorizationControlling
-    private var notificationsSettingsStore: NetworkProtectionNotificationsSettingsStore
+    private var settings: VPNSettings
     @Published var viewKind: NetworkProtectionNotificationsViewKind = .loading
     var alertsEnabled: Bool {
-        self.notificationsSettingsStore.alertsEnabled
+        self.settings.notifyStatusChanges
     }
 
     init(notificationsAuthorization: NotificationsAuthorizationControlling,
-         notificationsSettingsStore: NetworkProtectionNotificationsSettingsStore) {
+         settings: VPNSettings) {
         self.notificationsAuthorization = notificationsAuthorization
-        self.notificationsSettingsStore = notificationsSettingsStore
+        self.settings = settings
         self.notificationsAuthorization.delegate = self
     }
 
@@ -55,7 +55,7 @@ final class NetworkProtectionVPNNotificationsViewModel: ObservableObject {
     }
 
     func didToggleAlerts(to enabled: Bool) {
-        notificationsSettingsStore.alertsEnabled = enabled
+        settings.notifyStatusChanges = enabled
     }
 
     private func updateViewKind(for authorizationStatus: UNAuthorizationStatus) {
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift b/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
index 19664143e8..14820ce112 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
@@ -24,14 +24,14 @@ import NetworkProtection
 import Combine
 
 final class NetworkProtectionVPNSettingsViewModel: ObservableObject {
-    private let tunnelSettings: TunnelSettings
+    private let settings: VPNSettings
     private var cancellable: AnyCancellable?
 
     @Published public var preferredLocation: String = UserText.netPPreferredLocationNearest
 
-    init(tunnelSettings: TunnelSettings) {
-        self.tunnelSettings = tunnelSettings
-        cancellable = tunnelSettings.selectedLocationPublisher.map { selectedLocation in
+    init(settings: VPNSettings) {
+        self.settings = settings
+        cancellable = settings.selectedLocationPublisher.map { selectedLocation in
             guard let selectedLocation = selectedLocation.location else {
                 return UserText.netPPreferredLocationNearest
             }
diff --git a/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift b/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift
index 8bfdafd4db..73e6bf09be 100644
--- a/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift
+++ b/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift
@@ -28,7 +28,7 @@ import NetworkProtectionTestUtils
 
 final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
     private var listRepository: MockNetworkProtectionLocationListRepository!
-    private var tunnelSettings: TunnelSettings!
+    private var settings: VPNSettings!
     private var viewModel: NetworkProtectionVPNLocationViewModel!
 
     @MainActor
@@ -36,13 +36,13 @@ final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
         super.setUp()
         listRepository = MockNetworkProtectionLocationListRepository()
         let testDefaults = UserDefaults(suiteName: #file + Thread.current.debugDescription)!
-        tunnelSettings = TunnelSettings(defaults: testDefaults)
-        viewModel = NetworkProtectionVPNLocationViewModel(locationListRepository: listRepository, tunnelSettings: tunnelSettings)
+        settings = VPNSettings(defaults: testDefaults)
+        viewModel = NetworkProtectionVPNLocationViewModel(locationListRepository: listRepository, settings: settings)
     }
 
     override func tearDown() {
-        tunnelSettings.selectedLocation = .nearest
-        tunnelSettings = nil
+        settings.selectedLocation = .nearest
+        settings = nil
         listRepository = nil
         viewModel = nil
         super.tearDown()
@@ -70,28 +70,28 @@ final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
 
     func test_onViewAppeared_selectedCountryFromSettings_isSelectedSetToTrue() async throws {
         try await assertOnListLoad_countryIsSelected { [weak self] testCaseCountryId in
-            self?.tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: testCaseCountryId))
+            self?.settings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: testCaseCountryId))
             await self?.viewModel.onViewAppeared()
         }
     }
 
     func test_onViewAppeared_NOTSelectedCountryFromSettings_isSelectedSetToFalse() async throws {
         try await assertOnListLoad_isSelectedSetToFalse { [weak self] in
-            self?.tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: "US"))
+            self?.settings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: "US"))
             await self?.viewModel.onViewAppeared()
         }
     }
 
     func test_onViewAppeared_nearestSelectedInSettings_isNearestSelectedSetToTrue() async throws {
         try await assertNearestSelectedSetToTrue { [weak self] in
-            self?.tunnelSettings.selectedLocation = .nearest
+            self?.settings.selectedLocation = .nearest
             await self?.viewModel.onViewAppeared()
         }
     }
 
     func test_onViewAppeared_nearestNOTSelectedInSettings_isNearestSelectedSetToFalse() async throws {
         try await assertNearestSelectedSetToFalse { [weak self] testCaseCountryId in
-            self?.tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: testCaseCountryId))
+            self?.settings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: testCaseCountryId))
             await self?.viewModel.onViewAppeared()
         }
     }
@@ -128,7 +128,7 @@ final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
 
     func test_onViewAppeared_cityIsSelected_itemIsSelected() async throws {
         try await assertOnListLoad_itemIsSelected { [weak self] testCase in
-            self?.tunnelSettings.selectedLocation = .location(testCase)
+            self?.settings.selectedLocation = .location(testCase)
             await self?.viewModel.onViewAppeared()
         }
     }
@@ -140,7 +140,7 @@ final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
         ]
 
         listRepository.stubLocationList = countries
-        tunnelSettings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: "US", city: "New York"))
+        settings.selectedLocation = .location(NetworkProtectionSelectedLocation(country: "US", city: "New York"))
         await viewModel.onViewAppeared()
         let selectedItems = try loadedItems().flatMap { $0.cityPickerItems }.filter(\.isSelected)
         XCTAssertEqual(selectedItems.count, 0)
@@ -148,7 +148,7 @@ final class NetworkProtectionVPNLocationViewModelTests: XCTestCase {
 
     func test_onViewAppeared_countryWithoutCityIsSelected_nearestItemIsSelected() async throws {
         try await assertOnListLoad_nearestItemIsSelected { [weak self] testCase in
-            self?.tunnelSettings.selectedLocation = .location(testCase)
+            self?.settings.selectedLocation = .location(testCase)
             await self?.viewModel.onViewAppeared()
         }
     }
diff --git a/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift b/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift
index 4943d79eb3..0f1fe33c1b 100644
--- a/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift
+++ b/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift
@@ -176,9 +176,9 @@ final class NetworkProtectionPacketTunnelProvider: PacketTunnelProvider {
                                                              errorEvents: nil)
         let errorStore = NetworkProtectionTunnelErrorStore()
         let notificationsPresenter = NetworkProtectionUNNotificationPresenter()
-        let notificationsSettingsStore = NetworkProtectionNotificationsSettingsUserDefaultsStore(userDefaults: .networkProtectionGroupDefaults)
+        let settings = VPNSettings(defaults: .networkProtectionGroupDefaults)
         let nofificationsPresenterDecorator = NetworkProtectionNotificationsPresenterTogglableDecorator(
-            notificationSettingsStore: notificationsSettingsStore,
+            settings: settings,
             wrappee: notificationsPresenter
         )
         notificationsPresenter.requestAuthorization()
@@ -189,7 +189,7 @@ final class NetworkProtectionPacketTunnelProvider: PacketTunnelProvider {
                    tokenStore: tokenStore,
                    debugEvents: Self.networkProtectionDebugEvents(controllerErrorStore: errorStore),
                    providerEvents: Self.packetTunnelProviderEvents,
-                   tunnelSettings: TunnelSettings(defaults: .networkProtectionGroupDefaults))
+                   settings: settings)
         startMonitoringMemoryPressureEvents()
         observeServerChanges()
         APIRequest.Headers.setUserAgent(DefaultUserAgentManager.duckDuckGoUserAgent)

From 0d3c75584c4193ac228615897fedecb9906ee03c Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Tue, 28 Nov 2023 17:38:27 +0100
Subject: [PATCH 24/40] Remove disabled switches from VPN Settings screen
 (#2203)

---
 .../NetworkProtectionVPNLocationView.swift    |  3 +-
 .../NetworkProtectionVPNSettingsView.swift    | 61 ++++++-------------
 DuckDuckGo/UserText.swift                     |  3 -
 DuckDuckGo/en.lproj/Localizable.strings       |  9 ---
 4 files changed, 22 insertions(+), 54 deletions(-)

diff --git a/DuckDuckGo/NetworkProtectionVPNLocationView.swift b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
index dc673400e3..31425e33d7 100644
--- a/DuckDuckGo/NetworkProtectionVPNLocationView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
@@ -134,7 +134,7 @@ private struct CountryItem: View {
                     } label: {
                         Image(systemName: "ellipsis.circle")
                             .resizable()
-                            .frame(width: 22, height: 22)
+                            .frame(width: 22, height: 22).tint(.textSecondary)
                     }
                 }
             }
@@ -184,6 +184,7 @@ private struct MenuItem: View {
                         .if(!isSelected) {
                             $0.hidden()
                         }
+                        .tint(.textPrimary)
                 }
             }
         )
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
index f22075f044..f0270da42a 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
@@ -27,53 +27,31 @@ struct NetworkProtectionVPNSettingsView: View {
     @StateObject var viewModel = NetworkProtectionVPNSettingsViewModel()
 
     var body: some View {
-        List {
-            NavigationLink(destination: NetworkProtectionVPNLocationView()) {
-                HStack {
-                    Text(UserText.netPPreferredLocationSettingTitle).daxBodyRegular().foregroundColor(.textPrimary)
-                    Spacer()
-                    Text(viewModel.preferredLocation).daxBodyRegular().foregroundColor(.textSecondary)
+        VStack {
+            List {
+                Section {
+                    NavigationLink(destination: NetworkProtectionVPNLocationView()) {
+                        HStack {
+                            Text(UserText.netPPreferredLocationSettingTitle).daxBodyRegular().foregroundColor(.textPrimary)
+                            Spacer()
+                            Text(viewModel.preferredLocation).daxBodyRegular().foregroundColor(.textSecondary)
+                        }
+                    }
+                }
+                Section {
+                    HStack(spacing: 16) {
+                        Image("Info-Solid-24")
+                            .foregroundColor(.icon)
+                        Text(UserText.netPSecureDNSSettingFooter)
+                            .daxFootnoteRegular()
+                            .foregroundColor(.textSecondary)
+                    }
                 }
             }
-            toggleSection(
-                text: UserText.netPAlwaysOnSettingTitle,
-                footerText: UserText.netPAlwaysOnSettingFooter
-            )
-            toggleSection(
-                text: UserText.netPSecureDNSSettingTitle,
-                footerText: UserText.netPSecureDNSSettingFooter
-            )
         }
         .applyInsetGroupedListStyle()
         .navigationTitle(UserText.netPVPNSettingsTitle)
     }
-
-    @ViewBuilder
-    func toggleSection(text: String, footerText: String) -> some View {
-        Section {
-            HStack {
-                VStack(alignment: .leading, spacing: 4) {
-                    Text(text)
-                        .font(.system(size: 16))
-                        .foregroundColor(.textPrimary.opacity(0.4))
-                        .font(.system(size: 13))
-                        .foregroundColor(.textSecondary.opacity(0.4))
-                }
-
-                // These toggles are permanantly disabled as the features are permanantly enabled. Product decision.
-                Toggle("", isOn: .constant(true))
-                    .disabled(true)
-                    .toggleStyle(SwitchToggleStyle(tint: .controlColor))
-            }
-            .listRowBackground(Color.cellBackground)
-        } footer: {
-            Text(footerText)
-                .foregroundColor(.textSecondary)
-                .accentColor(Color.controlColor)
-                .font(.system(size: 13))
-                .padding(.top, 6)
-        }
-    }
 }
 
 private extension Color {
@@ -81,6 +59,7 @@ private extension Color {
     static let textSecondary = Color(designSystemColor: .textSecondary)
     static let cellBackground = Color(designSystemColor: .surface)
     static let controlColor = Color(designSystemColor: .accent)
+    static let icon = Color(designSystemColor: .icons).opacity(0.3)
 }
 
 #endif
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 6b15c281f1..80b88c0891 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -660,9 +660,6 @@ In addition to the details entered into this form, your app issue report will co
         let message = NSLocalizedString("network.protection.vpn.location.country.item.formatted.cities.count", value: "%d cities", comment: "Subtitle of countries item when there are multiple cities, example : ")
         return message.format(arguments: count)
     }
-    static let netPAlwaysOnSettingTitle = NSLocalizedString("network.protection.vpn.always.on.setting.title", value: "Always On", comment: "Title for the Always on VPN setting item.")
-    static let netPAlwaysOnSettingFooter = NSLocalizedString("network.protection.vpn.always.on.setting.footer", value: "Automatically restore a VPN connection after interruption.", comment: "Footer text for the Always on VPN setting item.")
-    static let netPSecureDNSSettingTitle = NSLocalizedString("network.protection.vpn.secure.dns.setting.title", value: "Secure DNS", comment: "Title for the Always on VPN setting item.")
     static let netPSecureDNSSettingFooter = NSLocalizedString("network.protection.vpn.secure.dns.setting.footer", value: "Network Protection prevents DNS leaks to your Internet Service Provider by routing DNS queries though the VPN tunnel to our own resolver.", comment: "Footer text for the Always on VPN setting item.")
     static let netPTurnOnNotificationsButtonTitle = NSLocalizedString("network.protection.turn.on.notifications.button.title", value: "Turn on Notifications", comment: "Title for the button to link to the iOS app settings and enable notifications app-wide.")
     static let netPTurnOnNotificationsSectionFooter = NSLocalizedString("network.protection.turn.on.notifications.section.footer", value: "Allow DuckDuckGo to notify you if your connection drops or VPN status changes.", comment: "Footer text under the button to link to the iOS app settings and enable notifications app-wide.")
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index f10a4c5602..6414e52e6b 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -1609,12 +1609,6 @@ https://duckduckgo.com/mac";
 /* Title for the toggle for VPN alerts. */
 "network.protection.vpn.alerts.toggle.title" = "VPN Alerts";
 
-/* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.footer" = "Automatically restore a VPN connection after interruption.";
-
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.always.on.setting.title" = "Always On";
-
 /* Title for the VPN Location screen's All Countries section. */
 "network.protection.vpn.location.all.countries.section.title" = "All Countries";
 
@@ -1645,9 +1639,6 @@ https://duckduckgo.com/mac";
 /* Footer text for the Always on VPN setting item. */
 "network.protection.vpn.secure.dns.setting.footer" = "Network Protection prevents DNS leaks to your Internet Service Provider by routing DNS queries though the VPN tunnel to our own resolver.";
 
-/* Title for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.title" = "Secure DNS";
-
 /* Title for the VPN Settings screen. */
 "network.protection.vpn.settings.title" = "VPN Settings";
 

From 5ddde8137a79efabeb6fb800794b24b8e1a9f853 Mon Sep 17 00:00:00 2001
From: Anh Do <18567+quanganhdo@users.noreply.github.com>
Date: Tue, 28 Nov 2023 23:11:52 -0500
Subject: [PATCH 25/40] Update iOS privacy defaults (#2185)

Co-authored-by: Diego Rey Mendez <dreymendez@duckduckgo.com>
---
 DuckDuckGo.xcodeproj/project.pbxproj          |  2 +-
 .../xcshareddata/swiftpm/Package.resolved     |  4 +--
 .../NetworkProtectionVPNSettingsView.swift    | 33 +++++++++++++++++++
 ...etworkProtectionVPNSettingsViewModel.swift | 30 ++++++++++++-----
 DuckDuckGo/UserText.swift                     |  2 ++
 DuckDuckGo/en.lproj/Localizable.strings       |  6 ++++
 6 files changed, 65 insertions(+), 12 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index bd0be4db88..6dd202dfe1 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9199,7 +9199,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 86.0.0;
+				version = 86.1.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 548739b3ef..74efce3cce 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "1331652ad0dc21c23b495b4a9a42e2a0eb44859d",
-          "version": "86.0.0"
+          "revision": "1400c9ca17dd770d6eb708288f97c9aab749d0ef",
+          "version": "86.1.0"
         }
       },
       {
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
index f0270da42a..f7b5c33774 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
@@ -38,6 +38,15 @@ struct NetworkProtectionVPNSettingsView: View {
                         }
                     }
                 }
+                toggleSection(
+                    text: UserText.netPExcludeLocalNetworksSettingTitle,
+                    footerText: UserText.netPExcludeLocalNetworksSettingFooter
+                ) {
+                    Toggle("", isOn: $viewModel.excludeLocalNetworks)
+                        .onTapGesture {
+                            viewModel.toggleExcludeLocalNetworks()
+                        }
+                }
                 Section {
                     HStack(spacing: 16) {
                         Image("Info-Solid-24")
@@ -52,6 +61,30 @@ struct NetworkProtectionVPNSettingsView: View {
         .applyInsetGroupedListStyle()
         .navigationTitle(UserText.netPVPNSettingsTitle)
     }
+
+    @ViewBuilder
+    func toggleSection(text: String, footerText: String, @ViewBuilder toggle: () -> some View) -> some View {
+        Section {
+            HStack {
+                VStack(alignment: .leading, spacing: 4) {
+                    Text(text)
+                        .daxBodyRegular()
+                        .foregroundColor(.textPrimary)
+                        .layoutPriority(1)
+                }
+
+                toggle()
+                    .toggleStyle(SwitchToggleStyle(tint: .controlColor))
+            }
+            .listRowBackground(Color.cellBackground)
+        } footer: {
+            Text(footerText)
+                .foregroundColor(.textSecondary)
+                .accentColor(Color.controlColor)
+                .daxFootnoteRegular()
+                .padding(.top, 6)
+        }
+    }
 }
 
 private extension Color {
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift b/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
index 14820ce112..f7ff89c53f 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
@@ -25,21 +25,33 @@ import Combine
 
 final class NetworkProtectionVPNSettingsViewModel: ObservableObject {
     private let settings: VPNSettings
-    private var cancellable: AnyCancellable?
+    private var cancellables: Set<AnyCancellable> = []
 
     @Published public var preferredLocation: String = UserText.netPPreferredLocationNearest
+    @Published public var excludeLocalNetworks: Bool = true
 
     init(settings: VPNSettings) {
         self.settings = settings
-        cancellable = settings.selectedLocationPublisher.map { selectedLocation in
-            guard let selectedLocation = selectedLocation.location else {
-                return UserText.netPPreferredLocationNearest
+        settings.selectedLocationPublisher
+            .map { selectedLocation in
+                guard let selectedLocation = selectedLocation.location else {
+                    return UserText.netPPreferredLocationNearest
+                }
+                guard let city = selectedLocation.city else {
+                    return Self.localizedString(forRegionCode: selectedLocation.country)
+                }
+                return "\(city), \(Self.localizedString(forRegionCode: selectedLocation.country))"
             }
-            guard let city = selectedLocation.city else {
-                return Self.localizedString(forRegionCode: selectedLocation.country)
-            }
-            return "\(city), \(Self.localizedString(forRegionCode: selectedLocation.country))"
-        }.assign(to: \.preferredLocation, onWeaklyHeld: self)
+            .assign(to: \.preferredLocation, onWeaklyHeld: self)
+            .store(in: &cancellables)
+        
+        settings.excludeLocalNetworksPublisher
+            .assign(to: \.excludeLocalNetworks, onWeaklyHeld: self)
+            .store(in: &cancellables)
+    }
+
+    func toggleExcludeLocalNetworks() {
+        settings.excludeLocalNetworks.toggle()
     }
 
     private static func localizedString(forRegionCode: String) -> String {
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 80b88c0891..0a67d5dcc8 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -660,6 +660,8 @@ In addition to the details entered into this form, your app issue report will co
         let message = NSLocalizedString("network.protection.vpn.location.country.item.formatted.cities.count", value: "%d cities", comment: "Subtitle of countries item when there are multiple cities, example : ")
         return message.format(arguments: count)
     }
+    static let netPExcludeLocalNetworksSettingTitle = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.title", value: "Exclude Local Networks", comment: "Title for the Exclude Local Networks setting item.")
+    static let netPExcludeLocalNetworksSettingFooter = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.footer", value: "Bypass the VPN for local network connections, like to a printer.", comment: "Footer text for the Exclude Local Networks setting item.")
     static let netPSecureDNSSettingFooter = NSLocalizedString("network.protection.vpn.secure.dns.setting.footer", value: "Network Protection prevents DNS leaks to your Internet Service Provider by routing DNS queries though the VPN tunnel to our own resolver.", comment: "Footer text for the Always on VPN setting item.")
     static let netPTurnOnNotificationsButtonTitle = NSLocalizedString("network.protection.turn.on.notifications.button.title", value: "Turn on Notifications", comment: "Title for the button to link to the iOS app settings and enable notifications app-wide.")
     static let netPTurnOnNotificationsSectionFooter = NSLocalizedString("network.protection.turn.on.notifications.section.footer", value: "Allow DuckDuckGo to notify you if your connection drops or VPN status changes.", comment: "Footer text under the button to link to the iOS app settings and enable notifications app-wide.")
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index 6414e52e6b..aa23444dbd 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -1609,6 +1609,12 @@ https://duckduckgo.com/mac";
 /* Title for the toggle for VPN alerts. */
 "network.protection.vpn.alerts.toggle.title" = "VPN Alerts";
 
+/* Footer text for the Exclude Local Networks setting item. */
+"network.protection.vpn.exclude.local.networks.setting.footer" = "Bypass the VPN for local network connections, like to a printer.";
+
+/* Title for the Exclude Local Networks setting item. */
+"network.protection.vpn.exclude.local.networks.setting.title" = "Exclude Local Networks";
+
 /* Title for the VPN Location screen's All Countries section. */
 "network.protection.vpn.location.all.countries.section.title" = "All Countries";
 

From bca38bc3dc59ea56d3263b7b61312fd23cae0661 Mon Sep 17 00:00:00 2001
From: bwaresiak <bartek@duckduckgo.com>
Date: Wed, 29 Nov 2023 12:40:42 +0100
Subject: [PATCH 26/40] Release 7.99.0 (#2205)

---
 Configuration/Version.xcconfig                |    2 +-
 .../AppPrivacyConfigurationDataProvider.swift |    4 +-
 Core/AppTrackerDataSetProvider.swift          |    4 +-
 Core/ios-config.json                          |  163 +-
 Core/trackerData.json                         | 1551 ++++++++++-------
 DuckDuckGo.xcodeproj/project.pbxproj          |   42 +-
 DuckDuckGo/Settings.bundle/Root.plist         |    2 +-
 7 files changed, 1078 insertions(+), 690 deletions(-)

diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig
index 698f293328..3e6917b72b 100644
--- a/Configuration/Version.xcconfig
+++ b/Configuration/Version.xcconfig
@@ -1 +1 @@
-MARKETING_VERSION = 7.97.1
+MARKETING_VERSION = 7.99.0
diff --git a/Core/AppPrivacyConfigurationDataProvider.swift b/Core/AppPrivacyConfigurationDataProvider.swift
index c984d0206f..81a313c2df 100644
--- a/Core/AppPrivacyConfigurationDataProvider.swift
+++ b/Core/AppPrivacyConfigurationDataProvider.swift
@@ -23,8 +23,8 @@ import BrowserServicesKit
 final public class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider {
 
     public struct Constants {
-        public static let embeddedDataETag = "\"b8a321aec612923a53b958fbdbfa541e\""
-        public static let embeddedDataSHA = "af271d73da0863e678670fb0d9cf4f8269ddb7e584599bfb57d5a370961dbc4b"
+        public static let embeddedDataETag = "\"7c6169d648700908e0dfc5904d640c37\""
+        public static let embeddedDataSHA = "e3cd448b68a22fe6c9563deeb4c7d2a62ae947bc655ff33b3fc030bba766672c"
     }
 
     public var embeddedDataEtag: String {
diff --git a/Core/AppTrackerDataSetProvider.swift b/Core/AppTrackerDataSetProvider.swift
index c41f8ed1b5..6cdd458869 100644
--- a/Core/AppTrackerDataSetProvider.swift
+++ b/Core/AppTrackerDataSetProvider.swift
@@ -23,8 +23,8 @@ import BrowserServicesKit
 final public class AppTrackerDataSetProvider: EmbeddedDataProvider {
 
     public struct Constants {
-        public static let embeddedDataETag = "\"3a50d09fd78a893f1a284051d1f777de\""
-        public static let embeddedDataSHA = "2c1995807a61fd9fa311baab01633411282759732f098765f5380bda5e92b9e2"
+        public static let embeddedDataETag = "\"b879198dd7dcd9e5f1e5ce0a5d4ba782\""
+        public static let embeddedDataSHA = "0006b1b27b94f5006ba2576f96dd8c7ab0e66943b5556458ea99002aeb80ac1a"
     }
 
     public var embeddedDataEtag: String {
diff --git a/Core/ios-config.json b/Core/ios-config.json
index 3283af4e90..092015bfeb 100644
--- a/Core/ios-config.json
+++ b/Core/ios-config.json
@@ -1,6 +1,6 @@
 {
     "readme": "https://github.com/duckduckgo/privacy-configuration",
-    "version": 1700585688784,
+    "version": 1701253939396,
     "features": {
         "adClickAttribution": {
             "readme": "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections/#3rd-party-tracker-loading-protection",
@@ -1251,6 +1251,9 @@
                     {
                         "domain": "formula1.com"
                     },
+                    {
+                        "domain": "gigisplayhouse.org"
+                    },
                     {
                         "domain": "hulu.com"
                     },
@@ -1293,7 +1296,7 @@
             },
             "exceptions": [],
             "state": "enabled",
-            "hash": "b101ded240bc51fce0ece83191b2da62"
+            "hash": "4c62237a3eeaf9cfec814fc3fb7af282"
         },
         "duckPlayer": {
             "exceptions": [],
@@ -1670,10 +1673,6 @@
                         "selector": "[class*='container--ads']",
                         "type": "hide-empty"
                     },
-                    {
-                        "selector": "[class*='l-ad']",
-                        "type": "hide-empty"
-                    },
                     {
                         "selector": "[class*='page-ad']",
                         "type": "hide-empty"
@@ -1878,6 +1877,22 @@
                     "upgrade to flickr pro to hide these ads"
                 ],
                 "domains": [
+                    {
+                        "domain": "3bmeteo.com",
+                        "rules": [
+                            {
+                                "type": "disable-default"
+                            },
+                            {
+                                "selector": "#admasthead",
+                                "type": "hide-empty"
+                            },
+                            {
+                                "selector": "#ads_container",
+                                "type": "hide-empty"
+                            }
+                        ]
+                    },
                     {
                         "domain": "abc.es",
                         "rules": [
@@ -2655,6 +2670,22 @@
                             }
                         ]
                     },
+                    {
+                        "domain": "kentonline.co.uk",
+                        "rules": [
+                            {
+                                "type": "disable-default"
+                            },
+                            {
+                                "selector": "[id*='p_mpu']",
+                                "type": "closest-empty"
+                            },
+                            {
+                                "selector": "[id*='p_dmp']",
+                                "type": "closest-empty"
+                            }
+                        ]
+                    },
                     {
                         "domain": "komputerswiat.pl",
                         "rules": [
@@ -3254,6 +3285,18 @@
                             }
                         ]
                     },
+                    {
+                        "domain": "startpagina.nl",
+                        "rules": [
+                            {
+                                "type": "disable-default"
+                            },
+                            {
+                                "selector": ".ad-widget",
+                                "type": "closest-empty"
+                            }
+                        ]
+                    },
                     {
                         "domain": "takealot.com",
                         "rules": [
@@ -3704,7 +3747,7 @@
                 ]
             },
             "state": "enabled",
-            "hash": "c747ff47f18924f7ddde7cea3874e3bc"
+            "hash": "f7c00905a329790def09ac2296a0e1da"
         },
         "exceptionHandler": {
             "exceptions": [
@@ -4024,9 +4067,6 @@
         "gpc": {
             "state": "enabled",
             "exceptions": [
-                {
-                    "domain": "abcnews.go.com"
-                },
                 {
                     "domain": "allegiantair.com"
                 },
@@ -4079,7 +4119,7 @@
                     "privacy-test-pages.site"
                 ]
             },
-            "hash": "9f8ae6a01924a47b3ca6ce18f001cbd9"
+            "hash": "d11962aceb1417d05e8f2854d5fb72a9"
         },
         "harmfulApis": {
             "settings": {
@@ -4546,16 +4586,6 @@
                             }
                         ]
                     },
-                    "adserver.adtech.advertising.com": {
-                        "rules": [
-                            {
-                                "rule": "adserver.adtech.advertising.com/pubapi/3.0/1/54669.7/0/0/ADTECH;v=2;cmd=bid;cors=yes",
-                                "domains": [
-                                    "collider.com"
-                                ]
-                            }
-                        ]
-                    },
                     "adswizz.com": {
                         "rules": [
                             {
@@ -4584,6 +4614,16 @@
                             }
                         ]
                     },
+                    "advertising.com": {
+                        "rules": [
+                            {
+                                "rule": "adserver.adtech.advertising.com/pubapi/3.0/1/54669.7/0/0/ADTECH;v=2;cmd=bid;cors=yes",
+                                "domains": [
+                                    "collider.com"
+                                ]
+                            }
+                        ]
+                    },
                     "ahacdn.me": {
                         "rules": [
                             {
@@ -5106,6 +5146,16 @@
                             }
                         ]
                     },
+                    "datadoghq-browser-agent.com": {
+                        "rules": [
+                            {
+                                "rule": "www.datadoghq-browser-agent.com/datadog-logs-v4.js",
+                                "domains": [
+                                    "shapermint.com"
+                                ]
+                            }
+                        ]
+                    },
                     "datadome.co": {
                         "rules": [
                             {
@@ -5353,6 +5403,12 @@
                     },
                     "facebook.net": {
                         "rules": [
+                            {
+                                "rule": "connect.facebook.net/en_UK/sdk.js",
+                                "domains": [
+                                    "globalcyclingnetwork.com"
+                                ]
+                            },
                             {
                                 "rule": "connect.facebook.net/en_US/sdk.js",
                                 "domains": [
@@ -5624,6 +5680,7 @@
                                 "rule": "imasdk.googleapis.com/js/sdkloader/ima3.js",
                                 "domains": [
                                     "bloomberg.com",
+                                    "gamak.tv",
                                     "games.washingtonpost.com",
                                     "metro.co.uk",
                                     "nfl.com",
@@ -5845,6 +5902,22 @@
                             }
                         ]
                     },
+                    "gorgias.chat": {
+                        "rules": [
+                            {
+                                "rule": "config.gorgias.chat",
+                                "domains": [
+                                    "help.athleticbrewing.com"
+                                ]
+                            },
+                            {
+                                "rule": "assets.gorgias.chat",
+                                "domains": [
+                                    "help.athleticbrewing.com"
+                                ]
+                            }
+                        ]
+                    },
                     "greylabeldelivery.com": {
                         "rules": [
                             {
@@ -6132,17 +6205,6 @@
                             }
                         ]
                     },
-                    "live.primis.tech": {
-                        "rules": [
-                            {
-                                "rule": "live.primis.tech/live/liveView.php",
-                                "domains": [
-                                    "belfastlive.co.uk",
-                                    "cornwalllive.com"
-                                ]
-                            }
-                        ]
-                    },
                     "livechatinc.com": {
                         "rules": [
                             {
@@ -6482,6 +6544,17 @@
                             }
                         ]
                     },
+                    "primis.tech": {
+                        "rules": [
+                            {
+                                "rule": "live.primis.tech/live/liveView.php",
+                                "domains": [
+                                    "belfastlive.co.uk",
+                                    "cornwalllive.com"
+                                ]
+                            }
+                        ]
+                    },
                     "privacy-center.org": {
                         "rules": [
                             {
@@ -6611,7 +6684,8 @@
                             {
                                 "rule": "protection-widget.route.com/protect.core.js",
                                 "domains": [
-                                    "littleunicorn.com"
+                                    "littleunicorn.com",
+                                    "olfactif.com"
                                 ]
                             }
                         ]
@@ -6708,6 +6782,16 @@
                             }
                         ]
                     },
+                    "route.com": {
+                        "rules": [
+                            {
+                                "rule": "protection-widget.route.com/protect.core.js",
+                                "domains": [
+                                    "littleunicorn.com"
+                                ]
+                            }
+                        ]
+                    },
                     "rumble.com": {
                         "rules": [
                             {
@@ -6810,6 +6894,16 @@
                             }
                         ]
                     },
+                    "slickstream.com": {
+                        "rules": [
+                            {
+                                "rule": "app.slickstream.com",
+                                "domains": [
+                                    "<all>"
+                                ]
+                            }
+                        ]
+                    },
                     "snapkit.com": {
                         "rules": [
                             {
@@ -6967,6 +7061,7 @@
                             {
                                 "rule": "widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js",
                                 "domains": [
+                                    "azurestandard.com",
                                     "domesticandgeneral.com"
                                 ]
                             }
@@ -7284,7 +7379,7 @@
                     "domain": "sundancecatalog.com"
                 }
             ],
-            "hash": "f5e54d051c76c97e2ebaf3014037d10a"
+            "hash": "1ce506662b48fccc1bf37a3133fd3f1e"
         },
         "trackingCookies1p": {
             "settings": {
diff --git a/Core/trackerData.json b/Core/trackerData.json
index 84975e1a36..fb357bcf7f 100644
--- a/Core/trackerData.json
+++ b/Core/trackerData.json
@@ -1,7 +1,7 @@
 {
     "_builtWith": {
-        "tracker-radar": "ae2fbc01abd26abf1903208a5cabbaed6a96ab2aa13779d2125a98fc45fee2cd-4013b4e91930c643394cb31c6c745356f133b04f",
-        "tracker-surrogates": "abd6067fac9693cc5a43d48931b111ca08cb0d5a"
+        "tracker-radar": "0928b2f5aba106ff5ff034b6901b3a3a06fdd6a6b14ef08ef3054c10a79a03e3-4013b4e91930c643394cb31c6c745356f133b04f",
+        "tracker-surrogates": "326805e7ed18b0bd2e176fc3d1095dfab3569995"
     },
     "readme": "https://github.com/duckduckgo/tracker-blocklists",
     "trackers": {
@@ -451,7 +451,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -462,7 +462,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -508,7 +508,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2396,7 +2396,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2407,7 +2407,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2451,7 +2451,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2462,7 +2462,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2596,7 +2596,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2735,7 +2735,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -2746,7 +2746,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3065,7 +3065,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3192,7 +3192,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3316,7 +3316,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3700,7 +3700,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3711,7 +3711,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3722,7 +3722,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3733,7 +3733,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3799,7 +3799,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3851,7 +3851,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3862,7 +3862,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -3999,7 +3999,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -4350,7 +4350,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -4385,7 +4385,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -4829,7 +4829,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -4840,7 +4840,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5042,7 +5042,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5084,7 +5084,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5107,7 +5107,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5142,7 +5142,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5171,7 +5171,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5459,7 +5459,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5576,7 +5576,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5587,7 +5587,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5598,7 +5598,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5609,7 +5609,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5646,7 +5646,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -5701,7 +5701,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -6237,7 +6237,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -6396,7 +6396,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -6712,7 +6712,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -6723,7 +6723,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -6847,7 +6847,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7043,7 +7043,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7079,7 +7079,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7090,7 +7090,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7101,7 +7101,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7684,7 +7684,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7695,7 +7695,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7706,7 +7706,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7787,7 +7787,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7910,7 +7910,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7921,7 +7921,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -7999,7 +7999,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8010,7 +8010,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8125,7 +8125,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8276,7 +8276,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8287,7 +8287,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8813,7 +8813,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8824,7 +8824,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -8865,7 +8865,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -9281,7 +9281,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -9886,7 +9886,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -9897,7 +9897,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -9908,7 +9908,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -9948,7 +9948,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -9990,7 +9990,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10064,7 +10064,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10132,7 +10132,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10143,7 +10143,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10191,7 +10191,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10317,7 +10317,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10477,7 +10477,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10488,7 +10488,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10499,7 +10499,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10526,7 +10526,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10576,7 +10576,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -10623,7 +10623,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -11095,7 +11095,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -11135,7 +11135,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -11437,12 +11437,6 @@
                     "fingerprinting": 0,
                     "cookies": 0.0000476,
                     "comment": "pixel"
-                },
-                {
-                    "rule": "google\\.com\\/url",
-                    "fingerprinting": 0,
-                    "cookies": 0.0000272,
-                    "comment": "pixel"
                 }
             ]
         },
@@ -11873,7 +11867,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -11960,7 +11954,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -11971,7 +11965,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12198,7 +12192,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12238,7 +12232,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12249,7 +12243,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12260,7 +12254,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12271,7 +12265,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12597,7 +12591,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12608,7 +12602,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -12619,7 +12613,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -14528,7 +14522,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -15213,7 +15207,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -15288,7 +15282,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -15339,7 +15333,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16196,7 +16190,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16207,7 +16201,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16235,7 +16229,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16454,7 +16448,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16763,7 +16757,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16774,7 +16768,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -16959,7 +16953,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -17008,7 +17002,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -17282,7 +17276,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -17293,7 +17287,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -17856,7 +17850,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -18204,7 +18198,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -18343,7 +18337,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -18702,7 +18696,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -18938,7 +18932,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -20127,7 +20121,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -20348,7 +20342,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -20359,7 +20353,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -20370,7 +20364,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -20510,7 +20504,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -20997,7 +20991,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21026,7 +21020,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21037,7 +21031,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21048,7 +21042,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21112,7 +21106,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21192,7 +21186,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21240,7 +21234,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21251,7 +21245,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21291,7 +21285,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21302,7 +21296,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21337,7 +21331,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21348,7 +21342,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21481,7 +21475,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -21565,7 +21559,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22036,7 +22030,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22047,7 +22041,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22058,7 +22052,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22128,7 +22122,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22139,7 +22133,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22292,7 +22286,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22303,7 +22297,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22345,7 +22339,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22356,7 +22350,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22367,7 +22361,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22637,7 +22631,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22648,7 +22642,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22709,7 +22703,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22767,7 +22761,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22778,7 +22772,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22878,7 +22872,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22901,7 +22895,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -22912,7 +22906,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23269,7 +23263,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23373,7 +23367,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23770,7 +23764,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23845,7 +23839,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23856,7 +23850,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23900,7 +23894,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23911,7 +23905,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23922,7 +23916,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -23933,7 +23927,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24013,7 +24007,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24046,7 +24040,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24097,7 +24091,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24233,7 +24227,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24362,7 +24356,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24373,7 +24367,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24620,7 +24614,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24631,7 +24625,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24642,7 +24636,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24923,7 +24917,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24958,7 +24952,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -24999,7 +24993,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25115,7 +25109,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25126,7 +25120,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25155,7 +25149,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25251,7 +25245,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25308,7 +25302,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25319,7 +25313,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25440,7 +25434,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25597,7 +25591,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25623,7 +25617,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25634,7 +25628,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25697,7 +25691,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25708,7 +25702,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25719,7 +25713,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25950,7 +25944,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25977,7 +25971,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25988,7 +25982,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -25999,7 +25993,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26029,7 +26023,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26040,7 +26034,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26068,7 +26062,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26079,7 +26073,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26167,7 +26161,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26215,7 +26209,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26226,7 +26220,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26237,7 +26231,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26248,7 +26242,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26259,7 +26253,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26270,7 +26264,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26342,7 +26336,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26353,7 +26347,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26407,7 +26401,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26609,7 +26603,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26917,7 +26911,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26928,7 +26922,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -26939,7 +26933,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -27190,7 +27184,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -27201,7 +27195,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -27619,7 +27613,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -28476,7 +28470,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -28606,7 +28600,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -28617,7 +28611,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -28750,7 +28744,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -28833,7 +28827,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -28844,7 +28838,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -29204,7 +29198,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -29511,7 +29505,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -29522,7 +29516,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -29648,7 +29642,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -29659,7 +29653,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -31401,7 +31395,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -31690,7 +31684,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32850,7 +32844,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32861,7 +32855,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32872,7 +32866,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32883,7 +32877,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32894,7 +32888,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32905,7 +32899,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32916,7 +32910,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32927,7 +32921,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32938,7 +32932,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32949,7 +32943,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32960,7 +32954,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32971,7 +32965,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32982,7 +32976,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -32993,7 +32987,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33004,7 +32998,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33015,7 +33009,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33026,7 +33020,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33037,7 +33031,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33048,7 +33042,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33059,7 +33053,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33070,7 +33064,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33081,7 +33075,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33092,7 +33086,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33103,7 +33097,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33114,7 +33108,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33125,7 +33119,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33136,7 +33130,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "badgeboat.com": {
+            "domain": "badgeboat.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33147,7 +33152,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33158,7 +33163,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33169,7 +33174,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33180,7 +33185,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33191,7 +33196,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33202,7 +33207,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33213,7 +33218,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33224,7 +33229,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33235,7 +33240,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33246,7 +33251,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33257,7 +33262,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33268,7 +33273,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33279,7 +33284,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33290,7 +33295,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33301,7 +33306,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33312,7 +33317,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33323,7 +33328,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33334,7 +33339,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33345,7 +33350,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33356,7 +33361,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33367,7 +33372,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33378,7 +33383,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33389,7 +33394,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33400,7 +33405,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33411,7 +33416,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33422,7 +33427,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33433,7 +33438,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33444,7 +33449,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33455,7 +33460,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33466,7 +33471,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33477,7 +33482,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33488,7 +33493,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33499,7 +33504,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33510,7 +33515,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33521,7 +33526,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33532,7 +33537,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33543,7 +33548,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33554,7 +33559,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "cavecurtain.com": {
+            "domain": "cavecurtain.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33565,7 +33581,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "celestialspectra.com": {
+            "domain": "celestialspectra.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33576,7 +33603,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33587,7 +33614,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "chesscolor.com": {
+            "domain": "chesscolor.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33598,7 +33636,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33609,7 +33647,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33620,7 +33658,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33631,7 +33669,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33642,7 +33680,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33653,7 +33691,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33664,7 +33702,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33675,7 +33713,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33686,7 +33724,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33697,7 +33735,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33708,7 +33746,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33719,7 +33757,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33730,7 +33768,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33741,7 +33779,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33752,7 +33790,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33763,7 +33801,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33774,7 +33812,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33785,7 +33823,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33796,7 +33834,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33807,7 +33845,29 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "creatorcherry.com": {
+            "domain": "creatorcherry.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "creaturecabbage.com": {
+            "domain": "creaturecabbage.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33818,7 +33878,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33829,7 +33889,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33840,7 +33900,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33851,7 +33911,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33862,7 +33922,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33873,7 +33933,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33884,7 +33944,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33895,7 +33955,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33906,7 +33966,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33917,7 +33977,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33928,7 +33988,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33939,7 +33999,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33950,7 +34010,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "debonairtree.com": {
+            "domain": "debonairtree.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33961,7 +34032,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33972,7 +34043,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33983,7 +34054,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "defeatedbadge.com": {
+            "domain": "defeatedbadge.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -33994,7 +34076,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34005,7 +34087,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34016,7 +34098,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34027,7 +34109,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34038,7 +34120,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34049,7 +34131,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34060,7 +34142,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34071,7 +34153,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "dreamycanyon.com": {
+            "domain": "dreamycanyon.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34082,7 +34175,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "dustyhammer.com": {
+            "domain": "dustyhammer.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34093,7 +34197,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34104,7 +34208,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34115,7 +34219,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34126,7 +34230,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34137,7 +34241,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34148,7 +34252,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34159,7 +34263,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34170,7 +34274,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34181,7 +34285,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34192,7 +34296,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34203,7 +34307,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34214,7 +34318,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34225,7 +34329,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34236,7 +34340,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34247,7 +34351,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34258,7 +34362,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34269,7 +34373,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34280,7 +34384,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34291,7 +34395,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34302,7 +34406,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34313,7 +34417,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34324,7 +34428,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34335,7 +34439,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34346,7 +34450,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34357,7 +34461,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34368,7 +34472,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34379,7 +34483,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34390,7 +34494,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34401,7 +34505,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34412,7 +34516,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34423,7 +34527,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34434,7 +34538,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34445,7 +34549,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34456,7 +34560,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34467,7 +34571,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34478,7 +34582,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34489,7 +34593,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34500,7 +34604,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34511,7 +34615,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34522,7 +34626,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34533,7 +34637,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34544,7 +34648,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34555,7 +34659,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34566,7 +34670,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34577,7 +34681,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34588,7 +34692,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34599,7 +34703,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34610,7 +34714,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34621,7 +34725,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34632,7 +34736,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34643,7 +34747,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34654,7 +34758,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34665,7 +34769,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34676,7 +34780,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "haltingdivision.com": {
+            "domain": "haltingdivision.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34687,7 +34802,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34698,7 +34813,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34709,7 +34824,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34720,7 +34835,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34731,7 +34846,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34742,7 +34857,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34753,7 +34868,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34764,7 +34879,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34775,7 +34890,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34786,7 +34901,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34797,7 +34912,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34808,7 +34923,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34819,7 +34934,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34830,7 +34945,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34841,7 +34956,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34852,7 +34967,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34863,7 +34978,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34874,7 +34989,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34885,7 +35000,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34896,7 +35011,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34907,7 +35022,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34918,7 +35033,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34929,7 +35044,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34940,7 +35055,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34951,7 +35066,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34962,7 +35077,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34973,7 +35088,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34984,7 +35099,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -34995,7 +35110,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35006,7 +35121,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35017,7 +35132,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35028,7 +35143,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35039,7 +35154,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35050,7 +35165,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35061,7 +35176,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35072,7 +35187,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35083,7 +35198,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35094,7 +35209,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35105,7 +35220,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35116,7 +35231,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35127,7 +35242,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35138,7 +35253,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35149,7 +35264,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35160,7 +35275,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35171,7 +35286,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "meadowlullaby.com": {
+            "domain": "meadowlullaby.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35182,7 +35308,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35193,7 +35319,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35204,7 +35330,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35215,7 +35341,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35226,7 +35352,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35237,7 +35363,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35248,7 +35374,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35259,7 +35385,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35270,7 +35396,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35281,7 +35407,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35292,7 +35418,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35303,7 +35429,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35314,7 +35440,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35325,7 +35451,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35336,7 +35462,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35347,7 +35473,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35358,7 +35484,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35369,7 +35495,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35380,7 +35506,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35391,7 +35517,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35402,7 +35528,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35413,7 +35539,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35424,7 +35550,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35435,7 +35561,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35446,7 +35572,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35457,7 +35583,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35468,7 +35594,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35479,7 +35605,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35490,7 +35616,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35501,7 +35627,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35512,7 +35638,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35523,7 +35649,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35534,7 +35660,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35545,7 +35671,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35556,7 +35682,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35567,7 +35693,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35578,7 +35704,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35589,7 +35715,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35600,7 +35726,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "processplantation.com": {
+            "domain": "processplantation.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35611,7 +35748,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35622,7 +35759,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35633,7 +35770,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35644,7 +35781,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35655,7 +35792,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35666,7 +35803,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35677,7 +35814,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35688,7 +35825,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35699,7 +35836,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35710,7 +35847,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35721,7 +35858,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35732,7 +35869,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35743,7 +35880,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35754,7 +35891,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35765,7 +35902,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35776,7 +35913,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35787,7 +35924,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35798,7 +35935,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35809,7 +35946,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35820,7 +35957,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35831,7 +35968,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35842,7 +35979,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35853,7 +35990,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35864,7 +36001,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35875,7 +36012,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "rhymezebra.com": {
+            "domain": "rhymezebra.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35886,7 +36034,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35897,7 +36045,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35908,7 +36056,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35919,7 +36067,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35930,7 +36078,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35941,7 +36089,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35952,7 +36100,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35963,7 +36111,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35974,7 +36122,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35985,7 +36133,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -35996,7 +36144,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36007,7 +36155,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36018,7 +36166,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36029,7 +36177,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36040,7 +36188,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36051,7 +36199,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36062,7 +36210,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36073,7 +36221,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36084,7 +36232,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36095,7 +36243,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36106,7 +36254,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36117,7 +36265,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36128,7 +36276,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36139,7 +36287,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36150,7 +36298,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36161,7 +36309,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36172,7 +36320,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36183,7 +36331,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36194,7 +36342,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36205,7 +36353,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36216,7 +36364,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36227,7 +36375,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36238,7 +36386,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36249,7 +36397,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36260,7 +36408,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36271,7 +36419,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36282,7 +36430,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36293,7 +36441,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36304,7 +36452,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36315,7 +36463,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36326,7 +36474,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36337,7 +36485,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "solarislabyrinth.com": {
+            "domain": "solarislabyrinth.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36348,7 +36507,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36359,7 +36518,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "soothingglade.com": {
+            "domain": "soothingglade.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36370,7 +36540,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36381,7 +36551,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36392,7 +36562,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36403,7 +36573,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "spellmist.com": {
+            "domain": "spellmist.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36414,7 +36595,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36425,7 +36606,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36436,7 +36617,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36447,7 +36628,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36458,7 +36639,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36469,7 +36650,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36480,7 +36661,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36491,7 +36672,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36502,7 +36683,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36513,7 +36694,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36524,7 +36705,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36535,7 +36716,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36546,7 +36727,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "stockingsleet.com": {
+            "domain": "stockingsleet.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36557,7 +36749,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36568,7 +36760,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36579,7 +36771,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36590,7 +36782,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36601,7 +36793,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36612,7 +36804,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36623,7 +36815,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36634,7 +36826,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36645,7 +36837,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36656,7 +36848,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36667,7 +36859,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36678,7 +36870,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36689,7 +36881,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36700,7 +36892,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36711,7 +36903,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36722,7 +36914,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36733,7 +36925,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36744,7 +36936,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36755,7 +36947,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36766,7 +36958,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36777,7 +36969,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36788,7 +36980,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36799,7 +36991,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36810,7 +37002,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36821,7 +37013,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36832,7 +37024,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36843,7 +37035,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36854,7 +37046,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36865,7 +37057,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36876,7 +37068,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36887,7 +37079,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36898,7 +37090,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36909,7 +37101,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36920,7 +37112,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "tradetooth.com": {
+            "domain": "tradetooth.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36931,7 +37134,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36942,7 +37145,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36953,7 +37156,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36964,7 +37167,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36975,7 +37178,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36986,7 +37189,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -36997,7 +37200,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37008,7 +37211,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37019,7 +37222,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37030,7 +37233,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37041,7 +37244,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37052,7 +37255,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37063,7 +37266,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37074,7 +37277,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37085,7 +37288,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37096,7 +37299,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37107,7 +37310,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37118,7 +37321,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37129,7 +37332,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37140,7 +37343,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37151,7 +37354,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37162,7 +37365,18 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "vibranthaven.com": {
+            "domain": "vibranthaven.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37173,7 +37387,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37184,7 +37398,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37195,7 +37409,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37206,7 +37420,40 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "whimsicalgrove.com": {
+            "domain": "whimsicalgrove.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "whisperingcascade.com": {
+            "domain": "whisperingcascade.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
+            "fingerprinting": 1,
+            "cookies": 0.01,
+            "default": "block"
+        },
+        "whisperingsummit.com": {
+            "domain": "whisperingsummit.com",
+            "owner": {
+                "name": "Leven Labs, Inc. DBA Admiral",
+                "displayName": "Admiral"
+            },
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37217,7 +37464,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37228,7 +37475,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37239,7 +37486,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37250,7 +37497,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -37261,7 +37508,7 @@
                 "name": "Leven Labs, Inc. DBA Admiral",
                 "displayName": "Admiral"
             },
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "fingerprinting": 1,
             "cookies": 0.01,
             "default": "block"
@@ -47322,6 +47569,7 @@
                 "awarealley.com",
                 "awesomeagreement.com",
                 "awzbijw.com",
+                "badgeboat.com",
                 "badgevolcano.com",
                 "bagbeam.com",
                 "baitbaseball.com",
@@ -47377,11 +47625,14 @@
                 "cautiouscamera.com",
                 "cautiouscherries.com",
                 "cautiouscredit.com",
+                "cavecurtain.com",
                 "ceciliavenus.com",
+                "celestialspectra.com",
                 "chalkoil.com",
                 "chargecracker.com",
                 "charmingplate.com",
                 "cherriescare.com",
+                "chesscolor.com",
                 "chickensstation.com",
                 "childlikecrowd.com",
                 "childlikeexample.com",
@@ -47411,6 +47662,8 @@
                 "cozyhillside.com",
                 "crabbychin.com",
                 "cratecamera.com",
+                "creatorcherry.com",
+                "creaturecabbage.com",
                 "crimsonmeadow.com",
                 "critictruck.com",
                 "crookedcreature.com",
@@ -47432,10 +47685,12 @@
                 "daughterstone.com",
                 "dazzlingbook.com",
                 "debonairdust.com",
+                "debonairtree.com",
                 "decisivebase.com",
                 "decisivedrawer.com",
                 "decisiveducks.com",
                 "deerbeginner.com",
+                "defeatedbadge.com",
                 "delicatecascade.com",
                 "detailedkitten.com",
                 "detectdiscovery.com",
@@ -47451,7 +47706,9 @@
                 "dq95d35.com",
                 "drainpaste.com",
                 "dramaticdirection.com",
+                "dreamycanyon.com",
                 "dustydime.com",
+                "dustyhammer.com",
                 "elasticchange.com",
                 "elderlybean.com",
                 "encouragingthread.com",
@@ -47533,6 +47790,7 @@
                 "gustygrandmother.com",
                 "hallowedinvention.com",
                 "haltingbadge.com",
+                "haltingdivision.com",
                 "haltinggold.com",
                 "hammerhearing.com",
                 "handsomehose.com",
@@ -47594,6 +47852,7 @@
                 "materialisticmoon.com",
                 "materialparcel.com",
                 "materialplayground.com",
+                "meadowlullaby.com",
                 "measlymiddle.com",
                 "meatydime.com",
                 "meddleplant.com",
@@ -47660,6 +47919,7 @@
                 "prepareplanes.com",
                 "priceypies.com",
                 "pricklydebt.com",
+                "processplantation.com",
                 "profusesupport.com",
                 "protestcopy.com",
                 "psychedelicarithmetic.com",
@@ -47703,6 +47963,7 @@
                 "retrievemint.com",
                 "rhetoricalloss.com",
                 "rhetoricalveil.com",
+                "rhymezebra.com",
                 "richstring.com",
                 "righteouscrayon.com",
                 "rightfulfall.com",
@@ -47775,15 +48036,18 @@
                 "smoggysnakes.com",
                 "smoggysongs.com",
                 "soggysponge.com",
+                "solarislabyrinth.com",
                 "somberscarecrow.com",
                 "sombersticks.com",
                 "songsterritory.com",
+                "soothingglade.com",
                 "sordidsmile.com",
                 "soretrain.com",
                 "sortsail.com",
                 "sortsummer.com",
                 "soundstocking.com",
                 "spectacularstamp.com",
+                "spellmist.com",
                 "spellsalsa.com",
                 "spookyexchange.com",
                 "spookyskate.com",
@@ -47808,6 +48072,7 @@
                 "stingycrush.com",
                 "stingyshoe.com",
                 "stingyspoon.com",
+                "stockingsleet.com",
                 "stomachscience.com",
                 "straightnest.com",
                 "strangeclocks.com",
@@ -47859,6 +48124,7 @@
                 "tidymitten.com",
                 "tiredthroat.com",
                 "tiresomethunder.com",
+                "tradetooth.com",
                 "tranquilcanyon.com",
                 "tremendousearthquake.com",
                 "tremendousplastic.com",
@@ -47888,6 +48154,7 @@
                 "venusgloria.com",
                 "verdantanswer.com",
                 "verseballs.com",
+                "vibranthaven.com",
                 "virtualvincent.com",
                 "volatilevessel.com",
                 "voraciousgrip.com",
@@ -47896,6 +48163,9 @@
                 "warmquiver.com",
                 "wearbasin.com",
                 "wellgroomedhydrant.com",
+                "whimsicalgrove.com",
+                "whisperingcascade.com",
+                "whisperingsummit.com",
                 "whispermeeting.com",
                 "wildcommittee.com",
                 "workoperation.com",
@@ -47903,7 +48173,7 @@
                 "zipperxray.com",
                 "zlp6s.pw"
             ],
-            "prevalence": 0.0144,
+            "prevalence": 0.0145,
             "displayName": "Admiral"
         }
     },
@@ -48662,6 +48932,7 @@
         "awarealley.com": "Leven Labs, Inc. DBA Admiral",
         "awesomeagreement.com": "Leven Labs, Inc. DBA Admiral",
         "awzbijw.com": "Leven Labs, Inc. DBA Admiral",
+        "badgeboat.com": "Leven Labs, Inc. DBA Admiral",
         "badgevolcano.com": "Leven Labs, Inc. DBA Admiral",
         "bagbeam.com": "Leven Labs, Inc. DBA Admiral",
         "baitbaseball.com": "Leven Labs, Inc. DBA Admiral",
@@ -48717,11 +48988,14 @@
         "cautiouscamera.com": "Leven Labs, Inc. DBA Admiral",
         "cautiouscherries.com": "Leven Labs, Inc. DBA Admiral",
         "cautiouscredit.com": "Leven Labs, Inc. DBA Admiral",
+        "cavecurtain.com": "Leven Labs, Inc. DBA Admiral",
         "ceciliavenus.com": "Leven Labs, Inc. DBA Admiral",
+        "celestialspectra.com": "Leven Labs, Inc. DBA Admiral",
         "chalkoil.com": "Leven Labs, Inc. DBA Admiral",
         "chargecracker.com": "Leven Labs, Inc. DBA Admiral",
         "charmingplate.com": "Leven Labs, Inc. DBA Admiral",
         "cherriescare.com": "Leven Labs, Inc. DBA Admiral",
+        "chesscolor.com": "Leven Labs, Inc. DBA Admiral",
         "chickensstation.com": "Leven Labs, Inc. DBA Admiral",
         "childlikecrowd.com": "Leven Labs, Inc. DBA Admiral",
         "childlikeexample.com": "Leven Labs, Inc. DBA Admiral",
@@ -48751,6 +49025,8 @@
         "cozyhillside.com": "Leven Labs, Inc. DBA Admiral",
         "crabbychin.com": "Leven Labs, Inc. DBA Admiral",
         "cratecamera.com": "Leven Labs, Inc. DBA Admiral",
+        "creatorcherry.com": "Leven Labs, Inc. DBA Admiral",
+        "creaturecabbage.com": "Leven Labs, Inc. DBA Admiral",
         "crimsonmeadow.com": "Leven Labs, Inc. DBA Admiral",
         "critictruck.com": "Leven Labs, Inc. DBA Admiral",
         "crookedcreature.com": "Leven Labs, Inc. DBA Admiral",
@@ -48772,10 +49048,12 @@
         "daughterstone.com": "Leven Labs, Inc. DBA Admiral",
         "dazzlingbook.com": "Leven Labs, Inc. DBA Admiral",
         "debonairdust.com": "Leven Labs, Inc. DBA Admiral",
+        "debonairtree.com": "Leven Labs, Inc. DBA Admiral",
         "decisivebase.com": "Leven Labs, Inc. DBA Admiral",
         "decisivedrawer.com": "Leven Labs, Inc. DBA Admiral",
         "decisiveducks.com": "Leven Labs, Inc. DBA Admiral",
         "deerbeginner.com": "Leven Labs, Inc. DBA Admiral",
+        "defeatedbadge.com": "Leven Labs, Inc. DBA Admiral",
         "delicatecascade.com": "Leven Labs, Inc. DBA Admiral",
         "detailedkitten.com": "Leven Labs, Inc. DBA Admiral",
         "detectdiscovery.com": "Leven Labs, Inc. DBA Admiral",
@@ -48791,7 +49069,9 @@
         "dq95d35.com": "Leven Labs, Inc. DBA Admiral",
         "drainpaste.com": "Leven Labs, Inc. DBA Admiral",
         "dramaticdirection.com": "Leven Labs, Inc. DBA Admiral",
+        "dreamycanyon.com": "Leven Labs, Inc. DBA Admiral",
         "dustydime.com": "Leven Labs, Inc. DBA Admiral",
+        "dustyhammer.com": "Leven Labs, Inc. DBA Admiral",
         "elasticchange.com": "Leven Labs, Inc. DBA Admiral",
         "elderlybean.com": "Leven Labs, Inc. DBA Admiral",
         "encouragingthread.com": "Leven Labs, Inc. DBA Admiral",
@@ -48873,6 +49153,7 @@
         "gustygrandmother.com": "Leven Labs, Inc. DBA Admiral",
         "hallowedinvention.com": "Leven Labs, Inc. DBA Admiral",
         "haltingbadge.com": "Leven Labs, Inc. DBA Admiral",
+        "haltingdivision.com": "Leven Labs, Inc. DBA Admiral",
         "haltinggold.com": "Leven Labs, Inc. DBA Admiral",
         "hammerhearing.com": "Leven Labs, Inc. DBA Admiral",
         "handsomehose.com": "Leven Labs, Inc. DBA Admiral",
@@ -48934,6 +49215,7 @@
         "materialisticmoon.com": "Leven Labs, Inc. DBA Admiral",
         "materialparcel.com": "Leven Labs, Inc. DBA Admiral",
         "materialplayground.com": "Leven Labs, Inc. DBA Admiral",
+        "meadowlullaby.com": "Leven Labs, Inc. DBA Admiral",
         "measlymiddle.com": "Leven Labs, Inc. DBA Admiral",
         "meatydime.com": "Leven Labs, Inc. DBA Admiral",
         "meddleplant.com": "Leven Labs, Inc. DBA Admiral",
@@ -49000,6 +49282,7 @@
         "prepareplanes.com": "Leven Labs, Inc. DBA Admiral",
         "priceypies.com": "Leven Labs, Inc. DBA Admiral",
         "pricklydebt.com": "Leven Labs, Inc. DBA Admiral",
+        "processplantation.com": "Leven Labs, Inc. DBA Admiral",
         "profusesupport.com": "Leven Labs, Inc. DBA Admiral",
         "protestcopy.com": "Leven Labs, Inc. DBA Admiral",
         "psychedelicarithmetic.com": "Leven Labs, Inc. DBA Admiral",
@@ -49043,6 +49326,7 @@
         "retrievemint.com": "Leven Labs, Inc. DBA Admiral",
         "rhetoricalloss.com": "Leven Labs, Inc. DBA Admiral",
         "rhetoricalveil.com": "Leven Labs, Inc. DBA Admiral",
+        "rhymezebra.com": "Leven Labs, Inc. DBA Admiral",
         "richstring.com": "Leven Labs, Inc. DBA Admiral",
         "righteouscrayon.com": "Leven Labs, Inc. DBA Admiral",
         "rightfulfall.com": "Leven Labs, Inc. DBA Admiral",
@@ -49115,15 +49399,18 @@
         "smoggysnakes.com": "Leven Labs, Inc. DBA Admiral",
         "smoggysongs.com": "Leven Labs, Inc. DBA Admiral",
         "soggysponge.com": "Leven Labs, Inc. DBA Admiral",
+        "solarislabyrinth.com": "Leven Labs, Inc. DBA Admiral",
         "somberscarecrow.com": "Leven Labs, Inc. DBA Admiral",
         "sombersticks.com": "Leven Labs, Inc. DBA Admiral",
         "songsterritory.com": "Leven Labs, Inc. DBA Admiral",
+        "soothingglade.com": "Leven Labs, Inc. DBA Admiral",
         "sordidsmile.com": "Leven Labs, Inc. DBA Admiral",
         "soretrain.com": "Leven Labs, Inc. DBA Admiral",
         "sortsail.com": "Leven Labs, Inc. DBA Admiral",
         "sortsummer.com": "Leven Labs, Inc. DBA Admiral",
         "soundstocking.com": "Leven Labs, Inc. DBA Admiral",
         "spectacularstamp.com": "Leven Labs, Inc. DBA Admiral",
+        "spellmist.com": "Leven Labs, Inc. DBA Admiral",
         "spellsalsa.com": "Leven Labs, Inc. DBA Admiral",
         "spookyexchange.com": "Leven Labs, Inc. DBA Admiral",
         "spookyskate.com": "Leven Labs, Inc. DBA Admiral",
@@ -49148,6 +49435,7 @@
         "stingycrush.com": "Leven Labs, Inc. DBA Admiral",
         "stingyshoe.com": "Leven Labs, Inc. DBA Admiral",
         "stingyspoon.com": "Leven Labs, Inc. DBA Admiral",
+        "stockingsleet.com": "Leven Labs, Inc. DBA Admiral",
         "stomachscience.com": "Leven Labs, Inc. DBA Admiral",
         "straightnest.com": "Leven Labs, Inc. DBA Admiral",
         "strangeclocks.com": "Leven Labs, Inc. DBA Admiral",
@@ -49199,6 +49487,7 @@
         "tidymitten.com": "Leven Labs, Inc. DBA Admiral",
         "tiredthroat.com": "Leven Labs, Inc. DBA Admiral",
         "tiresomethunder.com": "Leven Labs, Inc. DBA Admiral",
+        "tradetooth.com": "Leven Labs, Inc. DBA Admiral",
         "tranquilcanyon.com": "Leven Labs, Inc. DBA Admiral",
         "tremendousearthquake.com": "Leven Labs, Inc. DBA Admiral",
         "tremendousplastic.com": "Leven Labs, Inc. DBA Admiral",
@@ -49228,6 +49517,7 @@
         "venusgloria.com": "Leven Labs, Inc. DBA Admiral",
         "verdantanswer.com": "Leven Labs, Inc. DBA Admiral",
         "verseballs.com": "Leven Labs, Inc. DBA Admiral",
+        "vibranthaven.com": "Leven Labs, Inc. DBA Admiral",
         "virtualvincent.com": "Leven Labs, Inc. DBA Admiral",
         "volatilevessel.com": "Leven Labs, Inc. DBA Admiral",
         "voraciousgrip.com": "Leven Labs, Inc. DBA Admiral",
@@ -49236,6 +49526,9 @@
         "warmquiver.com": "Leven Labs, Inc. DBA Admiral",
         "wearbasin.com": "Leven Labs, Inc. DBA Admiral",
         "wellgroomedhydrant.com": "Leven Labs, Inc. DBA Admiral",
+        "whimsicalgrove.com": "Leven Labs, Inc. DBA Admiral",
+        "whisperingcascade.com": "Leven Labs, Inc. DBA Admiral",
+        "whisperingsummit.com": "Leven Labs, Inc. DBA Admiral",
         "whispermeeting.com": "Leven Labs, Inc. DBA Admiral",
         "wildcommittee.com": "Leven Labs, Inc. DBA Admiral",
         "workoperation.com": "Leven Labs, Inc. DBA Admiral",
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 6dd202dfe1..489a3abd77 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -7858,7 +7858,7 @@
 				CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -7895,7 +7895,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -7987,7 +7987,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = ShareExtension/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8014,7 +8014,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8160,7 +8160,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8184,7 +8184,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				INFOPLIST_FILE = DuckDuckGo/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8248,7 +8248,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEAD_CODE_STRIPPING = NO;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = Widgets/Info.plist;
@@ -8283,7 +8283,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8317,7 +8317,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = OpenAction/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = (
@@ -8347,7 +8347,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8633,7 +8633,7 @@
 				CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements;
 				CODE_SIGN_IDENTITY = "iPhone Distribution";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEVELOPMENT_ASSET_PATHS = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8659,7 +8659,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8691,7 +8691,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8728,7 +8728,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
@@ -8764,7 +8764,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				CODE_SIGN_STYLE = Manual;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = "";
 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -8799,11 +8799,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 2;
+				DYLIB_CURRENT_VERSION = 0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -8977,11 +8977,11 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 2;
+				DYLIB_CURRENT_VERSION = 0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -9010,10 +9010,10 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 0;
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 2;
+				DYLIB_CURRENT_VERSION = 0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				INFOPLIST_FILE = Core/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist
index cb5e57cf93..4af486a5a5 100644
--- a/DuckDuckGo/Settings.bundle/Root.plist
+++ b/DuckDuckGo/Settings.bundle/Root.plist
@@ -6,7 +6,7 @@
 	<array>
 		<dict>
 			<key>DefaultValue</key>
-			<string>7.97.1</string>
+			<string>7.99.0</string>
 			<key>Key</key>
 			<string>version</string>
 			<key>Title</key>

From 59dbb74d10ae5f0bd842b1a5c093dbfc4a604589 Mon Sep 17 00:00:00 2001
From: Christopher Brind <brindy@duckduckgo.com>
Date: Wed, 29 Nov 2023 13:10:15 +0000
Subject: [PATCH 27/40] update theme to use system colours (#2180)

---
 ...essBarPositionSettingsViewController.swift |  1 -
 .../AutoClearSettingsViewController.swift     |  1 -
 DuckDuckGo/AutocompleteViewController.swift   |  4 +-
 ...ofillLoginSettingsListViewController.swift | 15 ++++
 DuckDuckGo/Base.lproj/Bookmarks.storyboard    |  5 +-
 DuckDuckGo/Base.lproj/LaunchScreen.storyboard | 15 ++--
 DuckDuckGo/BookmarkDetailsCell.swift          |  2 -
 DuckDuckGo/BookmarksViewControllerCells.swift |  2 -
 DuckDuckGo/DarkTheme.swift                    | 71 ++-----------------
 DuckDuckGo/FeedbackPickerViewController.swift |  1 -
 ...uttonAnimationSettingsViewController.swift |  1 -
 DuckDuckGo/LightTheme.swift                   | 69 ++----------------
 DuckDuckGo/SettingsViewController.swift       |  9 ---
 DuckDuckGo/Theme+DesignSystem.swift           | 58 +++++++++++++++
 DuckDuckGo/Theme.swift                        | 29 ++------
 DuckDuckGo/ThemeManager.swift                 |  6 +-
 DuckDuckGo/ThemeSettingsViewController.swift  |  1 -
 .../UnprotectedSitesViewController.swift      |  1 -
 18 files changed, 104 insertions(+), 187 deletions(-)

diff --git a/DuckDuckGo/AddressBarPositionSettingsViewController.swift b/DuckDuckGo/AddressBarPositionSettingsViewController.swift
index b7df80ab5e..34d8a466f4 100644
--- a/DuckDuckGo/AddressBarPositionSettingsViewController.swift
+++ b/DuckDuckGo/AddressBarPositionSettingsViewController.swift
@@ -43,7 +43,6 @@ class AddressBarPositionSettingsViewController: UITableViewController {
     override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
 
         cell.tintColor = theme.buttonTintColor
         cell.textLabel?.textColor = theme.tableCellTextColor
diff --git a/DuckDuckGo/AutoClearSettingsViewController.swift b/DuckDuckGo/AutoClearSettingsViewController.swift
index f46a1ccf1d..6f4363ff2d 100644
--- a/DuckDuckGo/AutoClearSettingsViewController.swift
+++ b/DuckDuckGo/AutoClearSettingsViewController.swift
@@ -114,7 +114,6 @@ class AutoClearSettingsViewController: UITableViewController {
         
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         
         // Checkmark color
         cell.tintColor = theme.buttonTintColor
diff --git a/DuckDuckGo/AutocompleteViewController.swift b/DuckDuckGo/AutocompleteViewController.swift
index cc13fc7ead..caa9e5b35a 100644
--- a/DuckDuckGo/AutocompleteViewController.swift
+++ b/DuckDuckGo/AutocompleteViewController.swift
@@ -237,8 +237,7 @@ extension AutocompleteViewController: UITableViewDataSource {
 
         cell.backgroundColor = backgroundColor
         cell.tintColor = currentTheme.autocompleteCellAccessoryColor
-        cell.setHighlightedStateBackgroundColor(currentTheme.tableCellHighlightedBackgroundColor)
-        
+
         return cell
     }
 
@@ -255,7 +254,6 @@ extension AutocompleteViewController: UITableViewDataSource {
 
         cell.tintColor = currentTheme.autocompleteCellAccessoryColor
         cell.label?.textColor = currentTheme.tableCellTextColor
-        cell.setHighlightedStateBackgroundColor(currentTheme.tableCellHighlightedBackgroundColor)
 
         return cell
     }
diff --git a/DuckDuckGo/AutofillLoginSettingsListViewController.swift b/DuckDuckGo/AutofillLoginSettingsListViewController.swift
index aa1966ef0f..3c7d0f86a8 100644
--- a/DuckDuckGo/AutofillLoginSettingsListViewController.swift
+++ b/DuckDuckGo/AutofillLoginSettingsListViewController.swift
@@ -552,6 +552,21 @@ extension AutofillLoginSettingsListViewController: UITableViewDelegate {
             return 0
         }
     }
+
+    func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection: Int) {
+        if let view = view as? UITableViewHeaderFooterView {
+            let theme = ThemeManager.shared.currentTheme
+            view.textLabel?.textColor = theme.tableHeaderTextColor
+        }
+    }
+
+    func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection: Int) {
+        if let view = view as? UITableViewHeaderFooterView {
+            let theme = ThemeManager.shared.currentTheme
+            view.textLabel?.textColor = theme.tableHeaderTextColor
+        }
+    }
+
 }
 
 // MARK: UITableViewDataSource
diff --git a/DuckDuckGo/Base.lproj/Bookmarks.storyboard b/DuckDuckGo/Base.lproj/Bookmarks.storyboard
index 8db08cb51a..cf28e50f78 100644
--- a/DuckDuckGo/Base.lproj/Bookmarks.storyboard
+++ b/DuckDuckGo/Base.lproj/Bookmarks.storyboard
@@ -561,10 +561,10 @@
                                             <textInputTraits key="textInputTraits" returnKeyType="done"/>
                                         </textField>
                                         <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fVp-1a-TkJ">
-                                            <rect key="frame" x="88" y="44" width="255" height="0.5"/>
+                                            <rect key="frame" x="88" y="44" width="255" height="0.0"/>
                                             <color key="backgroundColor" name="BookmarksCellSeperatorColor"/>
                                             <constraints>
-                                                <constraint firstAttribute="height" priority="750" constant="0.5" id="RDj-dx-Yf1"/>
+                                                <constraint firstAttribute="height" priority="750" constant="0.33000000000000002" id="RDj-dx-Yf1"/>
                                             </constraints>
                                         </view>
                                     </subviews>
@@ -587,7 +587,6 @@
                                 <color key="backgroundColor" name="surface"/>
                                 <connections>
                                     <outlet property="faviconImageView" destination="gf7-Lt-ftk" id="kIT-Vf-ZxY"/>
-                                    <outlet property="seperatorViewHeight" destination="RDj-dx-Yf1" id="f1A-nY-fdp"/>
                                     <outlet property="titleTextField" destination="rT4-Yr-P8D" id="4f9-bl-KM7"/>
                                     <outlet property="urlTextField" destination="YqY-sP-hhb" id="b8Y-vb-Msu"/>
                                 </connections>
diff --git a/DuckDuckGo/Base.lproj/LaunchScreen.storyboard b/DuckDuckGo/Base.lproj/LaunchScreen.storyboard
index 6f667974a3..b1af175bf8 100644
--- a/DuckDuckGo/Base.lproj/LaunchScreen.storyboard
+++ b/DuckDuckGo/Base.lproj/LaunchScreen.storyboard
@@ -1,9 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="9SF-AN-ir1">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="9SF-AN-ir1">
     <device id="retina6_5" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
+        <capability name="Named colors" minToolsVersion="9.0"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -25,11 +26,11 @@
                             </imageView>
                             <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="TextDuckDuckGo" translatesAutoresizingMaskIntoConstraints="NO" id="CCq-t1-1xH">
                                 <rect key="frame" x="126" y="436" width="162" height="21"/>
-                                <color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <color key="tintColor" name="textPrimary"/>
                             </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="Uoe-RS-vTk"/>
-                        <color key="backgroundColor" red="0.13333333333333333" green="0.13333333333333333" blue="0.13333333333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <color key="backgroundColor" name="background"/>
                         <constraints>
                             <constraint firstItem="EId-hf-6HL" firstAttribute="centerX" secondItem="5uF-ws-lnA" secondAttribute="centerX" id="2In-4c-xKC"/>
                             <constraint firstItem="CCq-t1-1xH" firstAttribute="centerX" secondItem="5uF-ws-lnA" secondAttribute="centerX" id="VEh-23-FIM"/>
@@ -47,5 +48,11 @@
     <resources>
         <image name="Logo" width="128" height="128"/>
         <image name="TextDuckDuckGo" width="162" height="21"/>
+        <namedColor name="background">
+            <color red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </namedColor>
+        <namedColor name="textPrimary">
+            <color red="0.0" green="0.0" blue="0.0" alpha="0.8399999737739563" colorSpace="custom" customColorSpace="sRGB"/>
+        </namedColor>
     </resources>
 </document>
diff --git a/DuckDuckGo/BookmarkDetailsCell.swift b/DuckDuckGo/BookmarkDetailsCell.swift
index 6e037b3a46..c6cc3dce9b 100644
--- a/DuckDuckGo/BookmarkDetailsCell.swift
+++ b/DuckDuckGo/BookmarkDetailsCell.swift
@@ -52,12 +52,10 @@ class BookmarkDetailsCell: UITableViewCell {
     @IBOutlet weak var titleTextField: UITextField!
     @IBOutlet weak var urlTextField: UITextField!
     @IBOutlet weak var faviconImageView: UIImageView!
-    @IBOutlet weak var seperatorViewHeight: NSLayoutConstraint!
     
     func setUp() {
         selectionStyle = .none
         
-        seperatorViewHeight.constant = 1.0 / UIScreen.main.scale
         titleTextField.becomeFirstResponder()
         
         titleTextField.removeTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
diff --git a/DuckDuckGo/BookmarksViewControllerCells.swift b/DuckDuckGo/BookmarksViewControllerCells.swift
index 7cb16c799b..27b231fe19 100644
--- a/DuckDuckGo/BookmarksViewControllerCells.swift
+++ b/DuckDuckGo/BookmarksViewControllerCells.swift
@@ -76,7 +76,6 @@ class BookmarksViewControllerCellFactory {
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
         cell.titleLabel.textColor = theme.tableCellTextColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         cell.favoriteImageView.tintColor = UIColor(designSystemColor: .icons)
         cell.editingAccessoryType = .disclosureIndicator
         return cell
@@ -91,7 +90,6 @@ class BookmarksViewControllerCellFactory {
         cell.backgroundColor = theme.tableCellBackgroundColor
         cell.titleLabel.textColor = theme.tableCellTextColor
         cell.childrenCountLabel.textColor = theme.tableCellTextColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         cell.editingAccessoryType = .disclosureIndicator
         return cell
     }
diff --git a/DuckDuckGo/DarkTheme.swift b/DuckDuckGo/DarkTheme.swift
index 52ec2eece9..6ca267eba7 100644
--- a/DuckDuckGo/DarkTheme.swift
+++ b/DuckDuckGo/DarkTheme.swift
@@ -32,93 +32,34 @@ struct DarkTheme: Theme {
     var tabsBarBackgroundColor = UIColor.black
     var tabsBarSeparatorColor = UIColor.darkGreyish
 
-    var navigationBarTitleColor = UIColor.white
     var navigationBarTintColor = UIColor.lightMercury
-    
-    var tintOnBlurColor = UIColor.white
-    
-    var searchBarBackgroundColor = UIColor.charcoalGrey
+
     var centeredSearchBarBackgroundColor = UIColor.nearlyBlackLight
-    var searchBarTextColor = UIColor.white
     var searchBarTextDeemphasisColor = UIColor.lightMercury
-    var searchBarBorderColor = UIColor.darkGreyish
-    var searchBarClearTextIconColor = UIColor.greyish2
-    var searchBarVoiceSearchIconColor = UIColor.greyish2
-    
-    var browsingMenuTextColor = UIColor.white
-    var browsingMenuIconsColor = UIColor.gray20
-    var browsingMenuSeparatorColor = UIColor.charcoalGrey
-    var browsingMenuHighlightColor = UIColor.darkGreyish
-    
-    var progressBarGradientDarkColor = UIColor.orange
-    var progressBarGradientLightColor = UIColor.orangeLight
-    
-    var autocompleteSuggestionTextColor = UIColor.white
-    var autocompleteCellAccessoryColor = UIColor.lightMercury
 
+    var browsingMenuHighlightColor = UIColor.darkGreyish
+  
     var tableCellSelectedColor = UIColor.charcoalGrey
-    var tableCellSeparatorColor = UIColor.charcoalGrey
-    var tableCellTextColor = UIColor.lightGreyish
-    var tableCellAccessoryTextColor = UIColor.greyish
     var tableCellAccessoryColor = UIColor.greyish3
     var tableCellHighlightedBackgroundColor = UIColor.greyishBrown
-    var tableHeaderTextColor = UIColor.greyish3
     
     var tabSwitcherCellBorderColor = UIColor.white
     var tabSwitcherCellTextColor = UIColor.white
     var tabSwitcherCellSecondaryTextColor = UIColor.lightMercury
-    
-    var iconCellBorderColor = UIColor.lightGreyish
-
-    var buttonTintColor = UIColor.cornflowerBlue
-    var placeholderColor = UIColor.greyish
-    
-    var textFieldBackgroundColor = UIColor.nearlyBlackLight
-    var textFieldFontColor = UIColor.white
-    
+ 
     var homeRowPrimaryTextColor = UIColor.white
     var homeRowSecondaryTextColor = UIColor.lightMercury
     var homeRowBackgroundColor = UIColor.nearlyBlackLight
     
     var homePrivacyCellTextColor = UIColor.white
     var homePrivacyCellSecondaryTextColor = UIColor.greyish3
-    
-    var aboutScreenTextColor = UIColor.white
-    var aboutScreenButtonColor = UIColor.cornflowerBlue
-    
+     
     var favoritesPlusTintColor = UIColor.greyish3
     var favoritesPlusBackgroundColor = UIColor.greyishBrown2
 
-    var faviconBackgroundColor = UIColor.charcoalGrey
-    var favoriteTextColor = UIColor.greyish
-    
-    var feedbackPrimaryTextColor = UIColor.white
-    var feedbackSecondaryTextColor = UIColor.lightGreyish
-    var feedbackSentimentButtonBackgroundColor = UIColor.charcoalGrey
-    
-    var privacyReportCellBackgroundColor = UIColor.nearlyBlackLight
-    
     var activityStyle: UIActivityIndicatorView.Style = .medium
     
     var destructiveColor: UIColor = UIColor.destructive
-    
-    var ddgTextTintColor: UIColor = .white
-
-    var daxDialogBackgroundColor: UIColor = .nearlyBlackLight
-    var daxDialogTextColor: UIColor = UIColor.nearlyWhite
-    
-    var homeMessageBackgroundColor = UIColor.nearlyBlackLight
-    var homeMessageHeaderTextColor = UIColor.white
-    var homeMessageSubheaderTextColor = UIColor.greyish2
-    var homeMessageTopTextColor = UIColor.cornflowerBlue
-    var homeMessageButtonColor = UIColor.cornflowerBlue
-    var homeMessageButtonTextColor = UIColor.white
-    var homeMessageDismissButtonColor = UIColor.white
-
-    var autofillDefaultTitleTextColor = UIColor.white
-    var autofillDefaultSubtitleTextColor = UIColor.lightMercury
-    var autofillEmptySearchViewTextColor = UIColor.gray20
-    var autofillLockedViewTextColor = UIColor.lightMercury
 
-    var privacyDashboardWebviewBackgroundColor = UIColor.nearlyBlackLight
+    var searchBarBackgroundColor: UIColor = UIColor.charcoalGrey
 }
diff --git a/DuckDuckGo/FeedbackPickerViewController.swift b/DuckDuckGo/FeedbackPickerViewController.swift
index 898f0d095a..96169a4169 100644
--- a/DuckDuckGo/FeedbackPickerViewController.swift
+++ b/DuckDuckGo/FeedbackPickerViewController.swift
@@ -117,7 +117,6 @@ class FeedbackPickerViewController: UITableViewController {
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
         cell.textLabel?.textColor = theme.tableCellTextColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         
         let text = cell.textLabel?.attributedText?.mutableCopy() as? NSMutableAttributedString
         text?.mutableString.setString(entries[indexPath.row].userText)
diff --git a/DuckDuckGo/FireButtonAnimationSettingsViewController.swift b/DuckDuckGo/FireButtonAnimationSettingsViewController.swift
index b96853515e..94b2ae8cd9 100644
--- a/DuckDuckGo/FireButtonAnimationSettingsViewController.swift
+++ b/DuckDuckGo/FireButtonAnimationSettingsViewController.swift
@@ -49,7 +49,6 @@ class FireButtonAnimationSettingsViewController: UITableViewController {
         
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         
         // Checkmark color
         cell.tintColor = theme.buttonTintColor
diff --git a/DuckDuckGo/LightTheme.swift b/DuckDuckGo/LightTheme.swift
index 465680947a..7c90ed2b5d 100644
--- a/DuckDuckGo/LightTheme.swift
+++ b/DuckDuckGo/LightTheme.swift
@@ -33,94 +33,33 @@ struct LightTheme: Theme {
     var tabsBarBackgroundColor = UIColor.gray20
     var tabsBarSeparatorColor = UIColor.greyish
     
-
-    var navigationBarTitleColor = UIColor.nearlyBlackLight
     var navigationBarTintColor = UIColor.darkGreyish
     
-    var tintOnBlurColor = UIColor.white
-    
-    var searchBarBackgroundColor = UIColor.lightGreyish
-    var centeredSearchBarBackgroundColor = UIColor.mercury
-    var searchBarTextColor = UIColor.nearlyBlackLight
     var searchBarTextDeemphasisColor = UIColor.greyish3
-    var searchBarBorderColor = UIColor.lightGreyish
-    var searchBarClearTextIconColor = UIColor.greyish2
-    var searchBarVoiceSearchIconColor = UIColor.greyish2
-    
-    var browsingMenuTextColor = UIColor.nearlyBlack
-    var browsingMenuIconsColor = UIColor.nearlyBlackLight
-    var browsingMenuSeparatorColor = UIColor.mercury
-    var browsingMenuHighlightColor = UIColor.lightGreyish
-    
-    var progressBarGradientDarkColor = UIColor.cornflowerBlue
-    var progressBarGradientLightColor = UIColor.skyBlueLight
 
-    var autocompleteSuggestionTextColor = UIColor.black
-    var autocompleteCellAccessoryColor = UIColor.darkGreyish
+    var browsingMenuHighlightColor = UIColor.lightGreyish
     
     var tableCellSelectedColor = UIColor.mercury
-    var tableCellSeparatorColor = UIColor(white: 0, alpha: 0.09)
-    var tableCellTextColor = UIColor.darkGreyish
-    var tableCellAccessoryTextColor = UIColor.greyish3
     var tableCellAccessoryColor = UIColor.greyish
     var tableCellHighlightedBackgroundColor = UIColor.mercury
-    var tableHeaderTextColor = UIColor.greyish3
     
     var tabSwitcherCellBorderColor = UIColor.nearlyBlackLight
     var tabSwitcherCellTextColor = UIColor.black
     var tabSwitcherCellSecondaryTextColor = UIColor.greyishBrown2
-    
-    var iconCellBorderColor = UIColor.darkGreyish
 
-    var buttonTintColor = UIColor.cornflowerBlue
-    var placeholderColor = UIColor.greyish3
-    
-    var textFieldBackgroundColor = UIColor.white
-    var textFieldFontColor = UIColor.nearlyBlackLight
-    
     var homeRowPrimaryTextColor = UIColor.nearlyBlackLight
     var homeRowSecondaryTextColor = UIColor.greyishBrown2
     var homeRowBackgroundColor = UIColor.nearlyWhiteLight
     
     var homePrivacyCellTextColor = UIColor.charcoalGrey
     var homePrivacyCellSecondaryTextColor = UIColor.greyish3
-    
-    var aboutScreenTextColor = UIColor.charcoalGrey
-    var aboutScreenButtonColor = UIColor.cornflowerBlue
-    
+       
     var favoritesPlusTintColor = UIColor.greyish3
     var favoritesPlusBackgroundColor = UIColor.lightMercury
-    
-    var faviconBackgroundColor = UIColor.white
-    var favoriteTextColor = UIColor.darkGreyish
-    
-    var feedbackPrimaryTextColor = UIColor.nearlyBlackLight
-    var feedbackSecondaryTextColor = UIColor.nearlyBlackLight
-    var feedbackSentimentButtonBackgroundColor = UIColor.white
-    
-    var privacyReportCellBackgroundColor = UIColor.white
-    
+
     var activityStyle: UIActivityIndicatorView.Style = .medium
     
     var destructiveColor: UIColor = UIColor.destructive
-    
-    var ddgTextTintColor: UIColor = UIColor.nearlyBlackLight
-    
-    var daxDialogBackgroundColor: UIColor = UIColor.white
-    var daxDialogTextColor: UIColor = UIColor.darkGreyish
-    
-    var homeMessageBackgroundColor = UIColor.white
-    var homeMessageHeaderTextColor = UIColor.black
-    var homeMessageSubheaderTextColor = UIColor.greyish3
-    var homeMessageTopTextColor = UIColor.cornflowerBlue
-    var homeMessageButtonColor = UIColor.cornflowerBlue
-    var homeMessageButtonTextColor = UIColor.white
-    var homeMessageDismissButtonColor = UIColor.nearlyBlackLight
-
-    var autofillDefaultTitleTextColor = UIColor.nearlyBlack
-    var autofillDefaultSubtitleTextColor = UIColor.greyishBrown2
-    var autofillEmptySearchViewTextColor = UIColor.gray50
-    var autofillLockedViewTextColor = UIColor.nearlyBlack
 
-    var privacyDashboardWebviewBackgroundColor = UIColor.white
+    var searchBarBackgroundColor: UIColor = UIColor.lightGreyish
 }
diff --git a/DuckDuckGo/SettingsViewController.swift b/DuckDuckGo/SettingsViewController.swift
index 0f52a73f5a..42bc7ae375 100644
--- a/DuckDuckGo/SettingsViewController.swift
+++ b/DuckDuckGo/SettingsViewController.swift
@@ -510,17 +510,8 @@ class SettingsViewController: UITableViewController {
     }
     
     override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
-        
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
-        
-        if cell.accessoryType == .disclosureIndicator {
-            let accesoryImage = UIImageView(image: UIImage(named: "DisclosureIndicator"))
-            accesoryImage.frame = CGRect(x: 0, y: 0, width: 8, height: 13)
-            accesoryImage.tintColor = theme.tableCellAccessoryColor
-            cell.accessoryView = accesoryImage
-        }
     }
 
     override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection: Int) {
diff --git a/DuckDuckGo/Theme+DesignSystem.swift b/DuckDuckGo/Theme+DesignSystem.swift
index f52d2e923e..d496616332 100644
--- a/DuckDuckGo/Theme+DesignSystem.swift
+++ b/DuckDuckGo/Theme+DesignSystem.swift
@@ -33,4 +33,62 @@ extension Theme {
     var tabSwitcherCellBackgroundColor: UIColor { UIColor(designSystemColor: .surface) }
     var searchBarTextPlaceholderColor: UIColor { UIColor(designSystemColor: .textSecondary) }
 
+    // New:
+    var autocompleteCellAccessoryColor: UIColor { UIColor(designSystemColor: .icons) }
+
+    var autofillDefaultTitleTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var autofillDefaultSubtitleTextColor: UIColor { UIColor(designSystemColor: .textSecondary) }
+    var autofillEmptySearchViewTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var autofillLockedViewTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+
+    var ddgTextTintColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+
+    var privacyDashboardWebviewBackgroundColor: UIColor { UIColor(designSystemColor: .surface) }
+
+    var iconCellBorderColor: UIColor { UIColor(designSystemColor: .icons) }
+
+    var browsingMenuTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var browsingMenuIconsColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var browsingMenuSeparatorColor: UIColor { UIColor(designSystemColor: .lines) }
+
+    var feedbackSentimentButtonBackgroundColor: UIColor { UIColor(designSystemColor: .surface) }
+
+    var aboutScreenButtonColor: UIColor { UIColor(designSystemColor: .accent) }
+
+    var tabSwitcherCellBorderColor: UIColor { UIColor(designSystemColor: .surface) }
+    var tabSwitcherCellTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var tabSwitcherCellSecondaryTextColor: UIColor { UIColor(designSystemColor: .textSecondary) }
+
+    var textFieldFontColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var textFieldBackgroundColor: UIColor { UIColor(designSystemColor: .surface) }
+
+    var buttonTintColor: UIColor { UIColor(designSystemColor: .accent) }
+
+    var feedbackPrimaryTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var feedbackSecondaryTextColor: UIColor { UIColor(designSystemColor: .textSecondary) }
+
+    var progressBarGradientDarkColor: UIColor { UIColor(designSystemColor: .accent) }
+    var progressBarGradientLightColor: UIColor { UIColor(designSystemColor: .accent) }
+
+    var daxDialogBackgroundColor: UIColor { UIColor(designSystemColor: .surface) }
+    var daxDialogTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+
+    var placeholderColor: UIColor { UIColor(designSystemColor: .textSecondary) }
+    var searchBarTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+
+    var navigationBarTitleColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var tableHeaderTextColor: UIColor {UIColor(designSystemColor: .textSecondary) }
+
+    var faviconBackgroundColor: UIColor { UIColor(designSystemColor: .surface) }
+
+    var favoriteTextColor: UIColor { UIColor(designSystemColor: .textSecondary) }
+    var aboutScreenTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var autocompleteSuggestionTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+
+    var tableCellTextColor: UIColor { UIColor(designSystemColor: .textPrimary) }
+    var tableCellSeparatorColor: UIColor { UIColor(designSystemColor: .lines) }
+
+    // No design system colour yet, so fall back to SDK colours
+    var tableCellAccessoryTextColor: UIColor { .secondaryLabel }
+
 }
diff --git a/DuckDuckGo/Theme.swift b/DuckDuckGo/Theme.swift
index 063920f72e..e145c51444 100644
--- a/DuckDuckGo/Theme.swift
+++ b/DuckDuckGo/Theme.swift
@@ -46,18 +46,11 @@ protocol Theme {
     var navigationBarTitleColor: UIColor { get }
     var navigationBarTintColor: UIColor { get }
     
-    // Color of the content that is directly placed over blurred background
-    var tintOnBlurColor: UIColor { get }
-    
     var searchBarBackgroundColor: UIColor { get }
-    var centeredSearchBarBackgroundColor: UIColor { get }
     var searchBarTextColor: UIColor { get }
     var searchBarTextPlaceholderColor: UIColor { get }
     var searchBarTextDeemphasisColor: UIColor { get }
-    var searchBarBorderColor: UIColor { get }
-    var searchBarClearTextIconColor: UIColor { get }
-    var searchBarVoiceSearchIconColor: UIColor { get }
-    
+
     var browsingMenuTextColor: UIColor { get }
     var browsingMenuIconsColor: UIColor { get }
     var browsingMenuBackgroundColor: UIColor { get }
@@ -69,7 +62,7 @@ protocol Theme {
     
     var autocompleteSuggestionTextColor: UIColor { get }
     var autocompleteCellAccessoryColor: UIColor { get }
-    
+
     var tableCellBackgroundColor: UIColor { get }
     var tableCellSelectedColor: UIColor { get }
     var tableCellSeparatorColor: UIColor { get }
@@ -102,17 +95,13 @@ protocol Theme {
     var aboutScreenTextColor: UIColor { get }
     var aboutScreenButtonColor: UIColor { get }
 
-    var favoritesPlusTintColor: UIColor { get }
-    var favoritesPlusBackgroundColor: UIColor { get }
     var faviconBackgroundColor: UIColor { get }
     var favoriteTextColor: UIColor { get }
     
     var feedbackPrimaryTextColor: UIColor { get }
     var feedbackSecondaryTextColor: UIColor { get }
     var feedbackSentimentButtonBackgroundColor: UIColor { get }
-    
-    var privacyReportCellBackgroundColor: UIColor { get }
-    
+
     var activityStyle: UIActivityIndicatorView.Style { get }
     
     var destructiveColor: UIColor { get }
@@ -121,17 +110,7 @@ protocol Theme {
     
     var daxDialogBackgroundColor: UIColor { get }
     var daxDialogTextColor: UIColor { get }
-    
-    var homeMessageBackgroundColor: UIColor { get }
-    var homeMessageHeaderTextColor: UIColor { get }
-    var homeMessageSubheaderTextColor: UIColor { get }
-    var homeMessageTopTextColor: UIColor { get }
-    var homeMessageButtonColor: UIColor { get }
-    var homeMessageButtonTextColor: UIColor { get }
-    var homeMessageDismissButtonColor: UIColor { get }
-
-    var autofillDefaultTitleTextColor: UIColor { get }
-    var autofillDefaultSubtitleTextColor: UIColor { get }
+ 
     var autofillEmptySearchViewTextColor: UIColor { get }
     var autofillLockedViewTextColor: UIColor { get }
 
diff --git a/DuckDuckGo/ThemeManager.swift b/DuckDuckGo/ThemeManager.swift
index a788a252b8..1a764b755e 100644
--- a/DuckDuckGo/ThemeManager.swift
+++ b/DuckDuckGo/ThemeManager.swift
@@ -57,8 +57,9 @@ class ThemeManager {
             }
         }
     }
-    
-    private static func makeTheme(name: ThemeName) -> Theme {
+
+    public static func makeTheme(name: ThemeName) -> Theme {
+
         switch name {
         case .systemDefault:
             return obtainSystemTheme()
@@ -66,7 +67,6 @@ class ThemeManager {
             return DarkTheme()
         case .light:
             return LightTheme()
-
         }
     }
     
diff --git a/DuckDuckGo/ThemeSettingsViewController.swift b/DuckDuckGo/ThemeSettingsViewController.swift
index 4879cca3a2..81a0a874e1 100644
--- a/DuckDuckGo/ThemeSettingsViewController.swift
+++ b/DuckDuckGo/ThemeSettingsViewController.swift
@@ -55,7 +55,6 @@ class ThemeSettingsViewController: UITableViewController {
         
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         
         // Checkmark color
         cell.tintColor = theme.buttonTintColor
diff --git a/DuckDuckGo/UnprotectedSitesViewController.swift b/DuckDuckGo/UnprotectedSitesViewController.swift
index 94a1c03d5c..9a25969853 100644
--- a/DuckDuckGo/UnprotectedSitesViewController.swift
+++ b/DuckDuckGo/UnprotectedSitesViewController.swift
@@ -222,7 +222,6 @@ class UnprotectedSitesViewController: UITableViewController {
         
         let theme = enforceLightTheme ? LightTheme() : ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
-        cell.setHighlightedStateBackgroundColor(theme.tableCellHighlightedBackgroundColor)
         
         return cell
     }

From 82c85176f9be666f10a421325c2036e44967ae91 Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Wed, 29 Nov 2023 20:34:23 +0100
Subject: [PATCH 28/40] NetP Geoswitching Design Review feedback (#2206)

---
 DuckDuckGo.xcodeproj/project.pbxproj          |  4 ++
 ...tworkProtectionVPNCountryLabelsModel.swift | 42 ++++++++++++++++++
 ...etworkProtectionVPNLocationViewModel.swift | 24 ++++------
 .../NetworkProtectionVPNSettingsView.swift    | 19 ++++++--
 ...etworkProtectionVPNSettingsViewModel.swift | 44 ++++++++++++++-----
 DuckDuckGo/UserText.swift                     |  8 +++-
 DuckDuckGo/en.lproj/Localizable.strings       |  7 ++-
 7 files changed, 115 insertions(+), 33 deletions(-)
 create mode 100644 DuckDuckGo/NetworkProtectionVPNCountryLabelsModel.swift

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 489a3abd77..feaaa47f33 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -773,6 +773,7 @@
 		EE0153EF2A70021E002A8B26 /* NetworkProtectionInviteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0153EE2A70021E002A8B26 /* NetworkProtectionInviteView.swift */; };
 		EE01EB402AFBD0000096AAC9 /* NetworkProtectionVPNSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE01EB3F2AFBD0000096AAC9 /* NetworkProtectionVPNSettingsViewModel.swift */; };
 		EE01EB432AFC1E0A0096AAC9 /* NetworkProtectionVPNLocationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE01EB422AFC1E0A0096AAC9 /* NetworkProtectionVPNLocationView.swift */; };
+		EE0798C52B179936000A4F64 /* NetworkProtectionVPNCountryLabelsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0798C42B179936000A4F64 /* NetworkProtectionVPNCountryLabelsModel.swift */; };
 		EE276BEA2A77F823009167B6 /* NetworkProtectionRootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE276BE92A77F823009167B6 /* NetworkProtectionRootViewController.swift */; };
 		EE3766DE2AC5945500AAB575 /* NetworkProtectionUNNotificationPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE3766DD2AC5945500AAB575 /* NetworkProtectionUNNotificationPresenter.swift */; };
 		EE3B226B29DE0F110082298A /* MockInternalUserStoring.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE3B226A29DE0F110082298A /* MockInternalUserStoring.swift */; };
@@ -2393,6 +2394,7 @@
 		EE0153EE2A70021E002A8B26 /* NetworkProtectionInviteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionInviteView.swift; sourceTree = "<group>"; };
 		EE01EB3F2AFBD0000096AAC9 /* NetworkProtectionVPNSettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionVPNSettingsViewModel.swift; sourceTree = "<group>"; };
 		EE01EB422AFC1E0A0096AAC9 /* NetworkProtectionVPNLocationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionVPNLocationView.swift; sourceTree = "<group>"; };
+		EE0798C42B179936000A4F64 /* NetworkProtectionVPNCountryLabelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionVPNCountryLabelsModel.swift; sourceTree = "<group>"; };
 		EE276BE92A77F823009167B6 /* NetworkProtectionRootViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionRootViewController.swift; sourceTree = "<group>"; };
 		EE3766DD2AC5945500AAB575 /* NetworkProtectionUNNotificationPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionUNNotificationPresenter.swift; sourceTree = "<group>"; };
 		EE3B226A29DE0F110082298A /* MockInternalUserStoring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockInternalUserStoring.swift; sourceTree = "<group>"; };
@@ -4496,6 +4498,7 @@
 			children = (
 				EE01EB422AFC1E0A0096AAC9 /* NetworkProtectionVPNLocationView.swift */,
 				EEC02C132B0519DE0045CE11 /* NetworkProtectionVPNLocationViewModel.swift */,
+				EE0798C42B179936000A4F64 /* NetworkProtectionVPNCountryLabelsModel.swift */,
 			);
 			name = PreferredLocation;
 			sourceTree = "<group>";
@@ -6357,6 +6360,7 @@
 				1EE7C299294227EC0026C8CB /* AutoconsentSettingsViewController.swift in Sources */,
 				4BCD14632B05AF2B000B1E4C /* NetworkProtectionAccessController.swift in Sources */,
 				1E8AD1D527C2E22900ABA377 /* DownloadsListSectionViewModel.swift in Sources */,
+				EE0798C52B179936000A4F64 /* NetworkProtectionVPNCountryLabelsModel.swift in Sources */,
 				4BC6DD1C2A60E6AD001EC129 /* ReportBrokenSiteView.swift in Sources */,
 				31584616281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift in Sources */,
 				C1F341C72A6924100032057B /* EmailAddressPromptViewModel.swift in Sources */,
diff --git a/DuckDuckGo/NetworkProtectionVPNCountryLabelsModel.swift b/DuckDuckGo/NetworkProtectionVPNCountryLabelsModel.swift
new file mode 100644
index 0000000000..0d450d449c
--- /dev/null
+++ b/DuckDuckGo/NetworkProtectionVPNCountryLabelsModel.swift
@@ -0,0 +1,42 @@
+//
+//  NetworkProtectionVPNCountryLabelsModel.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+import NetworkProtection
+
+struct NetworkProtectionVPNCountryLabelsModel {
+    let emoji: String
+    let title: String
+
+    init(country: String) {
+        self.title = Locale.current.localizedString(forRegionCode: country) ?? country.capitalized
+        self.emoji = Self.flag(country: country)
+    }
+
+    private static func flag(country: String) -> String {
+        let flagBase = UnicodeScalar("🇦").value - UnicodeScalar("A").value
+
+        let flag = country
+            .uppercased()
+            .unicodeScalars
+            .compactMap({ UnicodeScalar(flagBase + $0.value)?.description })
+            .joined()
+        return flag
+    }
+}
diff --git a/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift b/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
index 38dfdd1b66..0a13bf75cb 100644
--- a/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionVPNLocationViewModel.swift
@@ -113,35 +113,29 @@ private typealias CountryItem = NetworkProtectionVPNCountryItemModel
 private typealias CityItem = NetworkProtectionVPNCityItemModel
 
 struct NetworkProtectionVPNCountryItemModel: Identifiable {
+    private let labelsModel: NetworkProtectionVPNCountryLabelsModel
+
+    var emoji: String {
+        labelsModel.emoji
+    }
+    var title: String {
+        labelsModel.title
+    }
     let isSelected: Bool
     var id: String
-    let emoji: String
-    let title: String
     let subtitle: String?
     let cityPickerItems: [NetworkProtectionVPNCityItemModel]
     let shouldShowPicker: Bool
 
     fileprivate init(netPLocation: NetworkProtectionLocation, isSelected: Bool, cityPickerItems: [NetworkProtectionVPNCityItemModel]) {
+        self.labelsModel = .init(country: netPLocation.country)
         self.isSelected = isSelected
         self.id = netPLocation.country
-        self.title = Locale.current.localizedString(forRegionCode: id) ?? id
         let hasMultipleCities = netPLocation.cities.count > 1
         self.subtitle = hasMultipleCities ? UserText.netPVPNLocationCountryItemFormattedCitiesCount(netPLocation.cities.count) : nil
         self.cityPickerItems = cityPickerItems
-        self.emoji = Self.flag(country: netPLocation.country)
         self.shouldShowPicker = hasMultipleCities
     }
-
-    static func flag(country: String) -> String {
-        let flagBase = UnicodeScalar("🇦").value - UnicodeScalar("A").value
-
-        let flag = country
-            .uppercased()
-            .unicodeScalars
-            .compactMap({ UnicodeScalar(flagBase + $0.value)?.description })
-            .joined()
-        return flag
-    }
 }
 
 struct NetworkProtectionVPNCityItemModel: Identifiable {
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
index f7b5c33774..74a50a3c95 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
@@ -31,10 +31,21 @@ struct NetworkProtectionVPNSettingsView: View {
             List {
                 Section {
                     NavigationLink(destination: NetworkProtectionVPNLocationView()) {
-                        HStack {
-                            Text(UserText.netPPreferredLocationSettingTitle).daxBodyRegular().foregroundColor(.textPrimary)
-                            Spacer()
-                            Text(viewModel.preferredLocation).daxBodyRegular().foregroundColor(.textSecondary)
+                        HStack(spacing: 16) {
+                            switch viewModel.preferredLocation.icon {
+                            case .defaultIcon:
+                                Image("Location-Solid-24")
+                            case .emoji(let string):
+                                Text(string)
+                            }
+                            VStack(alignment: .leading) {
+                                Text(UserText.netPPreferredLocationSettingTitle)
+                                    .daxBodyRegular()
+                                    .foregroundColor(.textPrimary)
+                                Text(viewModel.preferredLocation.title)
+                                    .daxFootnoteRegular()
+                                    .foregroundColor(.textSecondary)
+                            }
                         }
                     }
                 }
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift b/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
index f7ff89c53f..b0ac27cf07 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsViewModel.swift
@@ -27,25 +27,20 @@ final class NetworkProtectionVPNSettingsViewModel: ObservableObject {
     private let settings: VPNSettings
     private var cancellables: Set<AnyCancellable> = []
 
-    @Published public var preferredLocation: String = UserText.netPPreferredLocationNearest
+    @Published public var preferredLocation: NetworkProtectionLocationSettingsItemModel
     @Published public var excludeLocalNetworks: Bool = true
 
     init(settings: VPNSettings) {
         self.settings = settings
+        self.preferredLocation = NetworkProtectionLocationSettingsItemModel(selectedLocation: settings.selectedLocation)
         settings.selectedLocationPublisher
-            .map { selectedLocation in
-                guard let selectedLocation = selectedLocation.location else {
-                    return UserText.netPPreferredLocationNearest
-                }
-                guard let city = selectedLocation.city else {
-                    return Self.localizedString(forRegionCode: selectedLocation.country)
-                }
-                return "\(city), \(Self.localizedString(forRegionCode: selectedLocation.country))"
-            }
+            .receive(on: DispatchQueue.main)
+            .map(NetworkProtectionLocationSettingsItemModel.init(selectedLocation:))
             .assign(to: \.preferredLocation, onWeaklyHeld: self)
             .store(in: &cancellables)
         
         settings.excludeLocalNetworksPublisher
+            .receive(on: DispatchQueue.main)
             .assign(to: \.excludeLocalNetworks, onWeaklyHeld: self)
             .store(in: &cancellables)
     }
@@ -59,4 +54,33 @@ final class NetworkProtectionVPNSettingsViewModel: ObservableObject {
     }
 }
 
+struct NetworkProtectionLocationSettingsItemModel {
+    enum LocationIcon {
+        case defaultIcon
+        case emoji(String)
+    }
+
+    let title: String
+    let icon: LocationIcon
+
+    init(selectedLocation: VPNSettings.SelectedLocation) {
+        switch selectedLocation {
+        case .nearest:
+            title = UserText.netPPreferredLocationNearest
+            icon = .defaultIcon
+        case .location(let location):
+            let countryLabelsModel = NetworkProtectionVPNCountryLabelsModel(country: location.country)
+            if let city = location.city {
+                title = UserText.netPVPNSettingsLocationSubtitleFormattedCityAndCountry(
+                    city: city,
+                    country: countryLabelsModel.title
+                )
+            } else {
+                title = countryLabelsModel.title
+            }
+            icon = .emoji(countryLabelsModel.emoji)
+        }
+    }
+}
+
 #endif
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 0a67d5dcc8..5a03382223 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -645,6 +645,10 @@ In addition to the details entered into this form, your app issue report will co
     static let netPStatusViewConnectionDetails = NSLocalizedString("network.protection.status.view.connection.details", value: "Connection Details", comment: "Connection details label shown in NetworkProtection's status view.")
     static let netPStatusViewSettingsSectionTitle = NSLocalizedString("network.protection.status.view.settings.section.title", value: "Manage", comment: "Label shown on the title of the settings section in NetworkProtection's status view.")
     static let netPVPNSettingsTitle = NSLocalizedString("network.protection.vpn.settings.title", value: "VPN Settings", comment: "Title for the VPN Settings screen.")
+    static func netPVPNSettingsLocationSubtitleFormattedCityAndCountry(city: String, country: String) -> String {
+        let localized = NSLocalizedString("network.protection.vpn.location.subtitle.formatted.city.and.country", value: "%@, %@", comment: "Subtitle for the preferred location item that formats a city and country. E.g Chicago, United States")
+        return localized.format(arguments: city, country)
+    }
     static let netPVPNNotificationsTitle = NSLocalizedString("network.protection.vpn.notifications.title", value: "VPN Notifications", comment: "Title for the VPN Notifications management screen.")
     static let netPStatusViewShareFeedback = NSLocalizedString("network.protection.status.menu.share.feedback", value: "Share Feedback", comment: "The status view 'Share Feedback' button which is shown inline on the status view after the \(netPInviteOnlyMessage) text")
     static let netPStatusViewErrorConnectionFailedTitle = NSLocalizedString("network.protection.status.view.error.connection.failed.title", value: "Failed to Connect.", comment: "Generic connection failed error title shown in NetworkProtection's status view.")
@@ -653,7 +657,7 @@ In addition to the details entered into this form, your app issue report will co
     static let netPPreferredLocationNearest = NSLocalizedString("network.protection.vpn.preferred.location.nearest", value: "Nearest Available", comment: "Label for the Preferred Location VPN Settings item when the nearest available location is selected.")
     static let netPVPNLocationTitle = NSLocalizedString("network.protection.vpn.location.title", value: "VPN Location", comment: "Title for the VPN Location screen.")
     static let netPVPNLocationRecommendedSectionTitle = NSLocalizedString("network.protection.vpn.location.recommended.section.title", value: "Recommended", comment: "Title for the VPN Location screen's Recommended section.")
-    static let netPVPNLocationRecommendedSectionFooter = NSLocalizedString("network.protection.vpn.location.recommended.section.footer", value: "Automatically connect to the nearest server we can find", comment: "Footer describing the VPN Location screen's Recommended section which just has Nearest Available.")
+    static let netPVPNLocationRecommendedSectionFooter = NSLocalizedString("network.protection.vpn.location.recommended.section.footer", value: "Automatically connect to the nearest server we can find.", comment: "Footer describing the VPN Location screen's Recommended section which just has Nearest Available.")
     static let netPVPNLocationAllCountriesSectionTitle = NSLocalizedString("network.protection.vpn.location.all.countries.section.title", value: "All Countries", comment: "Title for the VPN Location screen's All Countries section.")
     static let netPVPNLocationNearestAvailableItemTitle = NSLocalizedString("network.protection.vpn.location.nearest.available.item.title", value: "Nearest Available", comment: "Title for the VPN Location screen's Nearest Available selection item.")
     static func netPVPNLocationCountryItemFormattedCitiesCount(_ count: Int) -> String {
@@ -662,7 +666,7 @@ In addition to the details entered into this form, your app issue report will co
     }
     static let netPExcludeLocalNetworksSettingTitle = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.title", value: "Exclude Local Networks", comment: "Title for the Exclude Local Networks setting item.")
     static let netPExcludeLocalNetworksSettingFooter = NSLocalizedString("network.protection.vpn.exclude.local.networks.setting.footer", value: "Bypass the VPN for local network connections, like to a printer.", comment: "Footer text for the Exclude Local Networks setting item.")
-    static let netPSecureDNSSettingFooter = NSLocalizedString("network.protection.vpn.secure.dns.setting.footer", value: "Network Protection prevents DNS leaks to your Internet Service Provider by routing DNS queries though the VPN tunnel to our own resolver.", comment: "Footer text for the Always on VPN setting item.")
+    static let netPSecureDNSSettingFooter = NSLocalizedString("network.protection.vpn.secure.dns.setting.footer", value: "Our VPN uses Secure DNS to keep your online activity private, so that your Internet provider can't see what websites you visit.", comment: "Footer text for the Always on VPN setting item.")
     static let netPTurnOnNotificationsButtonTitle = NSLocalizedString("network.protection.turn.on.notifications.button.title", value: "Turn on Notifications", comment: "Title for the button to link to the iOS app settings and enable notifications app-wide.")
     static let netPTurnOnNotificationsSectionFooter = NSLocalizedString("network.protection.turn.on.notifications.section.footer", value: "Allow DuckDuckGo to notify you if your connection drops or VPN status changes.", comment: "Footer text under the button to link to the iOS app settings and enable notifications app-wide.")
     static let netPVPNAlertsToggleTitle = NSLocalizedString("network.protection.vpn.alerts.toggle.title", value: "VPN Alerts", comment: "Title for the toggle for VPN alerts.")
diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings
index aa23444dbd..b9cf565057 100644
--- a/DuckDuckGo/en.lproj/Localizable.strings
+++ b/DuckDuckGo/en.lproj/Localizable.strings
@@ -1625,11 +1625,14 @@ https://duckduckgo.com/mac";
 "network.protection.vpn.location.nearest.available.item.title" = "Nearest Available";
 
 /* Footer describing the VPN Location screen's Recommended section which just has Nearest Available. */
-"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find";
+"network.protection.vpn.location.recommended.section.footer" = "Automatically connect to the nearest server we can find.";
 
 /* Title for the VPN Location screen's Recommended section. */
 "network.protection.vpn.location.recommended.section.title" = "Recommended";
 
+/* Subtitle for the preferred location item that formats a city and country. E.g Chicago, United States */
+"network.protection.vpn.location.subtitle.formatted.city.and.country" = "%1$@, %2$@";
+
 /* Title for the VPN Location screen. */
 "network.protection.vpn.location.title" = "VPN Location";
 
@@ -1643,7 +1646,7 @@ https://duckduckgo.com/mac";
 "network.protection.vpn.preferred.location.title" = "Preferred Location";
 
 /* Footer text for the Always on VPN setting item. */
-"network.protection.vpn.secure.dns.setting.footer" = "Network Protection prevents DNS leaks to your Internet Service Provider by routing DNS queries though the VPN tunnel to our own resolver.";
+"network.protection.vpn.secure.dns.setting.footer" = "Our VPN uses Secure DNS to keep your online activity private, so that your Internet provider can't see what websites you visit.";
 
 /* Title for the VPN Settings screen. */
 "network.protection.vpn.settings.title" = "VPN Settings";

From d6c6d92b86993235b52142806c1b11c73bd7000e Mon Sep 17 00:00:00 2001
From: Dominik Kapusta <dkapusta@duckduckgo.com>
Date: Thu, 30 Nov 2023 08:36:34 +0100
Subject: [PATCH 29/40] Allow automated fetching of synced bookmarks' favicons
 (#2163)

Task/Issue URL: https://app.asana.com/0/0/1205949780297088/f
Tech Design URL: https://app.asana.com/0/481882893211075/1204986998781220/f

Description:
Add BookmarksFaviconFetcher that is used to fetch favicons for bookmarks received by Sync.
Fetcher is opt-in, controlled by a setting inside Sync settings (with an additional in-context onboarding
popup presented from client apps). Fetcher uses LinkPresentation framework to obtain a favicon
for a given domain, and in case of failure it falls back to checking hardcoded favicon URLs.
Fetcher keeps a state internally, by saving list of bookmarks IDs that need processing to a file on disk.
Fetcher plugs into clients' implementation of favicon storage by exposing FaviconStoring protocol.
Fetcher performs fetching on a serial operation queue. Each fetcher invocation cancels previously scheduled
operation and schedules a new one. Updating fetcher state is also scheduled on the operation queue -
state updates don't support cancelling and always finish before next operation is started.
---
 Core/PixelEvent.swift                         |   4 +
 Core/SyncBookmarksAdapter.swift               | 135 ++++++++++++++++--
 Core/SyncCredentialsAdapter.swift             |   1 +
 Core/UserDefaultsPropertyWrapper.swift        |   4 +
 DuckDuckGo.xcodeproj/project.pbxproj          |   6 +-
 .../xcshareddata/swiftpm/Package.resolved     |   6 +-
 DuckDuckGo/AppDelegate.swift                  |   1 +
 DuckDuckGo/BookmarksDataSource.swift          |   7 +-
 DuckDuckGo/BookmarksViewController.swift      |  11 +-
 DuckDuckGo/Favicons.swift                     |  32 +++++
 DuckDuckGo/FaviconsFetcherOnboarding.swift    |  77 ++++++++++
 DuckDuckGo/FavoriteHomeCell.swift             |   3 +-
 .../FavoritesHomeViewSectionRenderer.swift    |   6 +-
 DuckDuckGo/HomeCollectionView.swift           |   8 +-
 DuckDuckGo/HomeViewController.swift           |  50 ++++++-
 DuckDuckGo/MainViewController.swift           |   8 +-
 DuckDuckGo/SettingsViewController.swift       |   2 +-
 .../SyncFetchFavicons.imageset/Contents.json  |  16 +++
 .../SyncFetchFavicons.svg                     |   8 ++
 .../Contents.json                             |  15 ++
 .../SyncFetchFaviconsLogo.svg                 |  16 +++
 DuckDuckGo/SyncDebugViewController.swift      |   8 ++
 DuckDuckGo/SyncSettingsViewController.swift   |  47 +++++-
 DuckDuckGoTests/AppSettingsMock.swift         |   1 -
 .../FaviconsFetcherOnboardingViewModel.swift  |  28 ++++
 .../ViewModels/SyncSettingsViewModel.swift    |   2 +-
 .../SyncUI/Views/DeviceConnectedView.swift    |   2 -
 .../Views/FaviconsFetcherOnboardingView.swift |  73 ++++++++++
 .../SyncUI/Views/Internal/UserText.swift      |   6 +
 .../SyncUI/Views/SyncSettingsView.swift       |  27 +++-
 30 files changed, 570 insertions(+), 40 deletions(-)
 create mode 100644 DuckDuckGo/FaviconsFetcherOnboarding.swift
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/Contents.json
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/SyncFetchFavicons.svg
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/Contents.json
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/SyncFetchFaviconsLogo.svg
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/ViewModels/FaviconsFetcherOnboardingViewModel.swift
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/FaviconsFetcherOnboardingView.swift

diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index 37e48dcb73..c29918a5f3 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -498,6 +498,8 @@ extension Pixel {
         case bookmarksCleanupFailed
         case bookmarksCleanupAttemptedWhileSyncWasEnabled
         case favoritesCleanupFailed
+        case bookmarksFaviconsFetcherStateStoreInitializationFailed
+        case bookmarksFaviconsFetcherFailed
 
         case credentialsDatabaseCleanupFailed
         case credentialsCleanupAttemptedWhileSyncWasEnabled
@@ -990,6 +992,8 @@ extension Pixel.Event {
         case .bookmarksCleanupFailed: return "m_d_bookmarks_cleanup_failed"
         case .bookmarksCleanupAttemptedWhileSyncWasEnabled: return "m_d_bookmarks_cleanup_attempted_while_sync_was_enabled"
         case .favoritesCleanupFailed: return "m_d_favorites_cleanup_failed"
+        case .bookmarksFaviconsFetcherStateStoreInitializationFailed: return "m_d_bookmarks_favicons_fetcher_state_store_initialization_failed"
+        case .bookmarksFaviconsFetcherFailed: return "m_d_bookmarks_favicons_fetcher_failed"
 
         case .credentialsDatabaseCleanupFailed: return "m_d_credentials_database_cleanup_failed_2"
         case .credentialsCleanupAttemptedWhileSyncWasEnabled: return "m_d_credentials_cleanup_attempted_while_sync_was_enabled"
diff --git a/Core/SyncBookmarksAdapter.swift b/Core/SyncBookmarksAdapter.swift
index 5752c090dc..8986aab98a 100644
--- a/Core/SyncBookmarksAdapter.swift
+++ b/Core/SyncBookmarksAdapter.swift
@@ -30,14 +30,40 @@ public protocol FavoritesDisplayModeStoring: AnyObject {
     var favoritesDisplayMode: FavoritesDisplayMode { get set }
 }
 
+public class BookmarksFaviconsFetcherErrorHandler: EventMapping<BookmarksFaviconsFetcherError> {
+
+    public init() {
+        super.init { event, _, _, _ in
+            Pixel.fire(pixel: .bookmarksFaviconsFetcherFailed, error: event.underlyingError)
+        }
+    }
+
+    override init(mapping: @escaping EventMapping<BookmarksFaviconsFetcherError>.Mapping) {
+        fatalError("Use init()")
+    }
+}
+
+public enum SyncBookmarksAdapterError: CustomNSError {
+    case unableToAccessFaviconsFetcherStateStoreDirectory
+
+    public static let errorDomain: String = "SyncBookmarksAdapterError"
+
+    public var errorCode: Int {
+        switch self {
+        case .unableToAccessFaviconsFetcherStateStoreDirectory:
+            return 1
+        }
+    }
+}
+
 public final class SyncBookmarksAdapter {
 
+    public static let syncBookmarksPausedStateChanged = Notification.Name("com.duckduckgo.app.SyncPausedStateChanged")
+    public static let bookmarksSyncLimitReached = Notification.Name("com.duckduckgo.app.SyncBookmarksLimitReached")
+
     public private(set) var provider: BookmarksProvider?
     public let databaseCleaner: BookmarkDatabaseCleaner
     public let syncDidCompletePublisher: AnyPublisher<Void, Never>
-    public let widgetRefreshCancellable: AnyCancellable
-    public static let syncBookmarksPausedStateChanged = Notification.Name("com.duckduckgo.app.SyncPausedStateChanged")
-    public static let bookmarksSyncLimitReached = Notification.Name("com.duckduckgo.app.SyncBookmarksLimitReached")
 
     public var shouldResetBookmarksSyncTimestamp: Bool = false {
         willSet {
@@ -55,6 +81,22 @@ public final class SyncBookmarksAdapter {
     @UserDefaultsWrapper(key: .syncBookmarksPausedErrorDisplayed, defaultValue: false)
     static private var didShowBookmarksSyncPausedError: Bool
 
+    @Published
+    public var isFaviconsFetchingEnabled: Bool = UserDefaultsWrapper(key: .syncAutomaticallyFetchFavicons, defaultValue: false).wrappedValue {
+        didSet {
+            var udWrapper = UserDefaultsWrapper(key: .syncAutomaticallyFetchFavicons, defaultValue: false)
+            udWrapper.wrappedValue = isFaviconsFetchingEnabled
+            if isFaviconsFetchingEnabled {
+                faviconsFetcher?.initializeFetcherState()
+            } else {
+                faviconsFetcher?.cancelOngoingFetchingIfNeeded()
+            }
+        }
+    }
+
+    @UserDefaultsWrapper(key: .syncIsEligibleForFaviconsFetcherOnboarding, defaultValue: false)
+    public var isEligibleForFaviconsFetcherOnboarding: Bool
+
     public init(database: CoreDataDatabase, favoritesDisplayModeStorage: FavoritesDisplayModeStoring) {
         self.database = database
         self.favoritesDisplayModeStorage = favoritesDisplayModeStorage
@@ -74,6 +116,7 @@ public final class SyncBookmarksAdapter {
         if shouldEnable {
             databaseCleaner.scheduleRegularCleaning()
             handleFavoritesAfterDisablingSync()
+            isFaviconsFetchingEnabled = false
         } else {
             databaseCleaner.cancelCleaningSchedule()
         }
@@ -84,19 +127,62 @@ public final class SyncBookmarksAdapter {
             return
         }
 
+        let faviconsFetcher = setUpFaviconsFetcher()
+
         let provider = BookmarksProvider(
             database: database,
             metadataStore: metadataStore,
-            syncDidUpdateData: { [syncDidCompleteSubject] in
-                syncDidCompleteSubject.send()
+            syncDidUpdateData: { [weak self] in
+                self?.syncDidCompleteSubject.send()
                 Self.isSyncBookmarksPaused = false
                 Self.didShowBookmarksSyncPausedError = false
+            },
+            syncDidFinish: { [weak self] faviconsFetcherInput in
+                if let faviconsFetcher, self?.isFaviconsFetchingEnabled == true {
+                    if let faviconsFetcherInput {
+                        faviconsFetcher.updateBookmarkIDs(
+                            modified: faviconsFetcherInput.modifiedBookmarksUUIDs,
+                            deleted: faviconsFetcherInput.deletedBookmarksUUIDs
+                        )
+                    }
+                    faviconsFetcher.startFetching()
+                }
             }
         )
         if shouldResetBookmarksSyncTimestamp {
             provider.lastSyncTimestamp = nil
         }
 
+        bindSyncErrorPublisher(provider)
+
+        self.provider = provider
+        self.faviconsFetcher = faviconsFetcher
+    }
+
+    private func setUpFaviconsFetcher() -> BookmarksFaviconsFetcher? {
+        let stateStore: BookmarksFaviconsFetcherStateStore
+        do {
+            guard let url = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else {
+                throw SyncBookmarksAdapterError.unableToAccessFaviconsFetcherStateStoreDirectory
+            }
+            stateStore = try BookmarksFaviconsFetcherStateStore(applicationSupportURL: url)
+        } catch {
+            Pixel.fire(pixel: .bookmarksFaviconsFetcherStateStoreInitializationFailed, error: error)
+            os_log(.error, log: .syncLog, "Failed to initialize BookmarksFaviconsFetcherStateStore: %{public}s", String(reflecting: error))
+            return nil
+        }
+
+        return BookmarksFaviconsFetcher(
+            database: database,
+            stateStore: stateStore,
+            fetcher: FaviconFetcher(),
+            faviconStore: Favicons.shared,
+            errorEvents: BookmarksFaviconsFetcherErrorHandler(),
+            log: .syncLog
+        )
+    }
+
+    private func bindSyncErrorPublisher(_ provider: BookmarksProvider) {
         syncErrorCancellable = provider.syncErrorPublisher
             .sink { error in
                 switch error {
@@ -126,15 +212,31 @@ public final class SyncBookmarksAdapter {
                 }
                 os_log(.error, log: OSLog.syncLog, "Bookmarks Sync error: %{public}s", String(reflecting: error))
             }
-
-        self.provider = provider
     }
 
-    static private func notifyBookmarksSyncLimitReached() {
-        if !Self.didShowBookmarksSyncPausedError {
-            NotificationCenter.default.post(name: Self.bookmarksSyncLimitReached, object: nil)
-            Self.didShowBookmarksSyncPausedError = true
+    public func cancelFaviconsFetching(_ application: UIApplication) {
+        guard let faviconsFetcher else {
+            return
         }
+        if faviconsFetcher.isFetchingInProgress == true {
+            os_log(.debug, log: .syncLog, "Favicons Fetching is in progress. Starting background task to allow it to gracefully complete.")
+
+            var taskID: UIBackgroundTaskIdentifier!
+            taskID = application.beginBackgroundTask(withName: "Cancelled Favicons Fetching Completion Task") {
+                os_log(.debug, log: .syncLog, "Forcing background task completion")
+                application.endBackgroundTask(taskID)
+            }
+            faviconsFetchingDidFinishCancellable?.cancel()
+            faviconsFetchingDidFinishCancellable = faviconsFetcher.$isFetchingInProgress.dropFirst().filter { !$0 }
+                .prefix(1)
+                .receive(on: DispatchQueue.main)
+                .sink { _ in
+                    os_log(.debug, log: .syncLog, "Ending background task")
+                    application.endBackgroundTask(taskID)
+                }
+        }
+
+        faviconsFetcher.cancelOngoingFetchingIfNeeded()
     }
 
     private func handleFavoritesAfterDisablingSync() {
@@ -158,8 +260,19 @@ public final class SyncBookmarksAdapter {
         }
     }
 
+    static private func notifyBookmarksSyncLimitReached() {
+        if !Self.didShowBookmarksSyncPausedError {
+            NotificationCenter.default.post(name: Self.bookmarksSyncLimitReached, object: nil)
+            Self.didShowBookmarksSyncPausedError = true
+        }
+    }
+
     private var syncDidCompleteSubject = PassthroughSubject<Void, Never>()
     private var syncErrorCancellable: AnyCancellable?
+
     private let database: CoreDataDatabase
     private let favoritesDisplayModeStorage: FavoritesDisplayModeStoring
+    private var faviconsFetcher: BookmarksFaviconsFetcher?
+    private var faviconsFetchingDidFinishCancellable: AnyCancellable?
+    private var widgetRefreshCancellable: AnyCancellable?
 }
diff --git a/Core/SyncCredentialsAdapter.swift b/Core/SyncCredentialsAdapter.swift
index e5c2101954..d98f7ba068 100644
--- a/Core/SyncCredentialsAdapter.swift
+++ b/Core/SyncCredentialsAdapter.swift
@@ -39,6 +39,7 @@ public final class SyncCredentialsAdapter {
             NotificationCenter.default.post(name: syncCredentialsPausedStateChanged, object: nil)
         }
     }
+
     @UserDefaultsWrapper(key: .syncCredentialsPausedErrorDisplayed, defaultValue: false)
     static private var didShowCredentialsSyncPausedError: Bool
 
diff --git a/Core/UserDefaultsPropertyWrapper.swift b/Core/UserDefaultsPropertyWrapper.swift
index d675ee1bfa..475dcb2408 100644
--- a/Core/UserDefaultsPropertyWrapper.swift
+++ b/Core/UserDefaultsPropertyWrapper.swift
@@ -101,6 +101,10 @@ public struct UserDefaultsWrapper<T> {
         case syncCredentialsPaused = "com.duckduckgo.ios.sync-credentialsPaused"
         case syncBookmarksPausedErrorDisplayed = "com.duckduckgo.ios.sync-bookmarksPausedErrorDisplayed"
         case syncCredentialsPausedErrorDisplayed = "com.duckduckgo.ios.sync-credentialsPausedErrorDisplayed"
+        case syncAutomaticallyFetchFavicons = "com.duckduckgo.ios.sync-automatically-fetch-favicons"
+        case syncIsFaviconsFetcherEnabled = "com.duckduckgo.ios.sync-is-favicons-fetcher-enabled"
+        case syncIsEligibleForFaviconsFetcherOnboarding = "com.duckduckgo.ios.sync-is-eligible-for-favicons-fetcher-onboarding"
+        case syncDidPresentFaviconsFetcherOnboarding = "com.duckduckgo.ios.sync-did-present-favicons-fetcher-onboarding"
 
         case networkProtectionDebugOptionAlwaysOnDisabled = "com.duckduckgo.network-protection.always-on.disabled"
         case networkProtectionWaitlistTermsAndConditionsAccepted = "com.duckduckgo.ios.vpn.terms-and-conditions-accepted"
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index feaaa47f33..2c9bd6a012 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -253,6 +253,7 @@
 		3760DFED299315EF0045A446 /* Waitlist in Frameworks */ = {isa = PBXBuildFile; productRef = 3760DFEC299315EF0045A446 /* Waitlist */; };
 		377D80222AB48554002AF251 /* FavoritesDisplayModeSyncHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377D80212AB48554002AF251 /* FavoritesDisplayModeSyncHandler.swift */; };
 		379E877429E97C8D001C8BB0 /* BookmarksCleanupErrorHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379E877329E97C8D001C8BB0 /* BookmarksCleanupErrorHandling.swift */; };
+		37A6A8FE2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A6A8FD2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift */; };
 		37CBCA9E2A8A659C0050218F /* SyncSettingsAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CBCA9D2A8A659C0050218F /* SyncSettingsAdapter.swift */; };
 		37CEFCAC2A673B90001EF741 /* CredentialsCleanupErrorHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CEFCAB2A673B90001EF741 /* CredentialsCleanupErrorHandling.swift */; };
 		37DF000A29F9C416002B7D3E /* SyncMetadataDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DF000929F9C416002B7D3E /* SyncMetadataDatabase.swift */; };
@@ -1291,6 +1292,7 @@
 		37445F962A155F7C0029F789 /* SyncDataProviders.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncDataProviders.swift; sourceTree = "<group>"; };
 		377D80212AB48554002AF251 /* FavoritesDisplayModeSyncHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoritesDisplayModeSyncHandler.swift; sourceTree = "<group>"; };
 		379E877329E97C8D001C8BB0 /* BookmarksCleanupErrorHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksCleanupErrorHandling.swift; sourceTree = "<group>"; };
+		37A6A8FD2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaviconsFetcherOnboarding.swift; sourceTree = "<group>"; };
 		37CBCA9D2A8A659C0050218F /* SyncSettingsAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncSettingsAdapter.swift; sourceTree = "<group>"; };
 		37CEFCAB2A673B90001EF741 /* CredentialsCleanupErrorHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialsCleanupErrorHandling.swift; sourceTree = "<group>"; };
 		37DF000929F9C416002B7D3E /* SyncMetadataDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncMetadataDatabase.swift; sourceTree = "<group>"; };
@@ -4076,6 +4078,7 @@
 		85F98F8C296F0ED100742F4A /* Sync */ = {
 			isa = PBXGroup;
 			children = (
+				37A6A8FD2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift */,
 				377D80202AB4853A002AF251 /* SettingSyncHandlers */,
 				85F98F97296F4CB100742F4A /* SyncAssets.xcassets */,
 				85F0E97229952D7A003D5181 /* DuckDuckGo Recovery Document.pdf */,
@@ -6466,6 +6469,7 @@
 				85DB12ED2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift in Sources */,
 				98DA6ECA2181E41F00E65433 /* ThemeManager.swift in Sources */,
 				C159DF072A430B60007834BB /* EmailSignupViewController.swift in Sources */,
+				37A6A8FE2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift in Sources */,
 				1E016AB6294A5EB100F21625 /* CustomDaxDialog.swift in Sources */,
 				02341FA42A437999008A1531 /* OnboardingStepView.swift in Sources */,
 				F1CA3C3B1F045B65005FADB3 /* Authenticator.swift in Sources */,
@@ -9203,7 +9207,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 86.1.0;
+				version = 87.0.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 74efce3cce..904e27989d 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "1400c9ca17dd770d6eb708288f97c9aab749d0ef",
-          "version": "86.1.0"
+          "revision": "f1ae021c12c2afe3ade7ec0e41712725c03c3da4",
+          "version": "87.0.0"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index f9671de5dd..4e626e307d 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -562,6 +562,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         lastBackgroundDate = Date()
         AppDependencyProvider.shared.autofillLoginSession.endSession()
         suspendSync()
+        syncDataProviders.bookmarksAdapter.cancelFaviconsFetching(application)
     }
 
     private func suspendSync() {
diff --git a/DuckDuckGo/BookmarksDataSource.swift b/DuckDuckGo/BookmarksDataSource.swift
index 13f2834691..b02c31212a 100644
--- a/DuckDuckGo/BookmarksDataSource.swift
+++ b/DuckDuckGo/BookmarksDataSource.swift
@@ -24,6 +24,7 @@ import Core
 class BookmarksDataSource: NSObject, UITableViewDataSource {
 
     let viewModel: BookmarkListInteracting
+    var onFaviconMissing: ((String) -> Void)?
 
     var isEmpty: Bool {
         viewModel.bookmarks.isEmpty
@@ -50,7 +51,11 @@ class BookmarksDataSource: NSObject, UITableViewDataSource {
             return cell
         } else {
             let cell = BookmarksViewControllerCellFactory.makeBookmarkCell(tableView, forIndexPath: indexPath)
-            cell.faviconImageView.loadFavicon(forDomain: bookmark.urlObject?.host, usingCache: .fireproof)
+            cell.faviconImageView.loadFavicon(forDomain: bookmark.urlObject?.host, usingCache: .fireproof) { [weak self] _, isFake in
+                if isFake, let host = bookmark.urlObject?.host {
+                    self?.onFaviconMissing?(host)
+                }
+            }
             cell.titleLabel.text = bookmark.title
             cell.favoriteImageViewContainer.isHidden = !bookmark.isFavorite(on: viewModel.favoritesDisplayMode.displayedFolder)
             return cell
diff --git a/DuckDuckGo/BookmarksViewController.swift b/DuckDuckGo/BookmarksViewController.swift
index 8363a61384..20a03d1efa 100644
--- a/DuckDuckGo/BookmarksViewController.swift
+++ b/DuckDuckGo/BookmarksViewController.swift
@@ -96,7 +96,14 @@ class BookmarksViewController: UIViewController, UITableViewDelegate {
     fileprivate let viewModel: BookmarkListInteracting
 
     fileprivate lazy var dataSource: BookmarksDataSource = {
-        return BookmarksDataSource(viewModel: viewModel)
+        let dataSource = BookmarksDataSource(viewModel: viewModel)
+        dataSource.onFaviconMissing = { [weak self] _ in
+            guard let self else {
+                return
+            }
+            self.faviconsFetcherOnboarding.presentOnboardingIfNeeded(from: self)
+        }
+        return dataSource
     }()
 
     var searchDataSource: SearchBookmarksDataSource
@@ -833,6 +840,8 @@ class BookmarksViewController: UIViewController, UITableViewDelegate {
         }
     }
 
+    private(set) lazy var faviconsFetcherOnboarding: FaviconsFetcherOnboarding =
+        .init(syncService: syncService, syncBookmarksAdapter: syncDataProviders.bookmarksAdapter)
 }
 
 extension BookmarksViewController: UISearchBarDelegate {
diff --git a/DuckDuckGo/Favicons.swift b/DuckDuckGo/Favicons.swift
index ceda1bf9d3..bf8baa03e1 100644
--- a/DuckDuckGo/Favicons.swift
+++ b/DuckDuckGo/Favicons.swift
@@ -17,6 +17,7 @@
 //  limitations under the License.
 //
 
+import Bookmarks
 import Common
 import Kingfisher
 import UIKit
@@ -481,4 +482,35 @@ public class Favicons {
     }
 
 }
+
+extension Favicons: Bookmarks.FaviconStoring {
+
+    public func hasFavicon(for domain: String) -> Bool {
+        guard let targetCache = Favicons.Constants.caches[.fireproof],
+              let resource = defaultResource(forDomain: domain)
+        else {
+            return false
+        }
+
+        return targetCache.isCached(forKey: resource.cacheKey)
+    }
+
+    public func storeFavicon(_ imageData: Data, with url: URL?, for documentURL: URL) async throws {
+
+        guard let domain = documentURL.host,
+              let options = kfOptions(forDomain: domain, withURL: documentURL, usingCache: .fireproof),
+              let resource = defaultResource(forDomain: domain),
+              let targetCache = Favicons.Constants.caches[.fireproof],
+              let image = UIImage(data: imageData)
+        else {
+            return
+        }
+
+        Task {
+            let image = self.scaleDownIfNeeded(image: image, toFit: Constants.maxFaviconSize)
+            targetCache.store(image, forKey: resource.cacheKey, options: .init(options))
+            WidgetCenter.shared.reloadAllTimelines()
+        }
+    }
+}
 // swiftlint:enable type_body_length file_length
diff --git a/DuckDuckGo/FaviconsFetcherOnboarding.swift b/DuckDuckGo/FaviconsFetcherOnboarding.swift
new file mode 100644
index 0000000000..ec1418f2a7
--- /dev/null
+++ b/DuckDuckGo/FaviconsFetcherOnboarding.swift
@@ -0,0 +1,77 @@
+//
+//  FaviconsFetcherOnboarding.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Combine
+import Core
+import DDGSync
+import Foundation
+import SwiftUI
+import SyncUI
+
+final class FaviconsFetcherOnboarding {
+
+    init(syncService: DDGSyncing, syncBookmarksAdapter: SyncBookmarksAdapter) {
+        self.syncService = syncService
+        self.syncBookmarksAdapter = syncBookmarksAdapter
+        self.viewModel = FaviconsFetcherOnboardingViewModel()
+        faviconsFetcherCancellable = viewModel.$isFaviconsFetchingEnabled.sink { [weak self] isEnabled in
+            self?.shouldEnableFaviconsFetcherOnDismiss = isEnabled
+        }
+    }
+
+    @MainActor
+    func presentOnboardingIfNeeded(from viewController: UIViewController) {
+        let isCurrentlyPresenting = viewController.presentedViewController != nil
+        guard shouldPresentOnboarding, !isCurrentlyPresenting else {
+            return
+        }
+        didPresentFaviconsFetchingOnboarding = true
+
+        let controller = UIHostingController(rootView: FaviconsFetcherOnboardingView(model: viewModel))
+        if #available(iOS 16.0, *) {
+            controller.sheetPresentationController?.detents = [.custom(resolver: { _ in 462 })]
+        }
+
+        viewModel.onDismiss = { [weak self, weak viewController] in
+            viewController?.dismiss(animated: true)
+            if self?.shouldEnableFaviconsFetcherOnDismiss == true {
+                self?.syncBookmarksAdapter.isFaviconsFetchingEnabled = true
+                self?.syncService.scheduler.notifyDataChanged()
+            }
+        }
+
+        viewController.present(controller, animated: true)
+    }
+
+    private var shouldPresentOnboarding: Bool {
+        !didPresentFaviconsFetchingOnboarding
+        && !syncBookmarksAdapter.isFaviconsFetchingEnabled
+        && syncBookmarksAdapter.isEligibleForFaviconsFetcherOnboarding
+    }
+
+    @UserDefaultsWrapper(key: .syncDidPresentFaviconsFetcherOnboarding, defaultValue: false)
+    private var didPresentFaviconsFetchingOnboarding: Bool
+
+    private let syncService: DDGSyncing
+    private let syncBookmarksAdapter: SyncBookmarksAdapter
+    private let viewModel: FaviconsFetcherOnboardingViewModel
+
+    private var shouldEnableFaviconsFetcherOnDismiss: Bool = false
+    private var faviconsFetcherCancellable: AnyCancellable?
+}
diff --git a/DuckDuckGo/FavoriteHomeCell.swift b/DuckDuckGo/FavoriteHomeCell.swift
index 36cbeb83ab..a75c9714fa 100644
--- a/DuckDuckGo/FavoriteHomeCell.swift
+++ b/DuckDuckGo/FavoriteHomeCell.swift
@@ -87,7 +87,7 @@ class FavoriteHomeCell: UICollectionViewCell {
         self.onRemove?()
     }
 
-    func updateFor(favorite: BookmarkEntity) {
+    func updateFor(favorite: BookmarkEntity, onFaviconMissing: ((String) -> Void)? = nil) {
         self.favorite = favorite
         
         let host = favorite.host
@@ -111,6 +111,7 @@ class FavoriteHomeCell: UICollectionViewCell {
         iconImage?.loadFavicon(forDomain: domain, usingCache: .fireproof, useFakeFavicon: false) { image, _ in
             guard let image = image else {
                 iconImage?.image = fakeFavicon
+                onFaviconMissing?(domain)
                 return
             }
 
diff --git a/DuckDuckGo/FavoritesHomeViewSectionRenderer.swift b/DuckDuckGo/FavoritesHomeViewSectionRenderer.swift
index 7921e72699..0003ab9127 100644
--- a/DuckDuckGo/FavoritesHomeViewSectionRenderer.swift
+++ b/DuckDuckGo/FavoritesHomeViewSectionRenderer.swift
@@ -54,6 +54,8 @@ class FavoritesHomeViewSectionRenderer: NSObject, HomeViewSectionRenderer {
 
     var isEditing = false
 
+    var onFaviconMissing: ((String) -> Void)?
+
     private let allowsEditing: Bool
     private let cellWidth: CGFloat
     private let cellHeight: CGFloat
@@ -148,7 +150,9 @@ class FavoritesHomeViewSectionRenderer: NSObject, HomeViewSectionRenderer {
             self?.removeFavorite(cell, collectionView)
         }
 
-        cell.updateFor(favorite: favorite)
+        cell.updateFor(favorite: favorite, onFaviconMissing: { [weak self] domain in
+            self?.onFaviconMissing?(domain)
+        })
         cell.isEditing = isEditing
         return cell
 
diff --git a/DuckDuckGo/HomeCollectionView.swift b/DuckDuckGo/HomeCollectionView.swift
index ee0b6818ee..7d3a086e82 100644
--- a/DuckDuckGo/HomeCollectionView.swift
+++ b/DuckDuckGo/HomeCollectionView.swift
@@ -84,8 +84,12 @@ class HomeCollectionView: UICollectionView {
                 renderers.install(renderer: NavigationSearchHomeViewSectionRenderer(fixed: fixed))
                 
             case .favorites:
-                renderers.install(renderer: FavoritesHomeViewSectionRenderer(viewModel: favoritesViewModel))
-                
+                let renderer = FavoritesHomeViewSectionRenderer(viewModel: favoritesViewModel)
+                renderer.onFaviconMissing = { _ in
+                    controller.faviconsFetcherOnboarding.presentOnboardingIfNeeded(from: controller)
+                }
+                renderers.install(renderer: renderer)
+
             case .homeMessage:
                 renderers.install(renderer: HomeMessageViewSectionRenderer(homePageConfiguration: homePageConfiguration))
 
diff --git a/DuckDuckGo/HomeViewController.swift b/DuckDuckGo/HomeViewController.swift
index c90a9ac317..3d79ff3747 100644
--- a/DuckDuckGo/HomeViewController.swift
+++ b/DuckDuckGo/HomeViewController.swift
@@ -22,8 +22,12 @@ import Core
 import Bookmarks
 import Combine
 import Common
+import DDGSync
 import Persistence
 
+// swiftlint:disable file_length
+
+// swiftlint:disable:next type_body_length
 class HomeViewController: UIViewController {
     
     @IBOutlet weak var ctaContainerBottom: NSLayoutConstraint!
@@ -64,21 +68,25 @@ class HomeViewController: UIViewController {
     private let tabModel: Tab
     private let favoritesViewModel: FavoritesListInteracting
     private let appSettings: AppSettings
+    private let syncService: DDGSyncing
+    private let syncDataProviders: SyncDataProviders
     private var viewModelCancellable: AnyCancellable?
     private var favoritesDisplayModeCancellable: AnyCancellable?
 
 #if APP_TRACKING_PROTECTION
     private let appTPHomeViewModel: AppTPHomeViewModel
 #endif
-    
+
 #if APP_TRACKING_PROTECTION
+    // swiftlint:disable:next function_parameter_count
     static func loadFromStoryboard(
         model: Tab,
         favoritesViewModel: FavoritesListInteracting,
         appSettings: AppSettings,
+        syncService: DDGSyncing,
+        syncDataProviders: SyncDataProviders,
         appTPDatabase: CoreDataDatabase
     ) -> HomeViewController {
-
         let storyboard = UIStoryboard(name: "Home", bundle: nil)
         let controller = storyboard.instantiateViewController(identifier: "HomeViewController", creator: { coder in
             HomeViewController(
@@ -86,16 +94,31 @@ class HomeViewController: UIViewController {
                 tabModel: model,
                 favoritesViewModel: favoritesViewModel,
                 appSettings: appSettings,
+                syncService: syncService,
+                syncDataProviders: syncDataProviders,
                 appTPDatabase: appTPDatabase
             )
         })
         return controller
     }
 #else
-    static func loadFromStoryboard(model: Tab, favoritesViewModel: FavoritesListInteracting, appSettings: AppSettings) -> HomeViewController {
+    static func loadFromStoryboard(
+        model: Tab,
+        favoritesViewModel: FavoritesListInteracting,
+        appSettings: AppSettings,
+        syncService: DDGSyncing,
+        syncDataProviders: SyncDataProviders
+    ) -> HomeViewController {
         let storyboard = UIStoryboard(name: "Home", bundle: nil)
         let controller = storyboard.instantiateViewController(identifier: "HomeViewController", creator: { coder in
-            HomeViewController(coder: coder, tabModel: model, favoritesViewModel: favoritesViewModel, appSettings: appSettings)
+            HomeViewController(
+                coder: coder,
+                tabModel: model,
+                favoritesViewModel: favoritesViewModel,
+                appSettings: appSettings,
+                syncService: syncService,
+                syncDataProviders: syncDataProviders
+            )
         })
         return controller
     }
@@ -107,20 +130,34 @@ class HomeViewController: UIViewController {
         tabModel: Tab,
         favoritesViewModel: FavoritesListInteracting,
         appSettings: AppSettings,
+        syncService: DDGSyncing,
+        syncDataProviders: SyncDataProviders,
         appTPDatabase: CoreDataDatabase
     ) {
         self.tabModel = tabModel
         self.favoritesViewModel = favoritesViewModel
         self.appSettings = appSettings
+        self.syncService = syncService
+        self.syncDataProviders = syncDataProviders
+
         self.appTPHomeViewModel = AppTPHomeViewModel(appTrackingProtectionDatabase: appTPDatabase)
 
         super.init(coder: coder)
     }
 #else
-    required init?(coder: NSCoder, tabModel: Tab, favoritesViewModel: FavoritesListInteracting, appSettings: AppSettings) {
+    required init?(
+        coder: NSCoder,
+        tabModel: Tab,
+        favoritesViewModel: FavoritesListInteracting,
+        appSettings: AppSettings,
+        syncService: DDGSyncing,
+        syncDataProviders: SyncDataProviders
+    ) {
         self.tabModel = tabModel
         self.favoritesViewModel = favoritesViewModel
         self.appSettings = appSettings
+        self.syncService = syncService
+        self.syncDataProviders = syncDataProviders
 
         super.init(coder: coder)
     }
@@ -330,6 +367,9 @@ class HomeViewController: UIViewController {
     func launchNewSearch() {
         collectionView.launchNewSearch()
     }
+
+    private(set) lazy var faviconsFetcherOnboarding: FaviconsFetcherOnboarding =
+        .init(syncService: syncService, syncBookmarksAdapter: syncDataProviders.bookmarksAdapter)
 }
 
 extension HomeViewController: FavoritesHomeViewSectionRendererDelegate {
diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift
index 66785d4359..f043f52def 100644
--- a/DuckDuckGo/MainViewController.swift
+++ b/DuckDuckGo/MainViewController.swift
@@ -634,9 +634,15 @@ class MainViewController: UIViewController {
         let controller = HomeViewController.loadFromStoryboard(model: tabModel!,
                                                                favoritesViewModel: favoritesViewModel,
                                                                appSettings: appSettings,
+                                                               syncService: syncService,
+                                                               syncDataProviders: syncDataProviders,
                                                                appTPDatabase: appTrackingProtectionDatabase)
 #else
-        let controller = HomeViewController.loadFromStoryboard(model: tabModel!, favoritesViewModel: favoritesViewModel, appSettings: appSettings)
+        let controller = HomeViewController.loadFromStoryboard(model: tabModel!,
+                                                               favoritesViewModel: favoritesViewModel,
+                                                               appSettings: appSettings,
+                                                               syncService: syncService,
+                                                               syncDataProviders: syncDataProviders)
 #endif
 
         homeController = controller
diff --git a/DuckDuckGo/SettingsViewController.swift b/DuckDuckGo/SettingsViewController.swift
index 42bc7ae375..85827c1b4d 100644
--- a/DuckDuckGo/SettingsViewController.swift
+++ b/DuckDuckGo/SettingsViewController.swift
@@ -388,7 +388,7 @@ class SettingsViewController: UITableViewController {
     }
 
     func showSync(animated: Bool = true) {
-        let controller = SyncSettingsViewController()
+        let controller = SyncSettingsViewController(syncService: syncService, syncBookmarksAdapter: syncDataProviders.bookmarksAdapter)
         navigationController?.pushViewController(controller, animated: animated)
     }
 
diff --git a/DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/Contents.json b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/Contents.json
new file mode 100644
index 0000000000..082f3893d1
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/Contents.json
@@ -0,0 +1,16 @@
+{
+  "images" : [
+    {
+      "filename" : "SyncFetchFavicons.svg",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true,
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/SyncFetchFavicons.svg b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/SyncFetchFavicons.svg
new file mode 100644
index 0000000000..a145705a8f
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFavicons.imageset/SyncFetchFavicons.svg
@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Image-24">
+<g id="Union">
+<path d="M9 11C10.1046 11 11 10.1046 11 9C11 7.89543 10.1046 7 9 7C7.89543 7 7 7.89543 7 9C7 10.1046 7.89543 11 9 11Z" fill="black" fill-opacity="0.84"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M19.125 3C20.7128 3 22 4.28718 22 5.875V15.9878C22.0001 15.9941 22.0001 16.0004 22.0001 16.0068C22.0001 16.0091 22 16.0115 22 16.0139V18.125C22 19.7128 20.7128 21 19.125 21H4.875C3.28718 21 2 19.7128 2 18.125L2 5.875C2 4.28718 3.28718 3 4.875 3L19.125 3ZM20 5.875V14.0442L16.047 11.1893C15.6975 10.9369 15.2256 10.9369 14.8761 11.1893L9.92309 14.7665L7.73935 13.1893C7.38983 12.9369 6.91788 12.9369 6.56837 13.1893L4 15.0443L4 5.875C4 5.39175 4.39175 5 4.875 5L19.125 5C19.6082 5 20 5.39175 20 5.875ZM4 18.125V17.5113L7.15386 15.2335L9.3376 16.8107C9.68712 17.0631 10.1591 17.0631 10.5086 16.8107L15.4616 13.2335L20 16.5113V18.125C20 18.6082 19.6082 19 19.125 19H4.875C4.39175 19 4 18.6082 4 18.125Z" fill="black" fill-opacity="0.84"/>
+</g>
+</g>
+</svg>
diff --git a/DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/Contents.json b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/Contents.json
new file mode 100644
index 0000000000..b881c24166
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "SyncFetchFaviconsLogo.svg",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "original"
+  }
+}
diff --git a/DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/SyncFetchFaviconsLogo.svg b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/SyncFetchFaviconsLogo.svg
new file mode 100644
index 0000000000..a76a6e302c
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/SyncFetchFaviconsLogo.imageset/SyncFetchFaviconsLogo.svg
@@ -0,0 +1,16 @@
+<svg width="96" height="72" viewBox="0 0 96 72" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.2" d="M79.2214 28.65L80.3786 28.35C80.5929 28.3071 80.8072 28.0929 80.85 27.8786L81.15 26.7214C81.2357 26.4214 81.4929 26.25 81.75 26.25C82.05 26.25 82.3072 26.4643 82.35 26.7214L82.65 27.8786C82.6928 28.0929 82.9071 28.3071 83.1214 28.35L84.2786 28.65C84.5786 28.7357 84.75 28.9929 84.75 29.25C84.75 29.55 84.5357 29.8071 84.2786 29.85L83.1214 30.15C82.9071 30.1929 82.6928 30.4071 82.65 30.6214L82.35 31.7786C82.2643 32.0786 82.0071 32.25 81.75 32.25C81.45 32.25 81.1928 32.0357 81.15 31.7786L80.85 30.6214C80.8072 30.4071 80.5929 30.1929 80.3786 30.15L79.2214 29.85C78.9214 29.7643 78.75 29.5071 78.75 29.25C78.75 28.95 78.9643 28.6929 79.2214 28.65Z" fill="#888888"/>
+<path opacity="0.2" d="M11.9571 23.85L13.6928 23.4C14.0143 23.3357 14.3357 23.0143 14.4 22.6929L14.85 20.9571C14.9786 20.5071 15.3643 20.25 15.75 20.25C16.2 20.25 16.5857 20.5714 16.65 20.9571L17.1 22.6929C17.1643 23.0143 17.4857 23.3357 17.8072 23.4L19.5429 23.85C19.9929 23.9786 20.25 24.3643 20.25 24.75C20.25 25.2 19.9286 25.5857 19.5429 25.65L17.8072 26.1C17.4857 26.1643 17.1643 26.4857 17.1 26.8071L16.65 28.5429C16.5214 28.9929 16.1357 29.25 15.75 29.25C15.3 29.25 14.9143 28.9286 14.85 28.5429L14.4 26.8071C14.3357 26.4857 14.0143 26.1643 13.6928 26.1L11.9571 25.65C11.5071 25.5214 11.25 25.1357 11.25 24.75C11.25 24.3 11.5714 23.9143 11.9571 23.85Z" fill="#888888"/>
+<path opacity="0.2" d="M0.471418 39.9L1.62857 39.6C1.84285 39.5571 2.05715 39.3429 2.10001 39.1286L2.39999 37.9714C2.4857 37.6714 2.74286 37.5 3 37.5C3.3 37.5 3.55715 37.7143 3.60001 37.9714L3.89999 39.1286C3.94285 39.3429 4.15715 39.5571 4.37143 39.6L5.52858 39.9C5.82858 39.9857 6 40.2429 6 40.5C6 40.8 5.78572 41.0571 5.52858 41.1L4.37143 41.4C4.15715 41.4429 3.94285 41.6571 3.89999 41.8714L3.60001 43.0286C3.5143 43.3286 3.25714 43.5 3 43.5C2.7 43.5 2.44285 43.2857 2.39999 43.0286L2.10001 41.8714C2.05715 41.6571 1.84285 41.4429 1.62857 41.4L0.471418 41.1C0.171418 41.0143 0 40.7571 0 40.5C0 40.2 0.214275 39.9429 0.471418 39.9Z" fill="#888888"/>
+<path opacity="0.2" d="M94.875 39C94.2562 39 93.75 38.4937 93.75 37.875C93.75 37.2562 94.2562 36.75 94.875 36.75C95.4937 36.75 96 37.2562 96 37.875C96 38.4937 95.4937 39 94.875 39Z" fill="#888888"/>
+<path opacity="0.2" d="M17.25 52.5C16.425 52.5 15.75 51.825 15.75 51C15.75 50.175 16.425 49.5 17.25 49.5C18.075 49.5 18.75 50.175 18.75 51C18.75 51.825 18.075 52.5 17.25 52.5Z" fill="#888888"/>
+<path d="M65.25 38.25C56.9657 38.25 50.25 44.9657 50.25 53.25V54.5C50.25 56.7091 48.4591 58.5 46.25 58.5H36C30.201 58.5 25.5 53.799 25.5 48V24C25.5 18.201 30.201 13.5 36 13.5H52.5L70.5 31.5V34.25C70.5 36.4591 68.7091 38.25 66.5 38.25H65.25Z" fill="#444444"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M65.1045 38.2507C65.2005 37.514 65.25 36.7628 65.25 36C65.25 26.4731 57.5269 18.75 48 18.75C38.4731 18.75 30.75 26.4731 30.75 36C30.75 45.5269 38.4731 53.25 48 53.25C48.7628 53.25 49.514 53.2005 50.2507 53.1045C50.295 48.4455 52.4633 44.2944 55.8339 41.573C56.0345 40.2752 56.1661 38.9098 56.221 37.5H62.172C62.1332 37.8711 62.0801 38.238 62.0133 38.6001C63.0102 38.3809 64.0442 38.2608 65.1045 38.2507ZM53.4505 22.8295C58.1756 24.7872 61.619 29.2135 62.172 34.5H56.221C56.0685 30.5809 55.3229 27.005 54.1517 24.2722C53.9357 23.7681 53.702 23.2853 53.4505 22.8295ZM51.3943 46.5461C52.3823 44.2405 53.0673 41.081 53.2185 37.5H42.7815C42.9327 41.081 43.6177 44.2405 44.6057 46.5461C45.1689 47.86 45.8009 48.8275 46.4262 49.4447C47.0452 50.0555 47.5753 50.25 48 50.25C48.4247 50.25 48.9548 50.0555 49.5738 49.4447C50.1991 48.8275 50.8311 47.86 51.3943 46.5461ZM44.6057 25.4539C43.6177 27.7595 42.9327 30.919 42.7815 34.5H53.2185C53.0673 30.919 52.3823 27.7595 51.3943 25.4539C50.8311 24.14 50.1991 23.1725 49.5738 22.5553C48.9548 21.9445 48.4247 21.75 48 21.75C47.5753 21.75 47.0452 21.9445 46.4262 22.5553C45.8009 23.1725 45.1689 24.14 44.6057 25.4539ZM41.8483 24.2722C40.6771 27.005 39.9315 30.5809 39.779 34.5H33.828C34.381 29.2135 37.8244 24.7872 42.5495 22.8295C42.298 23.2853 42.0643 23.7681 41.8483 24.2722ZM41.8483 47.7278C40.6771 44.995 39.9315 41.4191 39.779 37.5H33.828C34.381 42.7865 37.8244 47.2128 42.5495 49.1705C42.298 48.7147 42.0643 48.2319 41.8483 47.7278Z" fill="#CCCCCC"/>
+<path opacity="0.2" d="M51.0826 23.1374L52.4998 13.5L70.4998 31.5L63.9072 33.7733C56.997 36.1562 50.0191 30.3691 51.0826 23.1374Z" fill="black"/>
+<path d="M52.5 21V13.5L70.5 31.5H63C57.201 31.5 52.5 26.799 52.5 21Z" fill="#888888"/>
+<path d="M65.25 65.25C71.8774 65.25 77.25 59.8774 77.25 53.25C77.25 46.6226 71.8774 41.25 65.25 41.25C58.6226 41.25 53.25 46.6226 53.25 53.25C53.25 59.8774 58.6226 65.25 65.25 65.25Z" fill="#557FF3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M66.5 46.5C67.0523 46.5 67.5 46.9477 67.5 47.5V53.7277C67.5 54.1438 67.9785 54.3778 68.307 54.1224L70.0717 52.7498C70.513 52.4065 71.1501 52.4918 71.4856 52.9392L72.5353 54.3388C72.8626 54.7752 72.7798 55.3934 72.3492 55.7282L66.3397 60.4008C65.6878 60.8664 64.812 60.8664 64.1601 60.4008L58.1508 55.7282C57.7202 55.3934 57.6373 54.7752 57.9646 54.3388L59.0144 52.9392C59.3499 52.4918 59.987 52.4065 60.4283 52.7498L62.193 54.1224C62.5215 54.3778 63 54.1438 63 53.7277V47.5C63 46.9477 63.4477 46.5 64 46.5H66.5Z" fill="white"/>
+<path d="M81.3761 44.25C81.5992 44.25 81.8222 44.34 81.9927 44.5155C82.3338 44.8664 82.3338 45.4378 81.9927 45.7887L80.2434 47.5884C79.9023 47.9394 79.3469 47.9394 79.0058 47.5884C78.6647 47.2375 78.6647 46.6661 79.0058 46.3151L80.7551 44.5155C80.9257 44.34 81.1487 44.25 81.3717 44.25H81.3761Z" fill="#CCCCCC"/>
+<path d="M80.5014 52.3487H83.1254C83.6064 52.3487 84 52.7536 84 53.2485C84 53.7434 83.6064 54.1484 83.1254 54.1484H80.5014C80.0204 54.1484 79.6268 53.7434 79.6268 53.2485C79.6268 52.7536 80.0204 52.3487 80.5014 52.3487Z" fill="#CCCCCC"/>
+<path d="M79.0147 58.9138C79.1853 58.7383 79.4083 58.6484 79.6314 58.6484H79.6357C79.8588 58.6484 80.0818 58.7383 80.2523 58.9138L82.0016 60.7135C82.3427 61.0645 82.3427 61.6359 82.0016 61.9868C81.6605 62.3377 81.1051 62.3377 80.764 61.9868L79.0147 60.1871C78.6736 59.8362 78.6736 59.2648 79.0147 58.9138Z" fill="#CCCCCC"/>
+</svg>
diff --git a/DuckDuckGo/SyncDebugViewController.swift b/DuckDuckGo/SyncDebugViewController.swift
index b5fe9f351a..d674e85c59 100644
--- a/DuckDuckGo/SyncDebugViewController.swift
+++ b/DuckDuckGo/SyncDebugViewController.swift
@@ -46,6 +46,7 @@ class SyncDebugViewController: UITableViewController {
         case syncNow
         case logOut
         case toggleFavoritesDisplayMode
+        case resetFaviconsFetcherOnboardingDialog
 
     }
 
@@ -111,6 +112,8 @@ class SyncDebugViewController: UITableViewController {
                 cell.textLabel?.text = "Log out of sync in 10 seconds"
             case .toggleFavoritesDisplayMode:
                 cell.textLabel?.text = "Toggle favorites display mode in 10 seconds"
+            case .resetFaviconsFetcherOnboardingDialog:
+                cell.textLabel?.text = "Reset Favicons Fetcher onboarding dialog"
             case .none:
                 break
             }
@@ -161,6 +164,7 @@ class SyncDebugViewController: UITableViewController {
         }
     }
 
+    // swiftlint:disable:next cyclomatic_complexity
     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         switch Sections(rawValue: indexPath.section) {
         case .info:
@@ -184,6 +188,10 @@ class SyncDebugViewController: UITableViewController {
                     AppDependencyProvider.shared.appSettings.favoritesDisplayMode = displayMode
                     NotificationCenter.default.post(name: AppUserDefaults.Notifications.favoritesDisplayModeChange, object: nil)
                 }
+            case .resetFaviconsFetcherOnboardingDialog:
+                var udWrapper = UserDefaultsWrapper(key: .syncDidPresentFaviconsFetcherOnboarding, defaultValue: false)
+                udWrapper.wrappedValue = false
+
             default: break
             }
         case .environment:
diff --git a/DuckDuckGo/SyncSettingsViewController.swift b/DuckDuckGo/SyncSettingsViewController.swift
index 6bba63102b..7e1f5558ea 100644
--- a/DuckDuckGo/SyncSettingsViewController.swift
+++ b/DuckDuckGo/SyncSettingsViewController.swift
@@ -18,6 +18,7 @@
 //
 
 import SwiftUI
+import Core
 import Combine
 import SyncUI
 import DDGSync
@@ -27,7 +28,8 @@ class SyncSettingsViewController: UIHostingController<SyncSettingsView> {
 
     lazy var authenticator = Authenticator()
 
-    let syncService: DDGSyncing! = (UIApplication.shared.delegate as? AppDelegate)!.syncService
+    let syncService: DDGSyncing
+    let syncBookmarksAdapter: SyncBookmarksAdapter
     var connector: RemoteConnecting?
 
     var recoveryCode: String {
@@ -50,11 +52,15 @@ class SyncSettingsViewController: UIHostingController<SyncSettingsView> {
     var cancellables = Set<AnyCancellable>()
 
     // For some reason, on iOS 14, the viewDidLoad wasn't getting called so do some setup here
-    convenience init(appSettings: AppSettings = AppDependencyProvider.shared.appSettings) {
+    init(syncService: DDGSyncing, syncBookmarksAdapter: SyncBookmarksAdapter, appSettings: AppSettings = AppDependencyProvider.shared.appSettings) {
+        self.syncService = syncService
+        self.syncBookmarksAdapter = syncBookmarksAdapter
+
         let viewModel = SyncSettingsViewModel()
 
-        self.init(rootView: SyncSettingsView(model: viewModel))
+        super.init(rootView: SyncSettingsView(model: viewModel))
 
+        setUpFaviconsFetcherSwitch(viewModel)
         setUpFavoritesDisplayModeSwitch(viewModel, appSettings)
         setUpSyncPaused(viewModel, appSettings)
         refreshForState(syncService.authState)
@@ -70,6 +76,41 @@ class SyncSettingsViewController: UIHostingController<SyncSettingsView> {
         rootView.model.delegate = self
         navigationItem.title = UserText.syncTitle
     }
+    
+    @MainActor required dynamic init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    private func setUpFaviconsFetcherSwitch(_ viewModel: SyncSettingsViewModel) {
+        viewModel.isFaviconsFetchingEnabled = syncBookmarksAdapter.isFaviconsFetchingEnabled
+
+        syncBookmarksAdapter.$isFaviconsFetchingEnabled
+            .removeDuplicates()
+            .receive(on: DispatchQueue.main)
+            .sink { isFaviconsFetchingEnabled in
+                if viewModel.isFaviconsFetchingEnabled != isFaviconsFetchingEnabled {
+                    viewModel.isFaviconsFetchingEnabled = isFaviconsFetchingEnabled
+                }
+            }
+            .store(in: &cancellables)
+
+        viewModel.$devices
+            .map { $0.count > 1 }
+            .removeDuplicates()
+            .sink { [weak self] hasMoreThanOneDevice in
+                self?.syncBookmarksAdapter.isEligibleForFaviconsFetcherOnboarding = hasMoreThanOneDevice
+            }
+            .store(in: &cancellables)
+
+        viewModel.$isFaviconsFetchingEnabled
+            .sink { [weak self] isFaviconsFetchingEnabled in
+                self?.syncBookmarksAdapter.isFaviconsFetchingEnabled = isFaviconsFetchingEnabled
+                if isFaviconsFetchingEnabled {
+                    self?.syncService.scheduler.notifyDataChanged()
+                }
+            }
+            .store(in: &cancellables)
+    }
 
     private func setUpFavoritesDisplayModeSwitch(_ viewModel: SyncSettingsViewModel, _ appSettings: AppSettings) {
         viewModel.isUnifiedFavoritesEnabled = appSettings.favoritesDisplayMode.isDisplayUnified
diff --git a/DuckDuckGoTests/AppSettingsMock.swift b/DuckDuckGoTests/AppSettingsMock.swift
index 72ec6924a2..1902cfb9fe 100644
--- a/DuckDuckGoTests/AppSettingsMock.swift
+++ b/DuckDuckGoTests/AppSettingsMock.swift
@@ -22,7 +22,6 @@ import Foundation
 @testable import DuckDuckGo
 
 class AppSettingsMock: AppSettings {
-
     var isSyncBookmarksPaused: Bool = false
 
     var isSyncCredentialsPaused: Bool = false
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/FaviconsFetcherOnboardingViewModel.swift b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/FaviconsFetcherOnboardingViewModel.swift
new file mode 100644
index 0000000000..9556ccf246
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/FaviconsFetcherOnboardingViewModel.swift
@@ -0,0 +1,28 @@
+//
+//  FaviconsFetcherOnboardingViewModel.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import Foundation
+
+final public class FaviconsFetcherOnboardingViewModel: ObservableObject {
+    @Published public var isFaviconsFetchingEnabled: Bool = false
+
+    public var onDismiss: () -> Void = {}
+
+    public init() {}
+}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift
index 3e13d1c9a1..8f78f1ea59 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift
@@ -76,7 +76,7 @@ public class SyncSettingsViewModel: ObservableObject {
     }
 
     @Published public var devices = [Device]()
-    @Published public var isFaviconsSyncEnabled = false
+    @Published public var isFaviconsFetchingEnabled = false
     @Published public var isUnifiedFavoritesEnabled = true
     @Published public var isSyncingDevices = false
     @Published public var isSyncBookmarksPaused = false
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift
index 2adec5fc5c..2a04672468 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift
@@ -19,8 +19,6 @@
 
 import SwiftUI
 import DuckUI
-import DesignResourcesKit
-
 
 public struct DeviceConnectedView: View {
 
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/FaviconsFetcherOnboardingView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/FaviconsFetcherOnboardingView.swift
new file mode 100644
index 0000000000..b60c96e350
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/FaviconsFetcherOnboardingView.swift
@@ -0,0 +1,73 @@
+//
+//  FaviconsFetcherOnboardingView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+import DuckUI
+import DesignResourcesKit
+
+public struct FaviconsFetcherOnboardingView: View {
+
+    public init(model: FaviconsFetcherOnboardingViewModel) {
+        self.model = model
+    }
+
+    @ObservedObject public var model: FaviconsFetcherOnboardingViewModel
+
+    public var body: some View {
+        VStack(spacing: 0) {
+
+            VStack(spacing: 24) {
+                Image("SyncFetchFaviconsLogo")
+
+                Text(UserText.fetchFaviconsOnboardingTitle)
+                    .daxTitle1()
+
+                Text(UserText.fetchFaviconsOnboardingMessage)
+                    .multilineTextAlignment(.center)
+                    .daxBodyRegular()
+            }
+            .padding(.horizontal, 24)
+            .padding(.vertical, 20)
+
+            VStack(spacing: 8) {
+                Button {
+                    withAnimation {
+                        model.isFaviconsFetchingEnabled = true
+                        model.onDismiss()
+                    }
+                } label: {
+                    Text(UserText.fetchFaviconsOnboardingButtonTitle)
+                }
+                .buttonStyle(PrimaryButtonStyle())
+                .frame(maxWidth: 360)
+
+                Button {
+                    withAnimation {
+                        model.onDismiss()
+                    }
+                } label: {
+                    Text(UserText.notNowButton)
+                }
+                .buttonStyle(SecondaryButtonStyle())
+                .frame(maxWidth: 360)
+            }
+            .padding(.init(top: 24, leading: 24, bottom: 0, trailing: 24))
+        }
+    }
+}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift
index 1fc5c3535b..060af63f53 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift
@@ -39,6 +39,9 @@ struct UserText {
     static let recoverYourData = "Recover Your Data"
 
     static let options = "Options"
+    static let fetchFaviconsOptionTitle = "Fetch Bookmark Icons"
+    static let fetchFaviconsOptionCaption = "Automatically download icons for synced bookmarks."
+
     static let unifiedFavoritesTitle = "Share Favorites"
     static let unifiedFavoritesInstruction = "Use the same favorites on all devices. Leave off to keep mobile and desktop favorites separate."
 
@@ -118,6 +121,9 @@ struct UserText {
     static let bookmarksLimitExceededAction = "Manage Bookmarks"
     static let credentialsLimitExceededAction = "Manage Logins"
     
+    static let fetchFaviconsOnboardingTitle = "Download Missing Icons?"
+    static let fetchFaviconsOnboardingMessage = "Do you want this device to automatically download icons for any new bookmarks synced from your other devices? This will expose the download to your network any time a bookmark is synced."
+    static let fetchFaviconsOnboardingButtonTitle = "Keep Bookmarks Icons Updated"
 
 }
 // swiftlint:enable line_length
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift
index f2fff4bf6c..5f8791bad5 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift
@@ -58,11 +58,14 @@ public struct SyncSettingsView: View {
                     
                     syncNewDevice()
                     
-                    OptionsView(isUnifiedFavoritesEnabled: $model.isUnifiedFavoritesEnabled)
-                        .onAppear(perform: {
-                            model.delegate?.updateOptions()
-                        })
-                    
+                    OptionsView(
+                        isFaviconsFetchingEnabled: $model.isFaviconsFetchingEnabled,
+                        isUnifiedFavoritesEnabled: $model.isUnifiedFavoritesEnabled
+                    )
+                    .onAppear {
+                        model.delegate?.updateOptions()
+                    }
+
                     saveRecoveryPDF()
                     
                     deleteAllData()
@@ -359,9 +362,23 @@ extension View {
 
 
 public struct OptionsView: View {
+    @Binding var isFaviconsFetchingEnabled: Bool
     @Binding var isUnifiedFavoritesEnabled: Bool
+
     public var body: some View {
         Section {
+            Toggle(isOn: $isFaviconsFetchingEnabled) {
+                HStack(spacing: 16) {
+                    Image("SyncFetchFavicons")
+                    VStack(alignment: .leading) {
+                        Text(UserText.fetchFaviconsOptionTitle)
+                            .foregroundColor(.primary)
+                        Text(UserText.fetchFaviconsOptionCaption)
+                            .daxBodyRegular()
+                            .foregroundColor(.secondary)
+                    }
+                }
+            }
             Toggle(isOn: $isUnifiedFavoritesEnabled) {
                 HStack(spacing: 16) {
                     Image("SyncAllDevices")

From 3b040915998e317d6fc99205d465151143869886 Mon Sep 17 00:00:00 2001
From: Shane Osbourne <shane.osbourne8@gmail.com>
Date: Thu, 30 Nov 2023 12:30:55 +0000
Subject: [PATCH 30/40] moving the toggle to the top of the dashboard (#2166)

Co-authored-by: Shane Osbourne <sosbourne@duckduckgo.com>
---
 DuckDuckGo.xcodeproj/project.pbxproj                      | 2 +-
 .../xcshareddata/swiftpm/Package.resolved                 | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 2c9bd6a012..8150dd7ae3 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9207,7 +9207,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 87.0.0;
+				version = 87.1.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 904e27989d..c43fafde13 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "f1ae021c12c2afe3ade7ec0e41712725c03c3da4",
-          "version": "87.0.0"
+          "revision": "fe6b0097f2f03665475473f7e235eb891ddd2f16",
+          "version": "87.1.0"
         }
       },
       {
@@ -105,8 +105,8 @@
         "repositoryURL": "https://github.com/duckduckgo/privacy-dashboard",
         "state": {
           "branch": null,
-          "revision": "b4ac92a444e79d5651930482623b9f6dc9265667",
-          "version": "2.0.0"
+          "revision": "daa9708223b4b4318fb6448ca44801dfabcddc6f",
+          "version": "3.0.0"
         }
       },
       {

From 3f3dbca952411fac9dad3459b3f5b70bd8c05cef Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Fri, 1 Dec 2023 09:05:32 +0100
Subject: [PATCH 31/40] Use design system fonts throughout NetP (#2211)

---
 DuckDuckGo/NetworkProtectionInviteView.swift  |  6 ++---
 DuckDuckGo/NetworkProtectionStatusView.swift  | 23 +++++++++----------
 .../NetworkProtectionVPNLocationView.swift    | 10 ++++----
 ...etworkProtectionVPNNotificationsView.swift |  4 ++--
 4 files changed, 21 insertions(+), 22 deletions(-)

diff --git a/DuckDuckGo/NetworkProtectionInviteView.swift b/DuckDuckGo/NetworkProtectionInviteView.swift
index 424b7ef79e..c45c98eb58 100644
--- a/DuckDuckGo/NetworkProtectionInviteView.swift
+++ b/DuckDuckGo/NetworkProtectionInviteView.swift
@@ -102,11 +102,11 @@ private struct NetworkProtectionInviteMessageView<Content>: View where Content:
                         .scaledToFit()
                         .frame(height: 102.5)
                     Text(messageData.title)
-                        .font(.system(size: 22, weight: .semibold))
+                        .daxTitle2()
                         .multilineTextAlignment(.center)
                         .foregroundColor(.textPrimary)
                     Text(messageData.message)
-                        .font(.system(size: 16))
+                        .daxBodyRegular()
                         .multilineTextAlignment(.center)
                         .foregroundColor(.textSecondary)
                         .padding(.bottom, 16)
@@ -114,7 +114,7 @@ private struct NetworkProtectionInviteMessageView<Content>: View where Content:
                     Spacer()
                     Text(UserText.netPInviteOnlyMessage)
                         .foregroundColor(.textSecondary)
-                        .font(.system(size: 13))
+                        .daxFootnoteRegular()
                         .multilineTextAlignment(.center)
                 }
                 .padding(24)
diff --git a/DuckDuckGo/NetworkProtectionStatusView.swift b/DuckDuckGo/NetworkProtectionStatusView.swift
index 93c335afdb..976bef8fa1 100644
--- a/DuckDuckGo/NetworkProtectionStatusView.swift
+++ b/DuckDuckGo/NetworkProtectionStatusView.swift
@@ -56,10 +56,10 @@ struct NetworkProtectionStatusView: View {
             HStack {
                 VStack(alignment: .leading, spacing: 4) {
                     Text(UserText.netPStatusViewTitle)
-                        .font(.system(size: 16))
+                        .daxBodyRegular()
                         .foregroundColor(.textPrimary)
                     Text(statusModel.statusMessage)
-                        .font(.system(size: 13))
+                        .daxFootnoteRegular()
                         .foregroundColor(.textSecondary)
                 }
 
@@ -92,11 +92,11 @@ struct NetworkProtectionStatusView: View {
                     .frame(height: 96)
                     .padding(8)
                 Text(statusModel.headerTitle)
-                    .font(.system(size: 17, weight: .semibold))
+                    .daxHeadline()
                     .multilineTextAlignment(.center)
                     .foregroundColor(.textPrimary)
                 Text(UserText.netPStatusHeaderMessage)
-                    .font(.system(size: 13))
+                    .daxFootnoteRegular()
                     .multilineTextAlignment(.center)
                     .foregroundColor(.textSecondary)
                     .padding(.bottom, 8)
@@ -137,10 +137,10 @@ struct NetworkProtectionStatusView: View {
     private func settings() -> some View {
         Section {
             NavigationLink(UserText.netPVPNSettingsTitle, destination: NetworkProtectionVPNSettingsView())
-                .font(.system(size: 16))
+                .daxBodyRegular()
                 .foregroundColor(.textPrimary)
             NavigationLink(UserText.netPVPNNotificationsTitle, destination: NetworkProtectionVPNNotificationsView())
-                .font(.system(size: 16))
+                .daxBodyRegular()
                 .foregroundColor(.textPrimary)
         } header: {
             Text(UserText.netPStatusViewSettingsSectionTitle).foregroundColor(.textSecondary)
@@ -155,7 +155,7 @@ struct NetworkProtectionStatusView: View {
         Text("\(UserText.netPInviteOnlyMessage) [\(UserText.netPStatusViewShareFeedback)](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)")
             .foregroundColor(.textSecondary)
             .accentColor(Color.controlColor)
-            .font(.system(size: 13))
+            .daxFootnoteRegular()
             .padding(.top, 6)
     }
 }
@@ -169,12 +169,11 @@ private struct NetworkProtectionErrorView: View {
             HStack {
                 Image("Alert-Color-16")
                 Text(title)
-                    .font(.system(size: 16))
+                    .daxBodyBold()
                     .foregroundColor(.primary)
-                    .bold()
             }
             Text(message)
-                .font(.system(size: 16))
+                .daxBodyRegular()
                 .foregroundColor(.primary)
         }
         .listRowBackground(Color.cellBackground)
@@ -190,11 +189,11 @@ private struct NetworkProtectionServerItemView: View {
         HStack(spacing: 16) {
             Image(imageID)
             Text(title)
-                .font(.system(size: 16))
+                .daxBodyRegular()
                 .foregroundColor(.textPrimary)
             Spacer(minLength: 2)
             Text(value)
-                .font(.system(size: 16))
+                .daxBodyRegular()
                 .foregroundColor(.textSecondary)
         }
         .listRowBackground(Color.cellBackground)
diff --git a/DuckDuckGo/NetworkProtectionVPNLocationView.swift b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
index 31425e33d7..717f295629 100644
--- a/DuckDuckGo/NetworkProtectionVPNLocationView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
@@ -53,7 +53,7 @@ struct NetworkProtectionVPNLocationView: View {
                 }, label: {
                     Text(UserText.netPPreferredLocationNearest)
                         .foregroundStyle(Color.textPrimary)
-                        .font(.system(size: 16))
+                        .daxBodyRegular()
                 }
             )
         } header: {
@@ -62,7 +62,7 @@ struct NetworkProtectionVPNLocationView: View {
         } footer: {
             Text(UserText.netPVPNLocationRecommendedSectionFooter)
                 .foregroundStyle(Color.textSecondary)
-                .font(.system(size: 13))
+                .daxFootnoteRegular()
                 .padding(.top, 6)
         }
     }
@@ -115,11 +115,11 @@ private struct CountryItem: View {
                 Text(itemModel.emoji)
                 VStack(alignment: .leading, spacing: 4) {
                     Text(itemModel.title)
-                        .font(.system(size: 16))
+                        .daxBodyRegular()
                         .foregroundStyle(Color.textPrimary)
                     if let subtitle = itemModel.subtitle {
                         Text(subtitle)
-                            .font(.system(size: 13))
+                            .daxFootnoteRegular()
                             .foregroundStyle(Color.textSecondary)
                     }
                 }
@@ -178,7 +178,7 @@ private struct MenuItem: View {
             action: action,
             label: {
                 HStack(spacing: 12) {
-                    Text(title)
+                    Text(title).daxBodyRegular()
                     Spacer()
                     Image(systemName: "checkmark")
                         .if(!isSelected) {
diff --git a/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift b/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift
index d5b0d22fd2..9d6897017f 100644
--- a/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift
@@ -58,7 +58,7 @@ struct NetworkProtectionVPNNotificationsView: View {
         } footer: {
             Text(UserText.netPTurnOnNotificationsSectionFooter)
                 .foregroundColor(.textSecondary)
-                .font(.system(size: 13))
+                .daxFootnoteRegular()
                 .padding(.top, 6)
         }
     }
@@ -74,7 +74,7 @@ struct NetworkProtectionVPNNotificationsView: View {
         } footer: {
             Text(UserText.netPVPNAlertsToggleSectionFooter)
                 .foregroundColor(.textSecondary)
-                .font(.system(size: 13))
+                .daxFootnoteRegular()
                 .padding(.top, 6)
         }
     }

From c73d7deac9f4e66f32a1482e52c8b7f1c9f1acf1 Mon Sep 17 00:00:00 2001
From: Christopher Brind <brindy@duckduckgo.com>
Date: Fri, 1 Dec 2023 10:24:28 +0000
Subject: [PATCH 32/40] new pixels for toolbars and share sheet  (#2208)

Task/Issue URL: https://app.asana.com/0/414235014887631/1205953072928854/f
Tech Design URL:
CC:

Description:

New pixels for iOS toolbars project.

Address Bar

AddressBarSettingsPressed: New pixel m_addressbar_settings
AddressBarRefreshPressed: This is the m_r pixel and is only called from the address bar so already exists
AddressBarShieldPressed: This is the mp pixel so already exists
AddressBarSharePressed: This was one pixel with a parameter, but I'm splitting into two new ones for clarity:
new pixel: m_addressbar_share from the address bar
new pixel: m_browsingmenu_share from the menu
pixel removed: mb_sh has been removed
Share Sheet

Share result
New pixel m_sharesheet_result_success when success is true
New pixel m_sharesheet_result_fail when success is false
ShareSheetCopy: new pixel m_sharesheet_activity_copy
ShareSheetAddBookmark: new pixel m_sharesheet_activity_addbookmark
ShareSheetAddFavorite: new pixel m_sharesheet_activity_addfavorite
ShareSheetFindinPage: new pixel m_sharesheet_activity_findinpage
ShareSheetPrint: new pixel m_sharesheet_activity_print
ShareSheetAddToReadingList: new pixel m_sharesheet_activity_addtoreadinglist
Also includes adding app version by default to the pixels as part of privacy triage: https://app.asana.com/0/69071770703008/1206042861558143/f
---
 Core/Pixel.swift                              |  3 +-
 Core/PixelEvent.swift                         | 30 +++++++++++++-
 DuckDuckGo/MainViewController.swift           |  2 +-
 DuckDuckGo/OmniBar.swift                      |  2 +
 ...bViewControllerBrowsingMenuExtension.swift | 40 ++++++++++++++++---
 5 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/Core/Pixel.swift b/Core/Pixel.swift
index 5c24bee78b..229598fd36 100644
--- a/Core/Pixel.swift
+++ b/Core/Pixel.swift
@@ -214,13 +214,14 @@ extension Pixel {
     
     public static func fire(pixel: Pixel.Event,
                             error: Error?,
+                            includedParameters: [QueryParameters] = [.appVersion],
                             withAdditionalParameters params: [String: String] = [:],
                             onComplete: @escaping (Error?) -> Void = { _ in }) {
         var newParams = params
         if let error {
             newParams.appendErrorPixelParams(error: error)
         }
-        fire(pixel: pixel, withAdditionalParameters: newParams, includedParameters: [], onComplete: onComplete)
+        fire(pixel: pixel, withAdditionalParameters: newParams, includedParameters: includedParameters, onComplete: onComplete)
     }
 }
 
diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index c29918a5f3..5d6a1e3494 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -74,6 +74,19 @@ extension Pixel {
         case browsingMenuFireproof
         case browsingMenuAutofill
         
+        case addressBarShare
+        case addressBarSettings
+
+        case shareSheetResultSuccess
+        case shareSheetResultFail
+        case shareSheetActivityCopy
+        case shareSheetActivityAddBookmark
+        case shareSheetActivityAddFavorite
+        case shareSheetActivityFindInPage
+        case shareSheetActivityPrint
+        case shareSheetActivityAddToReadingList
+        case shareSheetActivityOther
+
         case tabBarBackPressed
         case tabBarForwardPressed
         case bookmarksButtonPressed
@@ -562,7 +575,6 @@ extension Pixel.Event {
         case .browsingMenuRemoveFromFavorites: return "mb_df"
         case .browsingMenuAddToFavoritesAddFavoriteFlow: return "mb_aff"
         case .browsingMenuToggleBrowsingMode: return "mb_dm"
-        case .browsingMenuShare: return "mb_sh"
         case .browsingMenuCopy: return "mb_cp"
         case .browsingMenuPrint: return "mb_pr"
         case .browsingMenuSettings: return "mb_st"
@@ -572,7 +584,21 @@ extension Pixel.Event {
         case .browsingMenuReportBrokenSite: return "mb_rb"
         case .browsingMenuFireproof: return "mb_f"
         case .browsingMenuAutofill: return "m_nav_autofill_menu_item_pressed"
-            
+
+        case .browsingMenuShare: return "m_browsingmenu_share"
+
+        case .addressBarShare: return "m_addressbar_share"
+        case .addressBarSettings: return "m_addressbar_settings"
+        case .shareSheetResultSuccess: return "m_sharesheet_result_success"
+        case .shareSheetResultFail: return "m_sharesheet_result_fail"
+        case .shareSheetActivityCopy: return "m_sharesheet_activity_copy"
+        case .shareSheetActivityAddBookmark: return "m_sharesheet_activity_addbookmark"
+        case .shareSheetActivityAddFavorite: return "m_sharesheet_activity_addfavorite"
+        case .shareSheetActivityFindInPage: return "m_sharesheet_activity_findinpage"
+        case .shareSheetActivityPrint: return "m_sharesheet_activity_print"
+        case .shareSheetActivityAddToReadingList: return "m_sharesheet_activity_addtoreadinglist"
+        case .shareSheetActivityOther: return "m_sharesheet_activity_other"
+
         case .tabBarBackPressed: return "mt_bk"
         case .tabBarForwardPressed: return "mt_fw"
         case .bookmarksButtonPressed: return "mt_bm"
diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift
index f043f52def..fa2a0b7336 100644
--- a/DuckDuckGo/MainViewController.swift
+++ b/DuckDuckGo/MainViewController.swift
@@ -1463,7 +1463,7 @@ extension MainViewController: OmniBarDelegate {
     func onSharePressed() {
         hideSuggestionTray()
         guard let link = currentTab?.link else { return }
-        currentTab?.onShareAction(forLink: link, fromView: viewCoordinator.omniBar.shareButton, orginatedFromMenu: false)
+        currentTab?.onShareAction(forLink: link, fromView: viewCoordinator.omniBar.shareButton)
     }
     
     func onVoiceSearchPressed() {
diff --git a/DuckDuckGo/OmniBar.swift b/DuckDuckGo/OmniBar.swift
index bb8c6944ff..9498074044 100644
--- a/DuckDuckGo/OmniBar.swift
+++ b/DuckDuckGo/OmniBar.swift
@@ -446,6 +446,7 @@ class OmniBar: UIView {
     }
 
     @IBAction func onSettingsButtonPressed(_ sender: Any) {
+        Pixel.fire(pixel: .addressBarSettings)
         omniDelegate?.onSettingsPressed()
     }
     
@@ -474,6 +475,7 @@ class OmniBar: UIView {
     }
     
     @IBAction func onSharePressed(_ sender: Any) {
+        Pixel.fire(pixel: .addressBarShare)
         omniDelegate?.onSharePressed()
     }
     
diff --git a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift
index 835f9eb89d..b946236540 100644
--- a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift
+++ b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift
@@ -42,7 +42,8 @@ extension TabViewController {
         entries.append(BrowsingMenuEntry.regular(name: UserText.actionShare, image: UIImage(named: "Share-24")!, action: { [weak self] in
             guard let self = self else { return }
             guard let menu = self.chromeDelegate?.omniBar.menuButton else { return }
-            self.onShareAction(forLink: self.link!, fromView: menu, orginatedFromMenu: true)
+            Pixel.fire(pixel: .browsingMenuShare)
+            self.onShareAction(forLink: self.link!, fromView: menu)
         }))
         
         entries.append(BrowsingMenuEntry.regular(name: UserText.actionCopy, image: UIImage(named: "Copy-24")!, action: { [weak self] in
@@ -302,10 +303,7 @@ extension TabViewController {
         }
     }
 
-    func onShareAction(forLink link: Link, fromView view: UIView, orginatedFromMenu: Bool) {
-        Pixel.fire(pixel: .browsingMenuShare,
-                   withAdditionalParameters: [PixelParameters.originatedFromMenu: orginatedFromMenu ? "1" : "0"])
-        
+    func onShareAction(forLink link: Link, fromView view: UIView) {
         shareLinkWithTemporaryDownload(temporaryDownloadForPreviewedFile, originalLink: link) { [weak self] link in
             guard let self = self else { return }
             var items: [Any] = [link, self.webView.viewPrintFormatter()]
@@ -313,10 +311,40 @@ extension TabViewController {
             if let webView = self.webView {
                 items.append(webView)
             }
-            self.presentShareSheet(withItems: items, fromView: view)
+
+            self.presentShareSheet(withItems: items, fromView: view) { [weak self] activityType, result, _, error in
+                if result {
+                    Pixel.fire(pixel: .shareSheetResultSuccess)
+                } else {
+                    Pixel.fire(pixel: .shareSheetResultFail, error: error)
+                }
+
+                if let activityType {
+                    self?.firePixelForActivityType(activityType)
+                }
+            }
         }
     }
     
+    private func firePixelForActivityType(_ activityType: UIActivity.ActivityType) {
+        switch activityType {
+        case .copyToPasteboard:
+            Pixel.fire(pixel: .shareSheetActivityCopy)
+        case .saveBookmarkInDuckDuckGo:
+            Pixel.fire(pixel: .shareSheetActivityAddBookmark)
+        case .saveFavoriteInDuckDuckGo:
+            Pixel.fire(pixel: .shareSheetActivityAddFavorite)
+        case .findInPage:
+            Pixel.fire(pixel: .shareSheetActivityFindInPage)
+        case .print:
+            Pixel.fire(pixel: .shareSheetActivityPrint)
+        case .addToReadingList:
+            Pixel.fire(pixel: .shareSheetActivityAddToReadingList)
+        default:
+            Pixel.fire(pixel: .shareSheetActivityOther)
+        }
+    }
+
     private func shareLinkWithTemporaryDownload(_ temporaryDownload: Download?,
                                                 originalLink: Link,
                                                 completion: @escaping(Link) -> Void) {

From 7c44458a9e26bd331098b8766b4e142a096b6a80 Mon Sep 17 00:00:00 2001
From: Sabrina Tardio <44158575+SabrinaTardio@users.noreply.github.com>
Date: Fri, 1 Dec 2023 13:07:36 +0100
Subject: [PATCH 33/40] Sabrina/sync setup update (#2198)

Task/Issue URL: https://app.asana.com/0/0/1205948195318715/f

Description: Update the sync UI flow according to https://www.figma.com/file/5wIXwQLKJ0dZVsP5XWcgbT/%F0%9F%8E%AF-Sync-9?type=design&node-id=8748-306047&mode=design&t=5IygRcQcvvNAJ7xg-0
---
 Core/UIViewControllerExtension.swift          |   8 +-
 DuckDuckGo/Base.lproj/Settings.storyboard     |  42 +--
 DuckDuckGo/SettingsViewController.swift       |   4 +-
 .../Arrow-Circle-Right-12.svg                 |  11 +
 .../Contents.json                             |  15 +
 .../Sync-128.imageset/Contents.json           |  21 ++
 .../Sync-128.imageset/Sync-128.svg            |   9 +
 .../Sync-Recover-128.imageset/Contents.json   |  15 +
 .../Sync-Recover-128.svg                      |  20 ++
 .../Sync-Server-128.imageset/Contents.json    |  15 +
 .../Sync-Server-128.svg                       |  18 +
 ...cSettingsViewController+PDFRendering.swift |  12 +-
 ...cSettingsViewController+SyncDelegate.swift |  45 +--
 DuckDuckGo/SyncSettingsViewController.swift   |  47 +--
 DuckDuckGo/UserText.swift                     |   2 +-
 ...000170c180>{number = 1, name = main}.plist | Bin 0 -> 106 bytes
 .../SyncManagementViewModelTests.swift        |  49 ++-
 .../ViewModels/SaveRecoveryKeyViewModel.swift |   8 +-
 .../ViewModels/ScanOrPasteCodeViewModel.swift |  20 +-
 .../ViewModels/SyncSettingsViewModel.swift    |  12 +-
 .../SyncUI/Views/DeviceConnectedView.swift    | 108 +-----
 .../SyncUI/Views/Internal/CameraView.swift    | 154 +++++++++
 .../Views/Internal/ConnectModeView.swift      |  38 ---
 .../Views/Internal/EditDeviceView.swift       |   4 +-
 .../Views/Internal/QRCodeCopierView.swift     | 100 ------
 .../Views/Internal/QRCodeScannerView.swift    |   5 +-
 .../SyncUI/Views/Internal/ShowCodeView.swift  |  44 ---
 .../SyncUI/Views/Internal/UserText.swift      | 227 +++++++------
 .../Sources/SyncUI/Views/PasteCodeView.swift  |  53 +--
 .../SyncUI/Views/PreparingToSyncView.swift    |  49 +++
 .../SyncUI/Views/RecoverSyncedDataView.swift  |  68 ++++
 .../SyncUI/Views/SaveRecoveryKeyView.swift    |  76 +++--
 ...anOrEnterCodeToRecoverSyncedDataView.swift |  71 ++++
 .../SyncUI/Views/ScanOrPasteCodeView.swift    | 303 +++++------------
 .../SyncUI/Views/SyncSettingsView.swift       | 309 ++++++++----------
 .../SyncUI/Views/SyncWithServerView.swift     |  78 +++++
 36 files changed, 1137 insertions(+), 923 deletions(-)
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Arrow-Circle-Right-12.svg
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Contents.json
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Contents.json
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Sync-128.svg
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Contents.json
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Sync-Recover-128.svg
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Contents.json
 create mode 100644 DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Sync-Server-128.svg
 create mode 100644 DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift<_NSMainThread: 0x60000170c180>{number = 1, name = main}.plist
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/CameraView.swift
 delete mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ConnectModeView.swift
 delete mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeCopierView.swift
 delete mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ShowCodeView.swift
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/PreparingToSyncView.swift
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/RecoverSyncedDataView.swift
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrEnterCodeToRecoverSyncedDataView.swift
 create mode 100644 LocalPackages/SyncUI/Sources/SyncUI/Views/SyncWithServerView.swift

diff --git a/Core/UIViewControllerExtension.swift b/Core/UIViewControllerExtension.swift
index f37bca411b..4e91074719 100644
--- a/Core/UIViewControllerExtension.swift
+++ b/Core/UIViewControllerExtension.swift
@@ -50,11 +50,15 @@ extension UIViewController {
         present(controller: shareController, fromButtonItem: buttonItem)
     }
 
-    public func presentShareSheet(withItems activityItems: [Any], fromView sourceView: UIView, atPoint point: Point? = nil, completion: UIActivityViewController.CompletionWithItemsHandler? = nil) {
+    public func presentShareSheet(withItems activityItems: [Any], fromView sourceView: UIView, atPoint point: Point? = nil, overrideInterfaceStyle: UIUserInterfaceStyle? = nil, completion: UIActivityViewController.CompletionWithItemsHandler? = nil) {
         let activities = buildActivities()
         let shareController = UIActivityViewController(activityItems: activityItems, applicationActivities: activities)
         shareController.completionWithItemsHandler = completion
-        shareController.overrideUserInterfaceStyle()
+        if let overrideInterfaceStyle {
+            shareController.overrideUserInterfaceStyle = overrideInterfaceStyle
+        } else {
+            shareController.overrideUserInterfaceStyle()
+        }
         shareController.excludedActivityTypes = [.markupAsPDF]
         present(controller: shareController, fromView: sourceView, atPoint: point)
     }
diff --git a/DuckDuckGo/Base.lproj/Settings.storyboard b/DuckDuckGo/Base.lproj/Settings.storyboard
index 1d4eb7fa61..63439e5402 100644
--- a/DuckDuckGo/Base.lproj/Settings.storyboard
+++ b/DuckDuckGo/Base.lproj/Settings.storyboard
@@ -104,7 +104,7 @@
                                             <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="43.666667938232422"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
-                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Sync &amp; Back Up" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="oXN-ez-gct" userLabel="Sync">
+                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Sync &amp; Backup" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="oXN-ez-gct" userLabel="Sync">
                                                     <rect key="frame" x="20" y="0.0" width="315.66666666666669" height="43.666667938232422"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
@@ -753,11 +753,11 @@
                                         <rect key="frame" x="20" y="1324.6666603088379" width="374" height="55"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="nAl-CW-4R7" id="eQZ-vi-vuJ">
-                                            <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="55"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="355.66666666666669" height="55"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="Email Protection" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="azf-Nc-kvW">
-                                                    <rect key="frame" x="20" y="7.3333333333333339" width="118" height="19.333333333333332"/>
+                                                    <rect key="frame" x="8" y="7.3333333333333339" width="118" height="19.333333333333332"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
                                                         <bool key="isElement" value="NO"/>
@@ -767,7 +767,7 @@
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" insetsLayoutMarginsFromSafeArea="NO" text="Block email trackers and hide your address" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Y6Y-wA-n6Z">
-                                                    <rect key="frame" x="20" y="29.333333333333332" width="260" height="15.666666666666666"/>
+                                                    <rect key="frame" x="8" y="29.333333333333332" width="260" height="15.666666666666666"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="13"/>
                                                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
@@ -781,11 +781,11 @@
                                         <rect key="frame" x="20" y="1379.6666603088379" width="374" height="55"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WpO-kq-QM6" id="jdM-R6-KZO">
-                                            <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="55"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="355.66666666666669" height="55"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="DuckDuckGo Mac App" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Yz9-17-qnn">
-                                                    <rect key="frame" x="20" y="7.3333333333333339" width="164.33333333333334" height="19.333333333333332"/>
+                                                    <rect key="frame" x="8" y="7.3333333333333339" width="164.33333333333334" height="19.333333333333332"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
                                                         <bool key="isElement" value="NO"/>
@@ -795,7 +795,7 @@
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" insetsLayoutMarginsFromSafeArea="NO" text="Browse privately with our app for Mac " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="P0F-ts-ekd">
-                                                    <rect key="frame" x="20" y="29.333333333333332" width="232" height="15.666666666666666"/>
+                                                    <rect key="frame" x="8" y="29.333333333333332" width="232" height="15.666666666666666"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="13"/>
                                                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
@@ -809,11 +809,11 @@
                                         <rect key="frame" x="20" y="1434.6666603088379" width="374" height="55"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ubu-Mf-iUH" id="Sm8-Lv-wFY">
-                                            <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="55"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="355.66666666666669" height="55"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="DuckDuckGo Windows App" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="RQ8-H1-Ez1">
-                                                    <rect key="frame" x="20" y="7.3333333333333339" width="199.33333333333334" height="19.333333333333332"/>
+                                                    <rect key="frame" x="8" y="7.3333333333333339" width="199.33333333333334" height="19.333333333333332"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
                                                         <bool key="isElement" value="NO"/>
@@ -823,7 +823,7 @@
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" insetsLayoutMarginsFromSafeArea="NO" text="Browse privately with our app for Windows" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="hoT-Nu-KXP">
-                                                    <rect key="frame" x="20" y="29.333333333333332" width="257.66666666666669" height="15.666666666666666"/>
+                                                    <rect key="frame" x="8" y="29.333333333333332" width="257.66666666666669" height="15.666666666666666"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="13"/>
                                                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
@@ -837,11 +837,11 @@
                                         <rect key="frame" x="20" y="1489.6666603088379" width="374" height="55"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="7pF-cg-5QN" id="5Yk-5T-8YE">
-                                            <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="55"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="355.66666666666669" height="55"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="Network Protection" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="qah-gb-udB" userLabel="Network Protection">
-                                                    <rect key="frame" x="20" y="7.3333333333333339" width="140" height="19.333333333333332"/>
+                                                    <rect key="frame" x="8" y="7.3333333333333339" width="140" height="19.333333333333332"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
                                                         <bool key="isElement" value="NO"/>
@@ -851,7 +851,7 @@
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" insetsLayoutMarginsFromSafeArea="NO" text="Hide your location and conceal your online activity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Cyw-ir-cSK">
-                                                    <rect key="frame" x="20" y="29.333333333333332" width="304.66666666666669" height="15.666666666666666"/>
+                                                    <rect key="frame" x="8" y="29.333333333333332" width="304.66666666666669" height="15.666666666666666"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="13"/>
                                                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
@@ -869,11 +869,11 @@
                                         <rect key="frame" x="20" y="1611.9999923706055" width="374" height="43.666667938232422"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="iy0-gV-9MR" id="Msh-jY-fMD">
-                                            <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="43.666667938232422"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="355.66666666666669" height="43.666667938232422"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="About DuckDuckGo" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="oM7-1o-9oY">
-                                                    <rect key="frame" x="20" y="0.0" width="315.66666666666669" height="43.666667938232422"/>
+                                                    <rect key="frame" x="8" y="0.0" width="339.66666666666669" height="43.666667938232422"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
                                                         <bool key="isElement" value="NO"/>
@@ -900,14 +900,14 @@
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="Version" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="2ky-s9-1aZ">
-                                                    <rect key="frame" x="20.000000000000004" y="12.999999999999998" width="54.333333333333336" height="19.333333333333332"/>
+                                                    <rect key="frame" x="8.0000000000000036" y="12.999999999999998" width="54.333333333333336" height="19.333333333333332"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="10.0.1 (Build 10005)" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="d5n-vG-8kF">
-                                                    <rect key="frame" x="211.33333333333337" y="12.999999999999998" width="142.66666666666666" height="19.333333333333332"/>
+                                                    <rect key="frame" x="223.33333333333337" y="12.999999999999998" width="142.66666666666666" height="19.333333333333332"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                                     <color key="textColor" red="0.74509803919999995" green="0.76078431369999999" blue="0.79607843140000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -925,7 +925,7 @@
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="Share Feedback" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="m23-t6-9cb">
-                                                    <rect key="frame" x="20" y="0.0" width="334" height="43.666667938232422"/>
+                                                    <rect key="frame" x="8" y="0.0" width="358" height="43.666667938232422"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="16"/>
                                                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
@@ -949,11 +949,11 @@
                                         <rect key="frame" x="20" y="1782.9999961853027" width="374" height="43.666667938232422"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="FqT-nq-YvQ" id="DgP-Pj-wOt">
-                                            <rect key="frame" x="0.0" y="0.0" width="343.66666666666669" height="43.666667938232422"/>
+                                            <rect key="frame" x="0.0" y="0.0" width="355.66666666666669" height="43.666667938232422"/>
                                             <autoresizingMask key="autoresizingMask"/>
                                             <subviews>
                                                 <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" ambiguous="YES" text="Debug Menu" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="A9G-5I-RSn">
-                                                    <rect key="frame" x="20" y="0.0" width="315.66666666666669" height="43.666667938232422"/>
+                                                    <rect key="frame" x="8" y="0.0" width="339.66666666666669" height="43.666667938232422"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                     <accessibility key="accessibilityConfiguration">
                                                         <bool key="isElement" value="NO"/>
@@ -2346,7 +2346,7 @@
             <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
         <systemColor name="secondaryLabelColor">
-            <color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
+            <color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
         </systemColor>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
diff --git a/DuckDuckGo/SettingsViewController.swift b/DuckDuckGo/SettingsViewController.swift
index 85827c1b4d..f8bab32085 100644
--- a/DuckDuckGo/SettingsViewController.swift
+++ b/DuckDuckGo/SettingsViewController.swift
@@ -258,9 +258,9 @@ class SettingsViewController: UITableViewController {
     }
 
     private func configureSyncCell() {
-        syncCell.textLabel?.text = "Sync & Back Up"
+        syncCell.textLabel?.text = "Sync & Backup"
         if SyncBookmarksAdapter.isSyncBookmarksPaused || SyncCredentialsAdapter.isSyncCredentialsPaused {
-            syncCell.textLabel?.text = "⚠️ " + "Sync & Back Up"
+            syncCell.textLabel?.text = "⚠️ " + "Sync & Backup"
         }
         syncCell.isHidden = !shouldShowSyncCell
     }
diff --git a/DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Arrow-Circle-Right-12.svg b/DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Arrow-Circle-Right-12.svg
new file mode 100644
index 0000000000..898b40d43c
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Arrow-Circle-Right-12.svg
@@ -0,0 +1,11 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_9153_12928)">
+<path d="M5.81451 8.6983C5.56692 8.45778 5.56119 8.0621 5.8017 7.81451L6.95722 6.625H3.625C3.27982 6.625 3 6.34518 3 6C3 5.65482 3.27982 5.375 3.625 5.375H6.8358L5.8017 4.31049C5.56119 4.0629 5.56692 3.66721 5.81451 3.4267C6.0621 3.18618 6.45778 3.19192 6.6983 3.43951L8.8233 5.62701C9.0589 5.86954 9.0589 6.25546 8.8233 6.49799L6.6983 8.68549C6.45778 8.93308 6.0621 8.93881 5.81451 8.6983Z" fill="#7295F6"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6 0C2.68629 0 0 2.68629 0 6C0 9.31371 2.68629 12 6 12C9.31371 12 12 9.31371 12 6C12 2.68629 9.31371 0 6 0ZM1.25 6C1.25 3.37665 3.37665 1.25 6 1.25C8.62335 1.25 10.75 3.37665 10.75 6C10.75 8.62335 8.62335 10.75 6 10.75C3.37665 10.75 1.25 8.62335 1.25 6Z" fill="#7295F6"/>
+</g>
+<defs>
+<clipPath id="clip0_9153_12928">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Contents.json b/DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Contents.json
new file mode 100644
index 0000000000..c8db4cda36
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Arrow-Circle-Right-12.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "Arrow-Circle-Right-12.svg",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true
+  }
+}
diff --git a/DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Contents.json b/DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Contents.json
new file mode 100644
index 0000000000..825d823565
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "Sync-128.svg",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Sync-128.svg b/DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Sync-128.svg
new file mode 100644
index 0000000000..3cb06d383e
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Sync-128.imageset/Sync-128.svg
@@ -0,0 +1,9 @@
+<svg width="128" height="97" viewBox="0 0 128 97" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.2" d="M105.629 38.8665L107.171 38.4665C107.457 38.4094 107.743 38.1236 107.8 37.8379L108.2 36.2951C108.314 35.8951 108.657 35.6665 109 35.6665C109.4 35.6665 109.743 35.9522 109.8 36.2951L110.2 37.8379C110.257 38.1236 110.543 38.4094 110.829 38.4665L112.371 38.8665C112.771 38.9808 113 39.3236 113 39.6665C113 40.0665 112.714 40.4094 112.371 40.4665L110.829 40.8665C110.543 40.9236 110.257 41.2094 110.2 41.4951L109.8 43.0379C109.686 43.4379 109.343 43.6665 109 43.6665C108.6 43.6665 108.257 43.3808 108.2 43.0379L107.8 41.4951C107.743 41.2094 107.457 40.9236 107.171 40.8665L105.629 40.4665C105.229 40.3522 105 40.0094 105 39.6665C105 39.2665 105.286 38.9236 105.629 38.8665Z" fill="#888888"/>
+<path opacity="0.2" d="M15.9428 32.4665L18.2571 31.8665C18.6857 31.7808 19.1143 31.3522 19.2 30.9236L19.8 28.6094C19.9714 28.0094 20.4857 27.6665 21 27.6665C21.6 27.6665 22.1143 28.0951 22.2 28.6094L22.8 30.9236C22.8857 31.3522 23.3143 31.7808 23.7429 31.8665L26.0572 32.4665C26.6572 32.6379 27 33.1522 27 33.6665C27 34.2665 26.5714 34.7808 26.0572 34.8665L23.7429 35.4665C23.3143 35.5522 22.8857 35.9808 22.8 36.4094L22.2 38.7236C22.0286 39.3236 21.5143 39.6665 21 39.6665C20.4 39.6665 19.8857 39.2379 19.8 38.7236L19.2 36.4094C19.1143 35.9808 18.6857 35.5522 18.2571 35.4665L15.9428 34.8665C15.3428 34.6951 15 34.1808 15 33.6665C15 33.0665 15.4286 32.5522 15.9428 32.4665Z" fill="#888888"/>
+<path opacity="0.2" d="M0.628558 53.8665L2.17142 53.4665C2.45714 53.4094 2.74287 53.1236 2.80001 52.8379L3.19999 51.2951C3.31427 50.8951 3.65714 50.6665 4 50.6665C4.4 50.6665 4.74287 50.9522 4.80001 51.2951L5.19999 52.8379C5.25713 53.1236 5.54286 53.4094 5.82858 53.4665L7.37144 53.8665C7.77144 53.9808 8 54.3236 8 54.6665C8 55.0665 7.7143 55.4094 7.37144 55.4665L5.82858 55.8665C5.54286 55.9236 5.25713 56.2094 5.19999 56.4951L4.80001 58.0379C4.68573 58.4379 4.34286 58.6665 4 58.6665C3.6 58.6665 3.25713 58.3808 3.19999 58.0379L2.80001 56.4951C2.74287 56.2094 2.45714 55.9236 2.17142 55.8665L0.628558 55.4665C0.228558 55.3522 4.76837e-07 55.0094 4.76837e-07 54.6665C4.76837e-07 54.2665 0.285701 53.9236 0.628558 53.8665Z" fill="#888888"/>
+<path opacity="0.2" d="M126.5 52.6665C125.675 52.6665 125 51.9915 125 51.1665C125 50.3415 125.675 49.6665 126.5 49.6665C127.325 49.6665 128 50.3415 128 51.1665C128 51.9915 127.325 52.6665 126.5 52.6665Z" fill="#888888"/>
+<path opacity="0.2" d="M23 70.6665C21.9 70.6665 21 69.7665 21 68.6665C21 67.5665 21.9 66.6665 23 66.6665C24.1 66.6665 25 67.5665 25 68.6665C25 69.7665 24.1 70.6665 23 70.6665Z" fill="#888888"/>
+<path d="M79.6082 56.7804C74.4095 65.6597 63.2694 68.9187 54.1814 64.4303C53.4778 64.079 53.2433 63.1813 53.6342 62.4983L56.214 58.1074C56.8394 57.0536 55.8622 55.7657 54.67 56.0779L37.8817 60.4688C37.139 60.6639 36.7091 61.425 36.9045 62.147L41.2823 78.9689C41.595 80.1593 43.1781 80.3739 43.8035 79.3201L46.3247 75.0073C46.696 74.3633 47.5169 74.1487 48.1814 74.4999C62.859 82.3059 81.2108 77.193 89.7125 62.6934C93.1718 56.7999 94.4617 50.2429 93.8558 43.9201C93.7386 42.7492 92.6246 41.9491 91.491 42.2418L85.0219 43.9396C83.3998 44.369 82.3249 45.813 82.2858 47.4913C82.1881 50.6527 81.3476 53.8337 79.6278 56.7609L79.6082 56.7804Z" fill="#DE5833"/>
+<path d="M47.3124 37.4324C52.1212 29.2361 62.4257 26.2278 70.8321 30.371C71.4829 30.6952 71.6999 31.5239 71.3383 32.1544L68.952 36.2075C68.3735 37.1802 69.2774 38.3691 70.3802 38.0809L85.9094 34.0278C86.5964 33.8476 86.9941 33.1451 86.8133 32.4786L82.7638 16.9508C82.4745 15.8519 81.0102 15.6538 80.4317 16.6265L78.0996 20.6075C77.7561 21.202 76.9968 21.4002 76.3822 21.0759C62.8054 13.8704 45.8299 18.59 37.9659 31.9742C34.766 37.4144 33.5729 43.467 34.1333 49.3035C34.2418 50.3843 35.2722 51.1228 36.3208 50.8526L42.3047 49.2854C43.8052 48.8891 44.7994 47.5561 44.8356 46.0069C44.926 43.0887 45.7034 40.1525 47.2943 37.4504L47.3124 37.4324Z" fill="#3969EF"/>
+</svg>
diff --git a/DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Contents.json b/DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Contents.json
new file mode 100644
index 0000000000..19881bb976
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "Sync-Recover-128.svg",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true
+  }
+}
diff --git a/DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Sync-Recover-128.svg b/DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Sync-Recover-128.svg
new file mode 100644
index 0000000000..b0ace196dd
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Sync-Recover-128.imageset/Sync-Recover-128.svg
@@ -0,0 +1,20 @@
+<svg width="128" height="96" viewBox="0 0 128 96" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.2" d="M105.629 38.2L107.171 37.8C107.457 37.7429 107.743 37.4571 107.8 37.1714L108.2 35.6286C108.314 35.2286 108.657 35 109 35C109.4 35 109.743 35.2857 109.8 35.6286L110.2 37.1714C110.257 37.4571 110.543 37.7429 110.829 37.8L112.371 38.2C112.771 38.3143 113 38.6571 113 39C113 39.4 112.714 39.7429 112.371 39.8L110.829 40.2C110.543 40.2571 110.257 40.5429 110.2 40.8286L109.8 42.3714C109.686 42.7714 109.343 43 109 43C108.6 43 108.257 42.7143 108.2 42.3714L107.8 40.8286C107.743 40.5429 107.457 40.2571 107.171 40.2L105.629 39.8C105.229 39.6857 105 39.3429 105 39C105 38.6 105.286 38.2571 105.629 38.2Z" fill="#888888"/>
+<path opacity="0.2" d="M15.9428 31.8L18.2571 31.2C18.6857 31.1143 19.1143 30.6857 19.2 30.2571L19.8 27.9429C19.9714 27.3429 20.4857 27 21 27C21.6 27 22.1143 27.4286 22.2 27.9429L22.8 30.2571C22.8857 30.6857 23.3143 31.1143 23.7429 31.2L26.0572 31.8C26.6572 31.9714 27 32.4857 27 33C27 33.6 26.5714 34.1143 26.0572 34.2L23.7429 34.8C23.3143 34.8857 22.8857 35.3143 22.8 35.7429L22.2 38.0571C22.0286 38.6571 21.5143 39 21 39C20.4 39 19.8857 38.5714 19.8 38.0571L19.2 35.7429C19.1143 35.3143 18.6857 34.8857 18.2571 34.8L15.9428 34.2C15.3428 34.0286 15 33.5143 15 33C15 32.4 15.4286 31.8857 15.9428 31.8Z" fill="#888888"/>
+<path opacity="0.2" d="M0.628557 53.2L2.17142 52.8C2.45714 52.7429 2.74287 52.4571 2.80001 52.1714L3.19999 50.6286C3.31427 50.2286 3.65714 50 4 50C4.4 50 4.74287 50.2857 4.80001 50.6286L5.19999 52.1714C5.25713 52.4571 5.54286 52.7429 5.82858 52.8L7.37144 53.2C7.77144 53.3143 8 53.6571 8 54C8 54.4 7.7143 54.7429 7.37144 54.8L5.82858 55.2C5.54286 55.2571 5.25713 55.5429 5.19999 55.8286L4.80001 57.3714C4.68573 57.7714 4.34286 58 4 58C3.6 58 3.25713 57.7143 3.19999 57.3714L2.80001 55.8286C2.74287 55.5429 2.45714 55.2571 2.17142 55.2L0.628557 54.8C0.228557 54.6857 0 54.3429 0 54C0 53.6 0.2857 53.2571 0.628557 53.2Z" fill="#888888"/>
+<path opacity="0.2" d="M126.5 52C125.675 52 125 51.325 125 50.5C125 49.675 125.675 49 126.5 49C127.325 49 128 49.675 128 50.5C128 51.325 127.325 52 126.5 52Z" fill="#888888"/>
+<path opacity="0.2" d="M23 70C21.9 70 21 69.1 21 68C21 66.9 21.9 66 23 66C24.1 66 25 66.9 25 68C25 69.1 24.1 70 23 70Z" fill="#888888"/>
+<path d="M70 76C70 78.2091 68.2091 80 66 80H47C42.5817 80 39 76.4183 39 72V24C39 19.5817 42.5817 16 47 16H84C88.4183 16 92 19.5817 92 24V36C92 38.2091 90.2091 40 88 40H78C73.5817 40 70 43.5817 70 48V76Z" fill="#C18010"/>
+<path d="M70 76C70 78.2091 68.2091 80 66 80H46C41.5817 80 38 76.4183 38 72V24C38 19.5817 41.5817 16 46 16H80C84.4183 16 88 19.5817 88 24V40H78C73.5817 40 70 43.5817 70 48V76Z" fill="#E2A412"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M45 20C43.8954 20 43 20.8954 43 22V48C43 60.8559 41.9798 69.6309 41.3967 73.5965C41.2131 74.8452 42.1775 76 43.4396 76H70.0002V48C70.0002 43.5817 73.5819 40 78.0002 40H83V21.9924C83 20.8878 82.1046 20 81 20H45Z" fill="#FFDE7A"/>
+<path d="M51 20C51 18.8954 51.8954 18 53 18H73C74.1046 18 75 18.8954 75 20V24C75 25.1046 74.1046 26 73 26H53C51.8954 26 51 25.1046 51 24V20Z" fill="#999999"/>
+<path d="M51 20C51 18.8954 51.8954 18 53 18H73C74.1046 18 75 18.8954 75 20V22C75 23.1046 74.1046 24 73 24H53C51.8954 24 51 23.1046 51 22V20Z" fill="#D9D9D9"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M70 59.5H68.75C66.4028 59.5 64.5 57.5972 64.5 55.25V50.75C64.5 48.4028 66.4028 46.5 68.75 46.5H70.1404C70.0482 46.9859 70 47.4873 70 48V49H68.75C67.7835 49 67 49.7835 67 50.75V55.25C67 56.2165 67.7835 57 68.75 57H70V59.5ZM70 55C69.4477 55 69 54.5523 69 54V52C69 51.4477 69.4477 51 70 51V55ZM73.1681 41.6235C73.3623 41.2889 73.7073 41.0526 74.1101 41.0077C73.7811 41.1912 73.4664 41.3971 73.1681 41.6235ZM75 40.5815V38.25C75 37.5596 75.5596 37 76.25 37C76.9404 37 77.5 37.5596 77.5 38.25V40.0154C76.6207 40.0696 75.7798 40.2659 75 40.5815ZM52.75 59.5C50.4028 59.5 48.5 57.5972 48.5 55.25V50.75C48.5 48.4028 50.4028 46.5 52.75 46.5H57.25C59.5972 46.5 61.5 48.4028 61.5 50.75V55.25C61.5 57.5972 59.5972 59.5 57.25 59.5H52.75ZM51 55.25C51 56.2165 51.7835 57 52.75 57H57.25C58.2165 57 59 56.2165 59 55.25V50.75C59 49.7835 58.2165 49 57.25 49H52.75C51.7835 49 51 49.7835 51 50.75V55.25ZM54 55C53.4477 55 53 54.5523 53 54V52C53 51.4477 53.4477 51 54 51H56C56.5523 51 57 51.4477 57 52V54C57 54.5523 56.5523 55 56 55H54ZM54 39C53.4477 39 53 38.5523 53 38V36C53 35.4477 53.4477 35 54 35H56C56.5523 35 57 35.4477 57 36V38C57 38.5523 56.5523 39 56 39H54ZM52.75 43.5C50.4028 43.5 48.5 41.5972 48.5 39.25V34.75C48.5 32.4028 50.4028 30.5 52.75 30.5H57.25C59.5972 30.5 61.5 32.4028 61.5 34.75V39.25C61.5 41.5972 59.5972 43.5 57.25 43.5H52.75ZM51 39.25C51 40.2165 51.7835 41 52.75 41H57.25C58.2165 41 59 40.2165 59 39.25V34.75C59 33.7835 58.2165 33 57.25 33H52.75C51.7835 33 51 33.7835 51 34.75V39.25ZM65.75 37C66.4404 37 67 36.4404 67 35.75V33.25H67.75C68.4404 33.25 69 32.6904 69 32C69 31.3096 68.4404 30.75 67.75 30.75H65.75C65.0596 30.75 64.5 31.3096 64.5 32V35.75C64.5 36.4404 65.0596 37 65.75 37ZM72.25 33.25C71.5596 33.25 71 32.6904 71 32C71 31.3096 71.5596 30.75 72.25 30.75H76.25C76.9404 30.75 77.5 31.3096 77.5 32V33.75C77.5 34.4404 76.9404 35 76.25 35C75.5596 35 75 34.4404 75 33.75V33.25H72.25ZM66 43.25C65.9578 43.25 65.9161 43.2479 65.875 43.2438C65.8339 43.2479 65.7922 43.25 65.75 43.25C65.0596 43.25 64.5 42.6904 64.5 42V40.25C64.5 39.5596 65.0596 39 65.75 39C66.4404 39 67 39.5596 67 40.25V40.75H69.75C70.4404 40.75 71 41.3096 71 42C71 42.6904 70.4404 43.25 69.75 43.25H66ZM69 37.75C69 38.4404 69.5596 39 70.25 39H71.75C72.4404 39 73 38.4404 73 37.75V36.25C73 35.5596 72.4404 35 71.75 35H70.25C69.5596 35 69 35.5596 69 36.25V37.75Z" fill="#F9BE1A"/>
+<path d="M78 44H86C88.2091 44 90 45.7909 90 48V71V84C90 86.2091 88.2091 88 86 88H79.9474H78C75.7909 88 74 86.2091 74 84V48C74 45.7909 75.7909 44 78 44Z" fill="#444444"/>
+<path d="M80.6668 44H99.3335C101.543 44 103.333 45.7909 103.333 48V84C103.333 86.2091 101.543 88 99.3335 88H80.6668C78.4577 88 76.6668 86.2091 76.6668 84V76.1538V48C76.6668 45.7909 78.4577 44 80.6668 44Z" fill="#666666"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M99.5718 85.3327H80.4279C79.8216 85.3327 79.3332 84.8054 79.3332 84.161V47.8377C79.3332 47.1933 79.8216 46.666 80.4279 46.666H99.5718C100.178 46.666 100.667 47.1933 100.667 47.8377V84.161C100.667 84.8054 100.178 85.3327 99.5718 85.3327ZM87.3331 47.9995C86.5967 47.9995 85.9998 48.5965 85.9998 49.3328C85.9998 50.0692 86.5967 50.6662 87.3331 50.6662H92.6664C93.4028 50.6662 93.9998 50.0692 93.9998 49.3328C93.9998 48.5965 93.4028 47.9995 92.6664 47.9995H87.3331Z" fill="#ADC2FC"/>
+<path d="M107.404 63.5244H111.006C111.667 63.5244 112.207 64.0647 112.207 64.7251C112.207 65.3855 111.667 65.9258 111.006 65.9258H107.404C106.744 65.9258 106.204 65.3855 106.204 64.7251C106.204 64.0647 106.744 63.5244 107.404 63.5244Z" fill="#CCCCCC"/>
+<path d="M108.605 52.7188C108.911 52.7188 109.217 52.8388 109.452 53.0729C109.92 53.5412 109.92 54.3036 109.452 54.7719L107.05 57.1733C106.582 57.6415 105.819 57.6415 105.351 57.1733C104.883 56.705 104.883 55.9426 105.351 55.4743L107.753 53.0729C107.987 52.8388 108.293 52.7188 108.599 52.7188H108.605Z" fill="#CCCCCC"/>
+<path d="M106.21 71.9302C105.904 71.9302 105.598 72.0502 105.363 72.2844C104.895 72.7526 104.895 73.5151 105.363 73.9833L107.765 76.3847C108.233 76.853 108.995 76.853 109.464 76.3847C109.932 75.9164 109.932 75.154 109.464 74.6857L107.062 72.2844C106.828 72.0502 106.522 71.9302 106.216 71.9302H106.21Z" fill="#CCCCCC"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M82 63.4723V70.3335C82 71.8062 83.1939 73.0001 84.6667 73.0001H95.3333C96.8061 73.0001 98 71.8062 98 70.3335V63.4723C98 62.1069 96.8932 61.0001 95.5279 61.0001H95.118C94.4328 61.0001 93.8064 60.613 93.5 60.0001C93.1936 59.3873 92.5672 59.0001 91.882 59.0001H88.118C87.4328 59.0001 86.8064 59.3873 86.5 60.0001C86.1936 60.613 85.5672 61.0001 84.882 61.0001H84.4721C83.1068 61.0001 82 62.1069 82 63.4723ZM90 71.0001C92.2091 71.0001 94 69.2093 94 67.0001C94 64.791 92.2091 63.0001 90 63.0001C87.7909 63.0001 86 64.791 86 67.0001C86 69.2093 87.7909 71.0001 90 71.0001Z" fill="#8FABF9"/>
+</svg>
diff --git a/DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Contents.json b/DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Contents.json
new file mode 100644
index 0000000000..ca8f234f0d
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+  "images" : [
+    {
+      "filename" : "Sync-Server-128.svg",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true
+  }
+}
diff --git a/DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Sync-Server-128.svg b/DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Sync-Server-128.svg
new file mode 100644
index 0000000000..c9a50a0589
--- /dev/null
+++ b/DuckDuckGo/SyncAssets.xcassets/Sync-Server-128.imageset/Sync-Server-128.svg
@@ -0,0 +1,18 @@
+<svg width="128" height="96" viewBox="0 0 128 96" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.2" d="M105.629 38.2L107.171 37.8C107.457 37.7429 107.743 37.4571 107.8 37.1714L108.2 35.6286C108.314 35.2286 108.657 35 109 35C109.4 35 109.743 35.2857 109.8 35.6286L110.2 37.1714C110.257 37.4571 110.543 37.7429 110.829 37.8L112.371 38.2C112.771 38.3143 113 38.6571 113 39C113 39.4 112.714 39.7429 112.371 39.8L110.829 40.2C110.543 40.2571 110.257 40.5429 110.2 40.8286L109.8 42.3714C109.686 42.7714 109.343 43 109 43C108.6 43 108.257 42.7143 108.2 42.3714L107.8 40.8286C107.743 40.5429 107.457 40.2571 107.171 40.2L105.629 39.8C105.229 39.6857 105 39.3429 105 39C105 38.6 105.286 38.2571 105.629 38.2Z" fill="#888888"/>
+<path opacity="0.2" d="M15.9428 31.8L18.2571 31.2C18.6857 31.1143 19.1143 30.6857 19.2 30.2571L19.8 27.9429C19.9714 27.3429 20.4857 27 21 27C21.6 27 22.1143 27.4286 22.2 27.9429L22.8 30.2571C22.8857 30.6857 23.3143 31.1143 23.7429 31.2L26.0572 31.8C26.6572 31.9714 27 32.4857 27 33C27 33.6 26.5714 34.1143 26.0572 34.2L23.7429 34.8C23.3143 34.8857 22.8857 35.3143 22.8 35.7429L22.2 38.0571C22.0286 38.6571 21.5143 39 21 39C20.4 39 19.8857 38.5714 19.8 38.0571L19.2 35.7429C19.1143 35.3143 18.6857 34.8857 18.2571 34.8L15.9428 34.2C15.3428 34.0286 15 33.5143 15 33C15 32.4 15.4286 31.8857 15.9428 31.8Z" fill="#888888"/>
+<path opacity="0.2" d="M0.628557 53.2L2.17142 52.8C2.45714 52.7429 2.74287 52.4571 2.80001 52.1714L3.19999 50.6286C3.31427 50.2286 3.65714 50 4 50C4.4 50 4.74287 50.2857 4.80001 50.6286L5.19999 52.1714C5.25713 52.4571 5.54286 52.7429 5.82858 52.8L7.37144 53.2C7.77144 53.3143 8 53.6571 8 54C8 54.4 7.7143 54.7429 7.37144 54.8L5.82858 55.2C5.54286 55.2571 5.25713 55.5429 5.19999 55.8286L4.80001 57.3714C4.68573 57.7714 4.34286 58 4 58C3.6 58 3.25713 57.7143 3.19999 57.3714L2.80001 55.8286C2.74287 55.5429 2.45714 55.2571 2.17142 55.2L0.628557 54.8C0.228557 54.6857 0 54.3429 0 54C0 53.6 0.2857 53.2571 0.628557 53.2Z" fill="#888888"/>
+<path opacity="0.2" d="M126.5 52C125.675 52 125 51.325 125 50.5C125 49.675 125.675 49 126.5 49C127.325 49 128 49.675 128 50.5C128 51.325 127.325 52 126.5 52Z" fill="#888888"/>
+<path opacity="0.2" d="M23 70C21.9 70 21 69.1 21 68C21 66.9 21.9 66 23 66C24.1 66 25 66.9 25 68C25 69.1 24.1 70 23 70Z" fill="#888888"/>
+<path d="M70 76.1259C70 78.0475 68.6342 79.7249 66.7193 79.8861C65.8229 79.9615 64.9159 80 64 80C46.3269 80 32 65.6731 32 48C32 30.3269 46.3269 16 64 16C77.0944 16 88.3519 23.865 93.306 35.1287C94.3584 37.5212 92.4457 40 89.832 40H78C73.5817 40 70 43.5817 70 48V76.1259Z" fill="#557FF3"/>
+<path d="M70 76.1254C70 78.0471 68.6342 79.7245 66.7193 79.8856C65.8229 79.9611 64.9159 79.9995 64 79.9995C55.8512 79.9995 48.4138 76.9537 42.7642 71.9383C43.5042 71.979 44.2496 71.9997 44.9999 71.9997C54.4594 71.9997 63.152 68.7161 70 63.2265V76.1254Z" fill="#7295F6" fill-opacity="0.6" style="mix-blend-mode:multiply"/>
+<path d="M84.1997 40C84.7244 37.415 84.9999 34.7395 84.9999 31.9997C84.9999 28.9072 84.649 25.8967 83.9847 23.0059C87.9931 26.2151 91.2127 30.3686 93.3064 35.1291C94.3587 37.5217 92.4458 40 89.8321 40H84.1997Z" fill="#7295F6" fill-opacity="0.6" style="mix-blend-mode:multiply"/>
+<path d="M78 44H86C88.2091 44 90 45.7909 90 48V71V84C90 86.2091 88.2091 88 86 88H79.9474H78C75.7909 88 74 86.2091 74 84V48C74 45.7909 75.7909 44 78 44Z" fill="#444444"/>
+<path d="M80.6668 44H99.3335C101.543 44 103.333 45.7909 103.333 48V84C103.333 86.2091 101.543 88 99.3335 88H80.6668C78.4577 88 76.6668 86.2091 76.6668 84V76.1538V48C76.6668 45.7909 78.4577 44 80.6668 44Z" fill="#666666"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M99.5718 85.3327H80.4279C79.8216 85.3327 79.3332 84.8054 79.3332 84.161V47.8377C79.3332 47.1933 79.8216 46.666 80.4279 46.666H99.5718C100.178 46.666 100.667 47.1933 100.667 47.8377V84.161C100.667 84.8054 100.178 85.3327 99.5718 85.3327ZM87.3331 47.9995C86.5967 47.9995 85.9998 48.5965 85.9998 49.3328C85.9998 50.0692 86.5967 50.6662 87.3331 50.6662H92.6664C93.4028 50.6662 93.9998 50.0692 93.9998 49.3328C93.9998 48.5965 93.4028 47.9995 92.6664 47.9995H87.3331Z" fill="#FFCC33"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M98 65C98 69.4198 94.4198 73 90 73C85.5802 73 82 69.4198 82 65C82 60.5802 85.5802 57 90 57C94.4198 57 98 60.5802 98 65ZM96 65C96 67.2379 94.7748 69.1897 92.9586 70.2211C93.0322 69.7556 92.9724 68.7203 92.5967 68.2732C92.5189 68.1799 91.7221 68.6852 91.2439 69.0429C91.1429 68.934 90.964 68.8718 90.6258 68.9263C90.5941 68.9308 90.565 68.9367 90.5369 68.9423C90.517 68.9463 90.4975 68.9502 90.4781 68.9535C90.311 68.4092 90.2138 67.9311 90.2527 67.6201C89.8795 67.4219 89.6307 67.1925 89.5841 67.1031C89.5024 66.9554 89.6385 66.8854 89.7084 66.9243C89.7123 66.9282 89.7201 66.9321 89.7318 66.936C90.1244 67.1498 90.7541 67.383 91.6093 67.4258C91.7104 67.4297 91.8153 67.4335 91.9203 67.4335C93.3003 67.4219 94.105 66.8854 93.965 66.6172C93.899 66.4925 93.6125 66.5244 93.1838 66.572H93.1838C92.7035 66.6254 92.0448 66.6986 91.3178 66.5939C90.2993 66.4462 90.1982 65.9797 90.3265 65.7815C90.5224 65.4813 90.8897 65.4974 91.4153 65.5204C91.693 65.5326 92.0149 65.5467 92.379 65.5171C93.4325 65.4316 94.0311 65.1362 94.3615 64.7591C94.5364 64.5608 94.6142 64.347 94.5481 64.2188C94.4859 64.106 94.311 64.0633 93.8134 64.2538C93.4674 64.3859 92.9465 64.557 92.2507 64.6386C92.3712 63.865 92.0097 61.0623 90.0311 60.6386C90.0233 60.6347 90.0155 60.6308 90.0078 60.623C89.4579 59.9206 88.39 59.5679 87.3211 59.6298C88.1275 59.2268 89.0373 59 90 59C93.3137 59 96 61.6863 96 65ZM91.7337 69.9496C91.7337 70.0738 92.4851 70.296 92.8074 70.304C92.3144 70.5655 91.7806 70.7603 91.218 70.8763C91.18 70.7892 91.143 70.7033 91.1079 70.6211C90.8941 70.6872 90.5909 70.7183 90.3732 70.7261C90.208 70.7261 90.0739 70.7183 90.0039 70.6211C89.869 70.7361 89.6905 70.8634 89.5042 70.9798C89.2049 71.1668 88.8856 71.3259 88.6955 71.3613C88.6321 71.373 88.5831 71.3711 88.554 71.3519C88.4408 71.2792 88.3301 71.0376 88.2438 70.7389L88.2437 70.7389C88.0809 70.1751 88.0051 69.4077 88.1652 69.1867C88.2196 69.109 88.3207 69.0701 88.4451 69.0584C88.3285 69.5366 88.6006 70.7183 88.7522 70.8388C88.8999 70.9554 89.9582 70.3257 89.9116 70.1779C89.8183 69.867 89.8183 69.5871 89.8299 69.4122C89.8727 69.3538 90.0039 69.2644 90.0933 69.2256C90.0855 69.2683 90.0816 69.315 90.0855 69.3694C90.0855 69.5521 90.1088 69.867 90.1555 70.003C90.2177 70.1702 90.2838 70.279 90.5792 70.2751C90.8785 70.2712 91.3605 70.2052 91.4344 70.073C91.5083 69.9408 91.4111 69.4044 91.3489 69.2333L91.3139 69.1517C91.31 69.1439 91.3061 69.1362 91.3022 69.1323H91.4062C91.5617 69.1673 91.6949 69.2333 91.7337 69.9496ZM84 65C84 67.4627 85.4837 69.5789 87.606 70.5034C87.4127 69.7974 87.1366 68.756 86.7813 67.3325C85.9922 64.1721 85.4052 61.5949 88.3673 60.7902C88.3984 60.7824 88.4101 60.7474 88.3868 60.728C88.0447 60.417 87.4655 60.3626 86.898 60.4753C86.8707 60.4792 86.8513 60.4598 86.8513 60.4365C86.8513 60.4287 86.8513 60.4209 86.8591 60.4131C86.9951 60.2227 87.24 60.0749 87.4072 59.9855C87.302 59.8909 87.1652 59.8247 87.0424 59.7784C85.2257 60.8096 84 62.7617 84 65ZM97 65C97 68.866 93.866 72 90 72C86.134 72 83 68.866 83 65C83 61.134 86.134 58 90 58C93.866 58 97 61.134 97 65ZM91.656 62.3218L91.6409 62.3151C91.5387 62.2694 91.4119 62.2128 91.1934 62.2091C90.964 62.2052 90.8202 62.2635 90.7269 62.314C90.6958 62.3296 90.6492 62.2985 90.6647 62.2674C90.7425 62.143 90.9135 62.0458 91.1934 62.0458C91.4733 62.0458 91.6054 62.1585 91.6948 62.279C91.7143 62.3023 91.6832 62.3334 91.656 62.3218ZM91.8659 63.5579C91.8659 63.7951 91.6715 63.9894 91.4305 63.9894C91.1895 63.9894 90.9951 63.7951 90.9951 63.5579C90.9951 63.3208 91.1895 63.1264 91.4305 63.1264C91.6715 63.1264 91.8659 63.3169 91.8659 63.5579ZM88.0486 63.3519C88.3285 63.3519 88.5539 63.5774 88.5539 63.8573C88.5539 64.1371 88.3285 64.3626 88.0486 64.3626C87.7687 64.3626 87.5432 64.1371 87.5432 63.8573C87.5394 63.5774 87.7687 63.3519 88.0486 63.3519ZM87.5199 62.4267C87.2478 62.5395 87.1623 62.6639 87.1079 62.7455C87.0884 62.7766 87.0146 62.7727 87.0146 62.7377C87.0146 62.5822 87.1584 62.3451 87.4616 62.2324C87.8037 62.1041 88.0641 62.2207 88.1808 62.3179C88.208 62.3373 88.1846 62.3723 88.1535 62.3645C88.0058 62.3296 87.792 62.314 87.5199 62.4267ZM91.7376 63.4141C91.7376 63.4763 91.6871 63.5268 91.6249 63.5268C91.5627 63.5268 91.5122 63.4763 91.5122 63.4141C91.5122 63.3519 91.5627 63.3014 91.6249 63.3014C91.6871 63.3014 91.7376 63.3519 91.7376 63.4141ZM88.4062 63.6862C88.4062 63.76 88.3479 63.8184 88.2741 63.8184C88.2002 63.8184 88.1419 63.76 88.1419 63.6862C88.1419 63.6123 88.2002 63.554 88.2741 63.554C88.3479 63.554 88.4062 63.6123 88.4062 63.6862Z" fill="#E2A412"/>
+<path d="M108.605 52.7188C108.911 52.7188 109.217 52.8388 109.451 53.0729C109.919 53.5412 109.919 54.3036 109.451 54.7719L107.05 57.1733C106.581 57.6415 105.819 57.6415 105.351 57.1733C104.882 56.705 104.882 55.9426 105.351 55.4743L107.752 53.0729C107.986 52.8388 108.292 52.7188 108.599 52.7188H108.605Z" fill="#CCCCCC"/>
+<path d="M107.404 63.5244H111.006C111.666 63.5244 112.207 64.0647 112.207 64.7251C112.207 65.3855 111.666 65.9258 111.006 65.9258H107.404C106.743 65.9258 106.203 65.3855 106.203 64.7251C106.203 64.0647 106.743 63.5244 107.404 63.5244Z" fill="#CCCCCC"/>
+<path d="M105.363 72.2844C105.597 72.0502 105.903 71.9302 106.209 71.9302H106.215C106.522 71.9302 106.828 72.0502 107.062 72.2844L109.463 74.6857C109.931 75.154 109.931 75.9164 109.463 76.3847C108.995 76.853 108.233 76.853 107.764 76.3847L105.363 73.9833C104.895 73.5151 104.895 72.7526 105.363 72.2844Z" fill="#CCCCCC"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M73.5951 41.3208C74.1972 40.9229 74.8563 40.6043 75.5575 40.3797C74.7076 39.6235 73.8311 38.8965 72.9298 38.2002C72.9757 37.974 72.9998 37.7398 72.9998 37.5C72.9998 36.1021 72.1802 34.8956 70.9954 34.3348C70.9852 33.5673 70.9573 32.8041 70.9122 32.0456C71.6043 32.0153 72.3003 32 72.9998 32C80.3853 32 87.373 33.7035 93.5913 36.7391C93.6299 36.2324 93.5495 35.7018 93.3259 35.1745C93.1825 34.847 93.0337 34.5223 92.8797 34.2006C86.804 31.5005 80.0771 30 72.9998 30C72.2467 30 71.4977 30.017 70.7529 30.0506C70.2639 25.1752 69.0602 20.5106 67.2482 16.1629C66.5086 16.0883 65.7615 16.0389 65.0079 16.0156C66.9564 20.4232 68.2471 25.1866 68.7558 30.1813C66.1416 30.4056 63.5861 30.8351 61.1053 31.4537C57.5394 30.035 53.7676 29.0229 49.8472 28.4747C49.6295 27.7631 49.1911 27.1479 48.6119 26.7089C50.4833 23.2415 52.7778 20.036 55.4262 17.1616C54.1437 17.5173 52.8936 17.951 51.6813 18.4571C49.8058 20.8069 48.1419 23.3331 46.7186 26.0068C46.6462 26.0023 46.5733 26 46.4998 26C45.1032 26 43.8976 26.8181 43.3361 28.0012C43.2241 28.0004 43.112 28 42.9998 28C41.6132 28 40.24 28.0576 38.8826 28.1706C38.3289 28.8709 37.8039 29.595 37.3093 30.341C39.1747 30.1159 41.0737 30 42.9998 30L43.0352 30.0001C43.1456 30.7713 43.5073 31.4614 44.0348 31.9847C42.9209 34.9925 42.0939 38.1394 41.5868 41.3923C38.0165 44.3777 34.8777 47.8621 32.2777 51.7382L32.208 51.6705C32.3324 52.7597 32.5114 53.8322 32.7424 54.8853C35.7406 57.5095 39.0616 59.774 42.638 61.6116C43.8267 66.087 45.6328 70.3108 47.9596 74.1864C47.5621 74.4502 47.1603 74.7082 46.7544 74.9602C47.383 75.3631 48.0265 75.7446 48.6841 76.1037C48.7978 76.0297 48.9112 75.9553 49.0243 75.8804C49.1617 76.0894 49.3007 76.2973 49.4412 76.5041C50.6142 77.1044 51.8292 77.6345 53.0805 78.0887C52.2296 77.0102 51.4249 75.8935 50.6695 74.7417C53.2209 72.8979 55.5877 70.8144 57.7369 68.5243C58.2546 68.8267 58.857 69 59.4998 69C60.917 69 62.1374 68.1578 62.6879 66.9465C63.454 66.9821 64.2248 67 64.9998 67C66.6878 67 68.3559 66.9147 70 66.7481V64.7372C68.357 64.9109 66.6888 65 64.9998 65C64.3156 65 63.6349 64.9854 62.9578 64.9565C62.8512 64.2723 62.5463 63.6538 62.1039 63.1615C66.6589 56.6868 69.6856 49.0593 70.6597 40.8033C71.1555 40.6292 71.6003 40.3466 71.9655 39.9841C72.5188 40.4177 73.0621 40.8634 73.5951 41.3208ZM46.4998 33C48.0866 33 49.4268 31.9441 49.8559 30.4965C52.6011 30.8977 55.2692 31.5363 57.8388 32.3906C52.8034 34.0274 48.1259 36.4574 43.9536 39.5332C44.4165 37.2698 45.042 35.0657 45.8175 32.9336C46.0382 32.9772 46.2663 33 46.4998 33ZM41.215 44.377C38.3906 46.9713 35.8846 49.9066 33.7621 53.1178C36.2868 55.3651 39.0554 57.3443 42.0232 59.0106C41.3523 55.7789 40.9998 52.4306 40.9998 49C40.9998 47.441 41.0726 45.8989 41.215 44.377ZM60.9639 33.5553C54.4693 35.2708 48.5254 38.3416 43.453 42.4469C43.1542 44.5884 42.9998 46.7762 42.9998 49C42.9998 52.8714 43.4679 56.6335 44.3505 60.2328C48.069 62.0543 52.0634 63.3992 56.2541 64.1878C56.7732 62.905 58.0308 62 59.4998 62C59.8089 62 60.1086 62.0401 60.3941 62.1153C64.7436 55.9679 67.6538 48.7299 68.634 40.8921C67.1198 40.5068 65.9998 39.1342 65.9998 37.5C65.9998 37.0232 66.0951 36.5687 66.2678 36.1545C64.5637 35.1817 62.7929 34.3124 60.9639 33.5553ZM45.0484 62.7676C48.5261 64.3199 52.218 65.4788 56.0673 66.1878C56.1287 66.4955 56.2303 66.7887 56.3666 67.0616C54.3116 69.2633 52.0476 71.2674 49.6061 73.0422C47.6981 69.8435 46.1593 66.399 45.0484 62.7676ZM67.5568 34.5884C66.4693 33.9574 65.3553 33.367 64.2169 32.8193C65.7581 32.5279 67.3259 32.3119 68.9163 32.175C68.9529 32.7925 68.9776 33.4132 68.9901 34.0369C68.4656 34.1134 67.9788 34.3063 67.5568 34.5884Z" fill="#ADC2FC"/>
+</svg>
diff --git a/DuckDuckGo/SyncSettingsViewController+PDFRendering.swift b/DuckDuckGo/SyncSettingsViewController+PDFRendering.swift
index fe164242f4..a3701ef4ac 100644
--- a/DuckDuckGo/SyncSettingsViewController+PDFRendering.swift
+++ b/DuckDuckGo/SyncSettingsViewController+PDFRendering.swift
@@ -31,10 +31,14 @@ extension SyncSettingsViewController {
 
         let pdf = RecoveryCodeItem(data: data)
         navigationController?.visibleViewController?.presentShareSheet(withItems: [pdf],
-                                                                       fromView: view) { [weak self] _, success, _, _ in
-            guard success else { return }
-            self?.navigationController?.visibleViewController?.dismiss(animated: true)
-        }
+                                                                       fromView: view)
+    }
+
+    func shareCode(_ code: String) {
+
+        navigationController?.visibleViewController?.presentShareSheet(withItems: [code],
+                                                                       fromView: view,
+                                                                       overrideInterfaceStyle: .dark)
     }
 
 }
diff --git a/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift b/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
index 082b312ace..c8854639c5 100644
--- a/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
+++ b/DuckDuckGo/SyncSettingsViewController+SyncDelegate.swift
@@ -52,10 +52,12 @@ extension SyncSettingsViewController: SyncManagementViewModelDelegate {
     func createAccountAndStartSyncing(optionsViewModel: SyncSettingsViewModel) {
         Task { @MainActor in
             do {
+                self.dismissPresentedViewController()
+                self.showPreparingSync()
                 try await syncService.createAccount(deviceName: deviceName, deviceType: deviceType)
                 self.rootView.model.syncEnabled(recoveryCode: recoveryCode)
                 self.refreshDevices()
-                self.showDeviceConnected([], optionsModel: optionsViewModel, isSingleSetUp: true, shouldShowOptions: false)
+                navigationController?.topViewController?.dismiss(animated: true, completion: showRecoveryPDF)
             } catch {
                 handleError(error)
             }
@@ -69,50 +71,49 @@ extension SyncSettingsViewController: SyncManagementViewModelDelegate {
     }
 
     func showSyncWithAnotherDevice() {
-        collectCode(showConnectMode: syncService.account == nil)
-    }
-
-    func showSyncWithAnotherDeviceEnterText() {
-        collectCode(showConnectMode: syncService.account == nil, showEnterTextCode: true)
+        collectCode(showConnectMode: true)
     }
 
     func showRecoverData() {
+        dismissPresentedViewController()
         collectCode(showConnectMode: false)
     }
 
-    func showDeviceConnected(_ devices: [SyncSettingsViewModel.Device], optionsModel: SyncSettingsViewModel, isSingleSetUp: Bool, shouldShowOptions: Bool) {
-        let model = SaveRecoveryKeyViewModel(key: recoveryCode) { [weak self] in
-            self?.shareRecoveryPDF()
-        }
+    func showDeviceConnected() {
         let controller = UIHostingController(
-            rootView: DeviceConnectedView(model,
-                                        optionsViewModel: optionsModel,
-                                          devices: devices,
-                                          isSingleSetUp: isSingleSetUp,
-                                          shouldShowOptions: shouldShowOptions))
+            rootView: DeviceConnectedView())
         navigationController?.present(controller, animated: true) { [weak self] in
             self?.rootView.model.syncEnabled(recoveryCode: self!.recoveryCode)
-            self?.refreshDevices()
         }
     }
 
+    func showPreparingSync() {
+        let controller = UIHostingController(rootView: PreparingToSyncView())
+        navigationController?.present(controller, animated: true)
+    }
+
+    @MainActor
     func showRecoveryPDF() {
         let model = SaveRecoveryKeyViewModel(key: recoveryCode) { [weak self] in
             self?.shareRecoveryPDF()
+        } onDismiss: {
+            self.showDeviceConnected()
         }
         let controller = UIHostingController(rootView: SaveRecoveryKeyView(model: model))
-        navigationController?.present(controller, animated: true)
+        navigationController?.present(controller, animated: true) { [weak self] in
+            self?.rootView.model.syncEnabled(recoveryCode: self!.recoveryCode)
+        }
     }
 
-    private func collectCode(showConnectMode: Bool, showEnterTextCode: Bool = false) {
-        let model = ScanOrPasteCodeViewModel(showConnectMode: showConnectMode)
+    private func collectCode(showConnectMode: Bool) {
+        let model = ScanOrPasteCodeViewModel(showConnectMode: showConnectMode, recoveryCode: recoveryCode.isEmpty ? nil : recoveryCode)
         model.delegate = self
 
         var controller: UIHostingController<AnyView>
-        if showEnterTextCode {
-            controller = UIHostingController(rootView: AnyView(PasteCodeView(model: model, isfirstScreen: true)))
+        if showConnectMode {
+            controller = UIHostingController(rootView: AnyView(ScanOrSeeCode(model: model)))
         } else {
-            controller = UIHostingController(rootView: AnyView(ScanOrPasteCodeView(model: model)))
+            controller = UIHostingController(rootView: AnyView(ScanOrEnterCodeToRecoverSyncedDataView(model: model)))
         }
 
         let navController = UIDevice.current.userInterfaceIdiom == .phone
diff --git a/DuckDuckGo/SyncSettingsViewController.swift b/DuckDuckGo/SyncSettingsViewController.swift
index 7e1f5558ea..f523ca0990 100644
--- a/DuckDuckGo/SyncSettingsViewController.swift
+++ b/DuckDuckGo/SyncSettingsViewController.swift
@@ -34,7 +34,6 @@ class SyncSettingsViewController: UIHostingController<SyncSettingsView> {
 
     var recoveryCode: String {
         guard let code = syncService.account?.recoveryCode else {
-            assertionFailure("No recovery code")
             return ""
         }
 
@@ -173,7 +172,10 @@ class SyncSettingsViewController: UIHostingController<SyncSettingsView> {
     }
 
     func dismissPresentedViewController() {
-        navigationController?.topViewController?.dismiss(animated: true)
+        guard let presentedViewController = navigationController?.presentedViewController,
+              !(presentedViewController is UIHostingController<SyncSettingsView>) else { return }
+        presentedViewController.dismiss(animated: true, completion: nil)
+        endConnectMode()
     }
 
     func refreshDevices(clearDevices: Bool = true) {
@@ -226,21 +228,21 @@ extension SyncSettingsViewController: ScanOrPasteCodeViewModelDelegate {
         }
     }
 
-    func loginAndShowDeviceConnected(recoveryKey: SyncCode.RecoveryKey, isActiveSyncDevice: Bool) async throws {
-        let knownDevices = Set(self.rootView.model.devices.map { $0.id })
+    func loginAndShowDeviceConnected(recoveryKey: SyncCode.RecoveryKey) async throws {
         let registeredDevices = try await syncService.login(recoveryKey, deviceName: deviceName, deviceType: deviceType)
         mapDevices(registeredDevices)
-        dismissPresentedViewController()
-        let devices = self.rootView.model.devices.filter { !knownDevices.contains($0.id) && !$0.isThisDevice }
-        let isSecondDevice = devices.count == 1
-        showDeviceConnected(devices, optionsModel: self.rootView.model, isSingleSetUp: false, shouldShowOptions: isActiveSyncDevice && isSecondDevice)
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+            self.dismissVCAndShowRecoveryPDF()
+        }
     }
 
     func startPolling() {
         Task { @MainActor in
             do {
                 if let recoveryKey = try await connector?.pollForRecoveryKey() {
-                    try await loginAndShowDeviceConnected(recoveryKey: recoveryKey, isActiveSyncDevice: false)
+                    dismissPresentedViewController()
+                    showPreparingSync()
+                    try await loginAndShowDeviceConnected(recoveryKey: recoveryKey)
                 } else {
                     // Likely cancelled elsewhere
                     return
@@ -252,35 +254,36 @@ extension SyncSettingsViewController: ScanOrPasteCodeViewModelDelegate {
     }
 
     func syncCodeEntered(code: String) async -> Bool {
+        var shouldShowSyncEnabled = true
         do {
             guard let syncCode = try? SyncCode.decodeBase64String(code) else {
                 return false
             }
-
             if let recoveryKey = syncCode.recovery {
-                try await loginAndShowDeviceConnected(recoveryKey: recoveryKey, isActiveSyncDevice: true)
+                dismissPresentedViewController()
+                showPreparingSync()
+                try await loginAndShowDeviceConnected(recoveryKey: recoveryKey)
                 return true
             } else if let connectKey = syncCode.connect {
+                dismissPresentedViewController()
+                showPreparingSync()
                 if syncService.account == nil {
                     try await syncService.createAccount(deviceName: deviceName, deviceType: deviceType)
+                    self.dismissVCAndShowRecoveryPDF()
+                    shouldShowSyncEnabled = false
                     rootView.model.syncEnabled(recoveryCode: recoveryCode)
                 }
                 try await syncService.transmitRecoveryKey(connectKey)
-                self.dismissPresentedViewController()
-                self.rootView.model.isSyncingDevices = true
 
                 self.rootView.model.$devices
                     .removeDuplicates()
                     .dropFirst()
                     .prefix(1)
-                    .sink { [weak self] devices in
+                    .sink { [weak self] _ in
                         guard let self else { return }
-                        self.showDeviceConnected(
-                            devices.filter { !$0.isThisDevice },
-                            optionsModel: self.rootView.model,
-                            isSingleSetUp: false,
-                            shouldShowOptions: devices.count == 2)
-                        self.rootView.model.isSyncingDevices = false
+                        if shouldShowSyncEnabled {
+                            self.dismissVCAndShowRecoveryPDF()
+                        }
                     }.store(in: &cancellables)
 
                 return true
@@ -292,6 +295,10 @@ extension SyncSettingsViewController: ScanOrPasteCodeViewModelDelegate {
         return false
     }
 
+    func dismissVCAndShowRecoveryPDF() {
+        self.navigationController?.topViewController?.dismiss(animated: true, completion: self.showRecoveryPDF)
+    }
+
     func codeCollectionCancelled() {
         assert(navigationController?.visibleViewController is UIHostingController<AnyView>)
         dismissPresentedViewController()
diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift
index 5a03382223..e603b23c24 100644
--- a/DuckDuckGo/UserText.swift
+++ b/DuckDuckGo/UserText.swift
@@ -868,7 +868,7 @@ But if you *do* want a peek under the hood, you can find more information about
     }
     public static let syncRemoveDeviceConfirmAction = "Remove"
     public static let syncCodeCopied = "Recovery Code copied"
-    public static let syncTitle = "Sync & Back Up"
+    public static let syncTitle = "Sync & Backup"
 
     // MARK: Errors
 
diff --git a/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift<_NSMainThread: 0x60000170c180>{number = 1, name = main}.plist b/DuckDuckGoTests/NetworkProtectionVPNLocationViewModelTests.swift<_NSMainThread: 0x60000170c180>{number = 1, name = main}.plist
new file mode 100644
index 0000000000000000000000000000000000000000..4c375cd9b45468c03975f4da9db70030d6a2cd4a
GIT binary patch
literal 106
zcmYc)$jK}&F)+Bu$P_PNl9yUio?nz5P?TSinp~2ZpBJ23Qj(dM9-Nv3<fo?i<R>SB
lg-h~_64O(|5_3vZUGhqEayYo17{Gv$5kfOCLunZ04gj8997zBG

literal 0
HcmV?d00001

diff --git a/DuckDuckGoTests/SyncManagementViewModelTests.swift b/DuckDuckGoTests/SyncManagementViewModelTests.swift
index 7964c0910c..5edc9b8ba4 100644
--- a/DuckDuckGoTests/SyncManagementViewModelTests.swift
+++ b/DuckDuckGoTests/SyncManagementViewModelTests.swift
@@ -42,6 +42,16 @@ class SyncManagementViewModelTests: XCTestCase, SyncManagementViewModelDelegate
         XCTAssertNotNil(caprturedOptionModel)
     }
 
+    func testWhenShowRecoveryPDFPressed_ShowRecoveryPDFIsShown() {
+        model.delegate?.showRecoveryPDF()
+
+        // You can either test one individual call was made x number of times or check for a whole number of calls
+        monitor.assert(#selector(showRecoveryPDF).description, calls: 1)
+        monitor.assertCalls([
+            #selector(showRecoveryPDF).description: 1
+        ])
+    }
+
     func testWhenScanQRCodePressed_ThenSyncWithAnotherDeviceViewIsShown() {
         model.scanQRCode()
 
@@ -52,23 +62,34 @@ class SyncManagementViewModelTests: XCTestCase, SyncManagementViewModelDelegate
         ])
     }
 
-    func testWhenSyncIsNotSetup_EnterTextCodePressed_ThenSyncWithAnotherDeviceEnterTextViewIsShown() {
-        model.showEnterTextView()
+    func testWhenCopyCodePressed_CodeIsCopied() {
+        model.copyCode()
 
         // You can either test one individual call was made x number of times or check for a whole number of calls
-        monitor.assert(#selector(showSyncWithAnotherDeviceEnterText).description, calls: 1)
+        monitor.assert(#selector(copyCode).description, calls: 1)
         monitor.assertCalls([
-            #selector(showSyncWithAnotherDeviceEnterText).description: 1
+            #selector(copyCode).description: 1
         ])
     }
 
-    func testWhenRecoverYourDataPressed_RecoverDataViewIsShown() {
-        model.showRecoverDataView()
+
+    func testWhenManageBookmarkPressed_BookmarkVCIsLaunched() {
+        model.manageBookmarks()
 
         // You can either test one individual call was made x number of times or check for a whole number of calls
-        monitor.assert(#selector(showRecoverData).description, calls: 1)
+        monitor.assert(#selector(launchBookmarksViewController).description, calls: 1)
         monitor.assertCalls([
-            #selector(showRecoverData).description: 1
+            #selector(launchBookmarksViewController).description: 1
+        ])
+    }
+
+    func testWhenManageLoginsPressed_LoginsVCIsLaunched() {
+        model.manageLogins()
+
+        // You can either test one individual call was made x number of times or check for a whole number of calls
+        monitor.assert(#selector(launchAutofillViewController).description, calls: 1)
+        monitor.assertCalls([
+            #selector(launchAutofillViewController).description: 1
         ])
     }
 
@@ -102,13 +123,23 @@ class SyncManagementViewModelTests: XCTestCase, SyncManagementViewModelDelegate
         ])
     }
 
+
+    func testWhenRecoverSyncDataPressed_RecoverDataViewShown() {
+        model.recoverSyncDataPressed()
+
+        // You can either test one individual call was made x number of times or check for a whole number of calls
+        monitor.assert(#selector(showRecoverData).description, calls: 1)
+        monitor.assertCalls([
+            #selector(showRecoverData).description: 1
+        ])
+    }
     // MARK: Delegate functions
 
     func showSyncWithAnotherDeviceEnterText() {
         monitor.incrementCalls(function: #function.cleaningFunctionName())
     }
 
-    func createAccountAndStartSyncing(optionsViewModel: SyncSettingsViewModel) {
+   func createAccountAndStartSyncing(optionsViewModel: SyncSettingsViewModel) {
         createAccountAndStartSyncingCalled = true
         caprturedOptionModel = optionsViewModel
     }
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SaveRecoveryKeyViewModel.swift b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SaveRecoveryKeyViewModel.swift
index ced8831904..0e696b8885 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SaveRecoveryKeyViewModel.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SaveRecoveryKeyViewModel.swift
@@ -24,14 +24,20 @@ public class SaveRecoveryKeyViewModel: ObservableObject {
 
     let key: String
     let showRecoveryPDFAction: () -> Void
+    let onDismiss: () -> Void
 
-    public init(key: String, showRecoveryPDFAction: @escaping () -> Void) {
+    public init(key: String, showRecoveryPDFAction: @escaping () -> Void, onDismiss: @escaping () -> Void) {
         self.key = key
         self.showRecoveryPDFAction = showRecoveryPDFAction
+        self.onDismiss = onDismiss
     }
 
     func copyKey() {
         UIPasteboard.general.string = key
     }
 
+    func dismissed() {
+        onDismiss()
+    }
+
 }
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/ScanOrPasteCodeViewModel.swift b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/ScanOrPasteCodeViewModel.swift
index 7c5d1f181a..1e71082564 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/ScanOrPasteCodeViewModel.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/ScanOrPasteCodeViewModel.swift
@@ -31,6 +31,7 @@ public protocol ScanOrPasteCodeViewModelDelegate: AnyObject {
 
     func codeCollectionCancelled()
     func gotoSettings()
+    func shareCode(_ code: String)
 
 }
 
@@ -62,12 +63,16 @@ public class ScanOrPasteCodeViewModel: ObservableObject {
 
     public weak var delegate: ScanOrPasteCodeViewModelDelegate?
 
-    var showQRCodeModel: ShowQRCodeViewModel?
+    var showQRCodeModel: ShowQRCodeViewModel
 
     let showConnectMode: Bool
+    let recoveryCode: String?
 
-    public init(showConnectMode: Bool) {
+    public init(showConnectMode: Bool, recoveryCode: String?) {
         self.showConnectMode = showConnectMode
+        self.recoveryCode = recoveryCode
+        showQRCodeModel = ShowQRCodeViewModel()
+        showQRCodeModel.code = recoveryCode
     }
 
     func codeScanned(_ code: String) async -> Bool {
@@ -92,6 +97,7 @@ public class ScanOrPasteCodeViewModel: ObservableObject {
         Task { @MainActor in
             let codeUsed = await delegate?.syncCodeEntered(code: string) == true
             if !codeUsed {
+                isValidating = false
                 invalidCode = true
             }
         }
@@ -103,12 +109,14 @@ public class ScanOrPasteCodeViewModel: ObservableObject {
     }
 
     func startConnectMode() -> ShowQRCodeViewModel {
-        let model = ShowQRCodeViewModel()
-        showQRCodeModel = model
         Task { @MainActor in
-            showQRCodeModel?.code = await delegate?.startConnectMode()
+            showQRCodeModel.code = await delegate?.startConnectMode()
         }
-        return model
+        return showQRCodeModel
+    }
+
+    func showShareCodeSheet() {
+        delegate?.shareCode(showQRCodeModel.code ?? "")
     }
 
     func endConnectMode() {
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift
index 8f78f1ea59..6923a9322d 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/ViewModels/SyncSettingsViewModel.swift
@@ -24,7 +24,6 @@ public protocol SyncManagementViewModelDelegate: AnyObject {
 
     func showRecoverData()
     func showSyncWithAnotherDevice()
-    func showSyncWithAnotherDeviceEnterText()
     func showRecoveryPDF()
     func shareRecoveryPDF()
     func createAccountAndStartSyncing(optionsViewModel: SyncSettingsViewModel)
@@ -121,14 +120,6 @@ public class SyncSettingsViewModel: ObservableObject {
         delegate?.showSyncWithAnotherDevice()
     }
 
-    func showEnterTextView() {
-        delegate?.showSyncWithAnotherDeviceEnterText()
-    }
-
-    func showRecoverDataView() {
-        delegate?.showRecoverData()
-    }
-
     func createEditDeviceModel(_ device: Device) -> EditDeviceViewModel {
         return EditDeviceViewModel(device: device) { [weak self] newValue in
             self?.delegate?.updateDeviceName(newValue.name)
@@ -160,4 +151,7 @@ public class SyncSettingsViewModel: ObservableObject {
         delegate?.launchAutofillViewController()
     }
 
+    public func recoverSyncDataPressed() {
+        delegate?.showRecoverData()
+    }
 }
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift
index 2a04672468..aaf57001e9 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/DeviceConnectedView.swift
@@ -22,128 +22,38 @@ import DuckUI
 
 public struct DeviceConnectedView: View {
 
-    @Environment(\.verticalSizeClass) var verticalSizeClass
+    @Environment(\.presentationMode) var presentation
 
-    var isCompact: Bool {
-        verticalSizeClass == .compact
-    }
-    let isSingleSetUp: Bool
-    let shouldShowOptions: Bool
-    @State var showRecoveryPDF = false
-
-    let saveRecoveryKeyViewModel: SaveRecoveryKeyViewModel
-    @ObservedObject var optionsViewModel: SyncSettingsViewModel
-    let devices: [SyncSettingsViewModel.Device]
-
-    public init(_ saveRecoveryKeyViewModel: SaveRecoveryKeyViewModel, optionsViewModel: SyncSettingsViewModel, devices: [SyncSettingsViewModel.Device], isSingleSetUp: Bool, shouldShowOptions: Bool) {
-        self.saveRecoveryKeyViewModel = saveRecoveryKeyViewModel
-        self.devices = devices
-        self.optionsViewModel = optionsViewModel
-        self.isSingleSetUp = isSingleSetUp
-        self.shouldShowOptions = shouldShowOptions
-    }
-
-    var title: String {
-        if isSingleSetUp {
-            return UserText.syngleDeviceConnectedTitle
-        }
-        return UserText.deviceSyncedTitle
-    }
-
-    var message: String {
-        if isSingleSetUp {
-            return UserText.firstDeviceSyncedMessage
-        }
-        if devices.count == 1 {
-            return UserText.deviceSyncedMessage
-        }
-        return UserText.multipleDevicesSyncedMessage
-    }
-
-    var devicesOnMessageText: String {
-        if devices.isEmpty {
-            return ""
-        }
-        if devices.count == 1 {
-            return devices[0].name
-        }
-        return "\(devices.count + 1) " + UserText.wordDevices
-    }
+    public init() {}
 
     @ViewBuilder
     func deviceSyncedView() -> some View {
         UnderflowContainer {
             VStack(spacing: 0) {
                 Image("Sync-Start-128")
-                    .padding(.bottom, 20)
+                    .padding(20)
 
-                Text(title)
+                Text(UserText.deviceSyncedSheetTitle)
                     .daxTitle1()
                     .padding(.bottom, 24)
-
-                Text("\(message) \(Text(devicesOnMessageText).bold())")
-                    .multilineTextAlignment(.center)
-                
-                if shouldShowOptions {
-                    options()
-                }
             }
             .padding(.horizontal, 20)
+            .padding(.top, 56)
         } foregroundContent: {
             Button {
-                withAnimation {
-                    self.showRecoveryPDF = true
-                }
+                presentation.wrappedValue.dismiss()
             } label: {
-                Text(UserText.nextButton)
+                Text(UserText.doneButton)
             }
             .buttonStyle(PrimaryButtonStyle())
             .frame(maxWidth: 360)
             .padding(.horizontal, 30)
         }
-        .padding(.top, isCompact ? 0 : 56)
         .padding(.bottom)
     }
 
-    @ViewBuilder
-    func options() -> some View {
-        VStack {
-            Spacer(minLength: 71)
-            Text(UserText.options.uppercased())
-                .daxFootnoteRegular()
-            Toggle(isOn: $optionsViewModel.isUnifiedFavoritesEnabled) {
-                HStack(spacing: 16) {
-                    Image("SyncAllDevices")
-                    VStack(alignment: .leading) {
-                        Text(UserText.unifiedFavoritesTitle)
-                            .foregroundColor(.primary)
-                            .daxBodyRegular()
-                        Text(UserText.unifiedFavoritesInstruction)
-                            .daxCaption()
-                            .foregroundColor(.secondary)
-                    }
-                }
-            }
-            .padding(16)
-            .background(
-                RoundedRectangle(cornerRadius: 10)
-                    .fill(.black.opacity(0.01))
-            )
-            .overlay(
-                RoundedRectangle(cornerRadius: 10)
-                    .stroke(.black.opacity(0.2), lineWidth: 0.2)
-            )
-        }
-    }
-
     public var body: some View {
-        if showRecoveryPDF {
-            SaveRecoveryKeyView(model: saveRecoveryKeyViewModel)
-                .transition(.move(edge: .trailing))
-        } else {
-            deviceSyncedView()
-                .transition(.move(edge: .leading))
-        }
+        deviceSyncedView()
+            .transition(.move(edge: .leading))
     }
-
 }
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/CameraView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/CameraView.swift
new file mode 100644
index 0000000000..86096b1518
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/CameraView.swift
@@ -0,0 +1,154 @@
+//
+//  CameraView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+
+public struct CameraView: View {
+    
+    @ObservedObject var model: ScanOrPasteCodeViewModel
+
+    public var body: some View {
+        GeometryReader { g in
+            ZStack(alignment: .top) {
+                fullscreenCameraBackground()
+                
+                VStack(spacing: 0) {
+                    Rectangle() // Also acts as the blur for the camera
+                        .fill(.black)
+                        .frame(height: g.safeAreaInsets.top)
+                    
+                    ZStack {
+                        // Background in case fullscreen camera view doesn't work
+                        if !model.showCamera {
+                            Rectangle().fill(Color.black)
+                        }
+                        
+                        Group {
+                            cameraPermissionDenied()
+                            cameraUnavailable()
+                        }
+                        .padding(.horizontal, 0)
+
+                        if model.showCamera {
+                            VStack {
+                                Spacer()
+                                Text(UserText.cameraPointCameraIndication)
+                                    .padding(.vertical, 8)
+                                    .padding(.horizontal, 20)
+                                    .background(
+                                        RoundedRectangle(cornerRadius: 56)
+                                            .fill(.clear)
+                                            .background(BlurView(style: .light))
+                                            .cornerRadius(20)
+                                    )
+                                    .daxCaption()
+                            }
+                            .padding(.bottom, 20)
+                        }
+                    }
+                }
+                .ignoresSafeArea()
+            }
+        }
+    }
+
+    @ViewBuilder
+    func fullscreenCameraBackground() -> some View {
+        Group {
+            if model.showCamera {
+                QRCodeScannerView {
+                    return await model.codeScanned($0)
+                } onCameraUnavailable: {
+                    model.cameraUnavailable()
+                }
+            } else {
+                Rectangle()
+                    .fill(.black)
+            }
+        }
+        .ignoresSafeArea()
+    }
+
+    @ViewBuilder
+    func cameraPermissionDenied() -> some View {
+        if model.videoPermission == .denied {
+            VStack(spacing: 0) {
+
+                Image("SyncCameraPermission")
+                    .padding(.top, 40)
+                    .padding(.bottom, 20)
+
+                Text(UserText.cameraPermissionRequired)
+                    .daxTitle3()
+                    .lineSpacing(1.05)
+                    .padding(.bottom, 8)
+
+                Text(UserText.cameraPermissionInstructions)
+                    .lineLimit(nil)
+                    .multilineTextAlignment(.center)
+                    .daxBodyRegular()
+                    .lineSpacing(1.1)
+
+                Spacer()
+
+                Button {
+                    model.gotoSettings()
+                } label: {
+                    HStack {
+                        Image("SyncGotoButton")
+                        Text(UserText.cameraGoToSettingsButton)
+                    }
+                }
+                .buttonStyle(SyncLabelButtonStyle())
+                .padding(.bottom, 40)
+            }
+            .padding(.horizontal, 40)
+        }
+    }
+
+    @ViewBuilder
+    func cameraUnavailable() -> some View {
+        if model.videoPermission == .authorised && !model.showCamera {
+            VStack(spacing: 0) {
+
+                Image("SyncCameraUnavailable")
+                    .padding(.top, 40)
+                    .padding(.bottom, 20)
+
+                Text(UserText.cameraIsUnavailableTitle)
+                    .daxTitle3()
+                    .lineSpacing(1.05)
+
+            }
+            .padding(.horizontal, 40)
+        }
+    }
+
+    struct BlurView: UIViewRepresentable {
+        var style: UIBlurEffect.Style
+
+        func makeUIView(context: Context) -> UIVisualEffectView {
+            return UIVisualEffectView(effect: UIBlurEffect(style: style))
+        }
+
+        func updateUIView(_ uiView: UIVisualEffectView, context: Context) {
+            uiView.effect = UIBlurEffect(style: style)
+        }
+    }
+}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ConnectModeView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ConnectModeView.swift
deleted file mode 100644
index 7ccb491200..0000000000
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ConnectModeView.swift
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ConnectModeView.swift
-//  DuckDuckGo
-//
-//  Copyright © 2023 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import SwiftUI
-
-/// We have to defer starting connect mode untl we're visible because otherwise SwiftUI might start it prematurely as a result of the NavigationLink.
-///  In iOS 16 we use a value binding on the NavigationLink, but this better anyway as we can show progress.
-struct ConnectModeView: View {
-
-    @ObservedObject var model: ScanOrPasteCodeViewModel
-    @State var qrCodeModel = ShowQRCodeViewModel()
-
-    var body: some View {
-        QRCodeCopierView(model: qrCodeModel)
-            .padding(.vertical, 20)
-            .frame(maxWidth: Constants.maxFullScreenWidth)
-            .onAppear {
-                self.qrCodeModel = model.startConnectMode()
-            }
-    }
-
-}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/EditDeviceView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/EditDeviceView.swift
index 02d3ac5202..e2e9e0fa8b 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/EditDeviceView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/EditDeviceView.swift
@@ -31,11 +31,11 @@ struct EditDeviceView: View {
                 Section {
                     TextField("", text: $model.name)
                 } header: {
-                    Text(UserText.editDeviceLabel)
+                    Text(UserText.editDeviceHeader)
                 }
             }
             .applyListStyle()
-            .navigationTitle(UserText.editDevice(model.name))
+            .navigationTitle(UserText.editDeviceTitle(model.name))
             .navigationBarTitleDisplayMode(.inline)
             .toolbar {
                 ToolbarItem(placement: .cancellationAction) {
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeCopierView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeCopierView.swift
deleted file mode 100644
index 292ae5dd18..0000000000
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeCopierView.swift
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-//  QRCodeCopierView.swift
-//  DuckDuckGo
-//
-//  Copyright © 2023 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import SwiftUI
-import DesignResourcesKit
-
-struct QRCodeCopierView: View {
-
-    @ObservedObject var model: ShowQRCodeViewModel
-
-    @ViewBuilder
-    func progressView() -> some View {
-        if model.code == nil {
-            ZStack {
-                SwiftUI.ProgressView()
-            }.frame(width: 200, height: 200)
-        }
-    }
-
-    @ViewBuilder
-    func qrCodeView() -> some View {
-        if let code = model.code {
-            VStack(spacing: 20) {
-                Spacer()
-
-                QRCodeView(string: code, size: 220)
-                    .padding()
-
-                Spacer()
-
-                Button {
-                    model.copy()
-                } label: {
-                    Label(UserText.copyCodeLabel, image: "SyncCopy")
-                }
-                .buttonStyle(SyncLabelButtonStyle())
-                .padding(.bottom, 20)
-            }
-        }
-    }
-
-    @ViewBuilder
-    func instructions() -> some View {
-
-        if model.code != nil {
-            Text(UserText.viewQRCodeInstructions)
-                .daxCaption()
-                .foregroundColor(.secondary)
-                .lineLimit(nil)
-                .multilineTextAlignment(.center)
-        }
-
-    }
-
-    @ViewBuilder
-    func qrCodeSection() -> some View {
-        ZStack {
-            VStack {
-                HStack { Spacer() }
-                Spacer()
-            }
-            RoundedRectangle(cornerRadius: 8).foregroundColor(.white.opacity(0.12))
-            progressView()
-            qrCodeView()
-        }
-        .frame(maxWidth: 350, maxHeight: 350)
-        .padding()
-    }
-
-    var body: some View {
-        ZStack(alignment: .top) {
-            VStack(spacing: 20) {
-                qrCodeSection()
-                instructions()
-                Spacer()
-            }
-            .padding(.horizontal, 20)
-            .frame(maxWidth: Constants.maxFullScreenWidth, alignment: .center)
-        }
-        .navigationTitle(UserText.viewQRCodeTitle)
-        .modifier(BackButtonModifier())
-    }
-
-}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeScannerView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeScannerView.swift
index 1a2bbb1476..48c6b8aec7 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeScannerView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/QRCodeScannerView.swift
@@ -25,12 +25,10 @@ struct QRCodeScannerView: UIViewRepresentable {
     let scanningQueue: ScanningQueue
 
     let onCameraUnavailable: () -> Void
-    let onInvalidCodeScanned: () -> Void
 
-    init(onQRCodeScanned: @escaping (String) async -> Bool, onCameraUnavailable: @escaping () -> Void, onInvalidCodeScanned: @escaping () -> Void) {
+    init(onQRCodeScanned: @escaping (String) async -> Bool, onCameraUnavailable: @escaping () -> Void) {
         scanningQueue = ScanningQueue(onQRCodeScanned)
         self.onCameraUnavailable = onCameraUnavailable
-        self.onInvalidCodeScanned = onInvalidCodeScanned
     }
 
     func makeCoordinator() -> Coordinator {
@@ -112,7 +110,6 @@ struct QRCodeScannerView: UIViewRepresentable {
             Task { @MainActor in
                 let codeAccepted = await cameraView.scanningQueue.codeScanned(code)
                 if !codeAccepted {
-                    cameraView.onInvalidCodeScanned()
                     captureCodes = true
                 }
             }
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ShowCodeView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ShowCodeView.swift
deleted file mode 100644
index ebd2f79b73..0000000000
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/ShowCodeView.swift
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-//  ShowCodeView.swift
-//  DuckDuckGo
-//
-//  Copyright © 2023 DuckDuckGo. All rights reserved.
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-import SwiftUI
-
-struct ShowCodeView: View {
-
-    let code: String
-    let copyCode: () -> Void
-
-    var body: some View {
-
-        List {
-            Text(code)
-                .monospaceSystemFont(ofSize: 16)
-
-            Button {
-                copyCode()
-            } label: {
-                Label("Copy Code", image: "SyncCopy")
-            }
-        }
-        .lineSpacing(1.47)
-        .navigationTitle("Code")
-        .applyListStyle()
-    }
-
-}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift
index 060af63f53..f9691a5ff9 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/Internal/UserText.swift
@@ -23,107 +23,142 @@ import Foundation
 // Localise these later, when feature is closer to exernal release
 struct UserText {
 
-    static let syncWithAnotherDeviceTitle = "Sync with Another Device"
-    static let syncWithAnotherDeviceMessage = "Securely sync bookmarks and Logins between your devices."
-
-    static let recoveryMessage = "If you lose access to your devices, you will need this code to recover your synced data."
-    static let recoveryWarning = "Anyone with access to this code can access your synced data, so please keep it in a safe place."
-
-    static let scanQRCode = "Scan QR Code"
-    static let enterTextCode = "Enter Text Code"
-    static let turnSyncOff = "Turn Off Sync & Back Up"
-
-    static let singleDeviceSetUpTitle = "Single-Device Setup"
-    static let singleDeviceSetUpInstruction = "Set up this device now, sync with other devices later."
-    static let turnSyncOn = "Start Sync & Back Up"
-    static let recoverYourData = "Recover Your Data"
-
-    static let options = "Options"
-    static let fetchFaviconsOptionTitle = "Fetch Bookmark Icons"
-    static let fetchFaviconsOptionCaption = "Automatically download icons for synced bookmarks."
-
-    static let unifiedFavoritesTitle = "Share Favorites"
-    static let unifiedFavoritesInstruction = "Use the same favorites on all devices. Leave off to keep mobile and desktop favorites separate."
-
-    static let syncSettingsFooter = "Your data is end-to-end encrypted, and DuckDuckGo does not have access to the decryption key."
-
-    static let connectDeviceInstructions = "Go to Settings > Sync & Back Up in the DuckDuckGo App on a different device and scan the QR code to sync."
-
-    static let recoveryModeInstructions = "Scan the QR code from your Recovery PDF or in the DuckDuckGo app under Settings > Sync & Back Up on a signed-in device."
-
-    static let validatingCode = "Validating code"
-    static let validatingCodeFailed = "Invalid code."
-
-    static let pasteCodeInstructions = "Copy the code from the\n Settings > Sync & Back Up page in the DuckDuckGo App on another synced device and paste it here to sync this device."
-
-    static let viewQRCodeInstructions = "Open the DuckDuckGo app on another device. Navigate to Settings > Sync & Back Up and scan this QR code."
-    static let viewQRCodeTitle = "Your Sync Code"
-
-    static let syngleDeviceConnectedTitle = "All Set!"
-    static let deviceSyncedTitle = "Device Synced!"
-    static let firstDeviceSyncedMessage = "You can sync this device’s bookmarks and Logins with additional devices at any time from the Sync & Back Up menu in Settings."
-    static let deviceSyncedMessage = "Your bookmarks and Logins are now syncing with "
-    static let multipleDevicesSyncedMessage = "Your bookmarks and Logins are now syncing on "
-    static let wordDevices = "devices"
-
-    static let saveRecoveryTitle = "Save Recovery Code?"
-    static let copyCode = "Copy Code"
-
-    static let cameraPermissionRequired = "Camera Permission is Required"
-    static let cameraPermissionInstructions = "Please go to your device's settings and grant permission for this app to access your camera."
-    static let cameraIsUnavailableTitle = "Camera is Unavailable"
-
-    static let goToSettingsButton = "Go to Settings"
-
-    static let syncTitle = "Sync & Back Up"
-
-    static let thisDevice = "This Device"
-    static let connectedDevicesTitle = "Synced Devices"
-
-    static let pasteLabel = "Paste"
-    static let copyCodeLabel = "Copy Code"
-
-    static let manuallyEnterCodeTitle = "Enter Text Code"
-
-    static let showQRCodeLabel = "Show QR Code"
-    static let showQRCodeSubLabel = "Display code to scan with another device"
-
-    static let settingsNewDeviceInstructions1 = "Go to Settings > Sync in the"
-    static let settingsNewDeviceInstructions2 = "DuckDuckGo App"
-    static let settingsNewDeviceInstructions3 = "on a different device and scan to connect instantly"
-    static let settingsScanQRCodeButton = "Scan QR Code"
-    static let settingsShowCodeButton = "Show Text Code"
-    static let settingsSaveRecoveryPDFButton = "Save Recovery PDF"
-    static let settingsRecoveryPDFWarning = "If you lose your device, you will need this recovery code to restore your synced data."
-    static let settingsDeleteAllButton = "Turn Off and Delete Server Data..."
-
-    static let removeButton = "Remove"
-    static let cancelButton = "Cancel"
-    static let doneButton = "Done"
-    static let nextButton = "Next"
-    static let notNowButton = "Not Now"
-    static let backButton = "Back"
+    // Sync Title
+    static let syncTitle = NSLocalizedString("sync.title", value: "Sync & Backup", comment: "Sync & Backup Title")
+
+    // Sync Set Up
+    // Sync With Another Device Card
+    static let syncWithAnotherDeviceTitle = NSLocalizedString("sync.with.another.device.title", value: "Begin Syncing", comment: "Title for syncing with another device")
+    static let syncWithAnotherDeviceMessage = NSLocalizedString("sync.with.another.device.message", value: "Securely sync bookmarks and passwords between your devices.", comment: "Message for syncing with another device")
+    static let syncWithAnotherDeviceButton = NSLocalizedString("sync.with.another.device.button", value: "Sync with Another Device", comment: "Button label for syncing with another device")
+    static let syncWithAnotherDeviceFooter = NSLocalizedString("sync.with.another.device.footer", value: "Your data is end-to-end encrypted, and DuckDuckGo does not have access to the encryption key.", comment: "Footer message for syncing with another device")
+    // Other Options
+    static let syncAndBackUpThisDeviceLink = NSLocalizedString("sync.and.backup.this.device.link", value: "Sync and Back Up This Device", comment: "Link label for syncing and backing up the device")
+    static let recoverSyncedDataLink = NSLocalizedString("recover.synced.data.link", value: "Recover Synced Data", comment: "Link label for recovering synced data")
+    static let otherOptionsSectionHeader = NSLocalizedString("other.options.section.header", value: "Other Options", comment: "Section header for other syncing options")
+
+    // Sync Enabled View
+    // Turn Sync Off
+    static let turnSyncOff = NSLocalizedString("turn.sync.off", value: "Turn Off Sync & Backup...", comment: "Turn Sync Off - Button")
+    static let turnSyncOffSectionHeader = NSLocalizedString("turn.sync.off.section.header", value: "Sync Enabled", comment: "Turn Sync Off - Section Header")
+    static let turnSyncOffSectionFooter = NSLocalizedString("turn.sync.off.section.footer", value: "Bookmarks and passwords are currently synced across your devices.", comment: "Turn Sync Off - Section Footer")
+    // Sync Paused Errors
+    static let syncLimitExceededTitle = NSLocalizedString("sync.limit.exceeded.title", value: "⚠️ Sync Paused", comment: "Sync Paused Errors - Title")
+    static let bookmarksLimitExceededDescription = NSLocalizedString("bookmarks.limit.exceeded.description", value: "Bookmark limit exceeded. Delete some to resume syncing.", comment: "Sync Paused Errors - Bookmarks Limit Exceeded Description")
+    static let credentialsLimitExceededDescription = NSLocalizedString("credentials.limit.exceeded.description", value: "Logins limit exceeded. Delete some to resume syncing.", comment: "Sync Paused Errors - Credentials Limit Exceeded Description")
+    static let bookmarksLimitExceededAction = NSLocalizedString("bookmarks.limit.exceeded.action", value: "Manage Bookmarks", comment: "Sync Paused Errors - Bookmarks Limit Exceeded Action")
+    static let credentialsLimitExceededAction = NSLocalizedString("credentials.limit.exceeded.action", value: "Manage Logins", comment: "Sync Paused Errors - Credentials Limit Exceeded Action")
+    // Synced Devices
+    static let syncedDevicesSectionHeader = NSLocalizedString("synced.devices.section.header", value: "Synced Devices", comment: "Synced Devices - Section Header")
+    static let syncedDevicesThisDeviceLabel = NSLocalizedString("synced.devices.this.device.label", value: "This Device", comment: "Synced Devices - This Device Label")
+    static let syncedDevicesSyncWithAnotherDeviceLabel = NSLocalizedString("synced.devices.sync.with.another.device.label", value: "Sync with Another Device", comment: "Synced Devices - Sync with Another Device Label")
+    // Options
+    static let optionsSectionHeader = NSLocalizedString("options.section.header", value: "Options", comment: "Options - Section Header")
+    static let unifiedFavoritesTitle = NSLocalizedString("unified.favorites.title", value: "Unify Favorites", comment: "Options - Unify Favorites Title")
+    static let unifiedFavoritesInstruction = NSLocalizedString("unified.favorites.instruction", value: "Use the same favorite bookmarks on all your devices. Leave off to keep mobile and desktop favorites separate.", comment: "Options - Unify Favorites Instruction")
+    static let fetchFaviconsOptionTitle = NSLocalizedString("fetch.favicons.option.title", value: "Auto-Download Icons", comment: "Automatically download icons for your synced bookmarks. Icon downloads are exposed to your network.")
+    static let fetchFaviconsOptionCaption = NSLocalizedString("fetch.favicons.option.caption", value: "Automatically download icons for synced bookmarks.", comment: "Options - Fetch Favicons Caption")
+
+    // Save RecoveryPDF
+    static let saveRecoveryPDFButton = NSLocalizedString("save.recovery.pdf.button", value: "Save Recovery PDF", comment: "Save RecoveryPDF - Button")
+    static let saveRecoveryPDFFooter = NSLocalizedString("save.recovery.pdf.footer", value: "If you lose your device, you will need this recovery code to restore your synced data.", comment: "Save RecoveryPDF - Footer")
+    // Delete Server Data
+    static let deleteServerData = NSLocalizedString("delete.server.data", value: "Turn Off and Delete Server Data...", comment: "Delete Server Data - Button")
+
+    // Connect With Server Sheet
+    static let connectWithServerSheetTitle = NSLocalizedString("connect.with.server.sheet.title", value: "Sync and Back Up This Device", comment: "Connect With Server Sheet - Title")
+    static let connectWithServerSheetDescriptionPart1 = NSLocalizedString("connect.with.server.sheet.description.part1", value: "This creates an encrypted backup of your bookmarks and passwords on DuckDuckGo’s secure server, which can be synced with your other devices.", comment: "Connect With Server Sheet - Description Part 1")
+    static let connectWithServerSheetDescriptionPart2 = NSLocalizedString("connect.with.server.sheet.description.part2", value: "The encryption key is only stored on your device, DuckDuckGo cannot access it.", comment: "Connect With Server Sheet - Description Part 2")
+    static let connectWithServerSheetButton = NSLocalizedString("connect.with.server.sheet.button", value: "Turn on Sync & Backup", comment: "Connect With Server Sheet - Button")
+    static let connectWithServerSheetFooter = NSLocalizedString("connect.with.server.sheet.footer", value: "You can sync with your other devices later.", comment: "Connect With Server Sheet - Footer")
+
+    // Preparing To Sync Sheet
+    static let preparingToSyncSheetTitle = NSLocalizedString("preparing.to.sync.sheet.title", value: "Setting Up Sync and Backup", comment: "Preparing To Sync Sheet - Title")
+    static let preparingToSyncSheetDescription = NSLocalizedString("preparing.to.sync.sheet.description", value: "Your bookmarks and passwords are being prepared to sync. This should only take a moment.", comment: "Preparing To Sync Sheet - Description")
+    static let preparingToSyncSheetFooter = NSLocalizedString("preparing.to.sync.sheet.footer", value: "Connecting…", comment: "Preparing To Sync Sheet - Footer")
+
+    // Save Recovery Code Sheet
+    static let saveRecoveryCodeSheetTitle = NSLocalizedString("save.recovery.code.sheet.title", value: "Save Recovery Code", comment: "Save Recovery Code Sheet - Title")
+    static let saveRecoveryCodeSheetDescription = NSLocalizedString("save.recovery.code.sheet.description", value: "If you lose access to your devices, you will need this code to recover your synced data.", comment: "Save Recovery Code Sheet - Description")
+    static let saveRecoveryCodeSheetFooter = NSLocalizedString("save.recovery.code.sheet.footer", value: "Anyone with access to this code can access your synced data, so please keep it in a safe place.", comment: "Save Recovery Code Sheet - Footer")
+    static let saveRecoveryCodeCopyCodeButton = NSLocalizedString("save.recovery.code.copy.code.button", value: "Copy Code", comment: "Save Recovery Code Sheet - Copy Code Button")
+    static let saveRecoveryCodeSaveAsPdfButton = NSLocalizedString("save.recovery.code.save.as.pdf.button", value: "Save as PDF", comment: "Save Recovery Code Sheet - Save as PDF Button")
+    static let saveRecoveryCodeSaveCodeCopiedToast = NSLocalizedString("save.recovery.code.code.copied.button", value: "Recovery code copied to clipboard", comment: "Save Recovery Code Sheet - Copy Code Toast")
+
+    // Device Synced Sheet
+    static let deviceSyncedSheetTitle = NSLocalizedString("device.synced.sheet.title", value: "Your Data is Synced!", comment: "Device SyncedSheet - Title")
+
+    // Recover Synced Data Sheet
+    static let recoverSyncedDataTitle = NSLocalizedString("recover.synced.data.sheet.title", value: "Recover Synced Data", comment: "Recover Synced Data Sheet - Title")
+    static let recoverSyncedDataDescription = NSLocalizedString("recover.synced.data.sheet.description", value: "To restore your synced data, you'll need the Recovery Code you saved when you first set up Sync. This code may have been saved as a PDF on the device you originally used to set up Sync.", comment: "Recover Synced Data Sheet - Description")
+    static let recoverSyncedDataButton = NSLocalizedString("recover.synced.data.sheet.button", value: "Get Started", comment: "Recover Synced Data Sheet - Button")
+
+    // Scan Or Enter Code To Recover Synced Data View
+    static let scanCodeToRecoverSyncedDataTitle = NSLocalizedString("scan.code.to.recover.synced.data.title", value: "Recover Synced Data", comment: "Scan Or Enter Code To Recover Synced Data View - Title")
+    static let scanCodeToRecoverSyncedDataExplanation = NSLocalizedString("scan.code.to.recover.synced.data.explanation", value: "Scan the QR code on your Recovery PDF, or another synced device, to recover your data.", comment: "Scan Or Enter Code To Recover Synced Data View - Explanation")
+    static let scanCodeToRecoverSyncedDataFooter = NSLocalizedString("scan.code.to.recover.synced.data.footer", value: "Can’t Scan?", comment: "Scan Or Enter Code To Recover Synced Data View - Footer")
+    static let scanCodeToRecoverSyncedDataEnterCodeLink = NSLocalizedString("scan.code.to.recover.synced.data.enter.code.link", value: "Enter Text Code Manually", comment: "Scan Or Enter Code To Recover Synced Data View - Enter Code Link")
+
+    // Camera View
+    static let cameraPointCameraIndication = NSLocalizedString("camera.point.camera.indication", value: "Point camera at QR code to sync", comment: "Camera View - Point Camera Indication")
+    static let cameraPermissionRequired = NSLocalizedString("camera.permission.required", value: "Camera Permission is Required", comment: "Camera View - Permission Required")
+    static let cameraPermissionInstructions = NSLocalizedString("camera.permission.instructions", value: "Please go to your device's settings and grant permission for this app to access your camera.", comment: "Camera View - Permission Instructions")
+    static let cameraIsUnavailableTitle = NSLocalizedString("camera.is.unavailable.title", value: "Camera is Unavailable", comment: "Camera View - Unavailable Title")
+    static let cameraGoToSettingsButton = NSLocalizedString("camera.go.to.settings.button", value: "Go to Settings", comment: "Camera View - Go to Settings Button")
+
+    // Manually Enter Code View
+    static let manuallyEnterCodeTitle = NSLocalizedString("manually.enter.code.title", value: "Manually Enter Code", comment: "Manually Enter Code View - Title")
+    static let manuallyEnterCodeValidatingCodeAction = NSLocalizedString("manually.enter.code.validating.code.action", value: "Validating code", comment: "Manually Enter Code View - Validating Code Action")
+    static let manuallyEnterCodeValidatingCodeFailedAction = NSLocalizedString("manually.enter.code.validating.code.failed.action", value: "Invalid code.", comment: "Manually Enter Code View - Validating Code Failed Action")
+    static func manuallyEnterCodeInstructionAttributed(syncMenuPath: String, menuItem: String) -> String {
+        let localized = NSLocalizedString("manually.enter.code.instruction.attributed", value: "Go to %@ and select %@ in the DuckDuckGo App on another synced device and paste the code here to sync this device.", comment: "Manually Enter Code View - Instruction with sync menu path and view text code menu item inserted")
+        return String(format: localized, syncMenuPath, menuItem)
+    }
+    static let manuallyEnterCodeInstruction = NSLocalizedString("manually.enter.code.instruction", value: "Go to Settings > Sync & Backup > Sync With Another Device and select Sync Menu Path in the DuckDuckGo App on another synced device and paste the code here to sync this device.", comment: "Manually Enter Code View - Instruction with sync menu path and view text code menu item inserted")
+    static let syncMenuPath = NSLocalizedString("sync.menu.path", value: "Settings > Sync & Backup > Sync With Another Device", comment: "Sync Menu Path")
+    static let viewTextCodeMenuItem = NSLocalizedString("view.text.code.menu.item", value: "View Text Code", comment: "View Text Code menu item")
+
+    // Scan or See Code View
+    static let scanOrSeeCodeTitle = NSLocalizedString("scan.or.see.code.title", value: "Scan QR Code", comment: "Scan or See Code View - Title")
+    static let scanOrSeeCodeInstruction = NSLocalizedString("scan.or.see.code.instruction", value: "Go to Settings › Sync & Backup in the DuckDuckGo Browser on another device and select ”Sync with Another Device.”", comment: "Scan or See Code View - Instruction")
+    static func scanOrSeeCodeInstructionAttributed(syncMenuPath: String) -> String {
+        let localized = NSLocalizedString("scan.or.see.code.instruction.attributed", value: "Go to %@ in the DuckDuckGo Browser on another device and select ”Sync with Another Device.”.", comment: "Scan or See Code View - Instruction with syncMenuPath")
+        return String(format: localized, syncMenuPath)
+    }
 
-    static let editDeviceLabel = "Device Name"
-    static func editDevice(_ name: String) -> String {
-        return "Edit \(name)"
+    static let scanOrSeeCodeInstructionPart3 = NSLocalizedString("scan.or.see.code.instruction.part3", value: "in the DuckDuckGo Browser on another device and select ”Sync with Another Device.”", comment: "Scan or See Code View - Instruction Part 3")
+    static let scanOrSeeCodeManuallyEnterCodeLink = NSLocalizedString("scan.or.see.code.manually.enter.code.link", value: "Manually Enter Code", comment: "Scan or See Code View - Manually Enter Code Link")
+    static let scanOrSeeCodeScanCodeInstructionsTitle = NSLocalizedString("scan.or.see.code.scan.code.instructions.title", value: "Mobile-to-Mobile?", comment: "Scan or See Code View - Scan Code Instructions Title")
+    static let scanOrSeeCodeScanCodeInstructionsBody = NSLocalizedString("scan.or.see.code.scan.code.instructions.body", value: "Scan this code with another device to sync.", comment: "Scan or See Code View - Scan Code Instructions Body")
+    static let scanOrSeeCodeFooter = NSLocalizedString("scan.or.see.code.footer", value: "Can’t Scan?", comment: "Scan or See Code View - Footer")
+    static let scanOrSeeCodeShareCodeLink = NSLocalizedString("scan.or.see.code.share.code.link", value: "Share Text Code?", comment: "Scan or See Code View - Share Code Link")
+
+    // Edit Device View
+    static let editDeviceHeader = NSLocalizedString("edit.device.header", value: "Device Name", comment: "Edit Device View - Header")
+    static func editDeviceTitle(_ name: String) -> String {
+        return NSLocalizedString("edit.device.title", value: "Edit \(name)", comment: "Edit Device View - Title")
     }
 
-    static let removeDeviceTitle = "Remove Device?"
-    static let removeDeviceButton = "Remove Device"
+    // Remove Device View
+    static let removeDeviceTitle = NSLocalizedString("remove.device.title", value: "Remove Device?", comment: "Remove Device View - Title")
+    static let removeDeviceButton = NSLocalizedString("remove.device.button", value: "Remove Device", comment: "Remove Device View - Button")
     static func removeDeviceMessage(_ name: String) -> String {
-        return "\"\(name)\" will no longer be able to access your synced data."
+        return NSLocalizedString("remove.device.message", value: "\"\(name)\" will no longer be able to access your synced data.", comment: "Remove Device View - Message")
     }
 
-    static let syncLimitExceededTitle = "⚠️ Sync Paused"
-    static let bookmarksLimitExceededDescription = "Bookmark limit exceeded. Delete some to resume syncing."
-    static let credentialsLimitExceededDescription = "Logins limit exceeded. Delete some to resume syncing."
-    static let bookmarksLimitExceededAction = "Manage Bookmarks"
-    static let credentialsLimitExceededAction = "Manage Logins"
-    
-    static let fetchFaviconsOnboardingTitle = "Download Missing Icons?"
-    static let fetchFaviconsOnboardingMessage = "Do you want this device to automatically download icons for any new bookmarks synced from your other devices? This will expose the download to your network any time a bookmark is synced."
-    static let fetchFaviconsOnboardingButtonTitle = "Keep Bookmarks Icons Updated"
+    // Standard Buttons
+    static let cancelButton = NSLocalizedString("cancel.button", value: "Cancel", comment: "Standard Buttons - Cancel Button")
+    static let doneButton = NSLocalizedString("done.button", value: "Done", comment: "Standard Buttons - Done Button")
+    static let nextButton = NSLocalizedString("next.button", value: "Next", comment: "Standard Buttons - Next Button")
+    static let backButton = NSLocalizedString("back.button", value: "Back", comment: "Standard Buttons - Back Button")
+    static let pasteButton = NSLocalizedString("paste.button", value: "Paste", comment: "Standard Buttons - Paste Button")
+    static let notNowButton = NSLocalizedString("not.now.button", value: "Not Now", comment: "Standard Buttons - Not Now Button")
+
+    // Fetch favicons
+    static let fetchFaviconsOnboardingTitle = NSLocalizedString("fetch.favicons.onboarding.title", value: "Download Missing Icons?", comment: "Fetch Favicons Onboarding - Title")
+    static let fetchFaviconsOnboardingMessage = NSLocalizedString("fetch.favicons.onboarding.message", value: "Do you want this device to automatically download icons for any new bookmarks synced from your other devices? This will expose the download to your network any time a bookmark is synced.", comment: "Fetch Favicons Onboarding - Message")
+    static let fetchFaviconsOnboardingButtonTitle = NSLocalizedString("fetch.favicons.onboarding.button.title", value: "Keep Bookmarks Icons Updated", comment: "Fetch Favicons Onboarding - Button Title")
+
 
+    // swiftlint:enable line_length
 }
-// swiftlint:enable line_length
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/PasteCodeView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/PasteCodeView.swift
index 2eca97e13b..903c0046fb 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/PasteCodeView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/PasteCodeView.swift
@@ -30,17 +30,14 @@ public struct PasteCodeView: View {
 
     @State var isEditingCode = false
 
-    var isFirstScreen: Bool
-
-    public init(model: ScanOrPasteCodeViewModel, isfirstScreen: Bool = false) {
+    public init(model: ScanOrPasteCodeViewModel) {
         self.model = model
-        self.isFirstScreen = isfirstScreen
     }
 
     @ViewBuilder
     func pasteButton() -> some View {
         Button(action: model.pasteCode) {
-            Label(UserText.pasteLabel, image: "SyncPaste")
+            Label(UserText.pasteButton, image: "SyncPaste")
         }
     }
 
@@ -67,20 +64,32 @@ public struct PasteCodeView: View {
                 if model.isValidating {
                     HStack(spacing: 4) {
                         SwiftUI.ProgressView()
-                        Text(UserText.validatingCode)
+                        Text(UserText.manuallyEnterCodeValidatingCodeAction)
                             .foregroundColor(.white.opacity(0.36))
                     }
                     .padding(.horizontal)
                 } else if model.invalidCode {
                     HStack {
                         Image("SyncAlert")
-                        Text(UserText.validatingCodeFailed)
+                        Text(UserText.manuallyEnterCodeValidatingCodeFailedAction)
                             .foregroundColor(.white.opacity(0.36))
                     }
                     .padding(.horizontal)
                 } else {
 
-                    instructions()
+                    if #available(iOS 15.0, *) {
+                        Text(instructionsString)
+                            .lineLimit(nil)
+                            .multilineTextAlignment(.center)
+                            .foregroundColor(.white.opacity(0.6))
+                            .padding()
+                    } else {
+                        Text(UserText.manuallyEnterCodeInstruction)
+                            .lineLimit(nil)
+                            .multilineTextAlignment(.center)
+                            .foregroundColor(.white.opacity(0.6))
+                            .padding()
+                    }
 
                     Spacer()
                 }
@@ -95,13 +104,17 @@ public struct PasteCodeView: View {
         .padding()
     }
 
-    @ViewBuilder
-    func instructions() -> some View {
-        Text(UserText.pasteCodeInstructions)
-            .lineLimit(nil)
-            .multilineTextAlignment(.center)
-            .foregroundColor(.white.opacity(0.6))
-            .padding()
+    @available(iOS 15, *)
+    var instructionsString: AttributedString {
+        let baseString = UserText.manuallyEnterCodeInstructionAttributed(syncMenuPath: UserText.syncMenuPath, menuItem: UserText.viewTextCodeMenuItem)
+        var instructions = AttributedString(baseString)
+        if let range1 = instructions.range(of: UserText.syncMenuPath) {
+            instructions[range1].font = .boldSystemFont(ofSize: 16)
+        }
+        if let range2 = instructions.range(of: UserText.viewTextCodeMenuItem) {
+            instructions[range2].font = .boldSystemFont(ofSize: 16)
+        }
+        return instructions
     }
 
     @ViewBuilder
@@ -119,13 +132,9 @@ public struct PasteCodeView: View {
     }
 
     public var body: some View {
-        if isFirstScreen {
-            pastCodeWiewWithNoModifier()
-                .modifier(CancelButtonModifier(action: model.cancel))
-        } else {
-            pastCodeWiewWithNoModifier()
-                .modifier(BackButtonModifier())
-        }
+        pastCodeWiewWithNoModifier()
+            .modifier(BackButtonModifier())
+
     }
 
 }
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/PreparingToSyncView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/PreparingToSyncView.swift
new file mode 100644
index 0000000000..ddbf2d173b
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/PreparingToSyncView.swift
@@ -0,0 +1,49 @@
+//
+//  PreparingToSyncView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+import DuckUI
+import DesignResourcesKit
+
+
+public struct PreparingToSyncView: View {
+
+    public init() {}
+
+    public var body: some View {
+        UnderflowContainer {
+            VStack(spacing: 0) {
+                Image("Sync-128")
+                    .padding(20)
+
+                Text(UserText.preparingToSyncSheetTitle)
+                    .daxTitle1()
+                    .multilineTextAlignment(.center)
+                    .padding(.bottom, 24)
+
+                Text(UserText.preparingToSyncSheetDescription)
+                    .multilineTextAlignment(.center)
+            }
+            .padding(.horizontal, 20)
+        } foregroundContent: {
+            Text(UserText.preparingToSyncSheetFooter)
+                .foregroundColor(Color(designSystemColor: .textSecondary))
+        }
+    }
+}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/RecoverSyncedDataView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/RecoverSyncedDataView.swift
new file mode 100644
index 0000000000..34bfc6c747
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/RecoverSyncedDataView.swift
@@ -0,0 +1,68 @@
+//
+//  RecoverSyncedDataView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+import DuckUI
+import DesignResourcesKit
+
+public struct RecoverSyncedDataView: View {
+
+    @ObservedObject public var model: SyncSettingsViewModel
+    var onCancel: () -> Void
+
+    public init(model: SyncSettingsViewModel, onCancel: @escaping () -> Void) {
+        self.model = model
+        self.onCancel = onCancel
+    }
+
+    public var body: some View {
+        UnderflowContainer {
+            VStack(spacing: 0) {
+                HStack {
+                    Button(action: onCancel, label: {
+                        Text(UserText.cancelButton)
+                            .foregroundColor(.primary)
+                    })
+                    Spacer()
+                }
+                .frame(height: 56)
+                Image("Sync-Recover-128")
+                    .padding(20)
+
+                Text(UserText.recoverSyncedDataTitle)
+                    .daxTitle1()
+                    .multilineTextAlignment(.center)
+                    .padding(.bottom, 24)
+
+                Text(UserText.recoverSyncedDataDescription)
+                        .multilineTextAlignment(.center)
+            }
+            .padding(.horizontal, 20)
+        } foregroundContent: {
+            Button {
+                model.recoverSyncDataPressed()
+            } label: {
+                Text(UserText.recoverSyncedDataButton)
+            }
+            .buttonStyle(PrimaryButtonStyle())
+            .frame(maxWidth: 360)
+            .padding(.horizontal, 30)
+        }
+    }
+}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/SaveRecoveryKeyView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/SaveRecoveryKeyView.swift
index b2206716a4..d4a5bc3a5e 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/SaveRecoveryKeyView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/SaveRecoveryKeyView.swift
@@ -25,6 +25,7 @@ public struct SaveRecoveryKeyView: View {
 
     @Environment(\.presentationMode) var presentation
     @Environment(\.verticalSizeClass) var verticalSizeClass
+    @State private var isCopied = false
 
     var isCompact: Bool {
         verticalSizeClass == .compact
@@ -38,39 +39,33 @@ public struct SaveRecoveryKeyView: View {
 
     @ViewBuilder
     func recoveryInfo() -> some View {
-        ZStack {
             VStack(spacing: 26) {
                 HStack(spacing: 16) {
-                    QRCodeView(string: model.key, size: 94, style: .dark)
+                    QRCodeView(string: model.key, size: 64, style: .dark)
 
                     Text(model.key)
                         .fontWeight(.light)
                         .lineSpacing(1.6)
-                        .lineLimit(5)
+                        .lineLimit(3)
                         .applyKerning(2)
                         .truncationMode(.tail)
                         .monospaceSystemFont(ofSize: 16)
                         .frame(maxWidth: .infinity)
                 }
+                codeButtons()
             }
             .padding(.top, 20)
             .padding(.horizontal, 20)
             .padding(.bottom, 12)
-        }
-        .background(RoundedRectangle(cornerRadius: 10).foregroundColor(.black.opacity(0.03)))
+            .background(RoundedRectangle(cornerRadius: 10).foregroundColor(.black.opacity(0.03)))
     }
 
     @ViewBuilder
-    func buttons() -> some View {
+    func codeButtons() -> some View {
         VStack(spacing: isCompact ? 4 : 8) {
-            Button("Save as PDF") {
+            Button(UserText.saveRecoveryCodeSaveAsPdfButton) {
                 model.showRecoveryPDFAction()
             }
-            .buttonStyle(PrimaryButtonStyle(compact: isCompact))
-
-            Button(UserText.copyCode) {
-                model.copyKey()
-            }
             .buttonStyle(SecondaryButtonStyle(compact: isCompact))
             .overlay(
                 RoundedRectangle(cornerRadius: 8)
@@ -78,15 +73,37 @@ public struct SaveRecoveryKeyView: View {
                 .stroke(.blue, lineWidth: 1)
                 )
 
-            Button {
-                presentation.wrappedValue.dismiss()
-            } label: {
-                Text(UserText.notNowButton)
+            Button(UserText.saveRecoveryCodeCopyCodeButton) {
+                model.copyKey()
+                isCopied = true
+                DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+                    isCopied = false
+                }
             }
             .buttonStyle(SecondaryButtonStyle(compact: isCompact))
+            .overlay(
+                RoundedRectangle(cornerRadius: 8)
+                    .inset(by: 0.5)
+                    .stroke(.blue, lineWidth: 1)
+            )
         }
-        .frame(maxWidth: 360)
-        .padding(.horizontal, 30)
+    }
+
+    @ViewBuilder
+    func nextButton() -> some View {
+        Button {
+            presentation.wrappedValue.dismiss()
+            model.onDismiss()
+        } label: {
+            Text(UserText.nextButton)
+        }
+        .buttonStyle(PrimaryButtonStyle(compact: isCompact))
+        .overlay(
+            isCopied ?
+            codeCopiedToast()
+            : nil
+        )
+        .padding(.horizontal, 20)
     }
 
     @ViewBuilder
@@ -95,11 +112,11 @@ public struct SaveRecoveryKeyView: View {
             Image("SyncDownloadRecoveryCode")
                 .padding(.bottom, 24)
 
-            Text(UserText.saveRecoveryTitle)
+            Text(UserText.saveRecoveryCodeSheetTitle)
                 .daxTitle1()
                 .padding(.bottom, 28)
 
-            Text(UserText.recoveryMessage)
+            Text(UserText.saveRecoveryCodeSheetDescription)
                 .lineLimit(nil)
                 .daxBodyRegular()
                 .lineSpacing(1.32)
@@ -108,7 +125,7 @@ public struct SaveRecoveryKeyView: View {
 
             recoveryInfo()
                 .padding(.bottom, 20)
-            Text(UserText.recoveryWarning)
+            Text(UserText.saveRecoveryCodeSheetFooter)
                 .daxCaption()
                 .multilineTextAlignment(.center)
                 .foregroundColor(.primary.opacity(0.6))
@@ -117,11 +134,26 @@ public struct SaveRecoveryKeyView: View {
         .padding(.horizontal, 30)
     }
 
+    @ViewBuilder
+    func codeCopiedToast() -> some View {
+        ZStack(alignment: .leading) {
+            RoundedRectangle(cornerRadius: 8)
+                .fill(Color.black)
+                .frame(height: 45)
+            Text(UserText.saveRecoveryCodeSaveCodeCopiedToast)
+                .foregroundColor(.white)
+                .padding()
+
+        }
+        .padding(.bottom, 50)
+    }
+
+
     public var body: some View {
         UnderflowContainer {
             mainContent()
         } foregroundContent: {
-            buttons()
+            nextButton()
         }
     }
 
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrEnterCodeToRecoverSyncedDataView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrEnterCodeToRecoverSyncedDataView.swift
new file mode 100644
index 0000000000..dacecbe32a
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrEnterCodeToRecoverSyncedDataView.swift
@@ -0,0 +1,71 @@
+//
+//  ScanOrEnterCodeToRecoverSyncedDataView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+import DuckUI
+
+public struct ScanOrEnterCodeToRecoverSyncedDataView: View {
+
+    @ObservedObject var model: ScanOrPasteCodeViewModel
+
+    public init(model: ScanOrPasteCodeViewModel) {
+        self.model = model
+    }
+
+    public var body: some View {
+        VStack(spacing: 10) {
+            VStack(spacing: 10) {
+                Text(UserText.scanCodeToRecoverSyncedDataExplanation)
+                    .daxFootnoteRegular()
+                    .multilineTextAlignment(.center)
+                    .padding(.horizontal, 20)
+                    .padding(.top, 10)
+                    .padding(.bottom, 20)
+                CameraView(model: model)
+                    .aspectRatio(1.0, contentMode: .fill)
+            }
+            .navigationTitle(UserText.scanCodeToRecoverSyncedDataTitle)
+            .toolbar {
+                ToolbarItem(placement: .navigationBarLeading) {
+                    Button(UserText.cancelButton, action: model.cancel)
+                        .foregroundColor(Color.white)
+                }
+            }
+            ZStack {
+                Rectangle().fill(Color.black)
+                VStack(alignment: .center) {
+                    HStack(spacing: 4) {
+                        Text(UserText.scanCodeToRecoverSyncedDataFooter)
+                            .daxBodyRegular()
+                            .foregroundColor(Color(designSystemColor: .textSecondary))
+                        HStack(alignment: .center) {
+                            NavigationLink(UserText.scanCodeToRecoverSyncedDataEnterCodeLink, destination: {
+                                PasteCodeView(model: model)
+                            })
+                            .foregroundColor(Color(designSystemColor: .accent))
+                            Image("Arrow-Circle-Right-12")
+                        }
+                    }
+                    .padding(20)
+                    Spacer()
+                }
+            }
+        }
+    }
+}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrPasteCodeView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrPasteCodeView.swift
index 5c8a08af55..92532fc260 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrPasteCodeView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/ScanOrPasteCodeView.swift
@@ -20,260 +20,119 @@
 import SwiftUI
 import DesignResourcesKit
 
-/// Handles scanning or pasting a code.
-public struct ScanOrPasteCodeView: View {
-
+public struct ScanOrSeeCode: View {
     @ObservedObject var model: ScanOrPasteCodeViewModel
+    @State var qrCodeModel = ShowQRCodeViewModel()
+
+    @State private var isShareSheetPresented: Bool = false
 
     public init(model: ScanOrPasteCodeViewModel) {
         self.model = model
     }
 
-    @State var isInvalidCode = false
-
-    @ViewBuilder
-    func fullscreenCameraBackground() -> some View {
-        Group {
-            if model.showCamera {
-                QRCodeScannerView {
-                    return await model.codeScanned($0)
-                } onCameraUnavailable: {
-                    model.cameraUnavailable()
-                } onInvalidCodeScanned: {
-                    withAnimation(.linear.delay(0.0)) {
-                        isInvalidCode = true
-                    }
-
-                    withAnimation(.linear.delay(0.2)) {
-                        isInvalidCode = false
-                    }
+    public var body: some View {
+        VStack(spacing: 10) {
+            VStack(spacing: 10) {
+                titleView()
+                CameraView(model: model)
+            }
+            .toolbar {
+                ToolbarItem(placement: .navigationBarLeading) {
+                    Button(UserText.cancelButton, action: model.cancel)
+                        .foregroundColor(Color.white)
+                }
+                ToolbarItem(placement: .navigationBarTrailing) {
+                    NavigationLink(UserText.scanOrSeeCodeManuallyEnterCodeLink, destination: {
+                        PasteCodeView(model: model)
+                    })
+                    .foregroundColor(Color(designSystemColor: .accent))
                 }
-            } else {
-                Rectangle()
-                    .fill(.black)
             }
+            qrCodeView()
         }
-        .ignoresSafeArea()
     }
 
     @ViewBuilder
-    func waitingForCameraPermission() -> some View {
-        if model.videoPermission == .unknown {
-            SwiftUI.ProgressView()
+    func titleView() -> some View {
+        VStack(spacing: 10) {
+            Text(UserText.scanOrSeeCodeTitle)
+                .daxTitle2()
+            instructionsText()
+                .daxFootnoteRegular()
+                .multilineTextAlignment(.center)
+                .padding(.horizontal, 16)
         }
+        .padding(.top, 10)
     }
 
-    @ViewBuilder
-    func cameraPermissionDenied() -> some View {
-        if model.videoPermission == .denied {
-            VStack(spacing: 0) {
-
-                Image("SyncCameraPermission")
-                    .padding(.top, 40)
-                    .padding(.bottom, 20)
-
-                Text(UserText.cameraPermissionRequired)
-                    .daxTitle3()
-                    .lineSpacing(1.05)
-                    .padding(.bottom, 8)
-
-                Text(UserText.cameraPermissionInstructions)
-                    .lineLimit(nil)
-                    .multilineTextAlignment(.center)
-                    .daxBodyRegular()
-                    .lineSpacing(1.1)
-
-                Spacer()
-
-                Button {
-                    model.gotoSettings()
-                } label: {
-                    HStack {
-                        Image("SyncGotoButton")
-                        Text(UserText.goToSettingsButton)
-                    }
-                }
-                .buttonStyle(SyncLabelButtonStyle())
-                .padding(.bottom, 40)
-            }
-            .padding(.horizontal, 40)
+    func instructionsText() -> some View {
+        if #available(iOS 15.0, *) {
+            return Text(instructionsString)
+        } else {
+            return Text(UserText.scanOrSeeCodeInstruction)
         }
     }
 
-    @ViewBuilder
-    func cameraUnavailable() -> some View {
-        if model.videoPermission == .authorised && !model.showCamera {
-            VStack(spacing: 0) {
-
-                Image("SyncCameraUnavailable")
-                    .padding(.top, 40)
-                    .padding(.bottom, 20)
-
-                Text(UserText.cameraIsUnavailableTitle)
-                    .daxTitle3()
-                    .lineSpacing(1.05)
-
-            }
-            .padding(.horizontal, 40)
+    @available(iOS 15, *)
+    var instructionsString: AttributedString {
+        let baseString = UserText.scanOrSeeCodeInstructionAttributed(syncMenuPath: UserText.syncMenuPath)
+        var instructions = AttributedString(baseString)
+        if let range = instructions.range(of: UserText.syncMenuPath) {
+            instructions[range].font = .boldSystemFont(ofSize: 13)
         }
+        return instructions
     }
 
-    @ViewBuilder
-    func instructions() -> some View {
-
-        Text(model.showConnectMode ? UserText.connectDeviceInstructions : UserText.recoveryModeInstructions)
-            .lineLimit(nil)
-            .multilineTextAlignment(.center)
-            .daxCaption()
-            .foregroundColor(.white.opacity(0.6))
-            .padding(.top, 20)
-
-    }
 
     @ViewBuilder
-    func buttons() -> some View {
-
-        Group {
-            Section {
-                NavigationLink {
-                    PasteCodeView(model: model)
-                } label: {
-                    HStack(spacing: 16) {
-                        Image("SyncKeyboardIcon")
-                        Text(UserText.manuallyEnterCodeTitle)
-                            .daxButton()
-                            .foregroundColor(.white.opacity(0.84))
+    func qrCodeView() -> some View {
+        VStack(spacing: 8) {
+            HStack(alignment: .top, spacing: 20) {
+                QRCodeView(string: qrCodeModel.code ?? "", size: 120)
+                VStack(alignment: .leading, spacing: 10) {
+                    HStack {
+                        Text(UserText.scanOrSeeCodeScanCodeInstructionsTitle)
+                            .daxBodyBold()
+                            .fixedSize()
+                        Spacer()
+                        Image("SyncDeviceType_phone")
+                            .padding(2)
+                            .background(
+                                RoundedRectangle(cornerRadius: 2)
+                                    .fill(Color(designSystemColor: .lines))
+                            )
                     }
+                    Text(UserText.scanOrSeeCodeScanCodeInstructionsBody)
+                        .foregroundColor(.secondary)
+                        .fixedSize(horizontal: false, vertical: true)
+                        .multilineTextAlignment(.leading)
                 }
             }
-            Section {
-                if model.showConnectMode {
-                    NavigationLink {
-                        ConnectModeView(model: model)
-                    } label: {
-                        HStack(spacing: 16) {
-                            Image("SyncQRCodeIcon")
-
-                            VStack(alignment: .leading, spacing: 4) {
-                                Text(UserText.showQRCodeLabel)
-                                    .daxButton()
-                                    .foregroundColor(.white.opacity(0.84))
-                                Text(UserText.showQRCodeSubLabel)
-                                    .daxCaption()
-                                    .foregroundColor(.white.opacity(0.6))
-                            }
-                            .frame(maxWidth: .infinity, alignment: .leading)
+            .padding(20)
+            .background(
+                RoundedRectangle(cornerRadius: 8)
+                    .fill(Color(designSystemColor: .panel))
+            )
+            .padding(20)
+            HStack {
+                Text(UserText.scanOrSeeCodeFooter)
+                HStack(alignment: .center) {
+                    Text(UserText.scanOrSeeCodeShareCodeLink)
+                        .foregroundColor(Color(designSystemColor: .accent))
+                        .onTapGesture {
+                            model.showShareCodeSheet()
                         }
-                    }
+                    Image("Arrow-Circle-Right-12")
                 }
             }
         }
-        .frame(height: 40)
-        .foregroundColor(.primary)
+        .padding(.bottom, 40)
         .onAppear {
-            model.endConnectMode()
-        }
-    }
-
-    @ViewBuilder
-    func cameraViewPort() -> some View {
-        ZStack(alignment: .center) {
-            waitingForCameraPermission()
-            cameraTarget()
-        }
-    }
-
-    @ViewBuilder
-    func cameraTarget() -> some View {
-        if model.showCamera {
-            ZStack {
-                ForEach([0.0, 90.0, 180.0, 270.0], id: \.self) { degrees in
-                    RoundedCorner()
-                        .stroke(lineWidth: 8)
-                        .foregroundColor(isInvalidCode ? .red.opacity(0.6) : .white.opacity(0.8))
-                        .rotationEffect(.degrees(degrees), anchor: .center)
-                        .frame(width: 300, height: 300)
-                }
-            }
-        }
-    }
-
-    public var body: some View {
-        GeometryReader { g in
-            ZStack(alignment: .top) {
-                fullscreenCameraBackground()
-
-                VStack(spacing: 0) {
-                    Rectangle() // Also acts as the blur for the camera
-                        .fill(.black)
-                        .frame(height: g.safeAreaInsets.top)
-
-                    ZStack {
-                        // Background in case fullscreen camera view doesn't work
-                        if !model.showCamera {
-                            Rectangle().fill(Color.black)
-                        }
-                        
-                        cameraViewPort()
-                            .frame(width: g.size.width, height: g.size.width)
-                            .frame(maxHeight: g.size.height - 300)
-
-                        Group {
-                            cameraPermissionDenied()
-                            cameraUnavailable()
-                        }
-                        .padding(.horizontal, 0)
-                    }
-
-                    ZStack {
-                        Rectangle() // Also acts as the blur for the camera
-                            .fill(.black)
-                            .regularMaterialBackground()
-
-                        VStack(spacing: 0) {
-                            Section {
-                                instructions()
-                                    .padding(.horizontal, 20)
-                            }
-
-                            List {
-                                buttons()
-                            }
-                            .ignoresSafeArea()
-                            .disableScrolling()
-                        }
-                        .frame(maxWidth: Constants.maxFullScreenWidth)
-                    }
-                }
-                .ignoresSafeArea()
-            }
-            .navigationTitle("Scan QR Code")
-            .toolbar {
-                ToolbarItem(placement: .navigationBarLeading) {
-                    Button("Cancel", action: model.cancel)
-                    .foregroundColor(Color.white)
-                }
+            if let recoveryCode = model.recoveryCode {
+                self.qrCodeModel.code = recoveryCode
+            } else {
+                self.qrCodeModel = model.startConnectMode()
             }
         }
     }
 }
-
-private struct RoundedCorner: Shape {
-
-    func path(in rect: CGRect) -> Path {
-        var path = Path()
-        let c = 50.0
-        let r = 30.0
-        let e = c - r
-
-        path.move(to: CGPoint(x: 0, y: c))
-        path.addLine(to: CGPoint(x: 0, y: e))
-        path.addCurve(to: CGPoint(x: e, y: 0),
-                      control1: CGPoint(x: 0, y: 0),
-                      control2: CGPoint(x: e, y: 0))
-        path.addLine(to: CGPoint(x: c, y: 0))
-
-        return path
-    }
-
-}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift
index 5f8791bad5..835690841d 100644
--- a/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncSettingsView.swift
@@ -25,6 +25,8 @@ public struct SyncSettingsView: View {
     @ObservedObject public var model: SyncSettingsViewModel
 
     let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect()
+    @State var isSyncWithSetUpSheetVisible = false
+    @State var isRecoverSyncedDataSheetVisible = false
 
     public init(model: SyncSettingsViewModel) {
         self.model = model
@@ -40,31 +42,22 @@ public struct SyncSettingsView: View {
                 }
         } else {
             List {
-                workInProgress()
 
                 if model.isSyncEnabled {
                     
                     turnOffSync()
                     
+                    // Sync Paused Errors
                     if $model.isSyncBookmarksPaused.wrappedValue {
                         syncPaused(for: .bookmarks)
                     }
-
                     if $model.isSyncCredentialsPaused.wrappedValue {
                         syncPaused(for: .credentials)
                     }
 
                     devices()
-                    
-                    syncNewDevice()
-                    
-                    OptionsView(
-                        isFaviconsFetchingEnabled: $model.isFaviconsFetchingEnabled,
-                        isUnifiedFavoritesEnabled: $model.isUnifiedFavoritesEnabled
-                    )
-                    .onAppear {
-                        model.delegate?.updateOptions()
-                    }
+
+                    options()
 
                     saveRecoveryPDF()
                     
@@ -73,12 +66,9 @@ public struct SyncSettingsView: View {
                 } else {
 
                     syncWithAnotherDeviceView()
-                    
-                    singleDeviceSetUpView()
-                    
-                    recoverYourDataView()
-                    
-                    footerView()
+
+                    otherOptions()
+
                 }
             }
             .navigationTitle(UserText.syncTitle)
@@ -96,106 +86,90 @@ public struct SyncSettingsView: View {
     }
 
     @State var selectedDevice: SyncSettingsViewModel.Device?
-
-    @ViewBuilder
-    func workInProgress() -> some View {
-        Section {
-            EmptyView()
-        } footer: {
-            VStack(alignment: .leading, spacing: 4) {
-                Text("Work in Progress")
-                    .font(.system(size: 12, weight: .semibold))
-                    .foregroundColor(.black)
-
-                // swiftlint:disable line_length
-                Text("This feature is viewable to internal users only and is still being developed and tested. Currently you can create accounts, connect and manage devices, and sync bookmarks, favorites, Autofill logins and Email Protection status. **[More Info](https://app.asana.com/0/1201493110486074/1203756800930481/f)**")
-                    .foregroundColor(.black)
-                    .font(.system(size: 11, weight: .regular))
-                // swiftlint:enable line_length
-            }
-            .padding()
-            .background(RoundedRectangle(cornerRadius: 8).foregroundColor(.yellow))
-            .padding(.bottom, 10)
-        }
-
-    }
-
 }
 
 // Sync Set up Views
 extension SyncSettingsView {
-    @ViewBuilder
-    func recoverYourDataView() -> some View {
-        Section {
-            Button(UserText.recoverYourData) {
-                model.showRecoverDataView()
-            }
-        }
-    }
 
     @ViewBuilder
-    func footerView() -> some View {
-        Section {} footer: {
-            Text(UserText.syncSettingsFooter)
-                .daxFootnoteRegular()
-                .foregroundColor(.secondary)
-        }
-    }
-
-    @ViewBuilder
-    func singleDeviceSetUpView() -> some View {
+    func syncWithAnotherDeviceView() -> some View {
         Section {
             HStack {
-                VStack(alignment: .leading, spacing: 4) {
-                    Text(UserText.singleDeviceSetUpTitle)
-                        .daxBodyBold()
-                    Text(UserText.singleDeviceSetUpInstruction)
+                Spacer()
+                VStack(alignment: .center, spacing: 8) {
+                    Image("Sync-Pair-96")
+                    Text(UserText.syncWithAnotherDeviceTitle)
+                        .daxTitle3()
+                    Text(UserText.syncWithAnotherDeviceMessage)
                         .daxBodyRegular()
+                        .multilineTextAlignment(.center)
+                        .foregroundColor(Color(designSystemColor: .textPrimary))
+                    Button(action: {
+                        model.scanQRCode()
+                    }, label: {
+                        Text(UserText.syncWithAnotherDeviceButton)
+                            .daxButton()
+                            .foregroundColor(.white)
+                            .frame(maxWidth: 310)
+                            .frame(height: 50)
+                            .background(
+                                RoundedRectangle(cornerRadius: 8)
+                                    .fill(Color(designSystemColor: .accent))
+                            )
+                    })
+                    .padding(.vertical, 16)
                 }
                 Spacer()
-                Image("Device-Mobile-Upload-96")
-
             }
-            if model.isBusy {
-                SwiftUI.ProgressView()
-            } else {
-                Button(UserText.turnSyncOn) {
-                    model.startSyncPressed()
-                }
+        } footer: {
+            HStack {
+                Spacer()
+                Text(UserText.syncWithAnotherDeviceFooter)
+                    .daxFootnoteRegular()
+                    .multilineTextAlignment(.center)
+                Spacer()
             }
         }
     }
 
     @ViewBuilder
-    func syncWithAnotherDeviceView() -> some View {
+    func otherOptions() -> some View {
         Section {
-            HStack {
-                VStack(alignment: .leading, spacing: 4) {
-                    Text(UserText.syncWithAnotherDeviceTitle)
-                        .daxBodyBold()
-                    Text(UserText.syncWithAnotherDeviceMessage)
-                        .daxBodyRegular()
+            Text(UserText.syncAndBackUpThisDeviceLink)
+                .daxBodyRegular()
+                .foregroundColor(Color(designSystemColor: .accent))
+                .onTapGesture {
+                    isSyncWithSetUpSheetVisible = true
                 }
-                Spacer()
-                Image("Sync-Pair-96")
-
-            }
-            Button(UserText.scanQRCode) {
-                model.scanQRCode()
-            }
-            Button(UserText.enterTextCode) {
-                model.showEnterTextView()
-            }
+                .sheet(isPresented: $isSyncWithSetUpSheetVisible, content: {
+                    SyncWithServerView(model: model, onCancel: {
+                        isSyncWithSetUpSheetVisible = false
+                    })
+                })
+            Text(UserText.recoverSyncedDataLink)
+                .daxBodyRegular()
+                .foregroundColor(Color(designSystemColor: .accent))
+                .onTapGesture {
+                    isRecoverSyncedDataSheetVisible = true
+                }
+                .sheet(isPresented: $isRecoverSyncedDataSheetVisible, content: {
+                    RecoverSyncedDataView(model: model, onCancel: {
+                        isRecoverSyncedDataSheetVisible = false
+                    })
+                })
+        } header: {
+            Text(UserText.otherOptionsSectionHeader)
         }
     }
 }
 
+
 // Sync Enabled Views
 extension SyncSettingsView {
     @ViewBuilder
     func deleteAllData() -> some View {
         Section {
-            Button(UserText.settingsDeleteAllButton) {
+            Button(UserText.deleteServerData) {
                 model.deleteAllData()
             }
         }
@@ -204,45 +178,32 @@ extension SyncSettingsView {
     @ViewBuilder
     func saveRecoveryPDF() -> some View {
         Section {
-            Button(UserText.settingsSaveRecoveryPDFButton) {
+            Button(UserText.saveRecoveryPDFButton) {
                 model.saveRecoveryPDF()
             }
         } footer: {
-            Text(UserText.settingsRecoveryPDFWarning)
+            Text(UserText.saveRecoveryPDFFooter)
         }
     }
 
-    @ViewBuilder
-    func syncNewDevice() -> some View {
-        Section {
-
-            // Appears off center because the list is padding the trailing to make space for the accessory
-            VStack(spacing: 0) {
-                QRCodeView(string: model.recoveryCode, size: 192, style: .dark)
-                    .padding(.bottom, 32)
-                    .padding(.top, 16)
-
-                let instrution1 = Text(UserText.settingsNewDeviceInstructions1)
-                let instrution2 = Text(UserText.settingsNewDeviceInstructions2).bold()
-                let instrution3 = Text(UserText.settingsNewDeviceInstructions3)
-
-                Text("\(instrution1)\n \(instrution2) \(instrution3)")
-                .daxSubheadRegular()
-                .lineLimit(nil)
-                .lineSpacing(1.2)
-                .multilineTextAlignment(.center)
-                .padding(.bottom, 16)
-            }
-
-            NavigationLink(UserText.settingsShowCodeButton) {
-                ShowCodeView(code: model.recoveryCode, copyCode: model.copyCode)
-            }
 
-            Button(UserText.settingsScanQRCodeButton) {
-                model.scanQRCode()
+    @ViewBuilder
+    func devicesList() -> some View {
+        ForEach(model.devices) { device in
+            Button {
+                selectedDevice = device
+            } label: {
+                HStack {
+                    deviceTypeImage(device)
+                    Text(device.name)
+                        .foregroundColor(.primary)
+                    Spacer()
+                    if device.isThisDevice {
+                        Text(UserText.syncedDevicesThisDeviceLabel)
+                            .foregroundColor(.secondary)
+                    }
+                }
             }
-        } header: {
-            Text("Sync New Device")
         }
     }
 
@@ -253,25 +214,15 @@ extension SyncSettingsView {
                 ProgressView()
                     .padding()
             }
-
-            ForEach(model.devices) { device in
-                Button {
-                    selectedDevice = device
-                } label: {
-                    HStack {
-                        deviceTypeImage(device)
-                        Text(device.name)
-                            .foregroundColor(.primary)
-                        Spacer()
-                        if device.isThisDevice {
-                            Text(UserText.thisDevice)
-                                .foregroundColor(.secondary)
-                        }
-                    }
-                }
-            }
+            devicesList()
+            Button(action: {
+                model.scanQRCode()
+            }, label: {
+                Text(UserText.syncedDevicesSyncWithAnotherDeviceLabel)
+                    .padding(.leading, 32)
+            })
         } header: {
-            Text(UserText.connectedDevicesTitle)
+            Text(UserText.syncedDevicesSectionHeader)
         }
         .sheet(item: $selectedDevice) { device in
             Group {
@@ -294,7 +245,6 @@ extension SyncSettingsView {
                 model.delegate?.refreshDevices(clearDevices: false)
             }
         }
-
     }
 
     @ViewBuilder
@@ -307,7 +257,49 @@ extension SyncSettingsView {
                     model.disableSync()
                 }
             }
+        } header: {
+            HStack(alignment: .center) {
+                Text(UserText.turnSyncOffSectionHeader)
+                Circle()
+                    .fill(.green)
+                    .frame(width: 8)
+                    .padding(.bottom, 1)
+            }
+        } footer: {
+            Text(UserText.turnSyncOffSectionFooter)
+                .multilineTextAlignment(.leading)
+        }
+    }
+
+    @ViewBuilder
+    func options() -> some View {
+        Section {
+            Toggle(isOn: $model.isFaviconsFetchingEnabled) {
+                VStack(alignment: .leading, spacing: 5) {
+                    Text(UserText.fetchFaviconsOptionTitle)
+                        .daxBodyRegular()
+                        .foregroundColor(.primary)
+                    Text(UserText.fetchFaviconsOptionCaption)
+                        .daxFootnoteRegular()
+                        .foregroundColor(.secondary)
+                }
+            }
+            Toggle(isOn: $model.isUnifiedFavoritesEnabled) {
+                VStack(alignment: .leading, spacing: 5) {
+                    Text(UserText.unifiedFavoritesTitle)
+                        .daxBodyRegular()
+                        .foregroundColor(.primary)
+                    Text(UserText.unifiedFavoritesInstruction)
+                        .daxFootnoteRegular()
+                        .foregroundColor(.secondary)
+                }
+            }
+        } header: {
+            Text(UserText.optionsSectionHeader)
         }
+        .onAppear(perform: {
+            model.delegate?.updateOptions()
+        })
     }
 
     @ViewBuilder
@@ -359,40 +351,3 @@ extension View {
         closure(self)
     }
 }
-
-
-public struct OptionsView: View {
-    @Binding var isFaviconsFetchingEnabled: Bool
-    @Binding var isUnifiedFavoritesEnabled: Bool
-
-    public var body: some View {
-        Section {
-            Toggle(isOn: $isFaviconsFetchingEnabled) {
-                HStack(spacing: 16) {
-                    Image("SyncFetchFavicons")
-                    VStack(alignment: .leading) {
-                        Text(UserText.fetchFaviconsOptionTitle)
-                            .foregroundColor(.primary)
-                        Text(UserText.fetchFaviconsOptionCaption)
-                            .daxBodyRegular()
-                            .foregroundColor(.secondary)
-                    }
-                }
-            }
-            Toggle(isOn: $isUnifiedFavoritesEnabled) {
-                HStack(spacing: 16) {
-                    Image("SyncAllDevices")
-                    VStack(alignment: .leading) {
-                        Text(UserText.unifiedFavoritesTitle)
-                            .foregroundColor(.primary)
-                        Text(UserText.unifiedFavoritesInstruction)
-                            .daxBodyRegular()
-                            .foregroundColor(.secondary)
-                    }
-                }
-            }
-        } header: {
-            Text(UserText.options)
-        }
-    }
-}
diff --git a/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncWithServerView.swift b/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncWithServerView.swift
new file mode 100644
index 0000000000..d95afd586b
--- /dev/null
+++ b/LocalPackages/SyncUI/Sources/SyncUI/Views/SyncWithServerView.swift
@@ -0,0 +1,78 @@
+//
+//  SyncWithServerView.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+import SwiftUI
+import DuckUI
+import DesignResourcesKit
+
+public struct SyncWithServerView: View {
+
+    @ObservedObject public var model: SyncSettingsViewModel
+    var onCancel: () -> Void
+
+    public init(model: SyncSettingsViewModel, onCancel: @escaping () -> Void) {
+        self.model = model
+        self.onCancel = onCancel
+    }
+
+    public var body: some View {
+        UnderflowContainer {
+            VStack(spacing: 0) {
+                HStack {
+                    Button(action: onCancel, label: {
+                        Text(UserText.cancelButton)
+                            .foregroundColor(.primary)
+                    })
+                    Spacer()
+                }
+                .frame(height: 56)
+                .padding(.bottom, 20)
+                Image("Sync-Server-128")
+                    .padding(.bottom, 20)
+
+                Text(UserText.connectWithServerSheetTitle)
+                    .daxTitle1()
+                    .multilineTextAlignment(.center)
+                    .padding(.bottom, 24)
+                VStack(spacing: 16) {
+                    Text(UserText.connectWithServerSheetDescriptionPart1)
+                        .multilineTextAlignment(.center)
+
+                    Text(UserText.connectWithServerSheetDescriptionPart2)
+                        .multilineTextAlignment(.center)
+                }
+            }
+            .padding(.horizontal, 20)
+        } foregroundContent: {
+            VStack(spacing: 8) {
+                Button {
+                    model.startSyncPressed()
+                } label: {
+                    Text(UserText.connectWithServerSheetButton)
+                }
+                .buttonStyle(PrimaryButtonStyle())
+                .frame(maxWidth: 360)
+                .padding(.horizontal, 30)
+                Text(UserText.connectWithServerSheetFooter)
+                    .daxFootnoteRegular()
+                    .foregroundColor(Color(designSystemColor: .textSecondary))
+            }
+        }
+    }
+}

From e8ee32c33c5587c59192500e04378e9629279fed Mon Sep 17 00:00:00 2001
From: Anh Do <18567+quanganhdo@users.noreply.github.com>
Date: Fri, 1 Dec 2023 09:51:34 -0500
Subject: [PATCH 34/40] Report macOS active/new user for netP (#2207)

---
 DuckDuckGo.xcodeproj/project.pbxproj                        | 2 +-
 .../xcshareddata/swiftpm/Package.resolved                   | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 8150dd7ae3..dc92af3630 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9207,7 +9207,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 87.1.0;
+				version = 87.2.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index c43fafde13..d1645a89c7 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "fe6b0097f2f03665475473f7e235eb891ddd2f16",
-          "version": "87.1.0"
+          "revision": "8e77b5a057d6f941a16218b27289554b60d44772",
+          "version": "87.2.0"
         }
       },
       {
@@ -156,7 +156,7 @@
       },
       {
         "package": "TrackerRadarKit",
-        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit.git",
+        "repositoryURL": "https://github.com/duckduckgo/TrackerRadarKit",
         "state": {
           "branch": null,
           "revision": "4684440d03304e7638a2c8086895367e90987463",

From c7f9c1673fe4215951d0d00d2a5f12e1dd1789f8 Mon Sep 17 00:00:00 2001
From: Sam Symons <sam@samsymons.com>
Date: Fri, 1 Dec 2023 08:05:46 -0800
Subject: [PATCH 35/40] Reset VPN waitlist T&C (#2212)

Task/Issue URL: https://app.asana.com/0/414235014887631/1206073390175555/f
Tech Design URL:
CC:

Description:

This PR adds a row to the VPN waitlist view controller to show the T&C status, and correctly resets it when resetting all data.
---
 DuckDuckGo/VPNWaitlistDebugViewController.swift | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/DuckDuckGo/VPNWaitlistDebugViewController.swift b/DuckDuckGo/VPNWaitlistDebugViewController.swift
index 6b3fa717ef..a206f38631 100644
--- a/DuckDuckGo/VPNWaitlistDebugViewController.swift
+++ b/DuckDuckGo/VPNWaitlistDebugViewController.swift
@@ -37,6 +37,7 @@ final class VPNWaitlistDebugViewController: UITableViewController {
         WaitlistInformationRows.waitlistTimestamp: "Timestamp",
         WaitlistInformationRows.waitlistToken: "Token",
         WaitlistInformationRows.waitlistInviteCode: "Invite Code",
+        WaitlistInformationRows.termsAccepted: "T&C Accepted",
         WaitlistInformationRows.backgroundTask: "Earliest Refresh Date"
     ]
 
@@ -45,6 +46,7 @@ final class VPNWaitlistDebugViewController: UITableViewController {
         case waitlistTimestamp
         case waitlistToken
         case waitlistInviteCode
+        case termsAccepted
         case backgroundTask
 
     }
@@ -128,6 +130,13 @@ final class VPNWaitlistDebugViewController: UITableViewController {
             case .waitlistInviteCode:
                 cell.detailTextLabel?.text = storage.getWaitlistInviteCode() ?? "None"
 
+            case .termsAccepted:
+                if NetworkProtectionTermsAndConditionsUserDefaultsStore().networkProtectionWaitlistTermsAndConditionsAccepted {
+                    cell.detailTextLabel?.text = "Yes"
+                } else {
+                    cell.detailTextLabel?.text = "No"
+                }
+
             case .backgroundTask:
                 cell.detailTextLabel?.text = backgroundTaskExecutionDate ?? "None"
             }
@@ -192,6 +201,9 @@ final class VPNWaitlistDebugViewController: UITableViewController {
 
     private func clearDataAndReload() {
         storage.deleteWaitlistState()
+        var termsAndConditionsStore = NetworkProtectionTermsAndConditionsUserDefaultsStore()
+        termsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted = false
+
         tableView.reloadData()
     }
 }

From 6030cc3cdcd9502a24688ed85756d2ff1ad45418 Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Fri, 1 Dec 2023 18:08:59 +0100
Subject: [PATCH 36/40] NetP: Fix list row colours (#2213)

---
 DuckDuckGo/NetworkProtectionInviteView.swift  | 23 ++++------
 DuckDuckGo/NetworkProtectionStatusView.swift  | 44 ++++++++-----------
 .../NetworkProtectionVPNLocationView.swift    | 27 +++++-------
 ...etworkProtectionVPNNotificationsView.swift | 28 ++++++------
 .../NetworkProtectionVPNSettingsView.swift    | 28 +++++-------
 5 files changed, 64 insertions(+), 86 deletions(-)

diff --git a/DuckDuckGo/NetworkProtectionInviteView.swift b/DuckDuckGo/NetworkProtectionInviteView.swift
index c45c98eb58..35b5d87af3 100644
--- a/DuckDuckGo/NetworkProtectionInviteView.swift
+++ b/DuckDuckGo/NetworkProtectionInviteView.swift
@@ -55,7 +55,7 @@ struct NetworkProtectionInviteView: View {
             )
             .frame(height: 44)
             .padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
-            .background(Color.textFieldBackground)
+            .background(Color(designSystemColor: .surface))
             .cornerRadius(10)
             .disabled(model.shouldDisableTextField)
             Button(UserText.inviteDialogContinueButton) {
@@ -104,25 +104,25 @@ private struct NetworkProtectionInviteMessageView<Content>: View where Content:
                     Text(messageData.title)
                         .daxTitle2()
                         .multilineTextAlignment(.center)
-                        .foregroundColor(.textPrimary)
+                        .foregroundColor(.init(designSystemColor: .textPrimary))
                     Text(messageData.message)
                         .daxBodyRegular()
                         .multilineTextAlignment(.center)
-                        .foregroundColor(.textSecondary)
+                        .foregroundColor(.init(designSystemColor: .textSecondary))
                         .padding(.bottom, 16)
                     interactiveContent()
                     Spacer()
                     Text(UserText.netPInviteOnlyMessage)
-                        .foregroundColor(.textSecondary)
+                        .foregroundColor(.init(designSystemColor: .textSecondary))
                         .daxFootnoteRegular()
                         .multilineTextAlignment(.center)
                 }
                 .padding(24)
                 .frame(minHeight: proxy.size.height)
-                .background(Color.viewBackground)
+                .background(Color(designSystemColor: .background))
             }
         }
-        .background(Color.viewBackground)
+        .background(Color(designSystemColor: .background))
     }
 }
 
@@ -137,14 +137,9 @@ extension AnyTransition {
     static var slideFromRight: AnyTransition {
         AnyTransition.asymmetric(
             insertion: .move(edge: .trailing),
-            removal: .move(edge: .leading))}
-}
-
-private extension Color {
-    static let textPrimary = Color(designSystemColor: .textPrimary)
-    static let textSecondary = Color(designSystemColor: .textSecondary)
-    static let textFieldBackground = Color(designSystemColor: .surface)
-    static let viewBackground = Color(designSystemColor: .background)
+            removal: .move(edge: .leading)
+        )
+    }
 }
 
 import NetworkProtection
diff --git a/DuckDuckGo/NetworkProtectionStatusView.swift b/DuckDuckGo/NetworkProtectionStatusView.swift
index 976bef8fa1..ab0698aa52 100644
--- a/DuckDuckGo/NetworkProtectionStatusView.swift
+++ b/DuckDuckGo/NetworkProtectionStatusView.swift
@@ -57,10 +57,10 @@ struct NetworkProtectionStatusView: View {
                 VStack(alignment: .leading, spacing: 4) {
                     Text(UserText.netPStatusViewTitle)
                         .daxBodyRegular()
-                        .foregroundColor(.textPrimary)
+                        .foregroundColor(.init(designSystemColor: .textPrimary))
                     Text(statusModel.statusMessage)
                         .daxFootnoteRegular()
-                        .foregroundColor(.textSecondary)
+                        .foregroundColor(.init(designSystemColor: .textSecondary))
                 }
 
                 Toggle("", isOn: Binding(
@@ -72,13 +72,13 @@ struct NetworkProtectionStatusView: View {
                     }
                 ))
                 .disabled(statusModel.shouldDisableToggle)
-                .toggleStyle(SwitchToggleStyle(tint: .controlColor))
+                .toggleStyle(SwitchToggleStyle(tint: .init(designSystemColor: .accent)))
             }
-            .listRowBackground(Color.cellBackground)
         } header: {
             header()
         }
         .increaseHeaderProminence()
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 
     @ViewBuilder
@@ -94,17 +94,17 @@ struct NetworkProtectionStatusView: View {
                 Text(statusModel.headerTitle)
                     .daxHeadline()
                     .multilineTextAlignment(.center)
-                    .foregroundColor(.textPrimary)
+                    .foregroundColor(.init(designSystemColor: .textPrimary))
                 Text(UserText.netPStatusHeaderMessage)
                     .daxFootnoteRegular()
                     .multilineTextAlignment(.center)
-                    .foregroundColor(.textSecondary)
+                    .foregroundColor(.init(designSystemColor: .textSecondary))
                     .padding(.bottom, 8)
             }
             .padding(.bottom, 4)
             // Pads beyond the default header inset
             .padding(.horizontal, -16)
-            .background(Color.viewBackground)
+            .background(Color(designSystemColor: .background))
             Spacer(minLength: 0)
         }
     }
@@ -129,8 +129,9 @@ struct NetworkProtectionStatusView: View {
                 )
             }
         } header: {
-            Text(UserText.netPStatusViewConnectionDetails).foregroundColor(.textSecondary)
+            Text(UserText.netPStatusViewConnectionDetails).foregroundColor(.init(designSystemColor: .textSecondary))
         }
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 
     @ViewBuilder
@@ -138,23 +139,24 @@ struct NetworkProtectionStatusView: View {
         Section {
             NavigationLink(UserText.netPVPNSettingsTitle, destination: NetworkProtectionVPNSettingsView())
                 .daxBodyRegular()
-                .foregroundColor(.textPrimary)
+                .foregroundColor(.init(designSystemColor: .textPrimary))
             NavigationLink(UserText.netPVPNNotificationsTitle, destination: NetworkProtectionVPNNotificationsView())
                 .daxBodyRegular()
-                .foregroundColor(.textPrimary)
+                .foregroundColor(.init(designSystemColor: .textPrimary))
         } header: {
-            Text(UserText.netPStatusViewSettingsSectionTitle).foregroundColor(.textSecondary)
+            Text(UserText.netPStatusViewSettingsSectionTitle).foregroundColor(.init(designSystemColor: .textSecondary))
         } footer: {
             inviteOnlyFooter()
         }
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 
     @ViewBuilder
     private func inviteOnlyFooter() -> some View {
         // Needs to be inlined like this for the markdown parsing to work
         Text("\(UserText.netPInviteOnlyMessage) [\(UserText.netPStatusViewShareFeedback)](https://form.asana.com/?k=_wNLt6YcT5ILpQjDuW0Mxw&d=137249556945)")
-            .foregroundColor(.textSecondary)
-            .accentColor(Color.controlColor)
+            .foregroundColor(.init(designSystemColor: .textSecondary))
+            .accentColor(.init(designSystemColor: .accent))
             .daxFootnoteRegular()
             .padding(.top, 6)
     }
@@ -176,7 +178,7 @@ private struct NetworkProtectionErrorView: View {
                 .daxBodyRegular()
                 .foregroundColor(.primary)
         }
-        .listRowBackground(Color.cellBackground)
+        .listRowBackground(Color(designSystemColor: .accent))
     }
 }
 
@@ -190,22 +192,14 @@ private struct NetworkProtectionServerItemView: View {
             Image(imageID)
             Text(title)
                 .daxBodyRegular()
-                .foregroundColor(.textPrimary)
+                .foregroundColor(.init(designSystemColor: .textPrimary))
             Spacer(minLength: 2)
             Text(value)
                 .daxBodyRegular()
-                .foregroundColor(.textSecondary)
+                .foregroundColor(.init(designSystemColor: .textSecondary))
         }
-        .listRowBackground(Color.cellBackground)
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 }
 
-private extension Color {
-    static let textPrimary = Color(designSystemColor: .textPrimary)
-    static let textSecondary = Color(designSystemColor: .textSecondary)
-    static let cellBackground = Color(designSystemColor: .surface)
-    static let viewBackground = Color(designSystemColor: .background)
-    static let controlColor = Color(designSystemColor: .accent)
-}
-
 #endif
diff --git a/DuckDuckGo/NetworkProtectionVPNLocationView.swift b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
index 717f295629..2708c23d49 100644
--- a/DuckDuckGo/NetworkProtectionVPNLocationView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNLocationView.swift
@@ -52,19 +52,20 @@ struct NetworkProtectionVPNLocationView: View {
                     }
                 }, label: {
                     Text(UserText.netPPreferredLocationNearest)
-                        .foregroundStyle(Color.textPrimary)
+                        .foregroundStyle(Color(designSystemColor: .textPrimary))
                         .daxBodyRegular()
                 }
             )
         } header: {
             Text(UserText.netPVPNLocationRecommendedSectionTitle)
-                .foregroundStyle(Color.textPrimary)
+                .foregroundStyle(Color(designSystemColor: .textPrimary))
         } footer: {
             Text(UserText.netPVPNLocationRecommendedSectionFooter)
-                .foregroundStyle(Color.textSecondary)
+                .foregroundStyle(Color(designSystemColor: .textSecondary))
                 .daxFootnoteRegular()
                 .padding(.top, 6)
         }
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 
     @ViewBuilder
@@ -89,9 +90,10 @@ struct NetworkProtectionVPNLocationView: View {
             }
         } header: {
             Text(UserText.netPVPNLocationAllCountriesSectionTitle)
-                .foregroundStyle(Color.textPrimary)
+                .foregroundStyle(Color(designSystemColor: .textPrimary))
         }
         .animation(.default, value: model.state.isLoading)
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 }
 
@@ -116,11 +118,11 @@ private struct CountryItem: View {
                 VStack(alignment: .leading, spacing: 4) {
                     Text(itemModel.title)
                         .daxBodyRegular()
-                        .foregroundStyle(Color.textPrimary)
+                        .foregroundStyle(Color(designSystemColor: .textPrimary))
                     if let subtitle = itemModel.subtitle {
                         Text(subtitle)
                             .daxFootnoteRegular()
-                            .foregroundStyle(Color.textSecondary)
+                            .foregroundStyle(Color(designSystemColor: .textSecondary))
                     }
                 }
                 if itemModel.shouldShowPicker {
@@ -134,7 +136,8 @@ private struct CountryItem: View {
                     } label: {
                         Image(systemName: "ellipsis.circle")
                             .resizable()
-                            .frame(width: 22, height: 22).tint(.textSecondary)
+                            .frame(width: 22, height: 22)
+                            .tint(.init(designSystemColor: .textSecondary))
                     }
                 }
             }
@@ -154,7 +157,7 @@ private struct ChecklistItem<Content>: View where Content: View {
             label: {
                 HStack(spacing: 12) {
                     Image(systemName: "checkmark")
-                        .tint(.controlColor)
+                        .tint(.init(designSystemColor: .accent))
                         .if(!isSelected) {
                             $0.hidden()
                         }
@@ -184,7 +187,7 @@ private struct MenuItem: View {
                         .if(!isSelected) {
                             $0.hidden()
                         }
-                        .tint(.textPrimary)
+                        .tint(Color(designSystemColor: .textPrimary))
                 }
             }
         )
@@ -192,10 +195,4 @@ private struct MenuItem: View {
     }
 }
 
-private extension Color {
-    static let textPrimary = Color(designSystemColor: .textPrimary)
-    static let textSecondary = Color(designSystemColor: .textSecondary)
-    static let controlColor = Color(designSystemColor: .accent)
-}
-
 #endif
diff --git a/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift b/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift
index 9d6897017f..e492c73000 100644
--- a/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNNotificationsView.swift
@@ -54,37 +54,35 @@ struct NetworkProtectionVPNNotificationsView: View {
             Button(UserText.netPTurnOnNotificationsButtonTitle) {
                 model.turnOnNotifications()
             }
-            .foregroundColor(.controlColor)
+            .foregroundColor(.init(designSystemColor: .accent))
         } footer: {
             Text(UserText.netPTurnOnNotificationsSectionFooter)
-                .foregroundColor(.textSecondary)
+                .foregroundColor(.init(designSystemColor: .textSecondary))
                 .daxFootnoteRegular()
                 .padding(.top, 6)
         }
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 
     @ViewBuilder
     private var authorizedView: some View {
         Section {
-            Toggle(UserText.netPVPNAlertsToggleTitle, isOn: Binding(
-                get: { model.alertsEnabled },
-                set: model.didToggleAlerts(to:)
-            ))
-            .toggleStyle(SwitchToggleStyle(tint: .controlColor))
+            Toggle(
+                UserText.netPVPNAlertsToggleTitle,
+                isOn: Binding(
+                    get: { model.alertsEnabled },
+                    set: model.didToggleAlerts(to:)
+                )
+            )
+            .toggleStyle(SwitchToggleStyle(tint: .init(designSystemColor: .accent)))
         } footer: {
             Text(UserText.netPVPNAlertsToggleSectionFooter)
-                .foregroundColor(.textSecondary)
+                .foregroundColor(.init(designSystemColor: .textSecondary))
                 .daxFootnoteRegular()
                 .padding(.top, 6)
         }
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 }
 
-private extension Color {
-    static let textPrimary = Color(designSystemColor: .textPrimary)
-    static let textSecondary = Color(designSystemColor: .textSecondary)
-    static let cellBackground = Color(designSystemColor: .surface)
-    static let controlColor = Color(designSystemColor: .accent)
-}
-
 #endif
diff --git a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
index 74a50a3c95..ee080da61b 100644
--- a/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
+++ b/DuckDuckGo/NetworkProtectionVPNSettingsView.swift
@@ -41,14 +41,15 @@ struct NetworkProtectionVPNSettingsView: View {
                             VStack(alignment: .leading) {
                                 Text(UserText.netPPreferredLocationSettingTitle)
                                     .daxBodyRegular()
-                                    .foregroundColor(.textPrimary)
+                                    .foregroundColor(.init(designSystemColor: .textPrimary))
                                 Text(viewModel.preferredLocation.title)
                                     .daxFootnoteRegular()
-                                    .foregroundColor(.textSecondary)
+                                    .foregroundColor(.init(designSystemColor: .textSecondary))
                             }
                         }
                     }
                 }
+                .listRowBackground(Color(designSystemColor: .surface))
                 toggleSection(
                     text: UserText.netPExcludeLocalNetworksSettingTitle,
                     footerText: UserText.netPExcludeLocalNetworksSettingFooter
@@ -61,12 +62,13 @@ struct NetworkProtectionVPNSettingsView: View {
                 Section {
                     HStack(spacing: 16) {
                         Image("Info-Solid-24")
-                            .foregroundColor(.icon)
+                            .foregroundColor(.init(designSystemColor: .icons).opacity(0.3))
                         Text(UserText.netPSecureDNSSettingFooter)
                             .daxFootnoteRegular()
-                            .foregroundColor(.textSecondary)
+                            .foregroundColor(.init(designSystemColor: .textSecondary))
                     }
                 }
+                .listRowBackground(Color(designSystemColor: .surface))
             }
         }
         .applyInsetGroupedListStyle()
@@ -80,30 +82,22 @@ struct NetworkProtectionVPNSettingsView: View {
                 VStack(alignment: .leading, spacing: 4) {
                     Text(text)
                         .daxBodyRegular()
-                        .foregroundColor(.textPrimary)
+                        .foregroundColor(.init(designSystemColor: .textPrimary))
                         .layoutPriority(1)
                 }
 
                 toggle()
-                    .toggleStyle(SwitchToggleStyle(tint: .controlColor))
+                    .toggleStyle(SwitchToggleStyle(tint: .init(designSystemColor: .accent)))
             }
-            .listRowBackground(Color.cellBackground)
         } footer: {
             Text(footerText)
-                .foregroundColor(.textSecondary)
-                .accentColor(Color.controlColor)
+                .foregroundColor(.init(designSystemColor: .textSecondary))
+                .accentColor(Color(designSystemColor: .accent))
                 .daxFootnoteRegular()
                 .padding(.top, 6)
         }
+        .listRowBackground(Color(designSystemColor: .surface))
     }
 }
 
-private extension Color {
-    static let textPrimary = Color(designSystemColor: .textPrimary)
-    static let textSecondary = Color(designSystemColor: .textSecondary)
-    static let cellBackground = Color(designSystemColor: .surface)
-    static let controlColor = Color(designSystemColor: .accent)
-    static let icon = Color(designSystemColor: .icons).opacity(0.3)
-}
-
 #endif

From ffa0cad205c04a2064695d127d9209eaa0ce3174 Mon Sep 17 00:00:00 2001
From: Graeme Arthur <garthur@duckduckgo.com>
Date: Fri, 1 Dec 2023 23:36:21 +0100
Subject: [PATCH 37/40] NetP: Remove port from server address (#2214)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Task/Issue URL: https://app.asana.com/0/0/1206056874665890/f

Description:

During the NetP iOS ship review, there was feedback that the server IP address labels should not feature the port. So now, rather than sending the host + port as the server address, I’m just sending the host.
---
 DuckDuckGo.xcodeproj/project.pbxproj                          | 2 +-
 .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index dc92af3630..195ab22dfd 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -9207,7 +9207,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 87.2.0;
+				version = 87.3.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index d1645a89c7..ab1dc5d3b8 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "8e77b5a057d6f941a16218b27289554b60d44772",
-          "version": "87.2.0"
+          "revision": "9228f64c71e1f2ed76792482f1cfaca6ff9eb5e2",
+          "version": "87.3.0"
         }
       },
       {

From 08b34f88c7dee620aedc7881ecc29f68fb1751d1 Mon Sep 17 00:00:00 2001
From: Sam Symons <sam@samsymons.com>
Date: Sun, 3 Dec 2023 22:20:40 -0800
Subject: [PATCH 38/40] NetP waitlist final touches (#2209)

Task/Issue URL: https://app.asana.com/0/0/1206027185389966/f
Tech Design URL:
CC:

Description:

This PR makes some final touches for the NetP waitlist, including:

Adding RMF support
Adding pixels
Updates NetP to only be visible to US users (unless they're internal)
Recording the date at which the user activated NetP, in order to show messages remotely if necessary
---
 Core/PixelEvent.swift                         |  16 ++++
 DuckDuckGo.xcodeproj/project.pbxproj          |  12 ++-
 .../xcshareddata/swiftpm/Package.resolved     |   4 +-
 DuckDuckGo/AppDelegate+Waitlists.swift        |   7 ++
 DuckDuckGo/AppDelegate.swift                  |   1 +
 .../Contents.json                             |  12 +++
 .../RemoteMessageVPNAnnounce.pdf              | Bin 0 -> 15349 bytes
 DuckDuckGo/HomeMessageViewModel.swift         |  16 ++++
 .../NetworkProtectionAccessController.swift   |  31 ++++++-
 DuckDuckGo/RemoteMessaging.swift              |  39 ++++++--
 DuckDuckGo/SettingsViewController.swift       |   4 +
 DuckDuckGo/SurveyURLBuilder.swift             |  86 ++++++++++++++++++
 .../VPNWaitlistActivationDateStore.swift      |  82 +++++++++++++++++
 ...listTermsAndConditionsViewController.swift |   4 +
 DuckDuckGo/VPNWaitlistViewController.swift    |   4 +
 .../RemoteMessagingStoreTests.swift           |   4 +-
 ...etworkProtectionPacketTunnelProvider.swift |  13 +++
 17 files changed, 316 insertions(+), 19 deletions(-)
 create mode 100644 DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/Contents.json
 create mode 100644 DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/RemoteMessageVPNAnnounce.pdf
 create mode 100644 DuckDuckGo/SurveyURLBuilder.swift
 create mode 100644 DuckDuckGo/VPNWaitlistActivationDateStore.swift

diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift
index 5d6a1e3494..0365fca0f8 100644
--- a/Core/PixelEvent.swift
+++ b/Core/PixelEvent.swift
@@ -367,6 +367,14 @@ extension Pixel {
 
         case networkProtectionUnhandledError
 
+        case networkProtectionWaitlistUserActive
+        case networkProtectionSettingsRowDisplayed
+        case networkProtectionWaitlistIntroScreenDisplayed
+        case networkProtectionWaitlistTermsDisplayed
+        case networkProtectionWaitlistTermsAccepted
+        case networkProtectionWaitlistNotificationShown
+        case networkProtectionWaitlistNotificationLaunched
+
         // MARK: remote messaging pixels
 
         case remoteMessageShown
@@ -876,6 +884,14 @@ extension Pixel.Event {
         case .networkProtectionMemoryCritical: return "m_netp_vpn_memory_critical"
         case .networkProtectionUnhandledError: return "m_netp_unhandled_error"
 
+        case .networkProtectionWaitlistUserActive: return "m_netp_waitlist_user_active"
+        case .networkProtectionSettingsRowDisplayed: return "m_netp_waitlist_settings_entry_viewed"
+        case .networkProtectionWaitlistIntroScreenDisplayed: return "m_netp_waitlist_intro_screen_viewed"
+        case .networkProtectionWaitlistTermsDisplayed: return "m_netp_waitlist_terms_viewed"
+        case .networkProtectionWaitlistTermsAccepted: return "m_netp_waitlist_terms_accepted"
+        case .networkProtectionWaitlistNotificationShown: return "m_netp_waitlist_notification_shown"
+        case .networkProtectionWaitlistNotificationLaunched: return "m_netp_waitlist_notification_launched"
+
         // MARK: remote messaging pixels
 
         case .remoteMessageShown: return "m_remote_message_shown"
diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj
index 195ab22dfd..e82c09e6e9 100644
--- a/DuckDuckGo.xcodeproj/project.pbxproj
+++ b/DuckDuckGo.xcodeproj/project.pbxproj
@@ -289,12 +289,15 @@
 		4B6484F327FD1E350050A7A1 /* MenuControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B6484E927FD1E340050A7A1 /* MenuControllerView.swift */; };
 		4B6484FC27FFD14F0050A7A1 /* WindowsBrowserWaitlistTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B6484FB27FFD14F0050A7A1 /* WindowsBrowserWaitlistTests.swift */; };
 		4B75EA9226A266CB00018634 /* PrintingUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B75EA9126A266CB00018634 /* PrintingUserScript.swift */; };
+		4B78074E2B183A1F009DB2CF /* SurveyURLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B78074D2B183A1F009DB2CF /* SurveyURLBuilder.swift */; };
 		4B83396C29AC0701003F7EA9 /* AppTrackingProtectionStoringModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B470EE2299C6DD10086EBDC /* AppTrackingProtectionStoringModel.swift */; };
 		4B83396F29AC1437003F7EA9 /* AppTrackingProtectionListModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B83396E29AC1437003F7EA9 /* AppTrackingProtectionListModelTests.swift */; };
 		4B83397129AC18C9003F7EA9 /* AppTrackingProtectionStoringModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B83397029AC18C9003F7EA9 /* AppTrackingProtectionStoringModelTests.swift */; };
 		4B83397329AFB8D2003F7EA9 /* AppTrackingProtectionFeedbackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B83397229AFB8D2003F7EA9 /* AppTrackingProtectionFeedbackModel.swift */; };
 		4B83397529AFBCE6003F7EA9 /* AppTrackingProtectionFeedbackModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B83397429AFBCE6003F7EA9 /* AppTrackingProtectionFeedbackModelTests.swift */; };
 		4B948E2629DCCDB9002531FA /* Persistence in Frameworks */ = {isa = PBXBuildFile; productRef = 4B948E2529DCCDB9002531FA /* Persistence */; };
+		4BB697A42B1D99C4003699B5 /* VPNWaitlistActivationDateStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B78074B2B1823C5009DB2CF /* VPNWaitlistActivationDateStore.swift */; };
+		4BB697A52B1D99C5003699B5 /* VPNWaitlistActivationDateStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B78074B2B1823C5009DB2CF /* VPNWaitlistActivationDateStore.swift */; };
 		4BB7CBB02AF59C310014A35F /* VPNWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB7CBAF2AF59C310014A35F /* VPNWidget.swift */; };
 		4BBBBA872B02E85400D965DA /* DesignResourcesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 4BBBBA862B02E85400D965DA /* DesignResourcesKit */; };
 		4BBBBA8D2B031B4200D965DA /* VPNWaitlistDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBBBA892B031B4200D965DA /* VPNWaitlistDebugViewController.swift */; };
@@ -1326,6 +1329,8 @@
 		4B6484E927FD1E340050A7A1 /* MenuControllerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuControllerView.swift; sourceTree = "<group>"; };
 		4B6484FB27FFD14F0050A7A1 /* WindowsBrowserWaitlistTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowsBrowserWaitlistTests.swift; sourceTree = "<group>"; };
 		4B75EA9126A266CB00018634 /* PrintingUserScript.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrintingUserScript.swift; sourceTree = "<group>"; };
+		4B78074B2B1823C5009DB2CF /* VPNWaitlistActivationDateStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNWaitlistActivationDateStore.swift; sourceTree = "<group>"; };
+		4B78074D2B183A1F009DB2CF /* SurveyURLBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurveyURLBuilder.swift; sourceTree = "<group>"; };
 		4B83396E29AC1437003F7EA9 /* AppTrackingProtectionListModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionListModelTests.swift; sourceTree = "<group>"; };
 		4B83397029AC18C9003F7EA9 /* AppTrackingProtectionStoringModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionStoringModelTests.swift; sourceTree = "<group>"; };
 		4B83397229AFB8D2003F7EA9 /* AppTrackingProtectionFeedbackModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingProtectionFeedbackModel.swift; sourceTree = "<group>"; };
@@ -3499,6 +3504,8 @@
 				4BBBBA8B2B031B4200D965DA /* VPNWaitlistView.swift */,
 				4BBBBA8A2B031B4200D965DA /* VPNWaitlistViewController.swift */,
 				4BCD146A2B05C4B5000B1E4C /* VPNWaitlistTermsAndConditionsViewController.swift */,
+				4B78074B2B1823C5009DB2CF /* VPNWaitlistActivationDateStore.swift */,
+				4B78074D2B183A1F009DB2CF /* SurveyURLBuilder.swift */,
 			);
 			name = VPN;
 			sourceTree = "<group>";
@@ -6214,6 +6221,7 @@
 				02025AEB2988229800E694E7 /* Utils.swift in Sources */,
 				02025AEC2988229800E694E7 /* AppTrackingProtectionPacketTunnelProvider.swift in Sources */,
 				02025B1029884DC500E694E7 /* AppTrackerDataParser.swift in Sources */,
+				4BB697A52B1D99C5003699B5 /* VPNWaitlistActivationDateStore.swift in Sources */,
 				EEFC6A602AC0F2F80065027D /* UserText.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -6243,6 +6251,7 @@
 				8528AE81212F15D600D0BD74 /* AppRatingPrompt.xcdatamodeld in Sources */,
 				1E24295E293F57FA00584836 /* LottieView.swift in Sources */,
 				8577A1C5255D2C0D00D43FCD /* HitTestingToolbar.swift in Sources */,
+				4BB697A42B1D99C4003699B5 /* VPNWaitlistActivationDateStore.swift in Sources */,
 				853C5F5B21BFF0AE001F7A05 /* HomeCollectionView.swift in Sources */,
 				3132FA2627A0784600DD7A12 /* FilePreviewHelper.swift in Sources */,
 				9820FF502244FECC008D4782 /* UIScrollViewExtension.swift in Sources */,
@@ -6317,6 +6326,7 @@
 				F1386BA41E6846C40062FC3C /* TabDelegate.swift in Sources */,
 				C1B924B72ACD6E6800EE7B06 /* AutofillNeverSavedTableViewCell.swift in Sources */,
 				020108A929A7C1CD00644F9D /* AppTrackerImageCache.swift in Sources */,
+				4B78074E2B183A1F009DB2CF /* SurveyURLBuilder.swift in Sources */,
 				3132FA2A27A0788F00DD7A12 /* QuickLookPreviewHelper.swift in Sources */,
 				C1D21E2D293A5965006E5A05 /* AutofillLoginSession.swift in Sources */,
 				4B53648A26718D0E001AA041 /* EmailWaitlist.swift in Sources */,
@@ -9207,7 +9217,7 @@
 			repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
 			requirement = {
 				kind = exactVersion;
-				version = 87.3.0;
+				version = 88.0.0;
 			};
 		};
 		C14882EB27F211A000D59F0C /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index ab1dc5d3b8..7eea215cbe 100644
--- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -15,8 +15,8 @@
         "repositoryURL": "https://github.com/DuckDuckGo/BrowserServicesKit",
         "state": {
           "branch": null,
-          "revision": "9228f64c71e1f2ed76792482f1cfaca6ff9eb5e2",
-          "version": "87.3.0"
+          "revision": "7b35b4c604f1cf17b48aabf72526b15a2fdcc6ce",
+          "version": "88.0.0"
         }
       },
       {
diff --git a/DuckDuckGo/AppDelegate+Waitlists.swift b/DuckDuckGo/AppDelegate+Waitlists.swift
index 83f5a84a24..d228ec680b 100644
--- a/DuckDuckGo/AppDelegate+Waitlists.swift
+++ b/DuckDuckGo/AppDelegate+Waitlists.swift
@@ -18,6 +18,7 @@
 //
 
 import Foundation
+import Core
 import BackgroundTasks
 import NetworkProtection
 
@@ -42,6 +43,10 @@ extension AppDelegate {
 
 #if NETWORK_PROTECTION
     private func checkNetworkProtectionWaitlist() {
+        if AppDependencyProvider.shared.featureFlagger.isFeatureOn(.networkProtectionWaitlistAccess) {
+            DailyPixel.fire(pixel: .networkProtectionWaitlistUserActive)
+        }
+
         VPNWaitlist.shared.fetchInviteCodeIfAvailable { [weak self] error in
             guard error == nil else {
 #if !DEBUG
@@ -89,6 +94,8 @@ extension AppDelegate {
             do {
                 try await NetworkProtectionCodeRedemptionCoordinator().redeem(inviteCode)
                 VPNWaitlist.shared.sendInviteCodeAvailableNotification()
+
+                DailyPixel.fire(pixel: .networkProtectionWaitlistNotificationShown)
             } catch {}
         }
     }
diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift
index 4e626e307d..92b00ee2e1 100644
--- a/DuckDuckGo/AppDelegate.swift
+++ b/DuckDuckGo/AppDelegate.swift
@@ -845,6 +845,7 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
 
             if identifier == VPNWaitlist.notificationIdentifier {
                 presentNetworkProtectionWaitlistModal()
+                DailyPixel.fire(pixel: .networkProtectionWaitlistNotificationLaunched)
             }
 #endif
         }
diff --git a/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/Contents.json b/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/Contents.json
new file mode 100644
index 0000000000..cbe62e069c
--- /dev/null
+++ b/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "RemoteMessageVPNAnnounce.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/RemoteMessageVPNAnnounce.pdf b/DuckDuckGo/HomeMessage.xcassets/RemoteMessage/RemoteMessageVPNAnnounce.imageset/RemoteMessageVPNAnnounce.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2e31d6e5ae561f6dee47d54a3eec79ec0e4d5458
GIT binary patch
literal 15349
zcmeI(TaTnybq3)3`W1D91d*otJ0B!uDL#Nuf*^J-kWem$cH0aZPn(%`g!Ak3y!-oV
zS9Q;T+Y!o@TgcR`+NX7X*V?;&_WMtN^`bq^heLa8j`x51%i(zZ<u8vn|M~s5cgLGQ
z{O(VGxx0Np^LO*_cW=Ia`17$d@bjJY>$msceS0;b{CoSZ%-JS>VZFC6-@N<w<=eYA
zx8J|_{cnyBZ@;^HME>ZbeTOf;`_n@?%dhU=ezVg)zk7H8-P_x{cV*|#{`T<eFCJb#
z+-?7A%m3ZJJT|AP$=~s#kGB8qvp@d${%^-W`nr7ETt2MRnKTXOPyc0-v%GtFd-w92
z!(R_KpS8!Y-yPcX_jQ#Q^;7+>?@rC!cSCpV)>AjkYd0Qmzd1CgVVIk7weh$NeLMKD
zPDs=7-R+x0H=mYfY=`l<FWIigZw`HP>ZWz=hU0MR$Ej`mW8a>pd0Lv`xSslDUApFq
z)DEY4?Aoq9-X1Ok+u4cQVHz`XX#1%dkFD9=+V{)R9&0-eLx1diyUxS9WcFwq1B{$c
z)3OZ9bnKVYIxMTz+wRoj1&{rDnuoSsmgAVMn;El*5Z7^-Tg1Md=H40C)6&n&6i$|T
zTpJrBO-nb;NJHPXV`u6>pq3`54#(p_k+vnxxt~dF-=d#REol@XUUuzHgVo06GVXOG
zxU|i3O^jN`X<A3)hGm||_V^*`-yZ&a`0DWH@E?c6-J36WQ}8L?a)>u<ZZo!BzAx0i
zQh&giDE}vC`f<+0T3AirGm;;4rgk~?)5^Y&FFNklwQV=?Cgf&m`j(F|^=V?>P0V}U
ztmZ}6ofyirPLGI!!oKg}dMtnKhM}F0uOE@u)7tQ_?$}Notnb(U_+s<Kj>+@SZr~47
zA&v%&6QghY)4(1XeZ~&+GV*>thSrD=A@<A6xsGjHPm9=%3-_|XeCpSs?G{7X^vch;
z*Qr~(zHKnOSe`r*a`x!=q8m?qzALkdXdIg%(n6huEM9-&U9Dpj+S+vde~&zN$+(S{
zy_a!p3F3;1p>dtF`irhV&0RMQg2som@(;Z%ZnAq>KUXi~x6eyi(?8YAenf8C6KF|E
ze_#rib6nEn(@!^lXpe~>dyakj_5SbkAs&By^CTG#=VVxu(ue0gU8Va!&g;v(kAHi-
z`R#YFA6|X?`uk+h$E$zfU&*Qols|6b2Ub3lZvGib{^qkTxjy>%^j`E&_U{Yjvtj$9
z+rIcfT8PE%2HRA7mA9_!^^t8zkWqP+)>B1JXN5GUzIbjO`B<DcjuuH4{L}s8kyXjC
z#XlZ7K6}m00G_k^6;Av6yBB@>&pEHk=vNZl0VyQ4Np4TgH=o}9_p95x&wu^#@slqO
zSO2<wcR_GK?>PcqVqyJMzg&W&GVllo`P6oM+8O)&iK9<H1j7l6odg0DZ5XtbbKo}6
zOX%%S%bGv=VmP%UVnQ?swT$!rVF(f`UuB6hyb16#R%i#S%CaK*w$a>KOQ7|wlr_pn
zmdea7tM|u>Yx^_Lm2!LNPV=VxN`szk;|w^qkSqy-<-}L}WnOEZGt_gvMr$&@zns23
zEnzH&**TOu5GEk<EQi}bVh3#_hl1H#{4}TbObcVOPSs9j?21x&Xvn70Dr3ys0`Ta@
z7%A8NcE;AE-t)OO#+sa=o_=F2$oS0R{?&rA%VAr9+#{P^UfV`=7TFAh39WC8p*dh=
zljH2CullK!=z4efN~7sb${S+~G=H{-x?kq)c2mz48;KHVww}IPVCAsdX_dq6#h$CY
zUZcg#*!ad61b$^eJ7bkn8M{4P(RRi*GgBOGjFIyD{&PVGiNYl=KhuNZzHay6<@p}0
z(pWo4%TZJwP1Et<X_I?unPu2LcsfCDU=7;3S?Ts+ZipjaDb%*%O9T|f0YH&xmIaHp
zjZ`I(Xy@BuKr8ZFxY4pX;Ci-@;Z%5O)O@?msFc`b{&AtPhl#~ER+{3%ibXJNU7exs
z7Yk|4bB21ZScnoSWm-KwE6rLd>vj(J_^@8&5U-n6mR(}TF0XiS;!mN4F^g6cu8dt#
z3J;OZ6|FD^H9^qi7B<3Ii3R(9d&G$6*K=)*(OJB1KmEoSW-Eu=SIdgB%VAq!DmC+2
zUK?YS64}fw9!}pFL*qSBdg{lbjSgkkPo+dZLGScaX^LT{Q3Mjklqc05>VC12m>Heb
zbHzrY1e&d<uNGK2tae)EaC@lsT;=r|EoN2{MHo}0SEJe)o3ANVKUbp)W9@EcOSB)x
zs##zA&tnfRIO>@mTq8zTr2A6}j<U8i^HT~=L+7UyT(HIeYYHwEP=(1gWPhLyx{8}y
z{L^m}2A}7@+72acpMz#20R!93gnFUXec%78E^w7lG`ff0VJxt()SbaW9bPGcg!}MH
zs~_I~sxFX3v?GqXO&wkjT!&Z6;{Z86yUpB|!X){{CxU*ie2Y%5WEuHtnqDQUt1sXG
zsy%1AEBS(lXQk~cNlN7p;@tPElme5t;gwcD)RiiwE)d|dFIrDkhgWIV;gxbN-)9-_
zSof(PO2@HV^$yd%*A~}n^8wKFv9#|s>+0e552fEYb-LqMP+u<Fzm_xS^zV)r(q$1s
zsspvn_Ej#QuD-1sUueM)?=4;ha#`g<s*7A{wXRV=d|-Sf{b(^?j;jINYG1-~vBgqg
zr^0p*vB`Ull-nX^w*$L9>D4yNq}3`wxN#ZQc7bFr)ULvZxQF@R+J!c|gDH~<x(-x2
zjqO}2^b3&-&rK`uI&Z&%p=Z>W`k4K-@O5kf(6wUVC=-OQRLF?ytnGSKi@34r6v%95
zSsT|cNY!2#h)WeyDH<QcB(wEh*BN#dS7kdgg6ZqbNbt->CH7juL$j=kJ-ZHL>(*yT
z-@CAT5&DJ3u>vMja$JoZw6FU`+qc~MbP%a^w0iOB#>st2-8$6C@^j=njg7W%My_o`
zG@*4qD1bv7z<INUu4!uByFke~n+}KBFzT{0gk$z@#|5yw=yT9H?+2B|6|LMBy=M=v
z>%GlipLbzLDD7Ah%<3Mh*V)-DQ4Qsuj=X2g!Q<}9mW9t3OLQI4I?$%w(P_1FSmLBS
z)@lb%EZR*8%DwViPlIugTHh?WY15@2#Spwoj%zy&`VRDfI_tk{1k-0UwvAl-MbUs}
z!6~<R##Nd-h`~DB?49ZkK^MS@vij_HPyNHDQ1F&?yt-<%i~9~Yf9#UkqNcJ()q0>j
zrwDCoS5PZFOg+^X8tZnS(u3tLFiKr(WUl*Iai}g6lz-u2!udwyIZk<Xa^p7IW`EN{
zm}T}x9n!y8a~EUpF86h+EOs$tp{zqUqk9xK;4YANXExUxn~|pvX;VytaE(WohYg!W
z8=HR4id|%`$joe7bqUL6ot%BrWO{yU(^AxtKAZPWUTH<<O~<(Dq*BSk6;GGF(MG_7
z%-x()=t7HV#B2tcFR_CCDs)=LCf4M(mH5pb)NxBcDSzWbi=G?*oHXf%o?V#Di#ivi
zMk@XED%8hl9KI!?(E3?;iY2BA;QBPQaY$$~JLiS9bQ{Q5*hxI&)$YXHHnVP*%wz0$
zc4N#k&`70kM)p_s9&|<B`ldfRaSD5DHt?R@M=NUwA~%~BrAxYtbPX(3whW}e<#I(D
zL({wCa$VL=u8fMz1>s(?>lUeVo-|Zv&AeQX+Z&Zm{43O1&r-!NbGjeyd223<T_3CO
z(RxBz3vKL&G{DMiSMIsZW?^kFRNLEm-7m8svKaf^T;~QbH|6|=-MEMAwJyyje>p-F
zMokMqd`x~3*4PzV>xMGt8MNkxHL+JGx$6PSZSQtv=cp`@W?4oq^xVDiJLkbyT7@FF
zK(mIM;(>`6_C}@S#Dq}Y(wQwd&HS1yLMuKN8qFkPRNCz!3bi3oR-#4#8ab2MAji^;
z8@j>4Z6QNWqfKl~qElCiljjA-5yI-`zKko|isO6q$<#v1-5>{89*v9rYm?Hmah*Hb
zw63MZl_4WZqpa1gv07XfFX9gpV)`zt6j98EeK?gSj=Wmzi^ubj63cYdwuBXvb(v{B
znQ3s%d+n!}1IHEi17i%Uyk_@j_$(chF1N;rl)fxZMF0cSBe7!Fjej65TI#}lLLlkL
z7?E8=qB2?HZ|9A}c#L5Q+R}mGEWBEcn8eY|1IMnDB#HodRWC?!>TVHfeIh7#siLsE
zVedldU63_Hxb>iefAK0)D;hvtSg|H+`f?N`bmty+r8~lqQ8dWoY4~<o>?m+o)65u)
z12o;3$15tEh)2IFo+1sDwqPr1aU<?H_e9*`ViBnMXgqIp2c4Y8$OJPJm|fH6wwir5
zg56XaiGn$o=LC*Pqd3fEJPz5rXii><Ea|`{H6f*MRwOa<9?{EcEN5XnHXSC>cAMJE
zQEnDUED^%VZ7~5kHdB`_P|AMHMw(2%Ty`HVUAH(&aGbqdg?9{9Rt_om6t+N0ZYLb1
zV22WzoYNzgd<~CEwho*Oy9xwI<R<ur<UJ2lLE@&dp%Rt6=$Sx2&MV;MzygP4B<#S%
zLnDkv`qL=-pX&)J+*ID<EsR?l@u9(nao*Etz`_(x7nzh$nyn-T%(V0x3p3SA9M~;x
zB-}(foU$LhiAig++&9FqU{WEIf?F|Gur^h~5Bh0&*6QH1sm$4N<qRMQqzSlTP2LXC
zS0ynfg6+YATu`0IMd%(!O>vH4;U=+gfj}5cOcGC6kg48D2%l0SVkfC_2_P66Q3fOJ
zyC!rL$W%!sW9d|{qDUq3E0KQR0>Y39k`?V<n(?u7fxuL$37`?`xwwi=MoC77Z)F+J
zsGzqzR{~CQ_72I(xoM^*I}Tohg&6E-oFu_qDImVNiK!mAl1vS{Z)TyO5|d$Rl_ro_
zWWaEeA;+CUlEpV<z{CL6I5FFq90i78oCOes1{>wN4$TXYg`#)|oX6U?GcWNTMnf9>
zIfoV>nuYe0(dWEGDKz8qRs=>6#n@hEdtB8zQu)4N8eF5GLsbrK5q^`r652uzBp4I~
zUb9<x$|;j;IW7qgK}QL?wn;@3^~(>Tu@m-e$K3PyWJR+@Tc{)Z;9Er)d}8%Ujx4l1
zvQcMBf$w4W)UUxCLRpYSa=!dO!1Qrgu`Wq5S>0xWt*q_rK`UHm(;~T^^KPYalpuZ3
zq~O@gNacCFJ+pfTR5V4Zf?J`<@&#AR+MUNW4g|&u0kVO!OAFh(y$S9RE16{jXcLgg
zu0jCyZ0v}fAaGaIgwqrHI5myraS*$a>9NXflW{^*VhQD21O>R*D7Q|6OVP){<sn#E
zSc^*J5{mec$ciX~LuJ8a7M>%2l4MM<#8E~hEBP#?PhM)peN-LlO^Z)PNjprf<h{9M
zwB&DqoaX@n>{RjsW;ZWq#?Yj+d__t^*;9HQ7fw?&lmO)llQ3C0=S)SRG!q_`4uU5~
z%?)STC?Jz!CalAhMe1AvE&;tHZKzQ!!pu`%BLWbir+Ds>O{BMZGbW{W?$3(@fZKM&
z91(B;TK2?qNca;Z^JJ@-NUqk1h;!i-oB~RW1PMxpqqT%b`ZHU_9@k7{6N|tOsYuV0
zxJodxv@?Y&DT}TdDbDTXCD_f59@A=hc^O$;T$NQgQ=%;LPy&R<ok_zaDV7BM0|cIv
zZb5|>RBY@G4~=Y<Qb(GSx`Y=Jh)|QS%gMZSEiSeM?&Rc>yc`><+59DsYq=Y^6$p*C
z;WxBB-&|-VSIL<w+N+Vw(!tV};3vXMG9DTjM&AjMS`A5gX1lahL8n9k&=vB6xlhaL
z!plf|Yf3<v{E`zvHC#gM5j{+{3q7P55lW$00kpzS+pTE<1a<Gw8TZv}FGNv~=%_U~
zR11oqGfdFT{vR;1;(igmz&#s4a><?oS#Y+jk@O*Vq&jwd=1BG>Q?Mhd6m$BmBnylY
z=?kKYWaYPVOPxSe1UI#_q`~c2fj5$29h?Gz016>JCb9`otzcWHhN2Op?^$ascjJLB
zqBCiz;>j&s&W$jfsf6J9u=VhnXE@+fx=1#OAT3a2`#!UgK@upth+FAis7qDfVi0wv
zG~+_DX?ifl3F3e$EHD7L$1xlcAj-`#tVh@d_Moc4T7oYQnAgiO^A-@=9B|bjOZEbz
z76DG+wj$WMwFXgV6_)^NZ)ZzZLd#G&%_;L_Qf>?glYmPpA!2o$k`t7U962W>tB0tg
z7(y~c3DXj6u>6Pkjy%5lm-3i74=JW658R&B7hkw0DR5!QQTZ*hm4+=R^;gj6;}7Lo
zJ0}(SI8P9SPG8Z1C>BV2Mbztv)p78sT)PdINeB@Ul`s9+mWW(>gj5hBBS?{TA%UVm
ze?(cQ(&EHt3Q#6gg-wCSU@!Mj6yZtOO3jjBqy|V)B&`a^k4U5~V1~3$y*;Ei3zuvc
zFy5jkcR!-B4&G|L^JFnVa4%3LAxmf_g34T8Ep$S?=zkFcgr)}uvs~oI9GPk`eHAI=
zcwf%xgNi3j$<wg8D%pN{k*41eMk_7v3!*yZOr=2z3QKNYo?WlylD|^GSMM;`WF5sB
z8|g4UzOUqPt7pu4&9d)TDIEKJu1bq4dcj6es<f1LGHiLzvaMbzs>$;iu4n>TPFh#0
z+|>OlB_2UDA{ib<Sa1wx-CmY!iV6=n(pt)e5B%skO(-jjmY)|0i!qu?Ny)8+CQn>w
z#keHgv=PrUoox10n!BD?PnBu?%-hcZ$I8hX2rM;`CxvHTp{T4@fdH73Q}@jaC5ccJ
zFJ`~ZgMJ0CEowyZ?my~Pg5YE)<2(%C`vf7mS;*^xtC>|gV1*Wgg#NnNe160s^3W<D
z_UhXr8%d<|TMRy2XI}Ai6@Q-l{v#cO{1uQ{+WZMPHCDa<Aps{rzf1~@EFW~`B@e}F
zx<ES(j+#LEq%L@{0IndAyxW(|lq1Eu`6HO>YC;vKRhC-iygFzqg95OXl5(BeO4WBB
zRgYNSNN(qnNC`ilFYtF7HpErF!RPryrNpkv@T*bv%eqpf)CI0uK>NA!JB2z9KQJhu
zV+pNuWsJP0YZ^o#5UZ9_>?<=s!=z!h4W{MQnqV@6MZuv`VoHx)qE+sdlIT#{l*!)v
zC=pO7hq~%YHkQhy<9)xReIKP!c)6ZRQrM(dPhKgNztU{mMgcDBHNf-r<=x?jXjNxd
z<95v^%Q0)vc-OwXn`kF*#Ez<s;8A7(OsXY`cN&eFFV)(rY%1kZK7OV@%vHOU_aAnL
zl%JbSlq=hZxX@EtYy(8jlfgQ!S_|Bv#0J7DMR~EUb!BID(JMQvi(Y-$Pf>^0McG+B
zY$Xb!V&;?W1G=~U>$(?GUD$ecTs^S$DzWl)*`hLkIZ7oJo&CMvgXJ;$_V7Qyg}eMB
zO!7K^k@xxk`sU63!@J`j^ZP=7`|mA(|MKhoXOK6)z5DXj%OCqo#jJGsaU?yRe?)Tg
z$^Dy$yEk^s3;Oe~H-DesV?HQicG}fL`$F6J$Z`Me)t3&dHps~1`Ou%-f0ya+vG8vD
z(d7BjzO;4CdYF87+4REwCodmfzP|tZ@#Md~z5D8r$bZ;0o&O$H*+3`y{+Dy*@A&3S
z%Khe3l6vDY2~K`GN;~rDDAgeb@>iGd@)q?8DFyx`68z7Lo|3@HC!{oLpOA86dnP@+
zefjG3-P=Rd@S9I5;pgw}zq$Lx@#n9;{Kck;o6qm>sUcD>n!Wkr)&JZ@V)Xg$;pN+h
SBE!6KT@OF|*=N7|)&Bw;x74u!

literal 0
HcmV?d00001

diff --git a/DuckDuckGo/HomeMessageViewModel.swift b/DuckDuckGo/HomeMessageViewModel.swift
index a64579cfdd..1f5a81b56a 100644
--- a/DuckDuckGo/HomeMessageViewModel.swift
+++ b/DuckDuckGo/HomeMessageViewModel.swift
@@ -137,6 +137,22 @@ struct HomeMessageViewModel {
         case .url(let value):
             return {
                 LaunchTabNotification.postLaunchTabNotification(urlString: value)
+                onDidClose(buttonAction)
+            }
+        case .surveyURL(let value):
+            return {
+#if NETWORK_PROTECTION
+                if let surveyURL = URL(string: value) {
+                    let surveyURLBuilder = DefaultSurveyURLBuilder()
+                    let surveyURLWithParameters = surveyURLBuilder.addSurveyParameters(to: surveyURL)
+                    LaunchTabNotification.postLaunchTabNotification(urlString: surveyURLWithParameters.absoluteString)
+                } else {
+                    LaunchTabNotification.postLaunchTabNotification(urlString: value)
+                }
+#else
+                LaunchTabNotification.postLaunchTabNotification(urlString: value)
+#endif
+
                 onDidClose(buttonAction)
             }
         case .appStore:
diff --git a/DuckDuckGo/NetworkProtectionAccessController.swift b/DuckDuckGo/NetworkProtectionAccessController.swift
index 7b1faaacce..16da156180 100644
--- a/DuckDuckGo/NetworkProtectionAccessController.swift
+++ b/DuckDuckGo/NetworkProtectionAccessController.swift
@@ -56,32 +56,53 @@ struct NetworkProtectionAccessController: NetworkProtectionAccess {
     private let networkProtectionWaitlistStorage: WaitlistStorage
     private let networkProtectionTermsAndConditionsStore: NetworkProtectionTermsAndConditionsStore
     private let featureFlagger: FeatureFlagger
+    private let internalUserDecider: InternalUserDecider
+
+    private var isUserLocaleAllowed: Bool {
+        var regionCode: String?
+
+        if #available(iOS 16.0, *) {
+            regionCode = Locale.current.region?.identifier
+        } else {
+            regionCode = Locale.current.regionCode
+        }
+
+        return (regionCode ?? "US") == "US"
+    }
+
 
     init(
         networkProtectionActivation: NetworkProtectionFeatureActivation = NetworkProtectionKeychainTokenStore(),
         networkProtectionWaitlistStorage: WaitlistStorage = WaitlistKeychainStore(waitlistIdentifier: VPNWaitlist.identifier),
         networkProtectionTermsAndConditionsStore: NetworkProtectionTermsAndConditionsStore = NetworkProtectionTermsAndConditionsUserDefaultsStore(),
-        featureFlagger: FeatureFlagger = AppDependencyProvider.shared.featureFlagger
+        featureFlagger: FeatureFlagger = AppDependencyProvider.shared.featureFlagger,
+        internalUserDecider: InternalUserDecider = AppDependencyProvider.shared.internalUserDecider
     ) {
         self.networkProtectionActivation = networkProtectionActivation
         self.networkProtectionWaitlistStorage = networkProtectionWaitlistStorage
         self.networkProtectionTermsAndConditionsStore = networkProtectionTermsAndConditionsStore
         self.featureFlagger = featureFlagger
+        self.internalUserDecider = internalUserDecider
     }
 
     func networkProtectionAccessType() -> NetworkProtectionAccessType {
-        // First, check for users who have activated the VPN via an invite code:
+        // Only show NetP to US or internal users:
+        guard isUserLocaleAllowed || internalUserDecider.isInternalUser else {
+            return .none
+        }
+
+        // Check for users who have activated the VPN via an invite code:
         if networkProtectionActivation.isFeatureActivated && !networkProtectionWaitlistStorage.isInvited {
             return .inviteCodeInvited
         }
 
-        // Next, check if the waitlist is still active; if not, the user has no access.
+        // Check if the waitlist is still active; if not, the user has no access.
         let isWaitlistActive = featureFlagger.isFeatureOn(.networkProtectionWaitlistActive)
         if !isWaitlistActive {
             return .none
         }
 
-        // Next, check if a waitlist user has NetP access and whether they need to accept T&C.
+        // Check if a waitlist user has NetP access and whether they need to accept T&C.
         if networkProtectionActivation.isFeatureActivated && networkProtectionWaitlistStorage.isInvited {
             if networkProtectionTermsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted {
                 return .waitlistInvited
@@ -90,7 +111,7 @@ struct NetworkProtectionAccessController: NetworkProtectionAccess {
             }
         }
 
-        // Next, check if the user has waitlist access at all and whether they've already joined.
+        // Check if the user has waitlist access at all and whether they've already joined.
         let hasWaitlistAccess = featureFlagger.isFeatureOn(.networkProtectionWaitlistAccess)
         if hasWaitlistAccess {
             if networkProtectionWaitlistStorage.isOnWaitlist {
diff --git a/DuckDuckGo/RemoteMessaging.swift b/DuckDuckGo/RemoteMessaging.swift
index ee6c3d897c..6b64221d64 100644
--- a/DuckDuckGo/RemoteMessaging.swift
+++ b/DuckDuckGo/RemoteMessaging.swift
@@ -25,6 +25,7 @@ import BrowserServicesKit
 import Persistence
 import Bookmarks
 import RemoteMessaging
+import NetworkProtection
 
 struct RemoteMessaging {
 
@@ -149,17 +150,35 @@ struct RemoteMessaging {
         case .success(let statusResponse):
             os_log("Successfully fetched remote messages", log: .remoteMessaging, type: .debug)
 
+            let isNetworkProtectionWaitlistUser: Bool
+            let daysSinceNetworkProtectionEnabled: Int
+
+#if NETWORK_PROTECTION
+            let vpnAccess = NetworkProtectionAccessController()
+            let accessType = vpnAccess.networkProtectionAccessType()
+            let isVPNActivated = NetworkProtectionKeychainTokenStore().isFeatureActivated
+            let activationDateStore = DefaultVPNWaitlistActivationDateStore()
+
+            isNetworkProtectionWaitlistUser = (accessType == .waitlistInvited) && isVPNActivated
+            daysSinceNetworkProtectionEnabled = activationDateStore.daysSinceActivation() ?? -1
+#else
+            isNetworkProtectionWaitlistUser = false
+            daysSinceNetworkProtectionEnabled = -1
+#endif
+
             let remoteMessagingConfigMatcher = RemoteMessagingConfigMatcher(
-                    appAttributeMatcher: AppAttributeMatcher(statisticsStore: statisticsStore,
-                                                             variantManager: variantManager,
-                                                             isInternalUser: AppDependencyProvider.shared.internalUserDecider.isInternalUser),
-                    userAttributeMatcher: UserAttributeMatcher(statisticsStore: statisticsStore,
-                                                               variantManager: variantManager,
-                                                               bookmarksCount: bookmarksCount,
-                                                               favoritesCount: favoritesCount,
-                                                               appTheme: AppUserDefaults().currentThemeName.rawValue,
-                                                               isWidgetInstalled: isWidgetInstalled),
-                    dismissedMessageIds: remoteMessagingStore.fetchDismissedRemoteMessageIds()
+                appAttributeMatcher: AppAttributeMatcher(statisticsStore: statisticsStore,
+                                                         variantManager: variantManager,
+                                                         isInternalUser: AppDependencyProvider.shared.internalUserDecider.isInternalUser),
+                userAttributeMatcher: UserAttributeMatcher(statisticsStore: statisticsStore,
+                                                           variantManager: variantManager,
+                                                           bookmarksCount: bookmarksCount,
+                                                           favoritesCount: favoritesCount,
+                                                           appTheme: AppUserDefaults().currentThemeName.rawValue,
+                                                           isWidgetInstalled: isWidgetInstalled,
+                                                           isNetPWaitlistUser: isNetworkProtectionWaitlistUser,
+                                                           daysSinceNetPEnabled: daysSinceNetworkProtectionEnabled),
+                dismissedMessageIds: remoteMessagingStore.fetchDismissedRemoteMessageIds()
             )
 
             let processor = RemoteMessagingConfigProcessor(remoteMessagingConfigMatcher: remoteMessagingConfigMatcher)
diff --git a/DuckDuckGo/SettingsViewController.swift b/DuckDuckGo/SettingsViewController.swift
index f8bab32085..1ee3f0ef18 100644
--- a/DuckDuckGo/SettingsViewController.swift
+++ b/DuckDuckGo/SettingsViewController.swift
@@ -512,6 +512,10 @@ class SettingsViewController: UITableViewController {
     override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
         let theme = ThemeManager.shared.currentTheme
         cell.backgroundColor = theme.tableCellBackgroundColor
+
+        if cell == netPCell {
+            DailyPixel.fire(pixel: .networkProtectionSettingsRowDisplayed)
+        }
     }
 
     override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection: Int) {
diff --git a/DuckDuckGo/SurveyURLBuilder.swift b/DuckDuckGo/SurveyURLBuilder.swift
new file mode 100644
index 0000000000..c4bf284a41
--- /dev/null
+++ b/DuckDuckGo/SurveyURLBuilder.swift
@@ -0,0 +1,86 @@
+//
+//  SurveyURLBuilder.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import Foundation
+import BrowserServicesKit
+import Core
+import Common
+
+protocol SurveyURLBuilder {
+    func addSurveyParameters(to url: URL) -> URL
+}
+
+struct DefaultSurveyURLBuilder: SurveyURLBuilder {
+
+    enum SurveyURLParameters: String, CaseIterable {
+        case atb = "atb"
+        case atbVariant = "var"
+        case daysSinceActivated = "delta"
+        case iosVersion = "mv"
+        case appVersion = "ddgv"
+    }
+
+    private let statisticsStore: StatisticsStore
+    private let activationDateStore: VPNWaitlistActivationDateStore
+
+    init(statisticsStore: StatisticsStore = StatisticsUserDefaults(),
+         activationDateStore: VPNWaitlistActivationDateStore = DefaultVPNWaitlistActivationDateStore()) {
+        self.statisticsStore = statisticsStore
+        self.activationDateStore = activationDateStore
+    }
+
+    func addSurveyParameters(to surveyURL: URL) -> URL {
+        guard var components = URLComponents(string: surveyURL.absoluteString) else {
+            assertionFailure("Could not build URL components from survey URL")
+            return surveyURL
+        }
+
+        var queryItems = components.queryItems ?? []
+
+        for parameter in SurveyURLParameters.allCases {
+            switch parameter {
+            case .atb:
+                if let atb = statisticsStore.atb {
+                    queryItems.append(URLQueryItem(name: parameter.rawValue, value: atb))
+                }
+            case .atbVariant:
+                if let variant = statisticsStore.variant {
+                    queryItems.append(URLQueryItem(name: parameter.rawValue, value: variant))
+                }
+            case .daysSinceActivated:
+                if let daysSinceActivated = activationDateStore.daysSinceActivation() {
+                    queryItems.append(URLQueryItem(name: parameter.rawValue, value: String(describing: daysSinceActivated)))
+                }
+            case .iosVersion:
+                queryItems.append(URLQueryItem(name: parameter.rawValue, value: AppVersion.shared.osVersion))
+            case .appVersion:
+                queryItems.append(URLQueryItem(name: parameter.rawValue, value: AppVersion.shared.versionAndBuildNumber))
+            }
+        }
+
+        components.queryItems = queryItems
+
+        return components.url ?? surveyURL
+    }
+
+}
+
+#endif
diff --git a/DuckDuckGo/VPNWaitlistActivationDateStore.swift b/DuckDuckGo/VPNWaitlistActivationDateStore.swift
new file mode 100644
index 0000000000..1c8e684ab2
--- /dev/null
+++ b/DuckDuckGo/VPNWaitlistActivationDateStore.swift
@@ -0,0 +1,82 @@
+//
+//  VPNWaitlistActivationDateStore.swift
+//  DuckDuckGo
+//
+//  Copyright © 2023 DuckDuckGo. All rights reserved.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+#if NETWORK_PROTECTION
+
+import Foundation
+import Core
+
+protocol VPNWaitlistActivationDateStore {
+
+    func setActivationDateIfNecessary()
+    func daysSinceActivation() -> Int?
+
+}
+
+struct DefaultVPNWaitlistActivationDateStore: VPNWaitlistActivationDateStore {
+
+    private enum Constants {
+        static let networkProtectionActivationDateKey = "com.duckduckgo.network-protection.activation-date"
+    }
+
+    private let userDefaults: UserDefaults
+
+    init(userDefaults: UserDefaults = .networkProtectionGroupDefaults) {
+        self.userDefaults = userDefaults
+    }
+
+    func setActivationDateIfNecessary() {
+        if userDefaults.double(forKey: Constants.networkProtectionActivationDateKey) != 0 {
+            return
+        }
+
+        updateActivationDate(Date())
+    }
+
+    func daysSinceActivation() -> Int? {
+        let timestamp = userDefaults.double(forKey: Constants.networkProtectionActivationDateKey)
+
+        if timestamp == 0 {
+            return nil
+        }
+
+        let activationDate = Date(timeIntervalSinceReferenceDate: timestamp)
+        return daysSince(date: activationDate)
+    }
+
+    // MARK: - Resetting
+
+    func removeDates() {
+        userDefaults.removeObject(forKey: Constants.networkProtectionActivationDateKey)
+    }
+
+    // MARK: - Updating
+
+    func updateActivationDate(_ date: Date) {
+        userDefaults.set(date.timeIntervalSinceReferenceDate, forKey: Constants.networkProtectionActivationDateKey)
+    }
+
+    private func daysSince(date storedDate: Date) -> Int? {
+        let numberOfDays = Calendar.current.dateComponents([.day], from: storedDate, to: Date())
+        return numberOfDays.day
+    }
+
+}
+
+#endif
diff --git a/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift b/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift
index d1f80e13ca..2dc044aa24 100644
--- a/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift
+++ b/DuckDuckGo/VPNWaitlistTermsAndConditionsViewController.swift
@@ -40,6 +40,8 @@ final class VPNWaitlistTermsAndConditionsViewController: UIViewController {
 
         title = UserText.networkProtectionWaitlistJoinTitle
         addHostingControllerToViewHierarchy()
+
+        DailyPixel.fire(pixel: .networkProtectionWaitlistTermsDisplayed)
     }
 
     private func addHostingControllerToViewHierarchy() {
@@ -47,6 +49,8 @@ final class VPNWaitlistTermsAndConditionsViewController: UIViewController {
             var termsAndConditionsStore = NetworkProtectionTermsAndConditionsUserDefaultsStore()
             termsAndConditionsStore.networkProtectionWaitlistTermsAndConditionsAccepted = true
 
+            DailyPixel.fire(pixel: .networkProtectionWaitlistTermsAccepted)
+
             self.navigationController?.popToRootViewController(animated: true)
             let networkProtectionViewController = NetworkProtectionRootViewController()
             self.navigationController?.pushViewController(networkProtectionViewController, animated: true)
diff --git a/DuckDuckGo/VPNWaitlistViewController.swift b/DuckDuckGo/VPNWaitlistViewController.swift
index 465a47e34e..c25153108b 100644
--- a/DuckDuckGo/VPNWaitlistViewController.swift
+++ b/DuckDuckGo/VPNWaitlistViewController.swift
@@ -68,6 +68,10 @@ final class VPNWaitlistViewController: UIViewController {
     private func updateViewState() {
         Task {
             await self.viewModel.updateViewState()
+
+            if self.viewModel.viewState == .notJoinedQueue {
+                DailyPixel.fire(pixel: .networkProtectionWaitlistIntroScreenDisplayed)
+            }
         }
     }
 
diff --git a/DuckDuckGoTests/RemoteMessagingStoreTests.swift b/DuckDuckGoTests/RemoteMessagingStoreTests.swift
index 39988fec3b..512e1d4b76 100644
--- a/DuckDuckGoTests/RemoteMessagingStoreTests.swift
+++ b/DuckDuckGoTests/RemoteMessagingStoreTests.swift
@@ -136,7 +136,9 @@ class RemoteMessagingStoreTests: XCTestCase {
                                                            bookmarksCount: 0,
                                                            favoritesCount: 0,
                                                            appTheme: "light",
-                                                           isWidgetInstalled: false),
+                                                           isWidgetInstalled: false,
+                                                           isNetPWaitlistUser: false,
+                                                           daysSinceNetPEnabled: -1),
                 dismissedMessageIds: []
         )
 
diff --git a/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift b/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift
index 0f1fe33c1b..4b56523f4e 100644
--- a/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift
+++ b/PacketTunnelProvider/NetworkProtection/NetworkProtectionPacketTunnelProvider.swift
@@ -192,6 +192,7 @@ final class NetworkProtectionPacketTunnelProvider: PacketTunnelProvider {
                    settings: settings)
         startMonitoringMemoryPressureEvents()
         observeServerChanges()
+        observeStatusChanges()
         APIRequest.Headers.setUserAgent(DefaultUserAgentManager.duckDuckGoUserAgent)
     }
 
@@ -226,6 +227,18 @@ final class NetworkProtectionPacketTunnelProvider: PacketTunnelProvider {
         }
         .store(in: &cancellables)
     }
+
+    private let activationDateStore = DefaultVPNWaitlistActivationDateStore()
+
+    private func observeStatusChanges() {
+        connectionStatusPublisher.sink { [weak self] status in
+            if case .connected = status {
+                self?.activationDateStore.setActivationDateIfNecessary()
+            }
+        }
+        .store(in: &cancellables)
+    }
+
 }
 
 #endif

From d2423363f0b8acf4abc42d11783050b866b7219a Mon Sep 17 00:00:00 2001
From: Lorenzo Mattei <lore.mattei@gmail.com>
Date: Mon, 4 Dec 2023 14:46:03 +0100
Subject: [PATCH 39/40] Update Sync e2e tests to fit the new UI (#2215)

---
 .maestro/shared/sync_create.yaml            | 16 +++++++----
 .maestro/shared/sync_delete.yaml            |  5 ++--
 .maestro/sync_tests/01_create_account.yaml  |  3 +-
 .maestro/sync_tests/02_login_account.yaml   | 21 +++++++-------
 .maestro/sync_tests/03_recover_account.yaml | 18 ++++++------
 .maestro/sync_tests/04_sync_data.yaml       | 31 +++++++++++++++------
 6 files changed, 57 insertions(+), 37 deletions(-)

diff --git a/.maestro/shared/sync_create.yaml b/.maestro/shared/sync_create.yaml
index bc4bb338d0..ec91e616c1 100644
--- a/.maestro/shared/sync_create.yaml
+++ b/.maestro/shared/sync_create.yaml
@@ -1,10 +1,14 @@
 appId: com.duckduckgo.mobile.ios
 ---
 
-- assertVisible: Sync & Back Up
-- tapOn: Sync & Back Up
-- assertVisible: Sync & Back Up 
-- tapOn: Start Sync & Back Up
-- assertVisible: All Set!
+- assertVisible: Sync & Backup
+- tapOn: Sync & Backup
+- assertVisible: Sync & Backup 
+- tapOn: Sync and Back Up This Device
+- assertVisible: You can sync with your other devices later.
+- tapOn: Turn on Sync & Backup
+- assertVisible: Save Recovery Code
+- tapOn: Copy Code
 - tapOn: Next
-- assertVisible: Save Recovery Code?
+- assertVisible: Your Data is Synced!
+- tapOn: Done
diff --git a/.maestro/shared/sync_delete.yaml b/.maestro/shared/sync_delete.yaml
index 54a78f3c15..41e53148c4 100644
--- a/.maestro/shared/sync_delete.yaml
+++ b/.maestro/shared/sync_delete.yaml
@@ -1,9 +1,10 @@
 appId: com.duckduckgo.mobile.ios
 ---
 
-- assertVisible: Sync & Back Up
+- assertVisible: Sync & Backup
 - scroll
 - tapOn:
     point: 50%,91% # TODO: Revisit after new setup flow has been implemented. 
 - assertVisible: Delete Server Data?
-- tapOn: Delete Server Data
\ No newline at end of file
+- tapOn: Delete Server Data
+- assertVisible: Begin Syncing
\ No newline at end of file
diff --git a/.maestro/sync_tests/01_create_account.yaml b/.maestro/sync_tests/01_create_account.yaml
index 5b48e6c829..37484bffb8 100644
--- a/.maestro/sync_tests/01_create_account.yaml
+++ b/.maestro/sync_tests/01_create_account.yaml
@@ -21,7 +21,6 @@ tags:
 
 
 # Clean up
-- tapOn: Not Now
-- assertVisible: Sync & Back Up
+- assertVisible: Sync & Backup
 - runFlow:
     file: ../shared/sync_delete.yaml
diff --git a/.maestro/sync_tests/02_login_account.yaml b/.maestro/sync_tests/02_login_account.yaml
index 99a69684fa..de383e6e10 100644
--- a/.maestro/sync_tests/02_login_account.yaml
+++ b/.maestro/sync_tests/02_login_account.yaml
@@ -20,23 +20,24 @@ tags:
 - runFlow:
     file: ../shared/sync_create.yaml
 
-# Copy Sync Code and Log Out
-- tapOn: Copy Code
-- tapOn: Not Now
-- assertVisible: Sync & Back Up
-- tapOn: Turn Off Sync & Back Up
+# Log Out
+- assertVisible: Sync & Backup
+- tapOn: Turn Off Sync & Backup...
 - assertVisible: Turn Off Sync?
 - tapOn: Remove
 
 # Login
-- assertVisible: Sync & Back Up
-- tapOn: Enter Text Code
+- assertVisible: Sync & Backup
+- tapOn: Sync with Another Device
+- assertVisible: Scan QR Code
+- tapOn: Manually Enter Code
 - tapOn: Paste
-- assertVisible: Device Synced!
+- assertVisible: Save Recovery Code
 - tapOn: Next
-- tapOn: Not Now
+- assertVisible: Your Data is Synced!
+- tapOn: Done
 
 # Clean up
-- assertVisible: Sync & Back Up
+- assertVisible: Sync & Backup
 - runFlow:
     file: ../shared/sync_delete.yaml
diff --git a/.maestro/sync_tests/03_recover_account.yaml b/.maestro/sync_tests/03_recover_account.yaml
index 1cd62c3a81..4736be829c 100644
--- a/.maestro/sync_tests/03_recover_account.yaml
+++ b/.maestro/sync_tests/03_recover_account.yaml
@@ -58,14 +58,16 @@ tags:
 - tapOn: Settings
 - runFlow:
     file: ../shared/set_internal_user.yaml
-- assertVisible: Sync & Back Up
-- tapOn: Sync & Back Up
-- assertVisible: Sync & Back up
-- tapOn: Recover Your Data
-- tapOn: Enter Text Code
+- assertVisible: Sync & Backup
+- tapOn: Sync & Backup
+- assertVisible: Begin Syncing
+- tapOn: Recover Synced Data
+- assertVisible: Recover Synced Data
+- assertVisible: Get Started
+- tapOn: Get Started
+- tapOn: Enter Text Code Manually
 - tapOn: Paste
-- assertVisible: Device Synced!
+- assertVisible: Save Recovery Code
 - tapOn: Next
-- tapOn: Not Now
-- tapOn: Settings
+- assertVisible: Your Data is Synced!
 - tapOn: Done
\ No newline at end of file
diff --git a/.maestro/sync_tests/04_sync_data.yaml b/.maestro/sync_tests/04_sync_data.yaml
index 79f2f68cea..2d6ffeebe3 100644
--- a/.maestro/sync_tests/04_sync_data.yaml
+++ b/.maestro/sync_tests/04_sync_data.yaml
@@ -94,20 +94,32 @@ tags:
 - tapOn: Settings
 - runFlow:
     file: ../shared/set_internal_user.yaml
-- assertVisible: Sync & Back Up
-- tapOn: Sync & Back Up
-- assertVisible: Sync & Back up
-- tapOn: Recover Your Data
-- tapOn: Enter Text Code
+- assertVisible: Sync & Backup
+- tapOn: Sync & Backup
+- assertVisible: Begin Syncing
+- tapOn: Recover Synced Data
+- assertVisible: Recover Synced Data
+- assertVisible: Get Started
+- tapOn: Get Started
+- tapOn: Enter Text Code Manually
 - tapOn: Paste
-- assertVisible: Device Synced!
+- assertVisible: Save Recovery Code
 - tapOn: Next
-- tapOn: Not Now
+- assertVisible: Your Data is Synced!
+- tapOn: Done
+- assertVisible: Sync & Backup
 - tapOn: Settings
+- assertVisible: Settings
 - tapOn: Done
 
 # Verify bookmarks and favorites have been merged
 - tapOn: Bookmarks
+- runFlow: 
+    when: 
+      visible:
+        text: Download Missing Icons?
+    commands:
+      - tapOn: Not Now
 
 - assertVisible: Spread Privacy
 - assertVisible: Stack Overflow - Where Developers Learn, Share, & Build Careers
@@ -137,9 +149,10 @@ tags:
 # Enable Share Favorites and expect all favorites
 - tapOn: Done
 - tapOn: Settings
-- tapOn: Sync & Back Up
+- tapOn: Sync & Backup
 - scroll
-- assertVisible: Share Favorites
+- assertVisible: Unify Favorites
+- tapOn: "0"
 - tapOn: "0"
 - tapOn: Settings
 - tapOn: Done

From e91af27aeaaad522d4b75ca90a60eeabb2129887 Mon Sep 17 00:00:00 2001
From: Thom Espach <thomespach@me.com>
Date: Mon, 4 Dec 2023 14:25:59 +0000
Subject: [PATCH 40/40] Address Bar Spoofing Tests + Remediation (#2181)

1. Introduce maestro test flows for address bar spoofing.
2. Update the omnibar text value to "about:blank" when a file download prompt is shown.
---
 .maestro/security_tests/0_all.yaml            | 39 +++++++++++++++++++
 .../1_-_AddressBarSpoof,_basicauth.yaml       | 35 +++++++++++++++++
 .../2_-_AddressBarSpoof,_aboutblank.yaml      | 17 ++++++++
 .../3_-_AddressBarSpoof,_appschemes.yaml      | 30 ++++++++++++++
 .../4_-_AddressBarSpoof,_b64_html.yaml        | 15 +++++++
 .../5_-_AddressBarSpoof,_downloadpath.yaml    | 39 +++++++++++++++++++
 .../6_-_AddressBarSpoof,_formaction.yaml      | 16 ++++++++
 .../7_-_AddressBarSpoof,_pagerewrite.yaml     | 16 ++++++++
 DuckDuckGo/TabViewController.swift            |  2 +
 9 files changed, 209 insertions(+)
 create mode 100644 .maestro/security_tests/0_all.yaml
 create mode 100644 .maestro/security_tests/1_-_AddressBarSpoof,_basicauth.yaml
 create mode 100644 .maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml
 create mode 100644 .maestro/security_tests/3_-_AddressBarSpoof,_appschemes.yaml
 create mode 100644 .maestro/security_tests/4_-_AddressBarSpoof,_b64_html.yaml
 create mode 100644 .maestro/security_tests/5_-_AddressBarSpoof,_downloadpath.yaml
 create mode 100644 .maestro/security_tests/6_-_AddressBarSpoof,_formaction.yaml
 create mode 100644 .maestro/security_tests/7_-_AddressBarSpoof,_pagerewrite.yaml

diff --git a/.maestro/security_tests/0_all.yaml b/.maestro/security_tests/0_all.yaml
new file mode 100644
index 0000000000..44ad6e7a52
--- /dev/null
+++ b/.maestro/security_tests/0_all.yaml
@@ -0,0 +1,39 @@
+# all.yaml
+
+appId: com.duckduckgo.mobile.ios
+---
+
+# Set up 
+- clearState
+- launchApp
+- runFlow: 
+    when: 
+      visible: 
+        text: "Let’s Do It!"
+        index: 0
+    file: ../shared/onboarding.yaml
+
+# Load Site
+- assertVisible:
+    id: "searchEntry"
+- tapOn: 
+    id: "searchEntry"
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/"
+- pressKey: Enter
+
+# Manage onboarding
+- runFlow:
+    when:
+      visible:
+        text: "Got It"
+        index: 0
+    file: ../shared/onboarding_browsing.yaml
+
+# Run AddressBarSpoofing tests
+- runFlow: ./1_-_AddressBarSpoof,_basicauth.yaml
+- runFlow: ./2_-_AddressBarSpoof,_aboutblank.yaml
+- runFlow: ./3_-_AddressBarSpoof,_appschemes.yaml
+- runFlow: ./4_-_AddressBarSpoof,_b64_html.yaml
+- runFlow: ./5_-_AddressBarSpoof,_downloadpath.yaml
+- runFlow: ./6_-_AddressBarSpoof,_formaction.yaml
+- runFlow: ./7_-_AddressBarSpoof,_pagerewrite.yaml
\ No newline at end of file
diff --git a/.maestro/security_tests/1_-_AddressBarSpoof,_basicauth.yaml b/.maestro/security_tests/1_-_AddressBarSpoof,_basicauth.yaml
new file mode 100644
index 0000000000..cd2c55bed0
--- /dev/null
+++ b/.maestro/security_tests/1_-_AddressBarSpoof,_basicauth.yaml
@@ -0,0 +1,35 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+- doubleTapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+# Test 1 - using \u2028 character
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-basicauth-2028.html"
+- pressKey: Enter
+- tapOn: "run"
+- assertVisible: "Example Domain"
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText.indexOf("https://www.google.com") != 0}
+- tapOn:
+    id: "searchEntry"
+# Test 2 - using \u2029 character
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-basicauth-2029.html"
+- pressKey: Enter
+- tapOn: "run"
+- assertVisible: "Example Domain"
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText.indexOf("https://www.google.com") != 0}
+- tapOn:
+    id: "searchEntry"
+# Test 3 - using repeated " " space character
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-basicauth-whitespace.html"
+- pressKey: Enter
+- tapOn: "run"
+- assertVisible: "Example Domain"
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText.indexOf("https://www.google.com") != 0}
diff --git a/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml b/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml
new file mode 100644
index 0000000000..c5d7613872
--- /dev/null
+++ b/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml
@@ -0,0 +1,17 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+- doubleTapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-about-blank-rewrite.html"
+- pressKey: Enter
+- tapOn: "Start"
+# This test is expected to load "about:blank" not spoof the address bar with duckduckgo.com with the spoofed content.
+- extendedWaitUntil:
+    visible: "Not DDG."  # Spoofed content is visible
+    timeout: 10000
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "about:blank"}
\ No newline at end of file
diff --git a/.maestro/security_tests/3_-_AddressBarSpoof,_appschemes.yaml b/.maestro/security_tests/3_-_AddressBarSpoof,_appschemes.yaml
new file mode 100644
index 0000000000..e2031ca3fa
--- /dev/null
+++ b/.maestro/security_tests/3_-_AddressBarSpoof,_appschemes.yaml
@@ -0,0 +1,30 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+# Test 1
+- tapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-application-scheme.html"
+- pressKey: Enter
+- tapOn: "Start"
+# This will try to open another app
+- assertVisible: "Cancel"
+- tapOn: "Cancel"
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "https://duckduckgo.com/"} # Should navigate directly here.
+- assertNotVisible: "Not DDG." # HTML content shouldn't be spoofed.
+- tapOn:
+    id: "searchEntry"
+# Test 2
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-unsupported-scheme.html"
+- pressKey: Enter
+- tapOn: "Start"
+# This will try to open another app
+- assertVisible: "Cancel"
+- tapOn: "Cancel"
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-unsupported-scheme.html"}
\ No newline at end of file
diff --git a/.maestro/security_tests/4_-_AddressBarSpoof,_b64_html.yaml b/.maestro/security_tests/4_-_AddressBarSpoof,_b64_html.yaml
new file mode 100644
index 0000000000..1ff6c2152a
--- /dev/null
+++ b/.maestro/security_tests/4_-_AddressBarSpoof,_b64_html.yaml
@@ -0,0 +1,15 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+# Test 1
+- doubleTapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-open-b64-html.html"
+- pressKey: Enter
+- tapOn: "Start"
+# This test is expected to do nothing: loading base64 encoded HTML content in a new tab is blocked.
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-open-b64-html.html"}
diff --git a/.maestro/security_tests/5_-_AddressBarSpoof,_downloadpath.yaml b/.maestro/security_tests/5_-_AddressBarSpoof,_downloadpath.yaml
new file mode 100644
index 0000000000..2e23f09a77
--- /dev/null
+++ b/.maestro/security_tests/5_-_AddressBarSpoof,_downloadpath.yaml
@@ -0,0 +1,39 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+# Test 1
+- doubleTapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-js-download-url.html"
+- pressKey: Enter
+- tapOn: "Start"
+# Download Acceptance Flow:
+- extendedWaitUntil:
+    visible: "Save to Downloads"
+    timeout: 10000
+- tapOn: "Save to Downloads"
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "about:blank"} # Downloads should occur in empty origin.
+# Restart
+- tapOn:
+    id: "searchEntry"
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-js-download-url.html"
+- pressKey: Enter
+# Download Cancel Flow:
+- tapOn: "Start"
+- extendedWaitUntil:
+    visible: "Cancel"  
+    timeout: 10000
+- tapOn: "Cancel"
+# Should be on about:blank
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "about:blank"}
+# Return to last test page
+- tapOn:
+    id: "searchEntry"
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-js-download-url.html"
+- pressKey: Enter
diff --git a/.maestro/security_tests/6_-_AddressBarSpoof,_formaction.yaml b/.maestro/security_tests/6_-_AddressBarSpoof,_formaction.yaml
new file mode 100644
index 0000000000..d12b1cb173
--- /dev/null
+++ b/.maestro/security_tests/6_-_AddressBarSpoof,_formaction.yaml
@@ -0,0 +1,16 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+# Test 1
+- doubleTapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-form-action.html"
+- pressKey: Enter
+- tapOn: "run"
+# Should navigate to duckduckgo.com without any spoofed HTML document content.
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "https://duckduckgo.com/"}
+- assertNotVisible: "Not DDG."
\ No newline at end of file
diff --git a/.maestro/security_tests/7_-_AddressBarSpoof,_pagerewrite.yaml b/.maestro/security_tests/7_-_AddressBarSpoof,_pagerewrite.yaml
new file mode 100644
index 0000000000..fe01f061c3
--- /dev/null
+++ b/.maestro/security_tests/7_-_AddressBarSpoof,_pagerewrite.yaml
@@ -0,0 +1,16 @@
+appId: com.duckduckgo.mobile.ios
+tags:
+    - securityTest
+---
+# Test 1
+- doubleTapOn:
+    id: "searchEntry"
+- pressKey: Backspace
+- inputText: "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-js-page-rewrite.html"
+- pressKey: Enter
+- tapOn: "Start"
+# Now check the address bar hasn't been updated too early resulting in spoofed content
+- copyTextFrom:
+    id: "searchEntry"
+- assertTrue: ${maestro.copiedText == "https://privacy-test-pages.site/security/address-bar-spoofing/spoof-js-page-rewrite.html"}
+- assertNotVisible: "DDG." 
\ No newline at end of file
diff --git a/DuckDuckGo/TabViewController.swift b/DuckDuckGo/TabViewController.swift
index 22e662952d..e63a5d9c21 100644
--- a/DuckDuckGo/TabViewController.swift
+++ b/DuckDuckGo/TabViewController.swift
@@ -1062,6 +1062,8 @@ extension TabViewController: WKNavigationDelegate {
                     } cancelHandler: {
                         decisionHandler(.cancel)
                     }
+                    // Rewrite the current URL to prevent spoofing from download URLs
+                    self.chromeDelegate?.omniBar.textField.text = "about:blank"
                 }
             } else {
                 Pixel.fire(pixel: .unhandledDownload)