From 8d40aecc55b14dc1f630fef298cf68f0c07cbff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=B7=E6=B8=A1?= Date: Tue, 14 Jul 2020 14:24:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A7=E7=89=88=20edge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 迷渡 --- edge/background.html | 3 - edge/backgroundScriptsAPIBridge.js | 1071 ---------------------------- edge/contentScriptsAPIBridge.js | 487 ------------- edge/icons/128.png | Bin 31827 -> 0 bytes edge/js/background.js | 16 - edge/manifest.json | 24 - 6 files changed, 1601 deletions(-) delete mode 100644 edge/background.html delete mode 100644 edge/backgroundScriptsAPIBridge.js delete mode 100644 edge/contentScriptsAPIBridge.js delete mode 100644 edge/icons/128.png delete mode 100644 edge/js/background.js delete mode 100644 edge/manifest.json diff --git a/edge/background.html b/edge/background.html deleted file mode 100644 index df3ea55a..00000000 --- a/edge/background.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/edge/backgroundScriptsAPIBridge.js b/edge/backgroundScriptsAPIBridge.js deleted file mode 100644 index 661fc17e..00000000 --- a/edge/backgroundScriptsAPIBridge.js +++ /dev/null @@ -1,1071 +0,0 @@ -try { - if (!Range.prototype.hasOwnProperty("intersectsNode")) { - Range.prototype["intersectsNode"] = function (node) { - let range = document.createRange(); - range.selectNode(node); - return 0 > this.compareBoundaryPoints(Range.END_TO_START, range) - && 0 < this.compareBoundaryPoints(Range.START_TO_END, range); - }; - } -} -catch (e) { } -try { - if (!Navigator.prototype.hasOwnProperty("languages")) { - Navigator.prototype["languages"] = [navigator.language]; - } -} -catch (e) { } -var getExtensionProtocol = function () { - if (typeof browser == "undefined") { - if (typeof chrome !== "undefined") - return "chrome-extension://"; - } - else { - return "ms-browser-extension://"; - } -}; -class BridgeAlarmEvent { - constructor() { - this.listeners = new Array(); - } - addListener(callback) { - this.listeners.push(callback); - } - addRules(rules, callback) { } - getRules(ruleIdentifiers, callback) { } - hasListener(callback) { return false; } - hasListeners() { return this.listeners.length > 0; } - removeRules(ruleIdentifiers, callback) { } - removeListener(callback) { } -} -class EdgeBridgeAlarms { - constructor() { - this.alarms = {}; - this.onAlarm = new BridgeAlarmEvent(); - } - create(name, alarmInfo) { - if (arguments.length < 1 || arguments.length > 2) { - throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)"; - } - var alarmName = ""; - var startMilliseconds = 0; - var startSet = false; - if (typeof name === "string") { - alarmName = name; - } - else if (typeof name === "object") { - alarmInfo = name; - } - else - throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)"; - if (!alarmInfo) { - throw "You must specify an alarmInfo argument!!"; - } - if (!alarmInfo.when && !alarmInfo.delayInMinutes && !alarmInfo.periodInMinutes) { - throw "Invalid alarmInfo argument!!"; - } - else if (alarmInfo.when && alarmInfo.delayInMinutes) { - throw "Invalid alarmInfo argument!! Either 'when' or 'delayInMinutes' but not both!!"; - } - else if (alarmInfo.when) { - startMilliseconds = alarmInfo.when; - startSet = true; - } - else if (alarmInfo.delayInMinutes) { - startMilliseconds = alarmInfo.delayInMinutes * 60 * 1000; - startSet = true; - } - else if (alarmInfo.periodInMinutes) { - startMilliseconds = alarmInfo.periodInMinutes * 60 * 1000; - startSet = true; - } - else - throw "Invalid alarmInfo argument!!"; - var timerHandle; - if (startSet) { - if (this.alarms[alarmName]) { - this.clearAlarm(alarmName); - } - var alarm = { name: alarmName, scheduledTime: Date.now() + startMilliseconds }; - var alarmAndHandle = { alarm: alarm, timerHandle: 0, startedInterval: false }; - this.alarms[alarmName] = alarmAndHandle; - if (alarmInfo.periodInMinutes) { - this.alarms[alarmName].alarm.periodInMinutes = alarmInfo.periodInMinutes; - this.alarms[alarmName].timerHandle = window.setTimeout(function (alarmName, that) { - that.soundAlarm(alarmName, that); - that.alarms[alarmName].timerHandle = window.setInterval(that.soundAlarm, alarmInfo.periodInMinutes * 60 * 1000, alarmName, that); - that.alarms[alarmName].startedInterval = true; - }, startMilliseconds, alarmName, this); - } - else { - this.alarms[alarmName].timerHandle = window.setTimeout(this.soundAlarm, startMilliseconds, alarmName, this); - } - } - } - getAll(callback) { - for (var key in this.alarms) { - if (this.alarms.hasOwnProperty(key)) { - var alarm = this.alarms[key].alarm; - callback(alarm); - } - } - } - clearAll(callback) { - var clearedAll = true; - for (var key in this.alarms) { - if (this.alarms.hasOwnProperty(key)) { - var alarm = this.alarms[key].alarm; - if (!this.clearAlarm(alarm.name)) { - clearedAll = false; - } - } - } - if (callback) { - callback(clearedAll); - } - } - clear(name, callback) { - var alarmName = ""; - if (typeof name === "string") { - alarmName = name; - } - else if (typeof name === "function") { - callback = name; - } - var wasCleared = this.clearAlarm(alarmName); - if (callback) { - callback(wasCleared); - } - } - get(name, callback) { - if (this.alarms.hasOwnProperty(name)) { - var alarm = this.alarms[name].alarm; - callback(alarm); - } - } - clearAlarm(name) { - var wasCleared = false; - if (this.alarms[name]) { - if (this.alarms[name].alarm.startedInterval) { - window.clearInterval(this.alarms[name].timerHandle); - } - else { - window.clearTimeout(this.alarms[name].timerHandle); - } - delete this.alarms[name]; - wasCleared = true; - } - return wasCleared; - } - soundAlarm(name, that) { - for (var index = 0; index < that.onAlarm.listeners.length; index++) { - var listener = that.onAlarm.listeners[index]; - listener({ name: name }); - } - } -} -class FakeEvent { - addListener(callback) { } - addRules(rules, callback) { } - getRules(ruleIdentifiers, callback) { } - hasListener(callback) { return false; } - hasListeners() { return false; } - removeRules(ruleIdentifiers, callback) { } - removeListener(callback) { } -} -class EdgeBridgeHelper { - constructor() { - this.fakeEvent = new FakeEvent(); - this.alarms = new EdgeBridgeAlarms(); - } - toAbsolutePath(relativePath) { - if (relativePath.indexOf("ms-browser-extension://") == 0) { - return relativePath.replace(myBrowser.runtime.getURL(""), ""); - } - else if (relativePath.indexOf("/") != 0) { - var absolutePath = ""; - var documentPath = document.location.pathname; - absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1); - absolutePath += relativePath; - return absolutePath; - } - return relativePath; - } -} -var bridgeHelper = new EdgeBridgeHelper(); -class EdgeBridgeDebugLog { - constructor() { - this.CatchOnException = true; - this.VerboseLogging = true; - this.FailedCalls = {}; - this.SuccededCalls = {}; - this.DeprecatedCalls = {}; - this.BridgedCalls = {}; - this.UnavailableApis = {}; - this.EdgeIssues = {}; - } - log(message) { - try { - if (this.VerboseLogging) { - console.log(message); - } - } - catch (e) { - } - } - info(message) { - try { - if (this.VerboseLogging) { - console.info(message); - } - } - catch (e) { - } - } - warn(message) { - try { - if (this.VerboseLogging) { - console.warn(message); - } - } - catch (e) { - } - } - error(message) { - try { - if (this.VerboseLogging) { - console.error(message); - } - } - catch (e) { - } - } - DoActionAndLog(action, name, deprecatedTo, bridgedTo) { - var result; - try { - result = action(); - this.AddToCalledDictionary(this.SuccededCalls, name); - if (typeof deprecatedTo !== "undefined") { - this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); - this.AddToCalledDictionary(this.DeprecatedCalls, name); - } - if (typeof bridgedTo !== "undefined") { - this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo); - this.AddToCalledDictionary(this.BridgedCalls, name); - } - this.info("API Call: '" + name + "'"); - return result; - } - catch (ex) { - this.AddToCalledDictionary(this.FailedCalls, name); - if (this.CatchOnException) - this.error("API Call Failed: " + name + " - " + ex); - else - throw ex; - } - } - LogEdgeIssue(name, message) { - this.warn(message); - this.AddToCalledDictionary(this.EdgeIssues, name); - } - LogUnavailbleApi(name, deprecatedTo) { - this.warn("API Call '" + name + "' is not supported in Edge"); - this.AddToCalledDictionary(this.UnavailableApis, name); - if (typeof deprecatedTo !== "undefined") { - this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); - this.AddToCalledDictionary(this.DeprecatedCalls, name); - } - } - AddToCalledDictionary(dictionary, name) { - if (typeof dictionary[name] !== "undefined") { - dictionary[name]++; - } - else { - dictionary[name] = 1; - } - } -} -var bridgeLog = new EdgeBridgeDebugLog(); -class EdgeChromeAlarmBridge { - get onAlarm() { - return bridgeLog.DoActionAndLog(() => { - return bridgeHelper.alarms.onAlarm; - }, "alarms.onAlarm", undefined, "bridgeHelper.alarms.onAlarm"); - } - create(name, alarmInfo) { - bridgeLog.DoActionAndLog(() => { - bridgeHelper.alarms.create.apply(bridgeHelper.alarms, arguments); - }, "alarms.create", undefined, "bridgeHelper.alarms.create"); - } - getAll(callback) { - bridgeLog.DoActionAndLog(() => { - bridgeHelper.alarms.getAll.apply(bridgeHelper.alarms, arguments); - }, "alarms.getAll", undefined, "bridgeHelper.alarms.getAll"); - } - clearAll(callback) { - bridgeLog.DoActionAndLog(() => { - bridgeHelper.alarms.clearAll.apply(bridgeHelper.alarms, arguments); - }, "alarms.clearAll", undefined, "bridgeHelper.alarms.clearAll"); - } - clear(name, callback) { - bridgeLog.DoActionAndLog(() => { - bridgeHelper.alarms.clear.apply(bridgeHelper.alarms, arguments); - }, "alarms.clear", undefined, "bridgeHelper.alarms.clear"); - } - get(name, callback) { - bridgeLog.DoActionAndLog(() => { - bridgeHelper.alarms.get.apply(bridgeHelper.alarms, arguments); - }, "alarms.get", undefined, "bridgeHelper.alarms.get"); - } -} -class EdgeChromeAppBridge { - getDetails() { - return bridgeLog.DoActionAndLog(() => { - return EdgeChromeRuntimeBridge.prototype.getManifest.apply(null, arguments); - }, "app.getManifest", undefined, "runtime.getManifest"); - } - get isInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.isInstalled is not available in Edge"; }, "app.isInstalled"); } - getIsInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.getIsInstalled is not available in the Edge"; }, "app.getIsInstalled"); } - installState() { return bridgeLog.DoActionAndLog(() => { throw "app.installState is not available in Edge"; }, "app.installState"); } - runningState() { return bridgeLog.DoActionAndLog(() => { throw "app.runningState is not available in Edge"; }, "app.runningState"); } -} -class EdgeBookmarksBridge { - create(bookmark, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.bookmarks.create.apply(null, arguments); - }, "bookmarks.create"); - } - getTree(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.bookmarks.getTree.apply(null, arguments); - }, "bookmarks.getTree"); - } - move(id, destination, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.bookmarks.move.apply(null, arguments); - }, "bookmarks.move"); - } - remove(id, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.bookmarks.remove.apply(null, arguments); - }, "bookmarks.remove"); - } - removeTree(id, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.bookmarks.removeTree.apply(null, arguments); - }, "bookmarks.removeTree"); - } - update(id, changes, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.bookmarks.update.apply(null, arguments); - }, "bookmarks.update"); - } -} -class EdgeChromeBookmarksBridge extends EdgeBookmarksBridge { - get onRemoved() { bridgeLog.LogUnavailbleApi("bookmarks.onRemoved"); return bridgeHelper.fakeEvent; } - get onImportEnded() { bridgeLog.LogUnavailbleApi("bookmarks.onImportEnded"); return bridgeHelper.fakeEvent; } - get onImportBegan() { bridgeLog.LogUnavailbleApi("bookmarks.onImportBegan"); return bridgeHelper.fakeEvent; } - get onChanged() { bridgeLog.LogUnavailbleApi("bookmarks.onChanged"); return bridgeHelper.fakeEvent; } - get onMoved() { bridgeLog.LogUnavailbleApi("bookmarks.onMoved"); return bridgeHelper.fakeEvent; } - get onCreated() { bridgeLog.LogUnavailbleApi("bookmarks.onCreated"); return bridgeHelper.fakeEvent; } - get onChildrenReordered() { bridgeLog.LogUnavailbleApi("bookmarks.onChildrenReordered"); return bridgeHelper.fakeEvent; } - getRecent(numberOfItems, callback) { - bridgeLog.LogUnavailbleApi("bookmarks.getRecent"); - } - get(idList, callback) { - bridgeLog.LogUnavailbleApi("bookmarks.get"); - } - getChildren(id, callback) { - bridgeLog.LogUnavailbleApi("bookmarks.getChildren"); - } - getSubTree(id, callback) { - bridgeLog.LogUnavailbleApi("bookmarks.getSubTree"); - } - search(query, callback) { - bridgeLog.LogUnavailbleApi("bookmarks.search"); - } -} -class EdgeBrowserActionBridge { - get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.browserAction.onClicked; }, "browserAction.onClicked"); } - disable(tabId) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.disable.apply(null, arguments); - }, "browserAction.disable"); - } - enable(tabId) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.enable.apply(null, arguments); - }, "browserAction.Enable"); - } - getBadgeBackgroundColor(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.getBadgeBackgroundColor.apply(null, arguments); - }, "browserAction.getBadgeBackgroundColor"); - } - getBadgeText(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.getBadgeText.apply(null, arguments); - ; - }, "browserAction.getBadgeText"); - } - getPopup(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.getPopup.apply(null, arguments); - }, "browserAction.getPopup"); - } - getTitle(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.getTitle.apply(null, arguments); - }, "browserAction.getTitle"); - } - setBadgeBackgroundColor(details) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.setBadgeBackgroundColor.apply(null, arguments); - }, "browserAction.setBadgeBackgroundColor"); - } - setBadgeText(details) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.setBadgeText.apply(null, arguments); - }, "browserAction.setBadgeText"); - } - setIcon(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.setIcon.apply(null, arguments); - }, "browserAction.setIcon"); - } - setPopup(details) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.setPopup.apply(null, arguments); - }, "browserAction.setPopup"); - } - setTitle(details) { - bridgeLog.DoActionAndLog(() => { - myBrowser.browserAction.setTitle.apply(null, arguments); - }, "browserAction.setTitle"); - } -} -class EdgeChromeBrowserActionBridge extends EdgeBrowserActionBridge { - getPopup(details, callback) { - if (myBrowser.browserAction.getPopup) { - EdgeBrowserActionBridge.prototype.getPopup.apply(null, arguments); - } - else { - bridgeLog.LogUnavailbleApi("browserAction.getPopup"); - } - } - getTitle(details, callback) { - if (myBrowser.browserAction.getTitle) { - EdgeBrowserActionBridge.prototype.getTitle.apply(null, arguments); - } - else { - bridgeLog.LogUnavailbleApi("browserAction.getTitle"); - } - } - setTitle(details) { - if (myBrowser.browserAction.setTitle) { - EdgeBrowserActionBridge.prototype.setTitle.apply(null, arguments); - } - else { - bridgeLog.LogUnavailbleApi("browserAction.setTitle"); - } - } -} -class EdgeChromeCommandsBridge { - get onCommand() { bridgeLog.LogUnavailbleApi("commands.onCommand"); return bridgeHelper.fakeEvent; } - getAll(callback) { - bridgeLog.LogUnavailbleApi("commands.getAll"); - } -} -class EdgeContextMenusBridge { - get ACTION_MENU_TOP_LEVEL_LIMIT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT; }, "contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT"); } - get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.onClicked; }, "contextMenus.onClicked"); } - create(createProperties, callback) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.contextMenus.create.apply(null, arguments); - }, "contextMenus.create"); - } - remove(menuItemId, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.contextMenus.remove.apply(null, arguments); - }, "contextMenus.remove"); - } - removeAll(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.contextMenus.removeAll.apply(null, arguments); - }, "contextMenus.removeAll"); - } - update(id, updateProperties, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.contextMenus.update.apply(null, arguments); - }, "contextMenus.update"); - } -} -class EdgeCookiesBridge { - get(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.cookies.get.apply(null, arguments); - }, "cookies.get"); - } - getAll(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.cookies.getAll.apply(null, arguments); - }, "cookies.getAll"); - } - remove(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.cookies.remove.apply(null, arguments); - }, "cookies.remove"); - } - set(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.cookies.set.apply(null, arguments); - }, "cookies.set"); - } -} -class EdgeChromeCookiesBridge extends EdgeCookiesBridge { - get onChanged() { bridgeLog.LogUnavailbleApi("cookies.onChanged"); return bridgeHelper.fakeEvent; } -} -class EdgeExtensionBridge { - get inIncognitoContext() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.inIncognitoContext; - }, "extension.inIncognitoContext"); - } - getBackgroundPage() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.getBackgroundPage.apply(null, arguments); - }, "extension.getBackgroundPage"); - } - getURL(path) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.getURL.apply(null, arguments); - }, "extension.getURL"); - } - getViews(fetchProperties) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.getViews.apply(null, arguments); - }, "extension.getViews"); - } - isAllowedIncognitoAccess(callback) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.isAllowedIncognitoAccess.apply(null, arguments); - }, "extension.isAllowedIncognitoAccess"); - } -} -class EdgeChromeExtensionBridge extends EdgeExtensionBridge { - get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); } - get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); } - get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); } - get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); } - get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); } - connect(extensionId, connectInfo) { - return bridgeLog.DoActionAndLog(() => { - return EdgeRuntimeBridge.prototype.connect.apply(null, arguments); - }, "extension.connect", "runtime.connect", "runtime.connect"); - } - sendMessage(message, responseCallback) { - return bridgeLog.DoActionAndLog(() => { - return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments); - }, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage"); - } - sendRequest(extensionId, message, options, responseCallback) { - return bridgeLog.DoActionAndLog(() => { - return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments); - }, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage"); - } - isAllowedFileSchemeAccess(callback) { - bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess"); - } - setUpdateUrlData(data) { - bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData"); - } -} -class EdgeHistoryBridge { - get onVisited() { bridgeLog.LogUnavailbleApi("history.onVisited"); return bridgeHelper.fakeEvent; } - get onVisitRemoved() { bridgeLog.LogUnavailbleApi("history.onVisitRemoved"); return bridgeHelper.fakeEvent; } - addUrl(details, callback) { - bridgeLog.LogUnavailbleApi("history.addUrl"); - } - deleteAll(callback) { - bridgeLog.LogUnavailbleApi("history.deleteAll"); - } - deleteRange(range, callback) { - bridgeLog.LogUnavailbleApi("history.deleteRange"); - } - deleteUrl(details, callback) { - bridgeLog.LogUnavailbleApi("history.deleteUrl"); - } - getVisits(details, callback) { - bridgeLog.LogUnavailbleApi("history.getVisits"); - } - search(query, callback) { - bridgeLog.LogUnavailbleApi("history.search"); - } -} -class EdgeI18nBridge { - getAcceptLanguages(callback) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.i18n.getAcceptLanguages.apply(null, arguments); - }, "i18n.getAcceptLanguages"); - } - getMessage(messageName, substitutions) { - return bridgeLog.DoActionAndLog(() => { - if (messageName.indexOf("@@extension_id") > -1) { - return myBrowser.runtime.id; - } - return myBrowser.i18n.getMessage.apply(null, arguments); - }, "i18n.getMessage"); - } - getUILanguage() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.i18n.getUILanguage.apply(null, arguments); - }, "i18n.getUILanguage"); - } -} -class EdgeChromeIdleBridge { - get onStateChanged() { bridgeLog.LogUnavailbleApi("idle.onStateChanged"); return bridgeHelper.fakeEvent; } - queryState(detectionIntervalInSeconds, callback) { - bridgeLog.LogUnavailbleApi("idle.queryState"); - } - setDetectionInterval(intervalInSeconds) { - bridgeLog.LogUnavailbleApi("idle.setDetectionInterval"); - } -} -class EdgeNotificationBridge { - get onButtonClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onButtonClicked; }, "notifications.onButtonClicked"); } - get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onClicked; }, "notifications.onClicked"); } - get onClosed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onClosed; }, "notifications.onClosed"); } - get onPermissionLevelChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.notifications.onPermissionLevelChanged; }, "notifications.onPermissionLevelChanged"); } - get onShowSettings() { bridgeLog.LogUnavailbleApi("notifications.onShowSettings"); return bridgeHelper.fakeEvent; } - clear(notificationId, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.notifications.clear.apply(null, arguments); - }, "notifications.clear"); - } - create(notificationId, options, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.notifications.create.apply(null, arguments); - }, "notifications.create"); - } - getAll(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.notifications.getAll.apply(null, arguments); - }, "notifications.getAll"); - } - getPermissionLevel(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.notifications.getPermissionLevel.apply(null, arguments); - }, "notifications.getPermissionLevel"); - } - update(notificationId, options, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.notifications.update.apply(null, arguments); - }, "notifications.update"); - } -} -class EdgePageActionBridge { - get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.pageAction.onClicked; }, "pageAction.onClicked"); } - getPopup(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.getPopup.apply(null, arguments); - }, "pageAction.getPopup"); - } - getTitle(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.getTitle.apply(null, arguments); - }, "pageAction.getTitle"); - } - hide(tabId) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.hide.apply(null, arguments); - }, "pageAction.hide"); - } - setTitle(details) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.setTitle.apply(null, arguments); - }, "pageAction.setTitle"); - } - setIcon(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.setIcon.apply(null, arguments); - }, "pageAction.setIcon"); - } - setPopup(details) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.setPopup.apply(null, arguments); - }, "pageAction.setPopup"); - } - show(tabId) { - bridgeLog.DoActionAndLog(() => { - myBrowser.pageAction.show.apply(null, arguments); - }, "pageAction.show"); - } -} -class EdgePermissionsBridge { - get onAdded() { bridgeLog.LogUnavailbleApi("permissions.onAdded"); return bridgeHelper.fakeEvent; } - get onRemoved() { bridgeLog.LogUnavailbleApi("permissions.onRemoved"); return bridgeHelper.fakeEvent; } - contains(permissions, callback) { - bridgeLog.LogUnavailbleApi("permissions.contains"); - } - getAll(callback) { - bridgeLog.LogUnavailbleApi("permissions.getAll"); - } - remove(permissions, callback) { - bridgeLog.LogUnavailbleApi("permissions.remove"); - } - request(permissions, callback) { - bridgeLog.LogUnavailbleApi("permissions.request"); - } -} -class EdgeRuntimeBridge { - get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); } - get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); } - get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); } - get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); } - get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); } - get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); } - connect(extensionId, connectInfo) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.connect.apply(null, arguments); - }, "runtime.connect"); - } - connectNative(application) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.connectNative.apply(null, arguments); - }, "runtime.connectNative"); - } - getBackgroundPage(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.getBackgroundPage.apply(null, arguments); - }, "runtime.getBackgroundPage"); - } - getManifest() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.getManifest.apply(null, arguments); - }, "runtime.getManifest"); - } - getURL(path) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.getURL.apply(null, arguments); - }, "runtime.getURL"); - } - reload() { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.reload.apply(null, arguments); - }, "runtime.reload"); - } - sendMessage(extensionId, message, options, responseCallback) { - if (arguments.length === 4) { - Array.prototype.splice.apply(arguments, [2, 1]); - } - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.sendMessage.apply(null, arguments); - }, "runtime.sendMessage"); - } - sendNativeMessage(application, message, responseCallback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.sendNativeMessage.apply(null, arguments); - }, "runtime.sendNativeMessage"); - } - setUninstallURL(url, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.setUninstallURL.apply(null, arguments); - }, "runtime.setUninstallURL"); - } -} -class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge { - get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; } - get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; } - get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; } - get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; } - get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; } - get onStartup() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "runtime.onStartup", undefined, "windows.onCreated"); } - openOptionsPage(callback) { - bridgeLog.DoActionAndLog(() => { - var optionsPage = myBrowser.runtime.getManifest()["options_page"]; - var optionsPageUrl = myBrowser.runtime.getURL(optionsPage); - if (typeof callback !== "undefined") { - myBrowser.tabs.create({ url: optionsPageUrl }, callback); - } - else { - myBrowser.tabs.create({ url: optionsPageUrl }); - } - }, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })"); - } - setUninstallURL(url, callback) { - if (myBrowser.runtime.setUninstallURL) { - EdgeRuntimeBridge.prototype.setUninstallURL.apply(null, arguments); - } - else { - bridgeLog.LogUnavailbleApi("runtime.setUninstallURL"); - } - } - getPackageDirectoryEntry(callback) { - bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry"); - } - getPlatformInfo(callback) { - bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo"); - } - requestUpdateCheck(callback) { - bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck"); - } - restart() { - bridgeLog.LogUnavailbleApi("runtime.restart"); - } -} -class EdgeStorageBridge { - get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); } - get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.sync; }, "storage.sync"); } - get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); } -} -class EdgeChromeStorageBridge extends EdgeStorageBridge { - get sync() { - if (myBrowser.storage.sync) { - return EdgeStorageBridge.prototype.sync; - } - else { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.storage.local; - }, "storage.sync", undefined, "storage.local"); - } - } - get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); } -} -class EdgeTabsBridge { - get onActivated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onActivated; }, "tabs.onActivated"); } - get onAttached() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onAttached; }, "tabs.onAttached"); } - get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onCreated; }, "tabs.onCreated"); } - get onDetached() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onDetached; }, "tabs.onDetached"); } - get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onRemoved; }, "tabs.onRemoved"); } - get onReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onReplaced; }, "tabs.onReplaced"); } - get onUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onUpdated; }, "tabs.onUpdated"); } - captureVisibleTab(windowId, options, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.captureVisibleTab.apply(null, arguments); - }, "tabs.captureVisibleTab"); - } - create(createProperties, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.create.apply(null, arguments); - }, "tabs.create"); - } - detectLanguage(tabId, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.detectLanguage.apply(null, arguments); - }, "tabs.detectLanguage"); - } - executeScript(tabId, details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.executeScript.apply(null, arguments); - }, "tabs.executeScript"); - } - get(tabId, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.get.apply(null, arguments); - }, "tabs.get"); - } - getCurrent(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.getCurrent.apply(null, arguments); - }, "tabs.getCurrent"); - } - insertCSS(tabId, details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.insertCSS.apply(null, arguments); - }, "tabs.insertCSS"); - } - query(queryInfo, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.query.apply(null, arguments); - }, "tabs.query"); - } - reload(tabId, reloadProperties, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.reload.apply(null, arguments); - }, "tabs.reload"); - } - remove(tabId, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.remove.apply(null, arguments); - }, "tabs.remove"); - } - sendMessage(tabId, message, responseCallback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.sendMessage.apply(null, arguments); - }, "tabs.sendMessage"); - } - update(tabId, updateProperties, callback) { - var updatePropertiesBridged = false; - for (var index = 0; index < arguments.length; index++) { - var argument = arguments[index]; - if (typeof argument === "object") { - if (!argument.active && (argument.highlighted || argument.selected)) { - argument.active = argument.highlighted || argument.selected; - updatePropertiesBridged = true; - } - } - } - bridgeLog.DoActionAndLog(() => { - myBrowser.tabs.update.apply(null, arguments); - }, "tabs.update", undefined, updatePropertiesBridged ? "tabs.update with UpdateProperties modified" : undefined); - } -} -class EdgeChromeTabsBridge extends EdgeTabsBridge { - get onHighlighted() { bridgeLog.LogUnavailbleApi("tabs.onHighlighted"); return bridgeHelper.fakeEvent; } - get onMoved() { bridgeLog.LogUnavailbleApi("tabs.onMoved"); return bridgeHelper.fakeEvent; } - get onSelectionChanged() { - return bridgeLog.DoActionAndLog(() => { - var fakeEvent = bridgeHelper.fakeEvent; - fakeEvent.addListener = (callback) => { - myBrowser.tabs.onActivated.addListener((activeInfo) => { - callback(activeInfo.tabId, { windowId: activeInfo.windowId }); - }); - }; - return fakeEvent; - }, "tabs.onSelectionChanged", "tabs.onActivated", "tabs.onActivated"); - } - duplicate(tabId, callback) { - bridgeLog.DoActionAndLog(() => { - var tabGetCallback = function (tab) { - if (typeof callback !== "undefined") { - myBrowser.tabs.create({ url: tab.url }, callback); - } - else { - myBrowser.tabs.create({ url: tab.url }); - } - }; - EdgeTabsBridge.prototype.get(tabId, tabGetCallback); - }, "tabs.duplicate", undefined, "tabs.create"); - } - getAllInWindow(windowId, callback) { - bridgeLog.DoActionAndLog(() => { - EdgeTabsBridge.prototype.query({ windowId: windowId }, callback); - }, "tabs.getAllInWindow", "tabs.query", "tabs.query"); - } - getSelected(windowId, callback) { - bridgeLog.DoActionAndLog(() => { - EdgeTabsBridge.prototype.query({ active: true }, (tabs) => callback(tabs[0])); - }, "tabs.getSelected", "tabs.query", "tabs.query"); - } - sendRequest(tabId, request, responseCallback) { - bridgeLog.DoActionAndLog(() => { - EdgeTabsBridge.prototype.sendMessage.apply(null, arguments); - }, "tabs.sendRequest", "tabs.sendMessage", "tabs.sendMessage"); - } - connect(tabId, connectInfo) { - bridgeLog.LogUnavailbleApi("tabs.connect"); - return null; - } - highlight(highlightInfo, callback) { - bridgeLog.LogUnavailbleApi("tabs.highlight"); - } - move(tabId, moveProperties, callback) { - bridgeLog.LogUnavailbleApi("tabs.move"); - } -} -class EdgeWebNavigationBridge { - get onBeforeNavigate() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onBeforeNavigate; }, "webNavigation.onBeforeNavigate"); } - get onCommitted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCommitted; }, "webNavigation.onCommitted"); } - get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCompleted; }, "webNavigation.onCompleted"); } - get onCreatedNavigationTarget() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCreatedNavigationTarget; }, "webNavigation.onCreatedNavigationTarget"); } - get onDOMContentLoaded() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onDOMContentLoaded; }, "webNavigation.onDOMContentLoaded"); } - get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onErrorOccurred; }, "webNavigation.onErrorOccurred"); } - get onHistoryStateUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onHistoryStateUpdated; }, "webNavigation.onHistoryStateUpdated"); } - get onReferenceFragmentUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onReferenceFragmentUpdated; }, "webNavigation.onReferenceFragmentUpdated"); } - get onTabReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onTabReplaced; }, "webNavigation.onTabReplaced"); } - getAllFrames(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.webNavigation.getAllFrames.apply(null, arguments); - }, "webNavigation.getAllFrames"); - } - getFrame(details, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.webNavigation.getFrame.apply(null, arguments); - }, "webNavigation.getFrame"); - } -} -class EdgeWebRequestBridge { - get MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; }, "webNavigation.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES"); } - get onAuthRequired() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onAuthRequired; }, "webRequest.onAuthRequired"); } - get onBeforeRedirect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRedirect; }, "webRequest.onBeforeRedirect"); } - get onBeforeRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRequest; }, "webRequest.onBeforeRequest"); } - get onBeforeSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeSendHeaders; }, "webRequest.onBeforeSendHeaders"); } - get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onCompleted; }, "webRequest.onCompleted"); } - get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onErrorOccurred; }, "webRequest.onErrorOccurred"); } - get onHeadersReceived() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onHeadersReceived; }, "webRequest.onHeadersReceived"); } - get onResponseStarted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onResponseStarted; }, "webRequest.onResponseStarted"); } - get onSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onSendHeaders; }, "webRequest.onSendHeaders"); } - handlerBehaviorChanged(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.webRequest.handlerBehaviorChanged.apply(null, arguments); - }, "webRequest.handlerBehaviorChanged"); - } -} -class EdgeWindowsBridge { - get WINDOW_ID_CURRENT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_CURRENT; }, "windows.WINDOW_ID_CURRENT"); } - get WINDOW_ID_NONE() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_NONE; }, "windows.WINDOW_ID_NONE"); } - get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "windows.onCreated"); } - get onFocusChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onFocusChanged; }, "windows.onFocusChanged"); } - get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onRemoved; }, "windows.onRemoved"); } - create(createData, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.windows.create.apply(null, arguments); - }, "windows.create"); - } - get(windowId, getInfo, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.windows.get.apply(null, arguments); - }, "windows.get"); - } - getAll(getInfo, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.windows.getAll.apply(null, arguments); - }, "windows.getAll"); - } - getCurrent(getInfo, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.windows.getCurrent.apply(null, arguments); - }, "windows.getCurrent"); - } - getLastFocused(getInfo, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.windows.getLastFocused.apply(null, arguments); - }, "windows.getLastFocused"); - } - update(windowId, updateInfo, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.windows.update.apply(null, arguments); - }, "windows.update"); - } -} -class EdgeChromeWindowsBridge extends EdgeWindowsBridge { - remove(windowId, callback) { - bridgeLog.LogUnavailbleApi("windows.remove"); - } -} -class EdgeBackgroundBridge { - constructor() { - this.alarms = new EdgeChromeAlarmBridge(); - this.app = new EdgeChromeAppBridge(); - this.commands = new EdgeChromeCommandsBridge(); - this.idle = new EdgeChromeIdleBridge(); - this.notifications = new EdgeNotificationBridge(); - this.bookmarks = typeof browser["bookmarks"] !== "undefined" ? new EdgeChromeBookmarksBridge() : undefined; - this.browserAction = typeof browser.browserAction !== "undefined" ? new EdgeChromeBrowserActionBridge() : undefined; - this.contextMenus = typeof browser.contextMenus !== "undefined" ? new EdgeContextMenusBridge() : undefined; - this.cookies = typeof browser.cookies !== "undefined" ? new EdgeChromeCookiesBridge() : undefined; - this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined; - this.history = typeof browser.history !== "undefined" ? new EdgeHistoryBridge() : undefined; - this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined; - this.pageAction = typeof browser.pageAction !== "undefined" ? new EdgePageActionBridge() : undefined; - this.permissions = typeof browser.permissions !== "undefined" ? new EdgePermissionsBridge() : undefined; - this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined; - this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined; - this.tabs = typeof browser.tabs !== "undefined" ? new EdgeChromeTabsBridge() : undefined; - this.webNavigation = typeof browser.webNavigation !== "undefined" ? new EdgeWebNavigationBridge() : undefined; - this.webRequest = typeof browser.webRequest !== "undefined" ? new EdgeWebRequestBridge() : undefined; - this.windows = typeof browser.windows !== "undefined" ? new EdgeChromeWindowsBridge() : undefined; - } -} -var myBrowser = browser; -var chrome = new EdgeBackgroundBridge(); diff --git a/edge/contentScriptsAPIBridge.js b/edge/contentScriptsAPIBridge.js deleted file mode 100644 index 39ecbe71..00000000 --- a/edge/contentScriptsAPIBridge.js +++ /dev/null @@ -1,487 +0,0 @@ -try { - if (!Range.prototype.hasOwnProperty("intersectsNode")) { - Range.prototype["intersectsNode"] = function (node) { - let range = document.createRange(); - range.selectNode(node); - return 0 > this.compareBoundaryPoints(Range.END_TO_START, range) - && 0 < this.compareBoundaryPoints(Range.START_TO_END, range); - }; - } -} -catch (e) { } -try { - if (!Navigator.prototype.hasOwnProperty("languages")) { - Navigator.prototype["languages"] = [navigator.language]; - } -} -catch (e) { } -var getExtensionProtocol = function () { - if (typeof browser == "undefined") { - if (typeof chrome !== "undefined") - return "chrome-extension://"; - } - else { - return "ms-browser-extension://"; - } -}; -class BridgeAlarmEvent { - constructor() { - this.listeners = new Array(); - } - addListener(callback) { - this.listeners.push(callback); - } - addRules(rules, callback) { } - getRules(ruleIdentifiers, callback) { } - hasListener(callback) { return false; } - hasListeners() { return this.listeners.length > 0; } - removeRules(ruleIdentifiers, callback) { } - removeListener(callback) { } -} -class EdgeBridgeAlarms { - constructor() { - this.alarms = {}; - this.onAlarm = new BridgeAlarmEvent(); - } - create(name, alarmInfo) { - if (arguments.length < 1 || arguments.length > 2) { - throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)"; - } - var alarmName = ""; - var startMilliseconds = 0; - var startSet = false; - if (typeof name === "string") { - alarmName = name; - } - else if (typeof name === "object") { - alarmInfo = name; - } - else - throw "Unexpected set of arguments. Expecting (alarmInfo) or (name, alarmInfo)"; - if (!alarmInfo) { - throw "You must specify an alarmInfo argument!!"; - } - if (!alarmInfo.when && !alarmInfo.delayInMinutes && !alarmInfo.periodInMinutes) { - throw "Invalid alarmInfo argument!!"; - } - else if (alarmInfo.when && alarmInfo.delayInMinutes) { - throw "Invalid alarmInfo argument!! Either 'when' or 'delayInMinutes' but not both!!"; - } - else if (alarmInfo.when) { - startMilliseconds = alarmInfo.when; - startSet = true; - } - else if (alarmInfo.delayInMinutes) { - startMilliseconds = alarmInfo.delayInMinutes * 60 * 1000; - startSet = true; - } - else if (alarmInfo.periodInMinutes) { - startMilliseconds = alarmInfo.periodInMinutes * 60 * 1000; - startSet = true; - } - else - throw "Invalid alarmInfo argument!!"; - var timerHandle; - if (startSet) { - if (this.alarms[alarmName]) { - this.clearAlarm(alarmName); - } - var alarm = { name: alarmName, scheduledTime: Date.now() + startMilliseconds }; - var alarmAndHandle = { alarm: alarm, timerHandle: 0, startedInterval: false }; - this.alarms[alarmName] = alarmAndHandle; - if (alarmInfo.periodInMinutes) { - this.alarms[alarmName].alarm.periodInMinutes = alarmInfo.periodInMinutes; - this.alarms[alarmName].timerHandle = window.setTimeout(function (alarmName, that) { - that.soundAlarm(alarmName, that); - that.alarms[alarmName].timerHandle = window.setInterval(that.soundAlarm, alarmInfo.periodInMinutes * 60 * 1000, alarmName, that); - that.alarms[alarmName].startedInterval = true; - }, startMilliseconds, alarmName, this); - } - else { - this.alarms[alarmName].timerHandle = window.setTimeout(this.soundAlarm, startMilliseconds, alarmName, this); - } - } - } - getAll(callback) { - for (var key in this.alarms) { - if (this.alarms.hasOwnProperty(key)) { - var alarm = this.alarms[key].alarm; - callback(alarm); - } - } - } - clearAll(callback) { - var clearedAll = true; - for (var key in this.alarms) { - if (this.alarms.hasOwnProperty(key)) { - var alarm = this.alarms[key].alarm; - if (!this.clearAlarm(alarm.name)) { - clearedAll = false; - } - } - } - if (callback) { - callback(clearedAll); - } - } - clear(name, callback) { - var alarmName = ""; - if (typeof name === "string") { - alarmName = name; - } - else if (typeof name === "function") { - callback = name; - } - var wasCleared = this.clearAlarm(alarmName); - if (callback) { - callback(wasCleared); - } - } - get(name, callback) { - if (this.alarms.hasOwnProperty(name)) { - var alarm = this.alarms[name].alarm; - callback(alarm); - } - } - clearAlarm(name) { - var wasCleared = false; - if (this.alarms[name]) { - if (this.alarms[name].alarm.startedInterval) { - window.clearInterval(this.alarms[name].timerHandle); - } - else { - window.clearTimeout(this.alarms[name].timerHandle); - } - delete this.alarms[name]; - wasCleared = true; - } - return wasCleared; - } - soundAlarm(name, that) { - for (var index = 0; index < that.onAlarm.listeners.length; index++) { - var listener = that.onAlarm.listeners[index]; - listener({ name: name }); - } - } -} -class FakeEvent { - addListener(callback) { } - addRules(rules, callback) { } - getRules(ruleIdentifiers, callback) { } - hasListener(callback) { return false; } - hasListeners() { return false; } - removeRules(ruleIdentifiers, callback) { } - removeListener(callback) { } -} -class EdgeBridgeHelper { - constructor() { - this.fakeEvent = new FakeEvent(); - this.alarms = new EdgeBridgeAlarms(); - } - toAbsolutePath(relativePath) { - if (relativePath.indexOf("ms-browser-extension://") == 0) { - return relativePath.replace(myBrowser.runtime.getURL(""), ""); - } - else if (relativePath.indexOf("/") != 0) { - var absolutePath = ""; - var documentPath = document.location.pathname; - absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1); - absolutePath += relativePath; - return absolutePath; - } - return relativePath; - } -} -var bridgeHelper = new EdgeBridgeHelper(); -class EdgeBridgeDebugLog { - constructor() { - this.CatchOnException = true; - this.VerboseLogging = true; - this.FailedCalls = {}; - this.SuccededCalls = {}; - this.DeprecatedCalls = {}; - this.BridgedCalls = {}; - this.UnavailableApis = {}; - this.EdgeIssues = {}; - } - log(message) { - try { - if (this.VerboseLogging) { - console.log(message); - } - } - catch (e) { - } - } - info(message) { - try { - if (this.VerboseLogging) { - console.info(message); - } - } - catch (e) { - } - } - warn(message) { - try { - if (this.VerboseLogging) { - console.warn(message); - } - } - catch (e) { - } - } - error(message) { - try { - if (this.VerboseLogging) { - console.error(message); - } - } - catch (e) { - } - } - DoActionAndLog(action, name, deprecatedTo, bridgedTo) { - var result; - try { - result = action(); - this.AddToCalledDictionary(this.SuccededCalls, name); - if (typeof deprecatedTo !== "undefined") { - this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); - this.AddToCalledDictionary(this.DeprecatedCalls, name); - } - if (typeof bridgedTo !== "undefined") { - this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo); - this.AddToCalledDictionary(this.BridgedCalls, name); - } - this.info("API Call: '" + name + "'"); - return result; - } - catch (ex) { - this.AddToCalledDictionary(this.FailedCalls, name); - if (this.CatchOnException) - this.error("API Call Failed: " + name + " - " + ex); - else - throw ex; - } - } - LogEdgeIssue(name, message) { - this.warn(message); - this.AddToCalledDictionary(this.EdgeIssues, name); - } - LogUnavailbleApi(name, deprecatedTo) { - this.warn("API Call '" + name + "' is not supported in Edge"); - this.AddToCalledDictionary(this.UnavailableApis, name); - if (typeof deprecatedTo !== "undefined") { - this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); - this.AddToCalledDictionary(this.DeprecatedCalls, name); - } - } - AddToCalledDictionary(dictionary, name) { - if (typeof dictionary[name] !== "undefined") { - dictionary[name]++; - } - else { - dictionary[name] = 1; - } - } -} -var bridgeLog = new EdgeBridgeDebugLog(); -class EdgeExtensionBridge { - get inIncognitoContext() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.inIncognitoContext; - }, "extension.inIncognitoContext"); - } - getBackgroundPage() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.getBackgroundPage.apply(null, arguments); - }, "extension.getBackgroundPage"); - } - getURL(path) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.getURL.apply(null, arguments); - }, "extension.getURL"); - } - getViews(fetchProperties) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.getViews.apply(null, arguments); - }, "extension.getViews"); - } - isAllowedIncognitoAccess(callback) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.extension.isAllowedIncognitoAccess.apply(null, arguments); - }, "extension.isAllowedIncognitoAccess"); - } -} -class EdgeChromeExtensionBridge extends EdgeExtensionBridge { - get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); } - get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); } - get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); } - get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); } - get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); } - connect(extensionId, connectInfo) { - return bridgeLog.DoActionAndLog(() => { - return EdgeRuntimeBridge.prototype.connect.apply(null, arguments); - }, "extension.connect", "runtime.connect", "runtime.connect"); - } - sendMessage(message, responseCallback) { - return bridgeLog.DoActionAndLog(() => { - return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments); - }, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage"); - } - sendRequest(extensionId, message, options, responseCallback) { - return bridgeLog.DoActionAndLog(() => { - return EdgeRuntimeBridge.prototype.sendMessage.apply(null, arguments); - }, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage"); - } - isAllowedFileSchemeAccess(callback) { - bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess"); - } - setUpdateUrlData(data) { - bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData"); - } -} -class EdgeI18nBridge { - getAcceptLanguages(callback) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.i18n.getAcceptLanguages.apply(null, arguments); - }, "i18n.getAcceptLanguages"); - } - getMessage(messageName, substitutions) { - return bridgeLog.DoActionAndLog(() => { - if (messageName.indexOf("@@extension_id") > -1) { - return myBrowser.runtime.id; - } - return myBrowser.i18n.getMessage.apply(null, arguments); - }, "i18n.getMessage"); - } - getUILanguage() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.i18n.getUILanguage.apply(null, arguments); - }, "i18n.getUILanguage"); - } -} -class EdgeRuntimeBridge { - get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); } - get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); } - get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); } - get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); } - get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); } - get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); } - connect(extensionId, connectInfo) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.connect.apply(null, arguments); - }, "runtime.connect"); - } - connectNative(application) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.connectNative.apply(null, arguments); - }, "runtime.connectNative"); - } - getBackgroundPage(callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.getBackgroundPage.apply(null, arguments); - }, "runtime.getBackgroundPage"); - } - getManifest() { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.getManifest.apply(null, arguments); - }, "runtime.getManifest"); - } - getURL(path) { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.runtime.getURL.apply(null, arguments); - }, "runtime.getURL"); - } - reload() { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.reload.apply(null, arguments); - }, "runtime.reload"); - } - sendMessage(extensionId, message, options, responseCallback) { - if (arguments.length === 4) { - Array.prototype.splice.apply(arguments, [2, 1]); - } - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.sendMessage.apply(null, arguments); - }, "runtime.sendMessage"); - } - sendNativeMessage(application, message, responseCallback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.sendNativeMessage.apply(null, arguments); - }, "runtime.sendNativeMessage"); - } - setUninstallURL(url, callback) { - bridgeLog.DoActionAndLog(() => { - myBrowser.runtime.setUninstallURL.apply(null, arguments); - }, "runtime.setUninstallURL"); - } -} -class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge { - get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; } - get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; } - get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; } - get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; } - get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; } - get onStartup() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "runtime.onStartup", undefined, "windows.onCreated"); } - openOptionsPage(callback) { - bridgeLog.DoActionAndLog(() => { - var optionsPage = myBrowser.runtime.getManifest()["options_page"]; - var optionsPageUrl = myBrowser.runtime.getURL(optionsPage); - if (typeof callback !== "undefined") { - myBrowser.tabs.create({ url: optionsPageUrl }, callback); - } - else { - myBrowser.tabs.create({ url: optionsPageUrl }); - } - }, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })"); - } - setUninstallURL(url, callback) { - if (myBrowser.runtime.setUninstallURL) { - EdgeRuntimeBridge.prototype.setUninstallURL.apply(null, arguments); - } - else { - bridgeLog.LogUnavailbleApi("runtime.setUninstallURL"); - } - } - getPackageDirectoryEntry(callback) { - bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry"); - } - getPlatformInfo(callback) { - bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo"); - } - requestUpdateCheck(callback) { - bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck"); - } - restart() { - bridgeLog.LogUnavailbleApi("runtime.restart"); - } -} -class EdgeStorageBridge { - get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); } - get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.sync; }, "storage.sync"); } - get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); } -} -class EdgeChromeStorageBridge extends EdgeStorageBridge { - get sync() { - if (myBrowser.storage.sync) { - return EdgeStorageBridge.prototype.sync; - } - else { - return bridgeLog.DoActionAndLog(() => { - return myBrowser.storage.local; - }, "storage.sync", undefined, "storage.local"); - } - } - get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); } -} -class EdgeContentBridge { - constructor() { - this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined; - this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined; - this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined; - this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined; - } -} -var myBrowser = browser; -var chrome = new EdgeContentBridge(); diff --git a/edge/icons/128.png b/edge/icons/128.png deleted file mode 100644 index e6dfcb113e92faaf7e1e22b2d50309b4c1aec904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31827 zcmeEOhdQT54?)x>)c%J8Z9PvH9xPlXN6#nmKE`<9i%jhi*`K_lxu)p0KG1p`(60e9|7*3h@y<6Le?WYXKK z)GYs~DcR!Vz#m0Hp~r&NCN;H_h;KUkdHsv}2EInc`}l>2%NwJ$E=G!YPqATdWm>`T zI4>KSV@mJ|iykT$Vo{+Lyc|vsfiL4#{{PGWKaI;m{Y&i6yu~^-oUDv2yg7ynOv3h8 zhi8A%2r!D(E~GkcF_X8LA$09V4Z~u(?^$RHk0mQLY(+>+Eqrioqd^=hj|bx>WO3u3 z?z7P{k2c1uWp{pED0Q1wiQ<)EDtp@1vl6S z@*9mg>IuDn|ArP7iH}r7ga5s}yc#Q>+i-@nA6=60e$q*Wo8NPxk*aHNTpbjOPk;#~Q}P zIQ0xtg{3fAUqQczzQDLBq2h*PhwPpNmPg2HgfBEgIpq)KLj_`WN)+d?OP<2fk@U!b zQYeZ_QlOEWSK3LoEIZrQV}!bB_2SBQ?#kSUIR#o+Y9|}V;*4y!TD$u_A8&8|%M#cc zZ_$HIELjZQ4k=Jt!_YF&jh^Il-l6o!8aJqpqp^0l*a~&e&TjFKhp%o|SP{=h?NFUm z?tPp|SFj%QlShqcSUVG!(B3iMO=pf}1-&T;6%o}t7b zPsqGHgm}y#FE8Idv}Y~&JXIwvC&H9C`37^f#@Qf!Mm3&mbh{p#kvWOa zi;9Xa1O@~&+zi-T%C`(Tnve9|oD8NwW8uGUF6q7HQKrhOFM*=WDxCf;*4EZaxbuBA zv-p@Q+fZYXM(kbJ>AQdPx#dJfyz>=Bqt5SZKf`D;<@~m$t`8TQ;nvgTeMzSqdths@ zdbl$TEU6JL`SjoSCsy1_L5Hms&dl^?)oC<$MkrMMjk$*N^y6e6KH?DEzqp38>aKs= z5aW}Kirzm^x(65 z>GN5Ns-&*ra&<>}k3*r4DKRHK&+tfk0<{z3JjV2gbJg$@ZSEMb`KXQ6Rebm7WXt3C z!T8W0AGE5t_#y+TrDdAnzThcQR<%O8A5Pft&1GK}(^jWpTXxs@0WyJC_Y=aXZ~ z8NwH#&`q=~G|B?T1Mbom)ex}1(s^P6a&_@42WOsL%Z19%o zUk4HV4?F`ST8kHbRhIu8>ph|C_{nr0&7vn~lOfX|{H1%iF!_#O<9D&ZxnFNHtCl{! z>6V|3x=z~Yat+yqmpsZ6p0Y+3hEip@9_`HgYNtp}+tnCjSf<=BmNwK~&GOyOUw!AP zrJ^SF&NK78;lLcr7JiN z6<~dQd}4IIMd=t5cY+drWWKA7W6=|s!<$(jr#8RsB_7c<38n670kOW)a)4cGL>VdsaJ!8-YUMr_FYhqJLL>OEN*enQv{f#wjx ztN>ODcw^-&ZubdyhYp>TlHo+kWu!^8jexU!AnScPWAgPXzL4a=Ts zvx%NDz;^ylc)D-amINYJ>Iqtx7fpn8X4|6igim+hkl2xS*~J&OOP;kFsIsYS?)B@m zx4dGn#q1;&D@b}R_0Ed^tL*;F>D^GHHC>W}R8eze^+rTi6TQ`&6NPBL;U{XmSNGe` z2CmIROon*kq0={}7f@>0Pcos09P~zv5W0gJ|GqUmk$Vwmd9%I1M_xtkiO@AE>v0xz z&>siS@Z;lS@!*{f5i7)Y3p)n>f`W%$5i*EJ(`2pwv&$sjb#>jO$^Vz!JLJ6~Zy}CO z5!mNH#GlLYe&y*JX+ZN{fpT!~0_zxNuTL}c*6yF{#kV=a=(dma`Sqc1IT}=1vw2@L zjwcVdXAx!_O4>zu4bua|(WOWXze;MDhFR$9F;&Xx=OsCfRf}0`*D*myJFywwLnbnx znv`Hc)CM#h=qq_DFt@WoTR$q- z3%*~rJDie?$Qsp!ptXrwTq5wn4!>pSL^i)ve&U|OF>}o+-$ZM&1_))?C zw(&rw=A!vU33SbUW8=~^+j)=bFlNQQ zUV^50^_+XlADXG_xwl4WvOpYtAC&Yw1xt0+R>-#Zhv`{xzjX?0^m>6nDy#K3RdUxjm^kEh1H`n5N?5FtT> z?x+MP)^j#>;o%f}{MniDUH4P3WOqBC9Pce#5%#_!6gegjFXg%x4tW5!<49QNDfZ zBEejZq^hyFosV!`;cFpN{J05UtWk{Y%**1Tl@xb*B5ZIX=Le~9t5U5`rBJoI;At8< z_X=7z9iA}NgCgx>gO+X!)UXR$z>ogqGPRjFyxA{}4R)H@TkbDbdt|qx{q%KngbBe0 zU&v9XOm|s$Blv-~VQ^u0*PPFa=k>n zZmUWC;TNr=F^BT$OTL&}@T?T0n0&J~%mMBR zeG{6C#QKwoIP%!qzcNJPT&b2KNmLH&LmsQd<1XxHPbAJ(U3mWDCe61&q7OKtOk9Uf z$PVhGJyT0y-K`~9E-Q#JPCf4~KU7M)lPq>_lDVE^j37OB#PTWI5Yzwkf!Ob(kOv%h z)csD+@4lCDo#ceXC_hjLGkHP|x7(93g!x!TE=lVug|f6NljFI`bMWB z+oGS1FxtJr?DOiu!9j+{pn(yQV}$dZJ9zA=u&>%5d~8PO)yGF{*5$KnydNC0_3;eg zEw8peFMd4XQ7YD{L^_<6fN$MElWHuZq$AIw=Smw6eiZY|JZgC<_oHvBb3!6QQ835+ zlNiZE5uTV4wpx=SY11SJy|{6lTF$Ev#oIMr{+hPK>VJ=IL*XrCtgbE~7_P4(+>@3Q zb9vJdVC?!~3*U)<*6P-ubYW^4A3^k%?<|+ht1>=)nh+i*lv{yP*XybNS7wKT8XNCf z#riy#gE}6O$1udPyf7N(vlRN7)A8~QBzF}E8?dJRTFxnFr3hR#NKbcb@2!}agii&Ffa@Xfx$ zeoJ1S#>%5Zc#SdT+#V#<88IJhXkqPV-HSOl?dR&vV(s4B|C{Sbz*0{Q zTiZ3>$%4o64f!vo%aqpE2EOh!owo^m^2yw3K8yG58y1xnwkXsi5>*lNE{Y?#*k+D==_wdF5gD)zwrF+7ec4WRK<&bSQfN zE;;rwojfb-UNnz)`K^cD-9|Jsf1~F(@97I8)7Dezu3QN(ZzFPh$0WXh>vLi@s#ZK7 z0ZiBaQVbbyq(``#%cFBJL!Tfpm zfh!j;)^nX(d*!+pK$>MI-)%#Cj=Sas6aOuf7^3RUa@|={O$mC`qkq6U*CgR3t>C)m z=h6`GF-fYQ?>KuWCKS0d;Ei`0uYjv&Ob7XjJO9o6stcRNSqRPcvG^g}OPB6k_&`Dl zPso07no$Cq_2_VkP4h+g5@ku{-{DV*CyV2!pl0Nlxm6fdA}FTlw?uBoY^{t!}?=m($ck+PAo`fLklQBgZRU$K5_Z1NpD z$1uCDWK}MtPsf3#T-w;!SXo-)5+Xm-zWwZ5cp_sGFMV9)L)?Ue^6qQ_8B!6 z*&B-*o2^wF1lcC52~_|EWn`~d59-2l&jK`Sa@%5fU-Zgj8`ps1i3cyG&OIzTpS4lT zs+*Ni&U$fAYnSr;xQH)fpuuP45*v^5lNXAriI6Ncg?Ip*_JxfwSpi8bl;#Ne~5ca|=XK$?BpZ($@+a2h! z)O(mUci{gP^C#un?HMmzLPVvz9gmSsy(uNT%3ce{o_lzZv7&EjA#eDRJ{|Iv+9 z*-~^8k6m&Lb zHljL$t=9<`D0js80Q~%u7s1lQt0q zLf;S_>89h5b^jObkt%m~V4UHJqDGHE_&WU8Q`A;qQl`;e$-Qx;ah&kZ?2MWN0|z=> zcVhn*E;wcWtewfYExXDexWZaJL9PgyT-mP;Rsxj-;#{1@t61|53!7e?;w`c7f9f<^ zPPaN#xa(|^e@G2Ux{S-t?fN75dKuqc$e9(QXmjSu8GE4*z+Cv-2=BD-2ye>~(hQ%x z1FDeP)r;+3eSyDsi1ESk%3yw}eg8$LkrLJqGOlgk3`9$xbQ-St+s2}T7?LFBoX1|^ z{yx9Kn|&|(o{^DJKW&{yJaJ}CRI4P?Ks#;@7&?nXUgqU)*B!>(-5I`O4qo{7#fyo$ z%#N0m7d3h}M}KsdEm(zc^9~iaFLcGMsjrZM^Bpd<+~J`qIYt zfSXtooSWbxZy}6S#E1$evWa{Y)oAS8>?~axF0|S-+jSf+Y85T6d#?RK+GePiNEhz%L?%WcF` zWl#S~9e7XN`dB0&%WMZbC2afKq8n~v0`?tRzAtD}hOi9<*?h0}b~0lI96Ba06Pz-gY;ect<2H#aKaWdYzLILU> zmB7ey3Y%$xghf@0WPK)JmbAN2Zl_mM-TUh}I(2yZR?oag1KT;BqSYBd$DAB>NkA75 zHWgdvf8DUi{1rHKKX@IZU zy`*Pv9AEZy?ncNfjz1B&_D@;a;>wzV=%iVDQg{u)lJ*GQi|hGo_N9zumacJ~@Sf6G z9@wdtJ~P^<`aNA9<*@hL&Uv@>AHy@-A{mXp6Gh+lEQW0yHw9*oS&B?Wy9CzvRyrp% zR&x9-7Q%KI2L5EQ)|xVCqDJb%&{9}(OwpT+zu9I@$FX=B*Om$)K;F@Pe7c-3Q&2(o zGJf9m8~o*HMx5c#?_#nsVJB6W@ec7S$&w^ji>_Y^Rl^K0!Iv~*IBf3XDNYO$?_m6NYC zEj&+oRHt1t6gNA%_|bJNgXY|`e;*3{-@4f))9zi;v@Bf^tlfFD3*)k?|1l*BBPlE& zU2_ z`8H^Fen5D-*mPI;^_^FpSaH@Bl{~fIsm$y<5B3iB$|LX?zL|?h4-Q2@1iNMPn^3&4 z@bo^+UidM?aD_95&H7;NU)4s9<94$Ekrt37LVWF)FTrLEF2SjN>#d&B6yh44I)*1x zi^IEPn7n*_D--v1K2D?o3Il%WmwN4mNA)v`Q-d|~F%-kz*SwZ=gN`(QF4x_VZBCO}J~zOI9~}Vf2iw zeXvrv0cG3@D0ozVbL;^Qu~v|rF`rbS@+;kUqdLX2h4pZG(8v~lz)vOIc=-j@+M{tx z$G?H{*K0PKEkoxDk38HhII|P!(KnElDBF{;S`$T-H6cCVfNqIqS&TmyviQY~-JwnO z7{^vPgTzOHB@I<>Wy*}B0q^wFT`EH)i-qk{>EQ#fi8r%%o{XBEI=%BCicjvl5X~n8 zQAq2a*2sP=`xWOOtGxx_7@+bsb<+m|d*_)O-_}gR8hbz9-pE~BsQ+;twBK9mV*|i7=Zr4wT=;)=B&%uF->U&clChLSd(9RY$yc=ix9K#--q=>ky7g5zTZVjW)ADf;rQ7 zA}Cu3{gZ^JS|4t4Ud9<^5bx&e2DjtQWdr!a_=4;?T3QOG`^z zRw7y{=$_z%>$1nW*#uUqR+c8@>ZGqF!_-@0`cr~Go}WdBOD1k~bQ)8uson7C&jPUG zQW!fU&kb4u(ip?F-Q{L?JU>QNDVbvG_|)^35Yyo%^$<}fzXin-m}daMZHBw?z}>NXKi4;=-t#NW_| zXa%)jIl+Eg!b%yTV?5q{bBLz zO5CD(eL1t|!iTOIESdQAB-q9+FKr23dd+cVdtySVX z(X*QG`#-Ue?M|zi=|};UiwU8w$7X0}SjCf{70__SR1Nyck9&s1+y@s-;A$&?mZzj$ z9pw<|%rt<)PyekZMGR(wmF1B}FSgdgipP34<41L;uH;)F&%DV95^UWaJ@VE-qB4V-y`JdAn(9V&l+k!Xj z7rF|Hq>@e_F9v*g#T-pKli1(ipZ()7k220wnF`I)=k~bM%9!l&2L))H!@lH(a6nx{ zEU!Xnh48N~A}f|))+Q0jLo8Vyyw+rSHoe#Akj$)*BZ9#Uj6+QpbQtFJQfY2IH9)JO~f~SPVX30}O!>U$3 zU|U2ThYp7toX1M|i$${#PwI@uI{fy@dNPd*9QeEUV)#sQpCQLClHM+a2|_Ar&AK1( zxkcpFqFSa{1W8ucZ9UKs^N>%x>Oz>-7YhFOOaOB~XPYWFClelIt3KFDsJYFIR9SKv zchG=LsMSXKA54BOBbEIV+o-|25PGgw9=Zo>ekWXiuVu4>R8>_zWS~OwsL?zl1>U&| zb6QkJQ+~lj+czjEl)K2~F`iscjqUG4&L;Bm*UYw96u}mgiJ5Q5EBa#Wh`ykCFh#ZW z>s*36{SkEjNGFPBU`-j~%ob*b1oxkVzHyFViWF(M$l{G_&@At-CuI%$u4d9ss#PR; zp-L2u)crOFhLMWOj3>=k2#x{&m?81rv3}kan9%RCo?YT!m$QwY%X7sZH3hofFJ)S&|~% z&CYa^{%;Y+7@J_h<({&ICzU8w)wVK%yp-NJ;$aC%F#`7NYG-v>8GCaivxMBH;W1Or z&5tyoMZx)Llwb)+Q@@?OuY@X$vstJICgyoBXA^>DS3(QD#EZS91XWW>LIE(f3E;)Q z@9}?2U>0SI7+u!+K@#wvV+GWyOu(za^GU8_zhs%fwk38~e|cp!clf!JRo1Lp2-9am z-V|QI6X~HEvigNAxGu#^($U>SXyrh-=OK2O=f`Q0wOaO1pN0sF9&(_R0CfsA`M8+O z^K9KwzG8TweS4hn32=_TiDG%vI{B?6n2r&*V!%7Anvob`v`zNWE2Gl;`a9WUEfaiZ ztXCkRGb_<{JMbkJpLmyndx-PP5&(gLd-~5M>hT9h&Bw2wBDlYD;d&@%NavS(To^j5 zD=UoxNri-THAf^B`d##WhU9t*cLgdT{#D8K+B0csad3E7dPT z8=H^m=R+zua&fMgF{mwiDr%U6_mdapXA0owo=n$>X9TTWUYo41o%<=C)VUhJ_et}Z zJqZQ+vL`&>^mcnD?G5~8Q?g~6RSU7cCx&ykl3!xhYT&5yaA0_t1}Zh53Kyc|fb^tQ z`Td1Lw!#Faeo`@%pUF@cJh$9Duz=fc7icd=5gi-hV)-e1izeg8 z)k}Qk$_?u&B;#3yl%~uZlvkh}C+br?;Q;ls6@%usM9B7=ky>AgM2M~NMxzc`7hqAh z3tdsX{%;STnBAS;JZ(WDL5Ni45cC1dyL!a}=v;IdJ(Ne=`F#t}qKu0ff#Tw|Yf?^= zb#i)iS?A-J1~3@&O^hp6DQNaveu?9vxG{QQ!H98ZHtRydwg!>@HsSR}M8=o^iE`L^ zxua|GTEIXqTJN@+q79q1N_g~?QHL73OMxdVZ3zb$d2Z0|`Dus1$puaCX12Sx^K$}* zp!@v*%>*sVqXXMhj5(`m>Gw1CD9|}%kd;KQj(W}383wJk(h)LCDquor?SfN0#tl?G<#6o z_qPJ~RZ?(!dsBeeV-7m%v})Vo5Z#LCL7nyaC{a7giyS;q543)bw<|L#u)>_h9(DWX zNMkH7XU>j<)MK7)ez^P&b}Q!8S9J~ILf3~#Tmyb$X=SA;Qy`GB66>zYX2b{%<>Qpd zsj#yU8}GjI=bFd0H8ooR=`sgm{V0-AD-TC1T?G_jmj%T(uvl#D$!!N7tZkztPWJM} zcqh5z($$c8Y0Rlhcuyx9&NOmJ(AIN?-oZgCNOu3-LrJ>>R<~X8ooa>gI^L9-jj;-+ zsO8mJmc|?#kY1m#exao8+&Jm~x5aS3VGyr^02e?3U4c1kjhsV(Tty~rB3eOHg8}na zCC!Wz$JvC5TX&U_-Pn|65^q?#aKilc{`>dpMBw1#b3UPCDolU?)zsEfH1j0mKb%#n z;{~1F)1?1Bj{P$w)QBN;8o4bHj!s&qrC$G}oaK$vRgk9a>H8o@Z-J)EYz!6~s`3-l zFsCzcEZ^#Zu!toGwByMe*~!*GhH-+XI8JXj)YkHHS{|NY6uGx^OABv17vK6?%vs3n za49O*pC;sd1RLaFHTVlbnZ!SKZX|q9J7`0{CgU+=(aUrN10LtQ!mb?Nt;B#}U}P1{ zfjvH`Y~ezbTxE!{;G2|5aDVMij(WJXE#R~}_RPvsfILIKn4!KI`YHQ&L$i&eeCU8Q!V@vsh}}x(F^OPCa|9F|0RVq}&V!RR z2%fc8@ypNbk>50T!jgDSV4D+a{U%`+L9#_|b-soY(F=Du&`tZ9T~A9<OV#(^sdl8aq+m&l0()XhIxb5lK^)z##xI1qn8n)oS%!9UD{haYWgo6d_ zqv4H-!_h>ejto_1tH!or zgZJ1lEfQLX44?H0h7oL2HR6D@e^lUSPh~lA{0$dOj~~8V4!%=7$d}ZuKKqPp&7LR! z;E0Lr*UI5H_RqDs9yj@>$HJWo;C+g1+ay|P37aCaU1snZ3=ja(Q@i%=yUM?xk;Ftu zV?K@RRFNWnnD?Y%U=-9-n-aCB0ehYhz$)7oL}`I#_}gPW)fjrXW~W5a=^ocLAJ+wZ zQL_`iTg00SWlf1h1B8`F_kb?WikOW02|DpxpsPQ-(<#vo+e zzvjPFeU>)T;~5zqbF5RP&Eo{V*ClBn1C&?Y-S>lV^4OoC=U3{t%}}-W9n)UnJQnn( zZ$R?pjWZ9MGf&70z)0z@?Yq)Vr(A9$UFUvGp9obvq0u1mJlMd+lwo6RW98a7CshvH z3-83C`gfGNL&nD32zCCyo-lk4tqxM}oXYsC7)^S}rb2}tI18}gCeUoX79cOFrpUUV z2V{4&rbIm>kU(8xCF#R?V!QVxct{HPwX&+&gE0ofy2U=+EJ;Q3^?j6HQ2krOO`z9` z2J$kIb5))82r*IGN4%=P9jn&*G_TbK`XN6iqA<2?G1mfq{co$<4=l(tHkT~}0|Nn( zL4ul9qZ*U0nr*#89nt{&burHPo^V!a%6AedqbB`kPX(=xVectzQkxP-ecZDI9&9W= z=EHF7UYI4>wnw)Lb6TC|dV}O3xKoy{41RYW!&>?J%7|kK2{4IQ;}@%ni;Jfu>l$Lk3{bKhQ|AX5ESbjjCt-yHVXaMV)-_imx<>N3dgwpQ9c zm5_{Lt9W9&*qwej@D&mLq%-O60%b3+u9;UoX}*9w=8BmpcCRdWzKTs+ArNyA#nU>- zUxP=rz-%!1C1I}XPqi9%d~gB17 zFiVGvkFDk3_py?oD#Kt4GN@3+V{WbF#(N+JkHt9s%}Noa;Fe zRt&_&1>6Rf#*vQK4`H#~uI{k`L{^Ct1CfY#YvnMS0woaB9HlN@F7uZtGN1sk0M`Se zJKL2wmSmtt5UnBItsX9hU*(ea;&SS2`xq9v^;sgA8aP zmcf#5B%BL(vmV7dO#-zFFyPOE8*u&a{l@KDrGe3 zm?#f2=%b-O?}Zgfj>2Apx@bO!6A)oHfXWx zDJ5LHQpWv?{32qM0A>j1?qFEER|WS7DgT2ce`Zz+2hXHyg~saavlT# zam+C0P<|w4aRp~iiXqD_9T#sRIxF1%eHLhb$=b|&1>8&CS|T_UKwRh8_dd~;j|syy zEGqi-f0(2^q_dkO@P=$N5O$0(^p{{OaZMm~d-PVHgtm~wW`XmY0qY^o`9PUq>sBVy zbc|R`-)sRfFiMfM8j;tWUXvDg@2&kFT{%S!uSL3*%LmQ=hB^NgykXmSv8p28mpxCV zCVTq5ErLh_WY)~X7Li^c!A+v7s^DZg+$57+*EToX+YzMg_|?_dAMNe!@17S`cc7h` z4BTv;X_YuMA)jB?d3V&2aBag%m4v(b*n92cM`H}2etBi&j&1vwp--cD zvb}2ch(x)kf4EN204boguZ;18H3c_Jj&YLCFJ#FQId}HfFnO{*(7o&Cu-_n8L;(tP zU0!*g-`KoSRlg3}zHZCyBqq=bg$*MDf3bgxq=)Qp4XoK;OAiEu@y)<9=15bQ<__6I zEP^1>usg9S#it8f8KL*+A)k=cKF#t5pC{ zz78Xvb|AfZPyRHPxt>hC`DvV4e5>2Hj>2={kG)}O%rT;Jay&|qEp~y+Z$EH)>PQx-`J4T zzv!~qtnVcsk((GKrb1~1_6ksD1pb^=vEO7T`Kg`a%2m{_UcsupzSwIUI%-rW2N2zT zQdvcGDji&_I;yK=s=FUrVd17J&$LmyNixifcCzIWeg7NgI?G|L*H_6N4@zTgfMT>^zo!ZzxDA-v)H4&kKS7KE+C6uWt(v-OHT0}YcgKQp*w{=mVR7`S z^7k#x>$g_P@9i>v_V*~Pn~^J?Xc}V9tum*3kx&hyLM=|hsow+JSi6~j;O$urw(y2qhwuF0s(4Lt@`vR!UCFddJ(ew!? zy=6WeLm@xw5BE4yC?Wtw2EZF=_&HJd`u&uBGLV`!v45H|HB0g(K4z$mvv>U`JvW6? zY{7t<`BQ9=(A04#%_Fv?Vu5&T2XHh`{%`){!@vp$SS#8AebZp6^*4O&_)Ju;*{anS@ql8aZ>9msj zsrQ4F{z7=Ho=m_c8j~uzR5=9)n`&Q{i`AH;fkv8Qwk_r=?M@n20NIj%*FWpwFPdNT zo`<8un3(mk%49#-=w~V98G^$BIa-GFCGId%Wdb!FFq(w;7sLPZXt-<^JCOJA1h`6V z$Hwsh=CWMqmIRuXs&3U{^Pad!xOu5mqxZB~O-96O1l$K80nuUt4;YjvK1Efosf7Lp zooG22NQbJ}{Y~a?`c+Cv>weWxl1xW4aWH=s3z)G*vh%<7*f=07K$`NTb50eLkHx&0 zdCy#85Tm0SslZ~DW*?V03|>L)AuaUI^^SgoEC}QzGnegD5qlo;NC*b?)dubhaK&N1 zZS0^A{zAC^i4A;Dse?dwqD8*P-|iY`77IO#%M(`mOEE5XAn*7seT;PLyjmH)KvB+f z5l03UpZlVP?@<$0BKchtG&xWOLv_pH_)N*+11!L`=Kt-OeTjDKQHPluTClOzw_(@fgx8(lg=r08R%@z= z2l7*wl^u36FGLfJmT1n!Q?6bLTI@kQl>fzCh*F6^2`u(nHc-3!Nd%;9hWvkMT0fv; zIeBGk^k8^vR)9RRd3t2!2=bWC3{r~ynh`+1I#etgg32>{R63g}c1Tnle8MB^2HlrC zdh9%mP*L*$>BTvWhaQN~cw&@RE=e%P^;}4npxv%}QwO%5@a)Xq2{U#uw)yNR2(nnk zj=9uoo0l}*1hA9nXpOfCz4w@u8PwOob>kU}EjUW9lcT&A&1yX+JqcLJfF_-9w7)dr z3QKaA{FtRCy_!$S9BM!JBEnKlSbM9?bSR_#1sP-J%|rEP&1 z1RLDOLpEKljyW_Ev=38yKHjvGDkVvbwPXy-A% zRl<>_1X@K0O4u5@$bO5-XKf_Zv8cXcIUlZ7M6M6S&BQXCp&TdQ>cl)y_XV4Yy58Me zL!uM>5ef`W-m3$>yV#>@XT-T9SIpPTE0mi;ajw0F*jI_Xj}D7GqZAHQzG72U&)Rg+ z;&?KUZnuNUB?TNRYwxcV)8WIO5%Qn+*Z+bhqc$m<4XNe~Qo<;`g;bXF7!dbD_vP2i zt%cEgtWz~dpzE-CRw9bq4M5KFJC~4!P!(XVb5>`($-DB9Y4j>i;)@LCsH<%bSnhxC z!CF7HT zAXmVTr3XO{dKklzE`j{7tx4o;ppy9gBx;GP%OnKpkR713RDNWEx zVVNFc`t!I4UtIJd(u@|i#7n8HCsY@5gdlb3lz<+`tT8P5j`ztsA|3FeG749sD0-2@ zh^d*buNj{>Na1m#fZHj*TH}N}Nv+N|kttILG=JXK(SaejDu#o~>1$3NIfxBGku%$GdOmU`zK}B8|}~>7PL5H*3(uR z8m8~=#C`HBFhxgI2koCB%@`a&3I`*$mIs($1l7D%tFwDwC;Qb!()B;-KLE~%kcw6c z^*Og=kLb%yFD#C9GwhZ=(XpoRvbIZHbSV=0Dt@_ zb=~Cs4~zcm2^m7Xn3e6T`SIhKK_#XDGDgoG<9HzdFzD49%7QEF08l-%G4kD&1aH*! zKAxovo0=T`enQo1-mdz7F9mY+>|pDa#h?&PQlxTQp;&K^`mZ zr`-obT=7Gg@VMiq+L#>bK@U`?*`(e}JSPuDbwmqtcwd2{C_mB4!33TA*{UH(?u?kR zu9UHE;Y3mmAG$r$ugRCl*#;fd!!Csb9mfNSBUg3cHbmAwSztc;S-bGGkmF@^go=7r zF7;Loyp8qA=g*;MNcb-w+(2xPe~mW1un2=1cL6UM?0Xm;C1!S}!sYgF^3y-GHRL=> zmOic&$`ls&c*uJr;Ttg|WiLAGSzkeHZN!+0@NvMX-h8No1I7Oy?lthsdB1~L{m zANx6U)y#dhuyO`eVRxiIoT4o^9jNZKq}~nzP2Q6k*Binimboe8e!ZD6-fh% zz5RWgg94M*7K~KF!Q3^PJFn6~4w(8$Q|hyB>MUg)4^rD|jdAIt2-#{R2U_Cs=iva) z89I@YZDv7jI0qDeYe2G*+b-<^OP_{nBOO|Xlkx;}B*k`;H26&e1iu%c7CVE=OyY~xnR;{uNHmW@rld4GeME3t#<9TLg zr!i^JQ3+?mVTM^HYvi+v%(A$|mW~!P+IM>p0Q2g<>DDl~NV zVCto_{QeSk)NDaA(Tj8nrdI}oj3Vk2P+~Xw8u_xI4`yz|2t)GLu7lumbiHrLo!B2! zJ2>p=p6eu;d=eJ0P}dxX{>1-59c?Pp=1G7H{U#X!14Cb-V7I-8w!-azOq3`z4sAb+ zQgD|*^H9tBZJjeLHevU|=ZmA%M}{75oxNtqB=tVZXG=gu&DI*U!&|iBUKU33VkPzh zT0ZJ$_eUAPvR;YIWCU(pUVs@(n|GF_Ow^e@%M%bU8DI((HwTgFgKG`9NTyf3G_}>M zbNaR9c_61SuV(vqJCYu5xDLI1;R6Nr|5bIwTtHz9b@bHH4_0$K|BG9CuU25dg)>Y} z=SCEvT?9|-#?+4amc8+5N{SeCG@R`a$z-Hm(-3(4C2}5gCWL|!N1bP$4*Xk}AemG| z*v80RWbycj&x~sWj6zOK{DNY{a&C4^6BrA9JqUd|JgGMvIBU71^L(W)Re5v+~wZS1&Qdt(D0cbz;?3qQGtNk}M z1UqaT=)IcgM5aDQo;57+6m*MNJlD-i&yBle$XiwP=7THgDru#dbY+SuIaWYb7EG>a znN_+(6bBgB48QOqw~kkPQeZWc$ttGFxqQ&Rr|>q4WavNvEH^RN2C_-daBHF~5qtNJ z!jKI=lt?9RRXUD?>zlG>tqN6x3cRi^;O6TveAdz;=L9Jz8xumNX6BB%{P3cq1$hqy zLSqn62hKB~wnMaUfTItKa5GQBJGP_KVukP)p zdbaR6Z=y&IW068CkoyFgkxqyK?0gVpHV_5t5I0JU*p?D03|EWPuxK zA{st9K>OxEyq9!_8Wul63WcG0+=7A5BHDenEm258?~uI@5R&KeR5^M9O52V3U{q4V zFpt(VF{=)vpz5T!E0^&G6g!HN_aK(_nRgc7RQ!$W18yE{Oz{3X5*<3`)FiJcvh=c+ z#a=Q9IRRHZDHK37Pvc{pX5~yLCh-uPF#7S0x>-^LyN&{k89|6!JjRJI6fqbZ9tD(% z;R;lkegYCLiUITz!MIMClk_V2EMNPzjC|AM)ok5cD5CeOR)`%^--VAM56Bq>Pkx6)s5x|QvWo4y zRLQfypW?+(h+V7HmeSRE%99H(zfJCAK&p9yLLuj@h4_CE;mPmQR-khiA0A`-PnzVm zS--ToIqXBj$Uu=Rj6OeP6;G4Jhp~*}l|KXeyH9D+aTi|zW06!W&~_o^z9lcsd=sdV zj0T~8`f#??WqtI~AFL1Y0cK&--=2gHN=Ga}0!mRjiWDgUE4}v;K#Cw8LWcyTsJxVyjtB%rK)Q$` zp$aHM6i^7DR4Gy-z1Q5~bMFtI?_Kv#xNE7%%AArpGtWG;pS|}Hwu}7oXv=-H8g`P? z;{{MIv-4LVkUH~-Y%zt=%^r|af4+5=KGwUJ3L+8f{00O>O*o6IE@v#^TB-R9rWOkL z#iBZ~3xQ*pz}6vJh_!X%>y=@ojEz%bc91od-uPQuieO zu++-gQr9i+P%f>41Qs6$V3?qJ882+zl+yY%>Fm896e2qBBM`|*x&A0bP4ncEBpazg zQMawsq>OQnk@8%Y1}brZ;~rDW1aXHtb;9-v(E5Sf6y+-rK5jy+hA1=kAb{oUn?Mn= zkiHm0xpxY2z2hKsrDJLFx@5`592;~qAEw1qet*UMA>}1Zsvc&MS#LUo<&>IXHkXy4^le}-w^ORxi%bplk zhm)~D&p}%%I#jE26Z#h8WN}h$0(-x;sd&kdmsEc?yv3O+oj#^;MruaqylPyTsAB<= zW7hGt#6W8H`2i_hkj=@mx_GzxY%7*)&a`-Rb&e4J1;A}%HjH+l4;{+3bwhF4s{wf zAj;!Cytxp`Lkkk7lQF?6z`sMq8ub?}F^n0|;Cxnw$9+<%2@ocvzqyLf0-b~-m6^r! zawhDKLjHW_7B!pFD9jJ z9%ZIN0H=4oL1aCsGCRa}r(FgdC%X+$$Dodd*pc0WTz{73>W>zt+)fe5o)%}Ed!9d0 zm9RD!I25gbr1+!%JYrG8y`9*;K8-_xQDumq=}n?s9CrSY2MGQbSCu=qX1wZ~G!&`r ze%;B{D~$ty`z3!2`2_-Zk2-k-9-q-lde)nJDSx~^zuNdF~LFk|Yink)rv2Q9~(0@57 zmo+NZ5p{)b(YtzrLHI(=j5%occO3T!jF=GlR0qzUJ!9IOq_lqT3B20*+j(rgq%+e< zmr=?br!23^ecCvRVBx2eF*xJy-M_m;2rh>|(Dl#$9LF1A-sLNsW+X1abBTH$BsY(M zjNI-^GXJsS2?Io<_F-*xdR0PL_%Kv*q#;Ai`mUMa^`CL}LhYMFoyP@GMU8!#cqAzJmD>G=SQIO zW@3cW3{lkM!bWH2n^X?_ZXPQvjWuxJ2>2`V{^*_9rzP}gv+eoT!Y8Q!Cb_+%$}diP z6Jo#<3fp4U60Qp26wzaJuay;tUOHK1DPkCHBZ5r|W_s_uIh5>jMy*dEPL|&j3D??m z=Y61s5^Q3OYBQA(=9Fc8=k%-gb)=u&+YEnuM%d#aUzww60%dPRlQ!h!2DRM!XJLRbeY-L5McbsEFMIf9MYSwN~f44bU=r5)dom{U} z6{}|QdNA4XnJ#&1FGtP;$Py**1L&?=Y~;oVcb}V24u+m2CNgX1TAqj7ZDT`9E>Y`u z?Lv#k_qM=&bl|RZh!NER_vKC!UkvY!fL4t7Vfa|E{p$!Yx_i`a?YVF6cZO^?r_ez| zF}c;O8Gdlvk!Id9v#RZpBSt_zel$Tri&b^r_XVLt8@g0@8*F{REO1dF)=2qG-9l}` zlh+|PHf&uX1$HvAt8cgEi>gEKRsX5Rh7n8SX{CbKIV)C+!4%!NNrQy7jT#p1NA$a3 zRK{!)Ztv9PDh11Qu(taCMN~5?KpNabUpg-*>~Y5(S4i3hc4!C=#WUa*US#k?!Fhz| zCnW)O0sV?!K!6UFj0HjVb4bL^9ZNl8C?IqQ@Zq0euik<`(j}bupE{rLlL#nk!M=q`p)$d{o zq5`-tRp5F~{{+?Tn>RbxSirl@dZf$ScZ4o685^zWhQPT@n zS2%>VMe5H0$CXDw|5ftyh~TsynoGR)HT}-{xcxx3{JRO~N%KYz>3!jL!}l^T@y_R& z%tk}nuX9GZ|t@_P@? z_1mA}0RBnwx~)m)Wv|Grz2*Hk6q^6+F1#S%%7XK}F{Yvcrg;fWL+NmqRjq+B#q{RU z4Ui_nMFODB2H2St=+j)l{=w<9QV>urJM1C&Js=<={O%crtoRb8CjxvHHEHpXG>Gl03AtZQS@QL&a z3ypeyoMsAqHhA&Py;&)SWT3h1_RB}ON6N3CF{1U=(_=BMuzY1x%o{TW zEPO6jF=%kx^H;l#g37LKgLR;o;kgspZ}=opC$eKs{@jsI%$)|tOj8sFo5ZKAXu6RS z(CWhjy2Fj`uD~URsq=f1woDv(K{AnNr&0SEPfEXP`R|W!iI)l!4;=Aj^v_%*6CM(n)~|FKP7XP!|NsA zX*59jtAx$KNAx(^io;}eYjg7~G41INiRxAX%bT zht@;iBPWWXH*65)r2D23%7v(NHjh1kb6UPVMUMFQm-GAKP`V! z;D7HmF}`gA0kZz@v(TmM_O$xOQ~2d3PhLadFT^fT%2n;XMwF$jhhdc0Y&RL`nJ%yL zTO<5g_<$@lY}ea;qIrxmns^GK!UJ3x=)+b5j+-y>rJF*~>evw>1ZyLStDgS18zd7j zf2S*pH6J!W6!8-fvsYlj+bodDOy(40MU7X{3FnZ#NrqSM0cbjzwN#3mMZ6HWO^)wURscfU>6;Zc$9KT(eveR1@qAH=HWnREo8eAB?7Y@@!lw^@t`c+GBdz)L?|B&~e z^~`YEy9kFb3GdQ4up;+DiB*@vJ6=C{Iz1(4vGdQt5Z{U1SZjbI$~qd}5#lR@Z_JfA zC#4%d8Q?1`cY_e89~c<;Qm^a}z(--ICl1|lz9CO?Ad%jF!Naa)N|?$@)y3W+-Z&84 zaM8&*FXlCm{S%`6Gg^>cA0OTG{esmRd2c^*9av(p{~ErUOwwJcu&0wpsP-0|(t@*qi3IHVZ@`$B%aL%?X)5|FNR#{4BAkpCG2QOdVi7DOVT zSE7Hr&aSAZ@au+6T&kYFv>$Vs$|q3|kW%m=qZL+l%N(Af$OlctbjTt5?>hHL7rBev zJ$OHhL|RlYGSNre%5b7toE~A5X2h45tizsrPB8`|%~!m-kGU(c!Fi1p`wc|rxAk|> zj{<-j%hm^ADx<`iRiMO!@w7|jMsX|JoyG4ZZ^(k}MLZo}5L9nnc`5Pd(=SiUvUobd z4l9k-DZTSD$F)y;CNXM4nM7V{lz6Qs@Z!*m0NW(586dR=rhAYFZAkKP!nZzP+gQS`q zAS&ugURqgMLCAYgvP$2KK>hKpN5Q#R{VBw8STLXdqB6MEwG#XDYm4%_L?&!xDfN7c zl?GTG4$wV|W@CqoO78?vV^wyP<0CH!v^}}YBqn4aC?Lpzt-I8%x+vDazC0vjzL!KQ z@Ogb-FwB2#&6F#}EuqD86>&WN>?uUr{A0s%zpV^pO3Jo4UlEWl0(@BzD$$LhQ$ zdcX?Rf-dFhm1BsIU9P&xeTP*_sZZWNA?Mc~f&2_&6X5t$!@{wtn1mx(JN4!%k3c+6 zRYcioxp0p1wZJLC3=pMVV6RM5=wU!a-opK*0P^vpm&EDw48*D_itK7MJuvB|eVthS z6}xsmW7eyCJLv*EIq99>T+eB!Mp`fTED%aYs7xavMAJ#xS8 zq0Wz6Sq-X*L{auNMiBT!XK zPxnwkf3;bQY`_r}kB!J^-8S^_hW^f>aoxho3idv583maX-VN9bv>yW!f*T1KN3vu^ z%=?VTx%S$hmUVoQ0S;x4R>rou9Yq?x6#2VXQrQrGu&o1aM=C%j{igglT0-MnXuEOy z*F!Q`xQd8#Da2XL?vfctl+8kxgoZvdYG4&01nk1#o!vq8L#EwI=lVkAFkK4i6DJGBTcl;puFt zbQ8plGMXkZ}IknKni0sPh#s2UY@gXTvpFawPjK=m{jnV-ogcu#nJ#_68H-)ovmdi!|pK7Ocj=4ZVV;C5g zOt41g&lCu(a~)sq3xh}sVJ z#9)k%yR{O;@X2G~%G%60?^RMF5vlmw%d)ptwg20Np$jM{T=L+ZKt!A}m39}=CmNgf zojskEK1~P)Zw1g|o=r={kxbuFzWfP}cm!Qn0V0u|T%XV95NvYsk2|U8Pc2hX)4>es zsMsGLeIa*k+;UMf(uJV=wz%OIROVHDk8t!ggwQMHp0M1`zH7C?qctE0Rkb*$pTv(C z!PxA8iV1-x?;yXOB6La_ddE*^Hv(Ms!pT4}9`H2V;9QmcZz%Onh2NX(THigM7h+-k z>mNoq)ZOBjZN)lMUAkv7Ge2=18!TaU$X^ajdKsX>N}C4vwW&{ft;FNGb|HHZs(HP5 zl!8`gUGjqeumIp?KW-ofqz!yf@RtcNBVG2Hv}_v9-co25^*=&~7}5pwHtl?$#V#Q{ zT3k4KApgUTy}3N{tN!Er)zS4w?cF(;V9iQ00g#Ow&$ZG@?NteZbdlErvRVe?W}+we z#*W8L0L==X$)ctCQNP36$>6`wK`xOiWj%JN_rxRjhD!zPo)y1jkL>M(@z4HS=-|P= zP6$?%gz!61iGt>fO}z+2k;uu{Sx5((tM$KcdsX0)dr78uP6LIr)i(Gx-m@p1+>vph zCPfQ5cdJ{yUv$zMcU)pJ_KNgGsPiW)Q%&ubIw12o@H?Ew7dsXNk%bYUqGGTyZAlT@ zX}NOvvXL6~nhurx&6#BkGh`zNnKLmTSzSGG6|8}-PhcrWbsoQJ7o0E!8tsYQc+wWh z6s_}<;PzEd4qYd6XLJ>Coj0#o$$WB(w~U6(bVCY6bnbwDbOY3#X> z9?CcZ#((KtO7~`F=7MEBIgQ$As6}d8PQXgG?T`gZmVZL-$EjF|!piXMnh%-GMc9>^^jac$abstq5? zOWnm4CRkn}8c1W;fE^bLav-N9o|1X-P-l<==(iM?gYBi>N7)ov;Jp(*OlP+R9A!d| z0Irn?7<|l^sJrDNEzd#o>CnH(5+T;oD&G`-98LgtRn0s;=~fsE#uAGJju%*J$1gW-^pJr) zLz^Vn$3lN{EOg-4ET)UpqB_d-siPhE->1^F$R|~MqXr%cc7uxaUHb1v8VcwE-_(Y& zOS`i>K3WuQTNnl{M8<;f>NOfdt{8&MVO3;AMbvp<78b!nT^;fL#ck|~*W7a>U4>a| z42=R0UX;by57N#)Abf{l)NSyox5K)Ppk`_JOcIgFYKVSO9@Zab0_FT#`@A%VARXS- z2{P^N1#=mYyeQuQoi-1u=K8yb27XrqnN5%_0Z>|w{Q%g~U#y)iV9`yv8CTxsC2A(>=!q|*3eWz- zjhdpSgR&IBfND8vrBhk8_?HEVWib(nW1v)|VbiMB^0%|I)yPNqmhOS6|qLeDc19oxLo@&{ti? z_+I*Sx#Kw?T0Mi)g*ae5I|VG^^Xq`o7LvCdnq7{;7?wc;w@~l8QDf*~>GsOt=VZMk zU{l%=EF^r6lC%h8O-JBI@|PRe_rfAT{WI{y+&U9F^YOwTxj1}vCVG~4UJ2g!Rn!ch zE)I=oI=?4nzPA35_O`&ue8O?|ZiOgk9JnxaNCMXSq2Gb+s4uPEa$m95WPcNj5$Dt; z_-9voW6v0n2Zv2vKax(T%9y4pxwV>;cA8iN!v5Qn2GBygxdE|&^C~m^Z*#Y4tspK=K^x- z9M3R*$60Br8C#0m1f_b1U`ruwQqzZ7T%n3i)3H`F@?1yQ@$Kn}UEQLQnq`hA?d|OB zth8(mT6qE1%ufU)7L$44SRjI3r~kZzQJ;_%(1yCqoU8Bilc}=h!x(#~L=m-JpFaos%HyE>e9cumq~JndzZ`nx%+9Ev{#C(E8MG@tV`Q+|8}4YU4-#SgXQuns2d;d zoJOdGnGf%f7*h3h^nqrK{jDN}#ctcRI5%L> zYGQvd^@gG%kF2d%2%?ze^(vbJpjg*aBoU}+&!>^bz7s&tz(Qi7WuxZ?w-~U&HwbFq z_oV4ddNFyXP0=i?BMdOYFN1O#fdTj3igjoz&RO->%0zb|@XWdxAZYbhLP<@GUB^G8 zxiLW(mQ2&=zIH>zgxZm&H8xY^;yS!YFHdO?5QcY}TmX>g9~Zv!!8TH!{A~N&^e>P{ z-V)Tr5tOuB;}{}xM?r~~^x4X*X{#BO$Qq%lDhhd3@sL4{g)=5t_u0&zVx(l~X>CS$ z8b++$_X@}LUH4MukO?EY;V`K z9Q^|rA3mmc@7}dT@-HZ+HFD>Ravi>7-8bgB_e^7P?;-o7J-LHzzbKse7eq>6vp=@; zb?Q@me$3EMuZv2VSl#SssUH3k>XHIzt7%jel&)uf3vzYCCyZtF1-_o%sLeDd(0W|F z){lqMj4F$pGgZsT(H4g_`kClYiluPm_>DeMXiApKjumGMrGnkFGgxbWb|NBnf8STH zygTWa=AAUMCVBaz4j_NzUdsD8Yrg1Xy>D;;;oPt1U>9E(n=0>4KGNd>D(6fMGxWvK8k5o6A|(nCK`F9YA2q51p9-l>=yR8&X&opOu0B6?88SF` zTne{)n883ERnymCZL@aI|M$=9wh4pr8>{N@_LG-$_yB#nUymZW{30;=y?SltS6XAz z$j_?5*$89!J1D`-^3wlL<3B=Nt2m#DU7uYgM1mG*aJ; zGSe?^+6-aPKsD(BC_St3z+=<;bng_F%hrR!&lywCx~edHRo@u$H*Kj@M`}yc8$sGW zSTKT&p{R{+6UbloII%|i%w)#8MV;=QVA5r(^#Pb2Qt39H4s{~KDQ=t<_sUiY-``}D zuC$nM^rcY*B`Y_r`rg0tgV?h_-LF$X*6kSzmUL5hu+8Lc{CYez$#8r`&*;a$`c}k* z-r6aTXF@KRsjUr$a;0yT{rad@g$oBix&9S!eFiKcTEzsWFCH3fd*|m}+7KGRT)FjP zQUq!OD0Ytbs86SkB6#772o?_?!wUIrND#JH(uJ1zt+W|LBE))G6DG1qM)TF9>UGz>Yxq4HOd3wjqUr=838es^!g?{o~JI83y!%UyDUjv`-}>?a`PML zoG=TuFK4%hA{~4S<`Gh7ZLb#CL$QJ2H5kAMa(fs&Cg%L>9+o?Ro^s=2r7P8ON_2AJ z)x(76 z*jJ2Ev%UL`yL$36oQkR6E~vYe6}ky%L)YB_nd~B{AYKmxB#aY7Y*KocqxvhAbh!Gn z)RMWquQQewbsM^jHno6UoVbgzW6bncsyrgyRT#CPGlX>MI>iP5g zS&I}>IC*rp6x2*&8e;5f@V`V+rl*kKxQVp)QuP^QImZJN0FA;Myet9__^pxQ;o*;X zJKq4WRoX8@wZQCw=zYY%FMB846QSrY(gIk$H>dmn?BO-?eyJ7UiEqJ|7;dp|k5vXj zh{bUL9xlakw}5Bgw-O`#cc-0WSKzhYnN`AmxHLmubG)G_I&(}?lmWygLM#fWGFW9v z@wvk?5YD{8`JgIXw7-WDr)pJK>YR6eB6G-uMg?Ctg;BTJ5-8D#s$u6Bh0aBXvdMHu z7_&rmS>c7wKh;+=`;EbEHkU~~8HJCn=_I5;O;Jvk&cAebM{E zTcyvZ@DFJRtThhq(;3ne;(oc+iM~Y`?U9^u@}SX>!Ncjd^n~v$TtfWAx2ML{T=O1~ z%HB?4Dnm?y%481(j3))=_cLkU^9VqiG%XsfWt9;_)wy9yZ7IiX$10y&JZ^M-)!u4& zpxA-#G*lsO;IoAzv@`4v8m~>5Zs*9kUj%Vimq$wuum4_3G6^rIHtMeKP0XX`PxE_R z3_T8>GCxS)%N4mo=eAz3m`h*wkAA0S-{n&oH9S(H%=QHre%^d}V0HI0f-n)iEWbX{ zC*%I;?7^)s^|2l~9U&S96|86G%EndGdE|6W>m(M4Kf*FnI|jnD%RfoU)ex)`%;L@7 z1=uY4R1um<8r+%O{c6;ytNyQoi(-}C8f@R_nf+v@zXExF*6 z;rMC;+fJCVCyLmg$cWAO{*lSdY_K&nE`y>yxVNekYo@f9?U=r+ zs|#yu4=U(i>F_`Jei>3E4sx=X)fuGDTRUa{buha-)^D*w2x?dqlp_5>7&gZ(S|kr; z_A+%hi@WlUy@NmP)qHoR#qc5e?ugZKRDdbuKWLIBYiEf*oHvfYJ(gL0Ebc^E-!D3Z zWG(c$@=90bW_e1K>9kGj!+73V7^K1R9K(wW7JZ_$KIgAwM>k0n;%!?*Xiz37)|y;T zg;NKlV0d}*&g=~5wRpIG1yR+#xrdQuBrYsJd(fofj)^?EhhH0(T-SBEb3iu#i6P{u z#*oI?$g>$Gr3p)}@Na$oxR_%RXAAQ-C>8n8-5mL2#c6Rwk}1q4P&Ji^-YNCG*caod zQ>Z>!R{Iu?>^nkg6LrW7O0e2;J0nYucT#9S9tbCIzkIt%nvM;I)?+c+%YM16J?970d)3~J z$6!3!ch>{-|A5?Eq|->;i?lvuqZORJyz=_$pnpq}@sC6k$jKvWb-3am-kMz2b$ini z-PJ6I1x3+chCMgA&*PlYrRvD4Vo*-xqrrrm;BwOF#$*)y@m9=E2>Ub5VLbTFgD#@~ zIM^2)S{&&_dpyb_4y@R}F#K)HB8a>kiI^=-u$1%^8{!m>U3aSy(dlwtye{N~DyGh| z-d~q~nL?R5mHaYpAV9o8TIEo-7hnSF~qWz7Jn+lf7Cry1oAOkm7RTL1^6ND52Xjf9uZg$oY}ohvuDyP*w!fV|iVLYdLUa)rG*88uf}1-MO|TMak4peDAcwt2pu$1=WRv?9GM0 zDpwkv*Nz%Y2ue@NzrC=-Xk_afyYZc2qR|<#DDz;D!Eb_CWzYDcQEb^u1=D5=_&P`- zFWi2gX`KNUw|EmF!qqJ0&S4tmT(GIO@F4MAU7qb+x7m;^gKq8|s_9OmFVEHoA>wEu zYio6asCX)ebo+LNEq1J#)RMd4M_e0s!pfvKtOeN;# zc!TuLefGAZpqj3&3L-!K273t~d~3G|V@$NM)e~;CAFkUE>|;0(;Ya*=HWY06f>SxV z+)QFtoJ@u;k=9=Xp?2o%Pkh@u3>)r z<0W-V*CY0T!|MC<$EHH|l{Yd%crhJ&V_8bfvoDM!Qq)aiO=3R$x+R(#YFpRT<>dY= z)6+s>u%v6zq$<#y3%A^e;rpj#MlJQ#^Zs(-e`v-6+2$nk>z02J4<0$A`~I2*CioBi z+}x32a3#r?btL3}Ir^?ElgbBOojp#kNM3S^Hx_1{8HJ_Bh%~$*O~)|YF_Kryyn(+V zmwLfg*)~nK+{!jlRHYJs`XEuU_aE1T4~)3wCi#r=OW6^6*QbsKuNW};Puwi}A)IaX z`TZ>4#cnR1PAA0suRs2Zme2HY_7CRPRo0*~Kk)@9r81$-a`=iw%%2@)SEfIEP~5Qm zcv#Q&s$O6v=-3rh8nWsZ49RE=O|i{I&UFmasc&CwSR?H@+^GL5rRg2NS4tA!PQU7Y z!HJig_|Q<>f9~9@#lP+B>lg;Dj`+9vB`arLu=e>L?Mjhl*~Jo9mqxBhGTT4Bsj_X` z)?3HUk6vzWFF*b;=V&P5[Yh;-7RG0pl5|m+YlbY_uXp)t9v000U=5xZD%HRFh zWb?-=%-!bBgq}iBPrr0`I7z0b-RjJ$=@&(u1#3>?!gf$ucnE*Rb!n!NyU%wUJZ(fBErufiw5xDOnMwl=-s#j+{CLriA!QVsmF}(> zk=3WSKOE(Ieyu|x{{y3Oy>W<*+g|(WhL2>Q_Oy%i1DKTR&F!#8)lvuhI@DLIN`xQ;^J;(98xrIDh$1RPDYn) zAawv;>rV&g#d1eg`wq6_*%_WREoM^i?HBL;F1|P0N$=Q^QC=k${D^J|NsUfU+>k4E zo=6XZrU-9El{?)k$Zmd8Q+fAgi5g5O8hr5UO1RNY?SbVm1oPJb?|McQw<^#%e6-r%m@xr(CgPhMv4gmvpn%B4o&JI#3GlT~+oU z_-D&mu})+(AS5Dn|0WA)aV}rVNBmv2`&39or*mU$$IZ+y-03%N-m^MUkPFOSD{%c3 z7g!c_%5v@3GyMzHY(KVZHEY=TfwL21c#7h$D}aZuPR|csZFllh19%>sydswqNS6Qq zum8U{{-1+kodSEjV$oqus9=L2NYMYbxxb^mzmwv9UnlSbl97_WDlTc?Hy@&9pvhnJ(PbMVOl(&FHcl&rCgl;Sm6#jCRa`+yLg>`-uk&dC-0 zyqx_5?R}jf4G()4Cmnki*ZU8V*Cpg75B&YT z6(uDBZ%o4Vta!e#)1={Jvp)Q1B{1*qT(&D`xp-=Pk%*4ebCeok}jq+ zNd8}K{&Q(X#d}V!E)V=6S!tQ11fxjMhWo$H^MBfyxjOnkIBCKYMl}kWocpgPI<6j0 z{=wc((0}eq(%aKTwZ;@w;{V5abc{hONcyUb)HMY;>8r9" - ], - "author": "https://github.com/justjavac", - "homepage_url": "https://github.com/justjavac/ReplaceGoogleCDN", - "-ms-preload": { - "backgroundScript": "backgroundScriptsAPIBridge.js", - "contentScript": "contentScriptsAPIBridge.js" - } -} \ No newline at end of file