From 70aa9ae046fadb6251110376a6c15d95187eec6a Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 23 Jan 2024 20:18:32 +0300 Subject: [PATCH 01/92] Localization promo messages --- src/_locales/de/messages.json | 4 ++++ src/_locales/en/messages.json | 4 ++-- src/_locales/zh_CN/messages.json | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 72cac68..6e4ca47 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -311,5 +311,9 @@ "intervalsChart": { "message": "Nur Zeitintervalle größer als", "description": "werden angezeigt" + }, + "promoClearYoutube": { + "message": "Möchten Sie Kurzfilme, Kommentare, empfohlene Videos, Abonnements und andere YouTube-Ablenkungen blockieren? Wir haben eine weitere Erweiterung erstellt, mit der Sie YouTube ohne Ablenkung ansehen können.", + "description": "Install" } } \ No newline at end of file diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 17a22db..c7ad416 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -215,8 +215,8 @@ "message": "Leave a review!" }, "promoClearYoutube": { - "message": "Хотели бы вы блокировать шортсы, комментарии, рекомендованные видео, подписки и другие отвлекающие элементы YouTube? Мы создали еще одно расширение, которое поможет вам смотреть YouTube без отвлекающих факторов.", - "description": "Установить" + "message": "Would you like to block shorts, comments, recommended videos, subscriptions, and other YouTube distractions? We've created another extension that will help you watch YouTube without distractions.", + "description": "Install" }, "block": { "message": "You've reached your limit for today on " diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 1693af3..8bbba44 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -311,5 +311,9 @@ "intervalsChart": { "message": "只有时间间隔大于", "description": "展示" + }, + "promoClearYoutube": { + "message": "您想屏蔽短片、评论、推荐视频、订阅和其他 YouTube 干扰内容吗? 我们创建了另一个扩展程序,可帮助您不受干扰地观看 YouTube", + "description": "安装" } } From 6426b564511c0ccc725dd4fd216bbfb9349abc2d Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 23 Jan 2024 20:18:41 +0300 Subject: [PATCH 02/92] Bump version to 2.0.15 --- src/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/manifest.json b/src/manifest.json index 0e6be12..d1f6a30 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "short_name": "Web Tracker", - "version": "2.0.14", + "version": "2.0.15", "description": "__MSG_extDescription__", "options_page": "src/dashboard.html", "default_locale": "en", From de1873ea920b076fc9606b4573b44422df27d99e Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Jan 2024 16:38:22 +0300 Subject: [PATCH 03/92] Add icons for dark/light mode --- src/assets/icons/dark-mode.svg | 9 +++++++-- src/assets/icons/light-mode.svg | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/assets/icons/light-mode.svg diff --git a/src/assets/icons/dark-mode.svg b/src/assets/icons/dark-mode.svg index 767b50e..eec14be 100644 --- a/src/assets/icons/dark-mode.svg +++ b/src/assets/icons/dark-mode.svg @@ -1,2 +1,7 @@ - - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/light-mode.svg b/src/assets/icons/light-mode.svg new file mode 100644 index 0000000..1cc8e8a --- /dev/null +++ b/src/assets/icons/light-mode.svg @@ -0,0 +1,7 @@ + + + \ No newline at end of file From 1efd8669cbf2b15166f68857fb6662f155543676 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Jan 2024 16:39:44 +0300 Subject: [PATCH 04/92] Change dark mode --- src/assets/css/dark.css | 10 ++++++++++ src/pages/Dashboard.vue | 2 +- src/pages/Popup.vue | 36 ++++++++++++++++++++++++++++++++++-- src/popup.html | 3 ++- src/utils/dark-mode.ts | 3 +++ 5 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/assets/css/dark.css create mode 100644 src/utils/dark-mode.ts diff --git a/src/assets/css/dark.css b/src/assets/css/dark.css new file mode 100644 index 0000000..1ccd83e --- /dev/null +++ b/src/assets/css/dark.css @@ -0,0 +1,10 @@ +.dark{ + background-color: #303030; + color: white; +} +.dark .headerBlock .header { + color: #ffffff; +} +.dark .headerBlock .icons-block a img { + filter: invert(100%) sepia(17%) saturate(0%) hue-rotate(24deg) brightness(103%) contrast(102%); +} \ No newline at end of file diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index 993e62c..c8bb8a0 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -135,7 +135,7 @@ diff --git a/src/popup.html b/src/popup.html index c0a5d37..6fa1948 100644 --- a/src/popup.html +++ b/src/popup.html @@ -1,4 +1,4 @@ - + @@ -11,6 +11,7 @@ + diff --git a/src/utils/dark-mode.ts b/src/utils/dark-mode.ts new file mode 100644 index 0000000..7919a6b --- /dev/null +++ b/src/utils/dark-mode.ts @@ -0,0 +1,3 @@ +export function applyDarkMode(value: boolean): void { + value ? document.body.classList.add('dark') : document.body.classList.remove('dark'); +} From 459770714ca182fab7bff67982467b644b681d3b Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Jan 2024 20:55:51 +0300 Subject: [PATCH 05/92] Dark mode UI --- src/assets/css/dark.css | 35 ++++++++++++ src/components/DonutChart.vue | 103 ++++++++++++++++++++-------------- src/pages/Popup.vue | 11 +++- 3 files changed, 106 insertions(+), 43 deletions(-) diff --git a/src/assets/css/dark.css b/src/assets/css/dark.css index 1ccd83e..ce5ce44 100644 --- a/src/assets/css/dark.css +++ b/src/assets/css/dark.css @@ -5,6 +5,41 @@ .dark .headerBlock .header { color: #ffffff; } +.dark .headerBlock .icons-block a:hover{ + filter: invert(40%) sepia(94%) saturate(3371%) hue-rotate(227deg) brightness(99%) contrast(92%); +} .dark .headerBlock .icons-block a img { filter: invert(100%) sepia(17%) saturate(0%) hue-rotate(24deg) brightness(103%) contrast(102%); +} +.dark .header-block { + background-color: #616161; +} +.dark .tab-item .progress-bar{ + border: 1.5px rgb(107 107 107) solid; +} +.dark .tab-item:hover{ + border: 1px rgb(107 107 107) solid; +} +.dark .tab-item .links .link{ + filter: invert(100%) sepia(17%) saturate(0%) hue-rotate(24deg) brightness(103%) contrast(102%); +} +.dark .stats-block .block p{ + color: #b9b9b9; +} +.dark .stats-block .block .header { + background-color: #595959; + color: rgb(255 255 255); +} +.dark .stats-block.block .header{ + background-color: #595959; + color: rgb(255 255 255); +} +.dark .stats-block.block p{ + color: #b9b9b9; +} +.dark .expander-body{ + background-color: #595959; +} +.dark .header span{ + color: rgb(255 255 255); } \ No newline at end of file diff --git a/src/components/DonutChart.vue b/src/components/DonutChart.vue index 60329f5..88f20ac 100644 --- a/src/components/DonutChart.vue +++ b/src/components/DonutChart.vue @@ -1,6 +1,6 @@ @@ -14,57 +14,76 @@ export default { import { Doughnut } from 'vue-chartjs'; import { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'; import { convertSummaryTimeToString } from '../utils/converter'; +import { injecStorage } from '../storage/inject-storage'; +import { onMounted, ref } from 'vue'; +import { DARK_MODE_DEFAULT, StorageParams } from '../storage/storage-params'; const props = defineProps<{ time: number[]; labels: string[]; }>(); -ChartJS.register(ArcElement, Tooltip, Legend); +const settingsStorage = injecStorage(); +const darkMode = ref(); +const data = ref(); +const options = ref(); -const data = { - labels: props.labels, - datasets: [ - { - backgroundColor: [ - '#5668e2', - '#8a56e2', - '#cf56e2', - '#e256ae', - '#e25668', - '#e28956', - '#e2cf56', - '#d0ff82', - '#aee256', - '#68e256', +onMounted(async () => { + darkMode.value = await settingsStorage.getValue(StorageParams.DARK_MODE, DARK_MODE_DEFAULT); + if (darkMode) { + data.value = { + labels: props.labels, + datasets: [ + { + borderWidth: 2, + borderColor: darkMode.value ? '#303030' : '#fff', + color: '#fff', + backgroundColor: [ + '#5668e2', + '#8a56e2', + '#cf56e2', + '#e256ae', + '#e25668', + '#e28956', + '#e2cf56', + '#d0ff82', + '#aee256', + '#68e256', + ], + data: props.time, + }, ], - data: props.time, - }, - ], -}; - -const options = { - responsive: true, - maintainAspectRatio: false, - layout: { - padding: 0, - }, - plugins: { - legend: { - position: 'right', - }, - legendDistance: { - padding: 50, - }, - tooltip: { - callbacks: { - label: function (context: any) { - return convertSummaryTimeToString(context.raw); + }; + options.value = { + responsive: true, + maintainAspectRatio: false, + layout: { + padding: 0, + }, + plugins: { + legend: { + position: 'right', + labels: { + usePointStyle: true, + color: darkMode.value ? '#a5a5a5' : '#7f7f7f', + }, + }, + legendDistance: { + padding: 50, + }, + tooltip: { + callbacks: { + label: function (context: any) { + return convertSummaryTimeToString(context.raw); + }, + }, }, }, - }, - }, -}; + }; + } + + ChartJS.register(ArcElement, Tooltip, Legend); +}); From 1aa1223baf54292d765ba7a95f9e32242716dbcc Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 12 Feb 2024 07:23:00 +0100 Subject: [PATCH 09/92] Refact functions --- src/background.ts | 2 +- src/components/BadgeIcons.vue | 2 +- src/components/ByDays.vue | 6 +- src/components/GeneralSettings.vue | 8 +- src/components/TabList.vue | 4 +- src/components/WebsiteStats.vue | 2 +- src/functions/black-list.ts | 10 ++ src/functions/current-tab.ts | 8 ++ src/functions/deferList.ts | 56 +++++++++ src/functions/limit-list.ts | 55 ++++++++ src/functions/pomodoro.ts | 64 ++++++++++ src/functions/settings.ts | 34 +++++ src/functions/useAllTabListSummary.ts | 146 ++++++++++++++++++++++ src/functions/useBadge.ts | 33 +++++ src/functions/useBlockPage.ts | 21 ++++ src/functions/useDailyIntervals.ts | 48 +++++++ src/functions/useFile.ts | 15 +++ src/functions/useImportToCsv.ts | 35 ++++++ src/functions/useNotification.ts | 23 ++++ src/functions/useNotificationList.ts | 49 ++++++++ src/functions/useRemoveAllData.ts | 9 ++ src/functions/useRestoreData.ts | 12 ++ src/functions/useTabListByDays.ts | 97 ++++++++++++++ src/functions/useTabStatsByDays.ts | 94 ++++++++++++++ src/functions/useTodayTabListSummary.ts | 47 +++++++ src/functions/useWebUsageSummaryForDay.ts | 63 ++++++++++ src/jobs/daily-summary-notification.ts | 6 +- src/jobs/sheduler.ts | 2 +- src/pages/Block.vue | 2 +- src/repository/tabs-repository.ts | 2 +- src/tracker.ts | 16 +-- 31 files changed, 945 insertions(+), 26 deletions(-) create mode 100644 src/functions/black-list.ts create mode 100644 src/functions/current-tab.ts create mode 100644 src/functions/deferList.ts create mode 100644 src/functions/limit-list.ts create mode 100644 src/functions/pomodoro.ts create mode 100644 src/functions/settings.ts create mode 100644 src/functions/useAllTabListSummary.ts create mode 100644 src/functions/useBadge.ts create mode 100644 src/functions/useBlockPage.ts create mode 100644 src/functions/useDailyIntervals.ts create mode 100644 src/functions/useFile.ts create mode 100644 src/functions/useImportToCsv.ts create mode 100644 src/functions/useNotification.ts create mode 100644 src/functions/useNotificationList.ts create mode 100644 src/functions/useRemoveAllData.ts create mode 100644 src/functions/useRestoreData.ts create mode 100644 src/functions/useTabListByDays.ts create mode 100644 src/functions/useTabStatsByDays.ts create mode 100644 src/functions/useTodayTabListSummary.ts create mode 100644 src/functions/useWebUsageSummaryForDay.ts diff --git a/src/background.ts b/src/background.ts index 63ddce4..3a12b2c 100644 --- a/src/background.ts +++ b/src/background.ts @@ -2,7 +2,7 @@ import Browser from 'webextension-polyfill'; import { initTracker } from './tracker'; import { logger } from './utils/logger'; import { scheduleJobs } from './jobs/sheduler'; -import { Settings } from './compositions/settings'; +import { Settings } from './functions/settings'; import { StorageParams } from './storage/storage-params'; import { injecStorage } from './storage/inject-storage'; import { todayLocalDate } from './utils/date'; diff --git a/src/components/BadgeIcons.vue b/src/components/BadgeIcons.vue index cf44a3f..16d920d 100644 --- a/src/components/BadgeIcons.vue +++ b/src/components/BadgeIcons.vue @@ -15,7 +15,7 @@ export default { import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { TypeOfList, TypeOfUrl } from '../utils/enums'; -import { isDomainInLimits } from '../compositions/limit-list'; +import { isDomainInLimits } from '../functions/limit-list'; import { computedAsync } from '@vueuse/core'; const { t } = useI18n(); diff --git a/src/components/ByDays.vue b/src/components/ByDays.vue index 25e4b24..c59d6f4 100644 --- a/src/components/ByDays.vue +++ b/src/components/ByDays.vue @@ -77,11 +77,11 @@ import NoDataByDays from './NoDataByDays.vue'; import ByDaysChart from '../components/ByDaysChart.vue'; import Expander from '../components/Expander.vue'; import { TabListByDays } from '../dto/tabListSummary'; -import { useTabListByDays } from '../compositions/useTabListByDays'; +import { useTabListByDays } from '../functions/useTabListByDays'; import { convertSummaryTimeToString } from '../utils/converter'; import { ranges, ThisWeekRange } from '../utils/date'; -import { useImportToCsvWithData } from '../compositions/useImportToCsv'; -import { useFile, FileType } from '../compositions/useFile'; +import { useImportToCsvWithData } from '../functions/useImportToCsv'; +import { useFile, FileType } from '../functions/useFile'; const { t } = useI18n(); diff --git a/src/components/GeneralSettings.vue b/src/components/GeneralSettings.vue index 6de6d5f..7106d10 100644 --- a/src/components/GeneralSettings.vue +++ b/src/components/GeneralSettings.vue @@ -151,11 +151,11 @@ import { SHOW_CHANGELOG_DEFAULT, } from '../storage/storage-params'; import { ranges, ThisWeekRange, todayLocalDate } from '../utils/date'; -import { useImportToCsv } from '../compositions/useImportToCsv'; -import { FileType, useFile } from '../compositions/useFile'; -import { useRemoveAllData } from '../compositions/useRemoveAllData'; +import { useImportToCsv } from '../functions/useImportToCsv'; +import { FileType, useFile } from '../functions/useFile'; +import { useRemoveAllData } from '../functions/useRemoveAllData'; import { injectTabsRepository } from '../repository/inject-tabs-repository'; -import { useRestoreData } from '../compositions/useRestoreData'; +import { useRestoreData } from '../functions/useRestoreData'; const { t } = useI18n(); diff --git a/src/components/TabList.vue b/src/components/TabList.vue index 9c3bacc..bde6e88 100644 --- a/src/components/TabList.vue +++ b/src/components/TabList.vue @@ -52,8 +52,8 @@ import DonutChart from '../components/DonutChart.vue'; import OverallStatistics from '../components/OverallStatistics.vue'; import { Tab } from '../entity/tab'; import { SortingBy, TypeOfList } from '../utils/enums'; -import { useTodayTabListSummary } from '../compositions/useTodayTabListSummary'; -import { useAllTabListSummary } from '../compositions/useAllTabListSummary'; +import { useTodayTabListSummary } from '../functions/useTodayTabListSummary'; +import { useAllTabListSummary } from '../functions/useAllTabListSummary'; import { CurrentTabItem } from '../dto/currentTabItem'; import { todayLocalDate } from '../utils/date'; import { OverallStats } from '../dto/tabListSummary'; diff --git a/src/components/WebsiteStats.vue b/src/components/WebsiteStats.vue index 7368467..5412730 100644 --- a/src/components/WebsiteStats.vue +++ b/src/components/WebsiteStats.vue @@ -72,7 +72,7 @@ import { openPage } from '../utils/open-page'; import { computed, onMounted, ref } from 'vue'; import { SettingsTab } from '../utils/enums'; import { ThisWeekRange, ranges } from '../utils/date'; -import { useTabStatsByDays } from '../compositions/useTabStatsByDays'; +import { useTabStatsByDays } from '../functions/useTabStatsByDays'; import { TabListByDays } from '../dto/tabListSummary'; import { Tab } from '../entity/tab'; import { getTypeOfUrl } from '../utils/get-type-of-url'; diff --git a/src/functions/black-list.ts b/src/functions/black-list.ts new file mode 100644 index 0000000..a06d188 --- /dev/null +++ b/src/functions/black-list.ts @@ -0,0 +1,10 @@ +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { extractHostname } from '../utils/extract-hostname'; +import { Settings } from './settings'; + +export async function isInBlackList(url: string): Promise { + const blackList = (await Settings.getInstance().getSetting(StorageParams.BLACK_LIST)) as string[]; + const array = Object.values(blackList); + return array?.find(x => isDomainEquals(extractHostname(x), extractHostname(url))) !== undefined; +} diff --git a/src/functions/current-tab.ts b/src/functions/current-tab.ts new file mode 100644 index 0000000..079be59 --- /dev/null +++ b/src/functions/current-tab.ts @@ -0,0 +1,8 @@ +import Browser from 'webextension-polyfill'; + +export async function getCurrentTab() { + const tabs = await Browser.tabs.query({ active: true, currentWindow: true }); + // since only one tab should be active and in the current window at once + // the return variable should only have one entry + return tabs[0]; +} diff --git a/src/functions/deferList.ts b/src/functions/deferList.ts new file mode 100644 index 0000000..f8cbcc9 --- /dev/null +++ b/src/functions/deferList.ts @@ -0,0 +1,56 @@ +import { differenceInHours } from 'date-fns'; +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { Settings } from './settings'; +import { Deffering } from '../entity/deffering'; +import { injecStorage } from '../storage/inject-storage'; +import { MINUTE } from '../utils/time'; +import { log } from '../utils/logger'; + +export async function isInDeferList(url: string): Promise { + const deferList = (await Settings.getInstance().getSetting( + StorageParams.BLOCK_DEFERRAL_TIME, + )) as Deffering[]; + const array = Object.values(deferList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) + log( + `Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours( + new Date(item.time), + new Date(), + )}`, + ); + return item != undefined && item.time > Date.now(); +} + +export async function canDefering(url: string): Promise { + const deferList = (await Settings.getInstance().getSetting( + StorageParams.BLOCK_DEFERRAL_TIME, + )) as Deffering[]; + const array = Object.values(deferList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) + log( + `Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours( + new Date(item.time), + new Date(), + )}`, + ); + if (item == undefined) return true; + + return item != undefined && differenceInHours(new Date(item.time), new Date()) > 24; +} + +export async function defering(url: string, timeInMinutes: number): Promise { + const settingsStorage = injecStorage(); + + const deferList = (await Settings.getInstance().getSetting( + StorageParams.BLOCK_DEFERRAL_TIME, + )) as Deffering[]; + const array = Object.values(deferList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) item.time = Date.now() + timeInMinutes * MINUTE; + else array.push(new Deffering(url, 5)); + + await settingsStorage.saveValue(StorageParams.BLOCK_DEFERRAL_TIME, array); +} diff --git a/src/functions/limit-list.ts b/src/functions/limit-list.ts new file mode 100644 index 0000000..9286ec1 --- /dev/null +++ b/src/functions/limit-list.ts @@ -0,0 +1,55 @@ +import { Restriction } from '../entity/restriction'; +import { Tab } from '../entity/tab'; +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { todayLocalDate } from '../utils/date'; +import { isInDeferList } from './deferList'; +import { log } from '../utils/logger'; +import { Settings } from './settings'; + +export type LimitExceed = { + IsLimitExceeded: boolean; + LimitTime: number | null; +}; + +export async function isLimitExceeded(url: string, tab: Tab): Promise { + const limitList = (await Settings.getInstance().getSetting( + StorageParams.RESTRICTION_LIST, + )) as Restriction[]; + const array = Object.values(limitList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) { + const date = tab.days.find(x => x.date == todayLocalDate()); + if (date != undefined) { + if (date.summary >= item.time) { + log(`Limit Exceeded: website ${url} limit ${item.time} summary time ${date.summary}`); + if (await isInDeferList(url)) { + log(`Page ${url} is in deffering list`); + return { + IsLimitExceeded: false, + LimitTime: null, + }; + } + + return { + IsLimitExceeded: true, + LimitTime: item.time, + }; + } + } + } + + return { + IsLimitExceeded: false, + LimitTime: null, + }; +} + +export async function isDomainInLimits(url: string): Promise { + const limitList = (await Settings.getInstance().getSetting( + StorageParams.RESTRICTION_LIST, + )) as Restriction[]; + const array = Object.values(limitList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + return item != undefined; +} diff --git a/src/functions/pomodoro.ts b/src/functions/pomodoro.ts new file mode 100644 index 0000000..49c74bf --- /dev/null +++ b/src/functions/pomodoro.ts @@ -0,0 +1,64 @@ +import { addSeconds } from 'date-fns'; +import { injecStorage } from '../storage/inject-storage'; +import { StorageParams } from '../storage/storage-params'; +import { Time, timeToSeconds } from '../utils/time'; +import { useBadge, BadgeIcon, BadgeColor } from './useBadge'; + +export async function checkPomodoro() { + function isTargetPeriod(isRest: boolean) { + for (let index = 1; index <= frequency; index++) { + const plusWorkingTime = timeToSeconds(workTime) * (isRest ? index : index--); + const plusRestTime = timeToSeconds(restTime) * index--; + const isPomodoroTargetPeriodStart = addSeconds(startTime, plusWorkingTime + plusRestTime); + const isPomodoroTargetPeriodEnd = addSeconds( + startTime, + plusWorkingTime + plusRestTime + timeToSeconds(workTime), + ); + const isTargetPeriod = + now.getTime() >= isPomodoroTargetPeriodStart.getTime() && + now.getTime() <= isPomodoroTargetPeriodEnd.getTime(); + + if (isTargetPeriod) return true; + } + return false; + } + + const storage = injecStorage(); + const isPomodoroEnabled = (await storage.getValue(StorageParams.IS_POMODORO_ENABLED)) as boolean; + + if (!isPomodoroEnabled) return; + + const startTime = (await storage.getValue(StorageParams.POMODORO_START_TIME)) as Date; + const workTime = (await storage.getValue(StorageParams.POMODORO_INTERVAL_WORK)) as Time; + const restTime = (await storage.getValue(StorageParams.POMODORO_INTERVAL_REST)) as Time; + const frequency = (await storage.getValue(StorageParams.POMODORO_FREQUENCY)) as number; + + const now = new Date(); + + const pomodoroEndTime = addSeconds( + startTime, + timeToSeconds(workTime) * frequency + timeToSeconds(restTime) * frequency, + ); + + if (pomodoroEndTime > now) { + await storage.saveValue(StorageParams.IS_POMODORO_ENABLED, false); + await storage.saveValue(StorageParams.POMODORO_START_TIME, null); + return; + } + + const isWork = isTargetPeriod(false); + const isRest = isTargetPeriod(true); + + if (isWork) + await useBadge({ + text: '', + color: BadgeColor.none, + icon: BadgeIcon.pomodoroWorkingTime, + }); + if (isRest) + await useBadge({ + text: '', + color: BadgeColor.none, + icon: BadgeIcon.pomodoroRestTime, + }); +} diff --git a/src/functions/settings.ts b/src/functions/settings.ts new file mode 100644 index 0000000..70ba99c --- /dev/null +++ b/src/functions/settings.ts @@ -0,0 +1,34 @@ +import { injecStorage } from '../storage/inject-storage'; +import { StorageParams, getDefaultValue } from '../storage/storage-params'; + +export class Settings { + private static instance: Settings; + private _settings = new Map(); + + constructor() { + if (Settings.instance) { + throw new Error('Error - use Settings.getInstance()'); + } + } + + static getInstance(): Settings { + Settings.instance = Settings.instance || new Settings(); + return Settings.instance; + } + + async getSetting(param: StorageParams) { + if (this._settings.has(param)) return this._settings.get(param); + else return await this.getValue(param); + } + + async reloadSetting(param: StorageParams) { + await this.getValue(param); + } + + private async getValue(param: StorageParams) { + const storage = injecStorage(); + const value = await storage.getValue(param, getDefaultValue(param)); + this._settings.set(param, value); + return value; + } +} diff --git a/src/functions/useAllTabListSummary.ts b/src/functions/useAllTabListSummary.ts new file mode 100644 index 0000000..aee301b --- /dev/null +++ b/src/functions/useAllTabListSummary.ts @@ -0,0 +1,146 @@ +import { ActiveDay, OverallStats } from '../dto/tabListSummary'; +import { Tab, TabDay } from '../entity/tab'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { SortingBy } from '../utils/enums'; +import { daysBetween } from '../utils/time'; +import { todayLocalDate } from '../utils/date'; + +export async function useAllTabListSummary(sortingBy: SortingBy): Promise { + const repo = await injectTabsRepository(); + const unSortedTabs = repo.getTabs(); + let tabs: Tab[] = []; + + if (unSortedTabs.length == 0) return null; + const todayTabs = unSortedTabs?.filter(x => x.days.find(s => s.date === todayLocalDate())); + + const summaryTimeListForToday = todayTabs.map(function (tab) { + return tab.days.find(day => day.date === todayLocalDate())!.summary; + }); + + const todaySummaryTime = + summaryTimeListForToday != undefined && summaryTimeListForToday.length > 0 + ? summaryTimeListForToday.reduce(function (a, b) { + return a + b; + }) + : 0; + + tabs = unSortedTabs.sort(function (a: Tab, b: Tab) { + return b.summaryTime - a.summaryTime; + }); + + let days: TabDay[] = []; + tabs.map(function (tab) { + return tab.days.forEach(function (day) { + const existDay = days.find(x => x.date == day.date); + if (!existDay) days.push(day); + else { + existDay.summary += day.summary; + existDay.counter += day.counter; + } + }); + }); + + days = days.sort(function (a, b) { + return new Date(a.date).valueOf() - new Date(b.date).valueOf(); + }); + + const mostDayExceptToday = fillMostListWithoutToday(days); + + const firstDay = new Date(days[0].date); + const activeDaysTotal = days.length; + + if (sortingBy == SortingBy.Sessions) + tabs = unSortedTabs.sort(function (a: Tab, b: Tab) { + return b.counter - a.counter; + }); + + const summaryTimeList = tabs?.map(function (tab) { + return tab.summaryTime; + }); + const siteList = tabs?.map(function (tab) { + return tab.url; + }); + const timeForChart = summaryTimeList?.slice(0, 10); + const sitesForChart = siteList?.slice(0, 10); + + const summaryTime = + summaryTimeList != undefined && summaryTimeList.length > 0 + ? summaryTimeList.reduce(function (a, b) { + return a + b; + }) + : 0; + + const averageTimeByActiveDays = Math.round(summaryTime / activeDaysTotal); + const daysTotal = daysBetween(firstDay, new Date(days[days.length - 1].date)); + + const mostDay = fillMostList(days); + + return { + firstDay: firstDay, + daysTotal: daysTotal, + activeDaysTotal: activeDaysTotal, + todaySummaryTime: todaySummaryTime, + averageTimeByActiveDays: averageTimeByActiveDays, + mostActiveDay: mostDay.mostActiveDayObj, + mostInactiveDay: mostDay.mostInactiveDayObj, + mostActiveDayExceptToday: + mostDayExceptToday != null ? mostDayExceptToday.mostActiveDayObjExceptToday : null, + mostInactiveDayExceptToday: + mostDayExceptToday != null ? mostDayExceptToday.mostInactiveDayObjExceptToday : null, + tabs: tabs, + summaryTime: summaryTime, + chart: { + timeForChart, + sitesForChart, + }, + }; +} + +function fillMostDay(mostDat: TabDay): ActiveDay { + return { + date: new Date(mostDat.date), + summaryTime: mostDat.summary, + }; +} + +function fillMostListWithoutToday(days: TabDay[]) { + const daysWithoutToday = days + .filter(x => x.date != todayLocalDate()) + .sort(function (a, b) { + return new Date(a.date).valueOf() - new Date(b.date).valueOf(); + }); + + const sortedByTimeDaysWithoutToday = daysWithoutToday.sort(function (a, b) { + return a.summary - b.summary; + }); + + if (sortedByTimeDaysWithoutToday.length == 0) return null; + const mostActiveDayExceptToday = + sortedByTimeDaysWithoutToday[sortedByTimeDaysWithoutToday.length - 1]; + const mostActiveDayObjExceptToday = fillMostDay(mostActiveDayExceptToday); + + const mostInactiveDayExceptToday = sortedByTimeDaysWithoutToday[0]; + const mostInactiveDayObjExceptToday = fillMostDay(mostInactiveDayExceptToday); + + return { + mostActiveDayObjExceptToday, + mostInactiveDayObjExceptToday, + }; +} + +function fillMostList(days: TabDay[]) { + const sortedByTimeDays = days.sort(function (a, b) { + return a.summary - b.summary; + }); + + const mostActiveDay = sortedByTimeDays[sortedByTimeDays.length - 1]; + const mostActiveDayObj = fillMostDay(mostActiveDay); + + const mostInactiveDay = sortedByTimeDays[0]; + const mostInactiveDayObj = fillMostDay(mostInactiveDay); + + return { + mostActiveDayObj, + mostInactiveDayObj, + }; +} diff --git a/src/functions/useBadge.ts b/src/functions/useBadge.ts new file mode 100644 index 0000000..ddd9a6d --- /dev/null +++ b/src/functions/useBadge.ts @@ -0,0 +1,33 @@ +import Browser from 'webextension-polyfill'; + +export interface BadgeState { + text: string; + color: BadgeColor; + tabId?: number; + icon?: BadgeIcon; +} + +export enum BadgeIcon { + timer = '/assets/icons/128x128.png', + pomodoroWorkingTime = '/assets/icons/empty.png', + pomodoroRestTime = '/assets/icons/empty.png', +} + +export enum BadgeColor { + red = '#fdb8b8', + green = '#6ec05e', + blue = '#1a73e8', + none = '#000', +} + +export async function useBadge(badge: BadgeState): Promise { + await Browser.action.setBadgeBackgroundColor({ color: badge.color }); + await Browser.action.setBadgeText({ + tabId: badge.tabId, + text: badge.text, + }); + if (badge.icon) + await Browser.action.setIcon({ + path: badge.icon, + }); +} diff --git a/src/functions/useBlockPage.ts b/src/functions/useBlockPage.ts new file mode 100644 index 0000000..c6b184c --- /dev/null +++ b/src/functions/useBlockPage.ts @@ -0,0 +1,21 @@ +import Browser from 'webextension-polyfill'; +import { buildBlockQuery } from '../utils/block-page'; +import { NO_FAVICON } from '../utils/consts'; + +export async function useBlockPage( + domain: string, + url: string, + liimitTime: number, + summaryCounter: number, + favIconUrl: string | undefined, +): Promise { + const favicon = + favIconUrl == undefined || favIconUrl == '' || favIconUrl.startsWith('chrome://favicon/') + ? NO_FAVICON + : favIconUrl; + const blockUrl = + Browser.runtime.getURL('src/block.html') + + buildBlockQuery(domain, url, liimitTime, summaryCounter, favicon); + const tab = await Browser.tabs.query({ currentWindow: true, active: true }); + await Browser.tabs.update(tab[0].id, { url: blockUrl }); +} diff --git a/src/functions/useDailyIntervals.ts b/src/functions/useDailyIntervals.ts new file mode 100644 index 0000000..1ae37c7 --- /dev/null +++ b/src/functions/useDailyIntervals.ts @@ -0,0 +1,48 @@ +import { TimeInterval } from '../entity/time-interval'; +import { injecStorage } from '../storage/inject-storage'; +import { StorageDeserializeParam } from '../storage/storage-params'; +import { todayLocalDate } from '../utils/date'; + +export async function useDailyIntervals() { + async function closeInterval(domain: string | null): Promise { + if (domain == null) return; + const storage = injecStorage(); + const timeIntervalList = (await storage.getDeserializeList( + StorageDeserializeParam.TIMEINTERVAL_LIST, + )) as TimeInterval[]; + const item = timeIntervalList?.find(x => x.domain === domain && x.day == todayLocalDate()); + item?.closeInterval(); + await storage.saveIntervalList(timeIntervalList); + } + + async function addInterval(domain: string | null): Promise { + if (domain == null) return; + + const storage = injecStorage(); + let timeIntervalList = (await storage.getDeserializeList( + StorageDeserializeParam.TIMEINTERVAL_LIST, + )) as TimeInterval[]; + if (timeIntervalList == undefined) timeIntervalList = []; + const item = timeIntervalList?.find(x => x.domain === domain && x.day == todayLocalDate()); + if (item != undefined) { + if (item.day == todayLocalDate()) item.addInterval(); + else { + const newInterval = new TimeInterval(); + newInterval.init(todayLocalDate(), domain); + newInterval.addInterval(); + timeIntervalList.push(newInterval); + } + } else { + const newInterval = new TimeInterval(); + newInterval.init(todayLocalDate(), domain); + newInterval.addInterval(); + timeIntervalList.push(newInterval); + } + await storage.saveIntervalList(timeIntervalList); + } + + return { + closeInterval, + addInterval, + }; +} diff --git a/src/functions/useFile.ts b/src/functions/useFile.ts new file mode 100644 index 0000000..cf18b01 --- /dev/null +++ b/src/functions/useFile.ts @@ -0,0 +1,15 @@ +export enum FileType { + CSV = 'text/csv', + JSON = 'application/json', +} + +export function useFile(data: string, type: FileType, fileName: string) { + const file = new Blob([data], { type: type }); + let downloadLink; + downloadLink = document.createElement('a'); + downloadLink.download = fileName; + downloadLink.href = window.URL.createObjectURL(file); + downloadLink.style.display = 'none'; + document.body.appendChild(downloadLink); + downloadLink.click(); +} diff --git a/src/functions/useImportToCsv.ts b/src/functions/useImportToCsv.ts new file mode 100644 index 0000000..71c3412 --- /dev/null +++ b/src/functions/useImportToCsv.ts @@ -0,0 +1,35 @@ +import { DayTabs } from '../dto/tabListSummary'; +import { useTabListByDays } from './useTabListByDays'; + +const CSV_HEADER = 'Date,WebSite,Time(sec),Sessions\r\n'; + +export async function useImportToCsvWithData(days: DayTabs[] | undefined): Promise { + return getCsv(days); +} + +export async function useImportToCsv(dateFrom: Date, dateTo: Date): Promise { + const summary = await useTabListByDays(dateFrom, dateTo); + if (summary == null) return CSV_HEADER; + + return getCsv(summary.days); +} + +function getCsv(days: DayTabs[] | undefined) { + let str = CSV_HEADER; + + if (days != undefined && days.length > 0) { + days.forEach(day => { + let newLine = ''; + day.tabs.forEach(tab => { + newLine += day.day + ','; + newLine += tab.url + ','; + newLine += tab.summaryTime + ','; + newLine += tab.sessions; + newLine += '\r\n'; + }); + str += newLine + '\r\n'; + }); + } + + return str; +} diff --git a/src/functions/useNotification.ts b/src/functions/useNotification.ts new file mode 100644 index 0000000..8ccba80 --- /dev/null +++ b/src/functions/useNotification.ts @@ -0,0 +1,23 @@ +import Browser from 'webextension-polyfill'; +import { SECOND } from '../utils/time'; + +export enum NotificationType { + DailySummaryNotification = 'daily-summary-notification', + WebSiteNotification = 'website-notification', +} + +export async function useNotification( + notificationType: NotificationType, + title: string, + message: string, +): Promise { + await Browser.notifications.clear(notificationType); + await new Promise(res => setTimeout(res, 3 * SECOND)); + return Browser.notifications.create(notificationType, { + type: 'basic', + title: title, + message: message, + iconUrl: Browser.runtime.getURL('128x128.png'), + isClickable: false, + }); +} diff --git a/src/functions/useNotificationList.ts b/src/functions/useNotificationList.ts new file mode 100644 index 0000000..c4eb402 --- /dev/null +++ b/src/functions/useNotificationList.ts @@ -0,0 +1,49 @@ +import { Notifications } from '../entity/notification'; +import { Tab } from '../entity/tab'; +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { todayLocalDate } from '../utils/date'; +import { log } from '../utils/logger'; +import { Settings } from './settings'; + +export type LimitExceed = { + IsLimitExceeded: boolean; + LimitTime: number | null; +}; + +export function useNotificationList() { + async function isNeedToShowNotification(url: string, tab: Tab): Promise { + const notificationList = (await Settings.getInstance().getSetting( + StorageParams.NOTIFICATION_LIST, + )) as Notifications[]; + const array = Object.values(notificationList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) { + const date = tab.days.find(x => x.date == todayLocalDate()); + if (date != undefined) { + if (date.summary != 0 && (date.summary == item.time || date.summary % item.time == 0)) { + log( + `Time for notification: website ${url} time ${item.time} summary time ${date.summary}`, + ); + return true; + } + } + } + + return false; + } + + async function isDomainInNotificationsLimit(url: string): Promise { + const notificationList = (await Settings.getInstance().getSetting( + StorageParams.NOTIFICATION_LIST, + )) as Notifications[]; + const array = Object.values(notificationList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + return item != undefined; + } + + return { + isNeedToShowNotification, + isDomainInNotificationsLimit, + }; +} diff --git a/src/functions/useRemoveAllData.ts b/src/functions/useRemoveAllData.ts new file mode 100644 index 0000000..8038857 --- /dev/null +++ b/src/functions/useRemoveAllData.ts @@ -0,0 +1,9 @@ +import Browser from 'webextension-polyfill'; +import { injecStorage } from '../storage/inject-storage'; +import { Messages } from '../utils/messages'; + +export async function useRemoveAllData() { + const storage = injecStorage(); + await storage.saveIntervalList([]); + await Browser.runtime.sendMessage(Messages.ClearAllData); +} diff --git a/src/functions/useRestoreData.ts b/src/functions/useRestoreData.ts new file mode 100644 index 0000000..fe01044 --- /dev/null +++ b/src/functions/useRestoreData.ts @@ -0,0 +1,12 @@ +import Browser from 'webextension-polyfill'; +import { Messages } from '../utils/messages'; + +export async function useRestoreData(json: string) { + if (json != null && json != undefined && json != '') { + const data = JSON.parse(json); + await Browser.runtime.sendMessage({ + message: Messages.Restore, + data: data, + }); + } +} diff --git a/src/functions/useTabListByDays.ts b/src/functions/useTabListByDays.ts new file mode 100644 index 0000000..0e8525c --- /dev/null +++ b/src/functions/useTabListByDays.ts @@ -0,0 +1,97 @@ +import { CurrentTabItem } from '../dto/currentTabItem'; +import { DayTabs, TabListByDays } from '../dto/tabListSummary'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { isSameDay } from 'date-fns'; + +export async function useTabListByDays( + dateFrom: Date, + dateTo: Date, +): Promise { + const repo = await injectTabsRepository(); + const unSortedTabs = repo.getTabs(); + let daysTabs: DayTabs[] = []; + + if (unSortedTabs.length == 0) return null; + + const isTheSameDay = isSameDay(dateFrom, dateTo); + + const unSortedTabsByDays = unSortedTabs.filter(x => + isTheSameDay + ? x.days.find(s => isSameDay(new Date(s.date), dateFrom)) != undefined + : x.days.find(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo) != undefined, + ); + + if (unSortedTabsByDays.length == 0) + return { + days: [], + averageTime: 0, + summaryTime: 0, + sessions: 0, + }; + + unSortedTabsByDays.forEach(tab => { + tab.days.forEach(day => { + if ( + (new Date(day.date) >= dateFrom && new Date(day.date) <= dateTo) || + (isTheSameDay && isSameDay(new Date(day.date), dateFrom)) + ) { + let dayTab = daysTabs.find(x => x.day == day.date); + if (dayTab == undefined) { + dayTab = { + day: day.date, + tabs: [], + time: day.summary, + sessions: day.counter, + }; + dayTab.tabs.push({ + favicon: tab.favicon, + url: tab.url, + sessions: day.counter, + summaryTime: day.summary, + }); + daysTabs.push(dayTab); + } else { + dayTab.time += day.summary; + dayTab.sessions += day.counter; + dayTab.tabs.push({ + favicon: tab.favicon, + url: tab.url, + sessions: day.counter, + summaryTime: day.summary, + }); + } + } + }); + }); + + daysTabs.sort(function (a, b) { + return new Date(a.day).valueOf() - new Date(b.day).valueOf(); + }); + + daysTabs.forEach(dayTab => { + dayTab.tabs.sort(function (a: CurrentTabItem, b: CurrentTabItem) { + return b.summaryTime - a.summaryTime; + }); + }); + + const summaryTime = daysTabs + .map(x => x.time) + .reduce(function (a, b) { + return a + b; + }); + + const totalSessions = daysTabs + .map(x => x.sessions) + .reduce(function (a, b) { + return a + b; + }); + + const averageTime = Math.round(summaryTime / daysTabs.length); + + return { + days: daysTabs, + summaryTime: summaryTime, + averageTime: averageTime, + sessions: totalSessions, + }; +} diff --git a/src/functions/useTabStatsByDays.ts b/src/functions/useTabStatsByDays.ts new file mode 100644 index 0000000..e85b03a --- /dev/null +++ b/src/functions/useTabStatsByDays.ts @@ -0,0 +1,94 @@ +import { CurrentTabItem } from '../dto/currentTabItem'; +import { DayTabs, TabListByDays } from '../dto/tabListSummary'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { isSameDay } from 'date-fns'; + +export async function useTabStatsByDays( + dateFrom: Date, + dateTo: Date, + domain: string, +): Promise { + const repo = await injectTabsRepository(); + const tab = repo.getTab(domain); + let daysTabs: DayTabs[] = []; + + if (tab == undefined) return null; + + const isTheSameDay = isSameDay(dateFrom, dateTo); + + const unSortedTabsByDays = isTheSameDay + ? tab.days.filter(s => isSameDay(new Date(s.date), dateFrom)) + : tab.days.filter(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo); + + if (unSortedTabsByDays.length == 0) + return { + days: [], + averageTime: 0, + summaryTime: 0, + sessions: 0, + }; + + unSortedTabsByDays.forEach(tabDay => { + if ( + (new Date(tabDay.date) >= dateFrom && new Date(tabDay.date) <= dateTo) || + (isTheSameDay && isSameDay(new Date(tabDay.date), dateFrom)) + ) { + let dayTab = daysTabs.find(x => x.day == tabDay.date); + if (dayTab == undefined) { + dayTab = { + day: tabDay.date, + tabs: [], + time: tabDay.summary, + sessions: tabDay.counter, + }; + dayTab.tabs.push({ + favicon: tab.favicon, + url: tab.url, + sessions: tabDay.counter, + summaryTime: tabDay.summary, + }); + daysTabs.push(dayTab); + } else { + dayTab.time += tabDay.summary; + dayTab.sessions += tabDay.counter; + dayTab.tabs.push({ + favicon: tab.favicon, + url: tab.url, + sessions: tabDay.counter, + summaryTime: tabDay.summary, + }); + } + } + }); + + daysTabs.sort(function (a, b) { + return new Date(a.day).valueOf() - new Date(b.day).valueOf(); + }); + + daysTabs.forEach(dayTab => { + dayTab.tabs.sort(function (a: CurrentTabItem, b: CurrentTabItem) { + return b.summaryTime - a.summaryTime; + }); + }); + + const summaryTime = daysTabs + .map(x => x.time) + .reduce(function (a, b) { + return a + b; + }); + + const totalSessions = daysTabs + .map(x => x.sessions) + .reduce(function (a, b) { + return a + b; + }); + + const averageTime = Math.round(summaryTime / daysTabs.length); + + return { + days: daysTabs, + summaryTime: summaryTime, + averageTime: averageTime, + sessions: totalSessions, + }; +} diff --git a/src/functions/useTodayTabListSummary.ts b/src/functions/useTodayTabListSummary.ts new file mode 100644 index 0000000..fcd6afd --- /dev/null +++ b/src/functions/useTodayTabListSummary.ts @@ -0,0 +1,47 @@ +import { TabListSummary } from '../dto/tabListSummary'; +import { Tab } from '../entity/tab'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { SortingBy } from '../utils/enums'; +import { todayLocalDate } from '../utils/date'; + +export async function useTodayTabListSummary(sortingBy: SortingBy): Promise { + const repo = await injectTabsRepository(); + const unSortedTabs = repo.getTodayTabs(); + let tabs: Tab[] = []; + + if (unSortedTabs.length == 0) return null; + + tabs = unSortedTabs.sort(function (a: Tab, b: Tab) { + return sortingBy == SortingBy.UsageTime + ? b.days.find(s => s.date === todayLocalDate())!.summary - + a.days.find(s => s.date === todayLocalDate())!.summary + : b.days.find(s => s.date === todayLocalDate())!.counter - + a.days.find(s => s.date === todayLocalDate())!.counter; + }); + + const summaryTimeList = tabs?.map(function (tab) { + return tab.days.find(day => day.date === todayLocalDate())!.summary; + }); + + const siteList = tabs?.map(function (tab) { + return tab.url; + }); + + const timeForChart = summaryTimeList?.slice(0, 10); + const sitesForChart = siteList?.slice(0, 10); + + const summaryTime = + summaryTimeList != undefined && summaryTimeList.length > 0 + ? summaryTimeList.reduce(function (a, b) { + return a + b; + }) + : 0; + return { + tabs, + summaryTime, + chart: { + timeForChart, + sitesForChart, + }, + }; +} diff --git a/src/functions/useWebUsageSummaryForDay.ts b/src/functions/useWebUsageSummaryForDay.ts new file mode 100644 index 0000000..242e0e6 --- /dev/null +++ b/src/functions/useWebUsageSummaryForDay.ts @@ -0,0 +1,63 @@ +import { Tab } from '../entity/tab'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { todayLocalDate } from '../utils/date'; +import { DaySummary } from '../dto/daySummary'; +import { startOfYesterday } from 'date-fns'; +import { getPercentage } from '../utils/common'; +import { ITabsRepository } from '../repository/tabs-repository-interface'; + +export async function useWebUsageSummaryForDay(): Promise { + const repo = await injectTabsRepository(); + + const unSortedTabs = repo.getTabs(); + if (unSortedTabs.length == 0) return null; + + const dataToday = getData(todayLocalDate(), repo); + const dataYesterday = getData(startOfYesterday().toLocaleDateString('en-US'), repo); + + return { + time: dataToday == null ? 0 : dataToday.time, + mostVisitedSite: dataToday?.mostVisitedSite, + mostVisitedSiteTime: dataToday?.mostVisitedSiteTime, + timeYesterDay: dataYesterday == null ? 0 : dataYesterday.time, + percentageFromYesterday: + dataToday == null + ? '0%' + : dataYesterday == null + ? '100%' + : `${getPercentage(dataToday.time, dataYesterday.time)}%`, + }; +} + +function getData(date: string, repo: ITabsRepository) { + const unSortedTabs = repo.getTabs(); + if (unSortedTabs.length == 0) return null; + + const targetTabs = unSortedTabs.filter(x => x.days.find(s => s.date === date)); + if (targetTabs.length == 0) return null; + + const tabs = targetTabs.sort(function (a: Tab, b: Tab) { + return b.days.find(s => s.date === date)!.summary - a.days.find(s => s.date === date)!.summary; + }); + + const summaryTimeList = tabs?.map(function (tab) { + return tab.days.find(day => day.date === date)!.summary; + }); + + const summaryTime = + summaryTimeList != undefined && summaryTimeList.length > 0 + ? summaryTimeList.reduce(function (a, b) { + return a + b; + }) + : 0; + + const mostVisitedTab = tabs[0]; + const mostVisitedSite = mostVisitedTab.url; + const mostVisitedSiteTime = mostVisitedTab.days.find(s => s.date === date)?.summary!; + + return { + time: summaryTime, + mostVisitedSite: mostVisitedSite, + mostVisitedSiteTime: mostVisitedSiteTime, + }; +} diff --git a/src/jobs/daily-summary-notification.ts b/src/jobs/daily-summary-notification.ts index 261be76..2e0489c 100644 --- a/src/jobs/daily-summary-notification.ts +++ b/src/jobs/daily-summary-notification.ts @@ -1,8 +1,8 @@ -import { useWebUsageSummaryForDay } from '../compositions/useWebUsageSummaryForDay'; +import { useWebUsageSummaryForDay } from '../functions/useWebUsageSummaryForDay'; import { convertLimitTimeToString } from '../utils/converter'; -import { Settings } from '../compositions/settings'; +import { Settings } from '../functions/settings'; import { StorageParams } from '../storage/storage-params'; -import { NotificationType, useNotification } from '../compositions/useNotification'; +import { NotificationType, useNotification } from '../functions/useNotification'; import { getMessagesFromLocale } from '../plugins/i18n'; export async function dailySummaryNotification() { diff --git a/src/jobs/sheduler.ts b/src/jobs/sheduler.ts index a1df1bb..43f4204 100644 --- a/src/jobs/sheduler.ts +++ b/src/jobs/sheduler.ts @@ -2,7 +2,7 @@ import Browser, { Alarms } from 'webextension-polyfill'; import { log } from '../utils/logger'; import { StorageParams } from '../storage/storage-params'; import { DAY_MINUTES, SECOND, getNextTimeOfDay } from '../utils/time'; -import { Settings } from '../compositions/settings'; +import { Settings } from '../functions/settings'; import { dailySummaryNotification } from './daily-summary-notification'; import { removeOldTimeIntervals } from './remove-time-intervals'; import { startOfTomorrow } from 'date-fns'; diff --git a/src/pages/Block.vue b/src/pages/Block.vue index e7aa309..d85b860 100644 --- a/src/pages/Block.vue +++ b/src/pages/Block.vue @@ -41,8 +41,8 @@ import { getValueFromQuery } from '../utils/block-page'; import { injecStorage } from '../storage/inject-storage'; import { BLOCK_DEFERRAL_DEFAULT, StorageParams } from '../storage/storage-params'; import { convertLimitTimeToString } from '../utils/converter'; -import { defering, canDefering } from '../compositions/deferList'; import PromoClearYouTube from '../components/PromoClearYouTube.vue'; +import { canDefering, defering } from '../functions/deferList'; const { t } = useI18n(); diff --git a/src/repository/tabs-repository.ts b/src/repository/tabs-repository.ts index 47ec364..02776bd 100644 --- a/src/repository/tabs-repository.ts +++ b/src/repository/tabs-repository.ts @@ -1,7 +1,7 @@ import { ITabsRepository } from './tabs-repository-interface'; import { Tab } from '../entity/tab'; import { injecStorage } from '../storage/inject-storage'; -import { isInBlackList } from '../compositions/black-list'; +import { isInBlackList } from '../functions/black-list'; import { StorageDeserializeParam } from '../storage/storage-params'; import { todayLocalDate } from '../utils/date'; diff --git a/src/tracker.ts b/src/tracker.ts index b7da2d6..af2bc57 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -2,19 +2,19 @@ import Browser from 'webextension-polyfill'; import { isValidPage } from './utils/valid-page'; import { extractHostname } from './utils/extract-hostname'; import { injectTabsRepositorySingleton } from './repository/inject-tabs-repository'; -import { isInBlackList } from './compositions/black-list'; -import { useBadge, BadgeColor } from './compositions/useBadge'; +import { isInBlackList } from './functions/black-list'; +import { useBadge, BadgeColor } from './functions/useBadge'; import { INTERVAL_SAVE_STORAGE_DEFAULT, StorageParams } from './storage/storage-params'; import { injecStorage } from './storage/inject-storage'; -import { useDailyIntervals } from './compositions/useDailyIntervals'; +import { useDailyIntervals } from './functions/useDailyIntervals'; import { ActiveTab } from './utils/active-tab'; -import { isLimitExceeded } from './compositions/limit-list'; +import { isLimitExceeded } from './functions/limit-list'; import { Tab } from './entity/tab'; -import { useBlockPage } from './compositions/useBlockPage'; +import { useBlockPage } from './functions/useBlockPage'; import { convertSummaryTimeToBadgeString } from './utils/converter'; -import { Settings } from './compositions/settings'; -import { useNotificationList } from './compositions/useNotificationList'; -import { NotificationType, useNotification } from './compositions/useNotification'; +import { Settings } from './functions/settings'; +import { useNotificationList } from './functions/useNotificationList'; +import { NotificationType, useNotification } from './functions/useNotification'; import { Messages } from './utils/messages'; const activeTabInstance = ActiveTab.getInstance(); From 8a8f3382bc1c58ba6d3b3feae3b91118fe6b12b5 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 13 Feb 2024 14:38:33 +0300 Subject: [PATCH 10/92] Add a new tab on dashboard --- src/pages/Dashboard.vue | 22 ++++++++++++++++++++++ src/utils/enums.ts | 1 + src/utils/extension-tabs.ts | 4 ++++ 3 files changed, 27 insertions(+) diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index c8bb8a0..067ccd3 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -90,6 +90,27 @@ +
+ + + +
+
+ +
+
+
+
Date: Tue, 13 Feb 2024 14:38:45 +0300 Subject: [PATCH 11/92] Icons --- src/assets/icons/pomodoro.svg | 3 +++ src/assets/icons/start.svg | 17 +++++++++++++++++ src/assets/icons/stop.svg | 17 +++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 src/assets/icons/pomodoro.svg create mode 100644 src/assets/icons/start.svg create mode 100644 src/assets/icons/stop.svg diff --git a/src/assets/icons/pomodoro.svg b/src/assets/icons/pomodoro.svg new file mode 100644 index 0000000..d3ec461 --- /dev/null +++ b/src/assets/icons/pomodoro.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/start.svg b/src/assets/icons/start.svg new file mode 100644 index 0000000..144f821 --- /dev/null +++ b/src/assets/icons/start.svg @@ -0,0 +1,17 @@ + + + + + play + Created with Sketch Beta. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/stop.svg b/src/assets/icons/stop.svg new file mode 100644 index 0000000..8d35481 --- /dev/null +++ b/src/assets/icons/stop.svg @@ -0,0 +1,17 @@ + + + + + stop + Created with Sketch Beta. + + + + + + + + + + + \ No newline at end of file From b162d19da99b1b4f9afcbd64f29fb7cc1e4607d5 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 13 Feb 2024 14:40:34 +0300 Subject: [PATCH 12/92] UI and functionality --- src/assets/css/dashboard.css | 2 +- src/assets/css/general.css | 17 +++-- src/components/Pomodoro.vue | 137 ++++++++++++++++++++++++++++++++++ src/storage/storage-params.ts | 19 ++++- src/tracker.ts | 3 + src/utils/time.ts | 4 + 6 files changed, 175 insertions(+), 7 deletions(-) create mode 100644 src/components/Pomodoro.vue diff --git a/src/assets/css/dashboard.css b/src/assets/css/dashboard.css index 5ea7ff4..8730208 100644 --- a/src/assets/css/dashboard.css +++ b/src/assets/css/dashboard.css @@ -49,7 +49,7 @@ body { margin-left: 10px; } -input[type='text'] { +input[type='number'],input[type='text'] { height: 36px; padding: 0 0 0 5px; width: 400px; diff --git a/src/assets/css/general.css b/src/assets/css/general.css index 7f4a4ad..a803a71 100644 --- a/src/assets/css/general.css +++ b/src/assets/css/general.css @@ -29,6 +29,9 @@ .mb-20 { margin-bottom: 20px; } +.ml-5 { + margin-left: 5px; +} .ml-10 { margin-left: 10px; } @@ -57,6 +60,10 @@ text-align: center; } +.mt-10 { + margin-top: 10px; +} + .mt-15 { margin-top: 15px; } @@ -67,7 +74,7 @@ select { .w-100 { width: 100%; } -input[type='button'] { +button, input[type='button'] { background: #428bff; color: #fff; border-radius: 3px; @@ -83,22 +90,22 @@ input[type='button'] { width: 200px; } -input[type='button']:hover { +button, input[type='button']:hover { background: #5c9dfe; text-decoration: none; } -input[type='button'].alert { +button, input[type='button'].alert { background: #fe5c5c !important; } -input[type='button'].info { +button, input[type='button'].info { background: #ffffff !important; color: black; border: 1px solid black; } -input[type='button'][disabled] { +button, input[type='button'][disabled] { border: 1px solid #999999; background-color: #cccccc; color: #666666; diff --git a/src/components/Pomodoro.vue b/src/components/Pomodoro.vue new file mode 100644 index 0000000..4447b42 --- /dev/null +++ b/src/components/Pomodoro.vue @@ -0,0 +1,137 @@ + + + + + + + diff --git a/src/storage/storage-params.ts b/src/storage/storage-params.ts index 612b2ae..1d5f616 100644 --- a/src/storage/storage-params.ts +++ b/src/storage/storage-params.ts @@ -1,6 +1,6 @@ import { Tab } from '../entity/tab'; import { TimeInterval } from '../entity/time-interval'; -import { HOUR } from '../utils/time'; +import { HOUR, MINUTE_IN_SECONDS } from '../utils/time'; export enum StorageParams { BLACK_LIST = 'black_list', @@ -20,6 +20,11 @@ export enum StorageParams { INSTALL_DATE = 'install-date', PROMO_CLEAR_YOUTUBE_ON_LIMITS = 'promo-clear-youtube-on-limits', PROMO_CLEAR_YOUTUBE_ON_BLOCK = 'promo-clear-youtube-on-block', + IS_POMODORO_ENABLED = 'is-pomodoro-enabled', + POMODORO_START_TIME = 'pomodoro-start-time', + POMODORO_INTERVAL_WORK = 'pomodoro-interval-work', + POMODORO_INTERVAL_REST = 'pomodoro-interval-rest', + POMODORO_FREQUENCY = 'pomodoro-frequency', } export enum StorageDeserializeParam { @@ -63,6 +68,10 @@ export const DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT = (20 * HOUR) / 1000; export const DAILY_NOTIFICATION_DEFAULT = true; export const SHOW_CHANGELOG_DEFAULT = false; export const SHOW_PROMO_CLEAR_YOUTUBE_DEFAULT = false; +export const IS_POMODORO_ENABLED_DEFAULT = false; +export const POMODORO_INTERVAL_WORK_DEFAULT = 25 * MINUTE_IN_SECONDS; +export const POMODORO_INTERVAL_REST_DEFAULT = 5 * MINUTE_IN_SECONDS; +export const POMODORO_FREQUENCY_DEFAULT = 3; export function getDefaultValue(param: StorageParams) { switch (param) { @@ -93,5 +102,13 @@ export function getDefaultValue(param: StorageParams) { case StorageParams.PROMO_CLEAR_YOUTUBE_ON_BLOCK: case StorageParams.PROMO_CLEAR_YOUTUBE_ON_LIMITS: return SHOW_PROMO_CLEAR_YOUTUBE_DEFAULT; + case StorageParams.IS_POMODORO_ENABLED: + return IS_POMODORO_ENABLED_DEFAULT; + case StorageParams.POMODORO_INTERVAL_WORK: + return POMODORO_INTERVAL_WORK_DEFAULT; + case StorageParams.POMODORO_INTERVAL_REST: + return POMODORO_INTERVAL_REST_DEFAULT; + case StorageParams.POMODORO_FREQUENCY: + return POMODORO_FREQUENCY_DEFAULT; } } diff --git a/src/tracker.ts b/src/tracker.ts index af2bc57..9c534ed 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -16,6 +16,7 @@ import { Settings } from './functions/settings'; import { useNotificationList } from './functions/useNotificationList'; import { NotificationType, useNotification } from './functions/useNotification'; import { Messages } from './utils/messages'; +import { checkPomodoro } from './functions/pomodoro'; const activeTabInstance = ActiveTab.getInstance(); @@ -39,6 +40,8 @@ async function trackTime() { if (isValidPage(activeTab)) { const activeDomain = extractHostname(activeTab!.url); + await checkPomodoro(); + if (await isInBlackList(activeDomain)) { await useBadge({ tabId: activeTab?.id, diff --git a/src/utils/time.ts b/src/utils/time.ts index 1c779c9..e18a6f6 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -29,3 +29,7 @@ export function daysBetween(startDate: Date, endDate: Date): number { const millisecondsPerDay = 24 * 60 * 60 * 1000; return (treatAsUTC(endDate).valueOf() - treatAsUTC(startDate).valueOf()) / millisecondsPerDay + 1; } + +export function timeToSeconds(time: Time) { + return time.hours * HOUR_IN_SECONDS + time.minutes * MINUTE_IN_SECONDS; +} From c1abfc51154568b3ea7950385dc36bc562d76871 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 12 Feb 2024 08:49:00 +0100 Subject: [PATCH 13/92] Completely block website with just one button --- src/components/ListWithTime.vue | 46 ++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/components/ListWithTime.vue b/src/components/ListWithTime.vue index b2391ef..04aab9e 100644 --- a/src/components/ListWithTime.vue +++ b/src/components/ListWithTime.vue @@ -10,7 +10,14 @@ /> {{ limit.domain }} -

{{ t('limit.message') }} : {{ getTime(limit.time) }}

+
+

+ {{ t('limit.message') }} : {{ getTime(limit.time) }} +

+

+ {{ t('completelyBlocked.message') }} +

+
@@ -31,6 +38,18 @@ @click="isEdit ? editItem() : addToList()" /> +
+ +
- diff --git a/src/functions/useBadge.ts b/src/functions/useBadge.ts index ddd9a6d..2f08c4e 100644 --- a/src/functions/useBadge.ts +++ b/src/functions/useBadge.ts @@ -8,9 +8,9 @@ export interface BadgeState { } export enum BadgeIcon { - timer = '/assets/icons/128x128.png', - pomodoroWorkingTime = '/assets/icons/empty.png', - pomodoroRestTime = '/assets/icons/empty.png', + default = '/assets/icons/128x128.png', + pomodoroWorkingTime = '/assets/icons/pomodoro.png', + pomodoroRestTime = '/assets/icons/pomodoro-rest-icon.png', } export enum BadgeColor { @@ -26,8 +26,15 @@ export async function useBadge(badge: BadgeState): Promise { tabId: badge.tabId, text: badge.text, }); - if (badge.icon) + if (badge.icon) { await Browser.action.setIcon({ path: badge.icon, }); + await Browser.action.setBadgeText({ + text: badge.text, + }); + } else + await Browser.action.setIcon({ + path: BadgeIcon.default, + }); } diff --git a/src/tracker.ts b/src/tracker.ts index 9c534ed..27bca9d 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -42,7 +42,7 @@ async function trackTime() { await checkPomodoro(); - if (await isInBlackList(activeDomain)) { + if ((await isInBlackList(activeDomain)) && (await canChangeBadge())) { await useBadge({ tabId: activeTab?.id, text: 'n/a', @@ -127,7 +127,9 @@ async function mainTracker( tab.incSummaryTime(); - const viewInBadge = await Settings.getInstance().getSetting(StorageParams.VIEW_TIME_IN_BADGE); + const viewInBadge = + (await Settings.getInstance().getSetting(StorageParams.VIEW_TIME_IN_BADGE)) && + (await canChangeBadge()); if (viewInBadge) await useBadge({ @@ -164,6 +166,10 @@ async function saveTabs() { await storage.saveTabs(tabs); } +async function canChangeBadge() { + return !(await Settings.getInstance().getSetting(StorageParams.IS_POMODORO_ENABLED)) as boolean; +} + Browser.runtime.onMessage.addListener(async message => { if (message == Messages.ClearAllData) { const storage = injecStorage(); From bd98225e7d719f4bcbe3d2efdc02db23372889a4 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 13 Feb 2024 19:45:57 +0300 Subject: [PATCH 16/92] Fix broken datepicker styles --- src/assets/css/general.css | 10 +++++----- src/components/Dashboad.vue | 14 +++++++++++++- src/components/Pomodoro.vue | 12 +++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/assets/css/general.css b/src/assets/css/general.css index a803a71..bac2baf 100644 --- a/src/assets/css/general.css +++ b/src/assets/css/general.css @@ -74,7 +74,7 @@ select { .w-100 { width: 100%; } -button, input[type='button'] { +input[type='button'] { background: #428bff; color: #fff; border-radius: 3px; @@ -90,22 +90,22 @@ button, input[type='button'] { width: 200px; } -button, input[type='button']:hover { +input[type='button']:hover { background: #5c9dfe; text-decoration: none; } -button, input[type='button'].alert { +input[type='button'].alert { background: #fe5c5c !important; } -button, input[type='button'].info { +input[type='button'].info { background: #ffffff !important; color: black; border: 1px solid black; } -button, input[type='button'][disabled] { +input[type='button'][disabled] { border: 1px solid #999999; background-color: #cccccc; color: #666666; diff --git a/src/components/Dashboad.vue b/src/components/Dashboad.vue index b94beb1..9658ff2 100644 --- a/src/components/Dashboad.vue +++ b/src/components/Dashboad.vue @@ -71,7 +71,19 @@ function openChart(type: TypeOfChart) { height: 390px; } .chart-btn { - background-color: rgb(202, 202, 202); + background-color: rgb(192, 192, 192); + color: #fff; + border-radius: 3px; + height: 36px; + line-height: 35px; + padding: 0 20px; + border: 0; + font-size: 14px; + font-weight: 500; + cursor: pointer; + min-width: 80px; + text-align: center; + width: 200px; } .chart-btn.active { diff --git a/src/components/Pomodoro.vue b/src/components/Pomodoro.vue index 4447b42..846cc95 100644 --- a/src/components/Pomodoro.vue +++ b/src/components/Pomodoro.vue @@ -125,8 +125,18 @@ async function changeStatus() { margin-top: 5px; } button { - color: white !important; border: none; + color: #fff; + border-radius: 3px; + height: 36px; + line-height: 35px; + padding: 0 20px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + min-width: 80px; + text-align: center; + width: 200px; } button.start { background-color: rgb(62, 148, 62) !important; From 299db96bfa5fdcd3e034be4772cf7c671e56743e Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 14 Feb 2024 07:00:00 +0100 Subject: [PATCH 17/92] Add link to pomodoro on dashboard --- src/assets/css/dark.css | 2 +- src/pages/Popup.vue | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/assets/css/dark.css b/src/assets/css/dark.css index ce5ce44..a168b80 100644 --- a/src/assets/css/dark.css +++ b/src/assets/css/dark.css @@ -8,7 +8,7 @@ .dark .headerBlock .icons-block a:hover{ filter: invert(40%) sepia(94%) saturate(3371%) hue-rotate(227deg) brightness(99%) contrast(92%); } -.dark .headerBlock .icons-block a img { +.dark .headerBlock .icons-block a.filter img { filter: invert(100%) sepia(17%) saturate(0%) hue-rotate(24deg) brightness(103%) contrast(102%); } .dark .header-block { diff --git a/src/pages/Popup.vue b/src/pages/Popup.vue index d16554a..9cd17fd 100644 --- a/src/pages/Popup.vue +++ b/src/pages/Popup.vue @@ -21,10 +21,14 @@ v-if="darkMode == false" @click="changeDarkMode(true)" /> - {{ t('pomodoroMode.message') }} + {{ t('dashboard.message') }} - {{ t('settings.message') }} @@ -153,7 +157,7 @@ function updateTab() { } .headerBlock .icons-block { float: right; - margin: 7px 10px 0 0; + margin: 7px 0 0 0; } .headerBlock .icons-block a:hover { From 044a4a8a3d845c84e7d6e395295ca26f6c7487cc Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 14 Feb 2024 08:59:00 +0100 Subject: [PATCH 18/92] Fix work/rest periods --- src/components/Pomodoro.vue | 18 ++++++++++++- src/functions/pomodoro.ts | 51 ++++++++++++++++++++++--------------- src/functions/useBadge.ts | 10 +++++--- src/tracker.ts | 32 +++++++++++------------ src/utils/converter.ts | 8 +++--- src/utils/time.ts | 4 --- vite.config.ts | 3 ++- 7 files changed, 76 insertions(+), 50 deletions(-) diff --git a/src/components/Pomodoro.vue b/src/components/Pomodoro.vue index 846cc95..25653be 100644 --- a/src/components/Pomodoro.vue +++ b/src/components/Pomodoro.vue @@ -42,6 +42,7 @@ import { } from '../storage/storage-params'; import { Time } from '../utils/time'; import { logger } from '../utils/logger'; +import { useBadge, BadgeColor, BadgeIcon } from '../functions/useBadge'; const { t } = useI18n(); const settingsStorage = injecStorage(); @@ -90,11 +91,26 @@ async function changeStatus() { StorageParams.POMODORO_INTERVAL_REST, convertHHMMToSeconds(restTime.value.hours, restTime.value.minutes), ); - await settingsStorage.saveValue(StorageParams.POMODORO_START_TIME, new Date()); + await settingsStorage.saveValue(StorageParams.POMODORO_START_TIME, new Date().toString()); await settingsStorage.saveValue(StorageParams.POMODORO_FREQUENCY, frequency.value); isEnabled.value = !isEnabled.value; + if (isEnabled.value) + await useBadge({ + text: null, + color: BadgeColor.none, + icon: BadgeIcon.pomodoroWorkingTime, + }); + else { + await settingsStorage.saveValue(StorageParams.POMODORO_START_TIME, null); + await useBadge({ + text: null, + color: BadgeColor.none, + icon: BadgeIcon.default, + }); + } + logger.log(`Change pomodoro status to ${String(isEnabled.value).toUpperCase()}`); } diff --git a/src/functions/pomodoro.ts b/src/functions/pomodoro.ts index 49c74bf..d3f3eae 100644 --- a/src/functions/pomodoro.ts +++ b/src/functions/pomodoro.ts @@ -1,18 +1,19 @@ import { addSeconds } from 'date-fns'; import { injecStorage } from '../storage/inject-storage'; import { StorageParams } from '../storage/storage-params'; -import { Time, timeToSeconds } from '../utils/time'; import { useBadge, BadgeIcon, BadgeColor } from './useBadge'; +import { Settings } from './settings'; +import Browser from 'webextension-polyfill'; export async function checkPomodoro() { - function isTargetPeriod(isRest: boolean) { + function isTargetPeriod() { for (let index = 1; index <= frequency; index++) { - const plusWorkingTime = timeToSeconds(workTime) * (isRest ? index : index--); - const plusRestTime = timeToSeconds(restTime) * index--; + const plusWorkingTime = workTime * (index - 1); + const plusRestTime = restTime * (index - 1); const isPomodoroTargetPeriodStart = addSeconds(startTime, plusWorkingTime + plusRestTime); const isPomodoroTargetPeriodEnd = addSeconds( startTime, - plusWorkingTime + plusRestTime + timeToSeconds(workTime), + plusWorkingTime + plusRestTime + workTime, ); const isTargetPeriod = now.getTime() >= isPomodoroTargetPeriodStart.getTime() && @@ -24,40 +25,50 @@ export async function checkPomodoro() { } const storage = injecStorage(); - const isPomodoroEnabled = (await storage.getValue(StorageParams.IS_POMODORO_ENABLED)) as boolean; + const isPomodoroEnabled = (await Settings.getInstance().getSetting( + StorageParams.IS_POMODORO_ENABLED, + )) as boolean; if (!isPomodoroEnabled) return; - const startTime = (await storage.getValue(StorageParams.POMODORO_START_TIME)) as Date; - const workTime = (await storage.getValue(StorageParams.POMODORO_INTERVAL_WORK)) as Time; - const restTime = (await storage.getValue(StorageParams.POMODORO_INTERVAL_REST)) as Time; - const frequency = (await storage.getValue(StorageParams.POMODORO_FREQUENCY)) as number; + const startTime = new Date( + (await Settings.getInstance().getSetting(StorageParams.POMODORO_START_TIME)) as string, + ); + const workTime = (await Settings.getInstance().getSetting( + StorageParams.POMODORO_INTERVAL_WORK, + )) as number; + const restTime = (await Settings.getInstance().getSetting( + StorageParams.POMODORO_INTERVAL_REST, + )) as number; + const frequency = (await Settings.getInstance().getSetting( + StorageParams.POMODORO_FREQUENCY, + )) as number; const now = new Date(); - const pomodoroEndTime = addSeconds( - startTime, - timeToSeconds(workTime) * frequency + timeToSeconds(restTime) * frequency, - ); + const pomodoroEndTime = addSeconds(startTime, workTime * frequency + restTime * frequency); - if (pomodoroEndTime > now) { + if (now > pomodoroEndTime) { await storage.saveValue(StorageParams.IS_POMODORO_ENABLED, false); await storage.saveValue(StorageParams.POMODORO_START_TIME, null); return; } - const isWork = isTargetPeriod(false); - const isRest = isTargetPeriod(true); + const isWork = isTargetPeriod(); + + const activeTab = await Browser.tabs.query({ active: true }); if (isWork) await useBadge({ - text: '', + tabId: activeTab[0].id, + text: null, color: BadgeColor.none, icon: BadgeIcon.pomodoroWorkingTime, }); - if (isRest) + else await useBadge({ - text: '', + tabId: activeTab[0].id, + text: null, color: BadgeColor.none, icon: BadgeIcon.pomodoroRestTime, }); diff --git a/src/functions/useBadge.ts b/src/functions/useBadge.ts index 2f08c4e..8854b25 100644 --- a/src/functions/useBadge.ts +++ b/src/functions/useBadge.ts @@ -1,16 +1,16 @@ import Browser from 'webextension-polyfill'; export interface BadgeState { - text: string; + text: string | null; color: BadgeColor; tabId?: number; icon?: BadgeIcon; } export enum BadgeIcon { - default = '/assets/icons/128x128.png', + default = '/128x128.png', pomodoroWorkingTime = '/assets/icons/pomodoro.png', - pomodoroRestTime = '/assets/icons/pomodoro-rest-icon.png', + pomodoroRestTime = '/assets/icons/pomodoro-rest.png', } export enum BadgeColor { @@ -21,7 +21,8 @@ export enum BadgeColor { } export async function useBadge(badge: BadgeState): Promise { - await Browser.action.setBadgeBackgroundColor({ color: badge.color }); + if (badge.color != BadgeColor.none) + await Browser.action.setBadgeBackgroundColor({ color: badge.color }); await Browser.action.setBadgeText({ tabId: badge.tabId, text: badge.text, @@ -31,6 +32,7 @@ export async function useBadge(badge: BadgeState): Promise { path: badge.icon, }); await Browser.action.setBadgeText({ + tabId: badge.tabId, text: badge.text, }); } else diff --git a/src/tracker.ts b/src/tracker.ts index 27bca9d..b5dcb03 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -127,22 +127,22 @@ async function mainTracker( tab.incSummaryTime(); - const viewInBadge = - (await Settings.getInstance().getSetting(StorageParams.VIEW_TIME_IN_BADGE)) && - (await canChangeBadge()); - - if (viewInBadge) - await useBadge({ - tabId: activeTab?.id, - text: convertSummaryTimeToBadgeString(tab.days.at(-1)!.summary), - color: BadgeColor.blue, - }); - else - await useBadge({ - tabId: activeTab?.id, - text: '', - color: BadgeColor.red, - }); + const viewInBadge = await Settings.getInstance().getSetting(StorageParams.VIEW_TIME_IN_BADGE); + + if (await canChangeBadge()) { + if (viewInBadge) + await useBadge({ + tabId: activeTab?.id, + text: convertSummaryTimeToBadgeString(tab.days.at(-1)!.summary), + color: BadgeColor.blue, + }); + else + await useBadge({ + tabId: activeTab?.id, + text: null, + color: BadgeColor.none, + }); + } } else await closeOpenInterval(); } diff --git a/src/utils/converter.ts b/src/utils/converter.ts index 06ac8f5..a80a5a7 100644 --- a/src/utils/converter.ts +++ b/src/utils/converter.ts @@ -2,7 +2,7 @@ import i18n, { getMessagesFromLocale } from '../plugins/i18n'; import { HOUR, HOUR_IN_SECONDS, MINUTE, MINUTE_IN_SECONDS, Time } from './time'; export function convertHHMMToSeconds(hours: number, minutes: number) { - return hours * 3600 + minutes * 60; + return hours * HOUR_IN_SECONDS + minutes * MINUTE_IN_SECONDS; } export function convertHHMMToMilliSeconds(hours: number, minutes: number) { @@ -10,9 +10,9 @@ export function convertHHMMToMilliSeconds(hours: number, minutes: number) { } export function convertSecondsToHHMM(seconds: number): Time { - const hours = Math.floor(seconds / 3600); - const totalSeconds = seconds % 3600; - const mins = Math.floor(totalSeconds / 60); + const hours = Math.floor(seconds / HOUR_IN_SECONDS); + const totalSeconds = seconds % HOUR_IN_SECONDS; + const mins = Math.floor(totalSeconds / MINUTE_IN_SECONDS); return { hours: hours, diff --git a/src/utils/time.ts b/src/utils/time.ts index e18a6f6..1c779c9 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -29,7 +29,3 @@ export function daysBetween(startDate: Date, endDate: Date): number { const millisecondsPerDay = 24 * 60 * 60 * 1000; return (treatAsUTC(endDate).valueOf() - treatAsUTC(startDate).valueOf()) / millisecondsPerDay + 1; } - -export function timeToSeconds(time: Time) { - return time.hours * HOUR_IN_SECONDS + time.minutes * MINUTE_IN_SECONDS; -} diff --git a/vite.config.ts b/vite.config.ts index 67a0bbd..b2a571e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -22,6 +22,7 @@ function generateManifest() { // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ build: { + assetsInlineLimit: 1024, rollupOptions: { output: { assetFileNames: assetInfo => { @@ -29,7 +30,7 @@ export default defineConfig(({ mode }) => ({ if (/png|jpe?g|svg|gif|tiff|bmp|ico/i.test(extType)) { extType = 'icons'; } - return `assets/${extType}/[name]-[hash][extname]`; + return `assets/${extType}/[name][extname]`; }, }, }, From 47ca6b226dc3cb1d8526bd2072a6176a9c6266a1 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 14 Feb 2024 14:37:27 +0300 Subject: [PATCH 19/92] Try my other apps --- src/_locales/de/messages.json | 7 +++ src/_locales/en/messages.json | 7 +++ src/_locales/ru/messages.json | 7 +++ src/_locales/zh_CN/messages.json | 7 +++ src/assets/icons/clear-youtube-logo.svg | 11 ++++ src/components/About.vue | 2 + src/components/MyApps.vue | 72 +++++++++++++++++++++++++ 7 files changed, 113 insertions(+) create mode 100644 src/assets/icons/clear-youtube-logo.svg create mode 100644 src/components/MyApps.vue diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 6e4ca47..908c01a 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -315,5 +315,12 @@ "promoClearYoutube": { "message": "Möchten Sie Kurzfilme, Kommentare, empfohlene Videos, Abonnements und andere YouTube-Ablenkungen blockieren? Wir haben eine weitere Erweiterung erstellt, mit der Sie YouTube ohne Ablenkung ansehen können.", "description": "Install" + }, + "tryMyOtherApps": { + "message": "Probieren Sie meine anderen Apps aus" + }, + "clearYoutube": { + "message": "Clear YouTube", + "description": "Chrome-Erweiterung, die YouTube-Shorts, empfohlene Videos, Kommentare, Feeds, Homepage-Empfehlungen und andere Ablenkungen ausblenden kann. Sieh dir YouTube ohne Ablenkungen an." } } \ No newline at end of file diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 7e57e18..1ce811f 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -315,5 +315,12 @@ "intervalsChart": { "message": "Only time intervals greater than", "description": "are shown" + }, + "tryMyOtherApps": { + "message": "Try my other apps" + }, + "clearYoutube": { + "message": "Clear YouTube", + "description": "Chrome extension that can hide YouTube shorts, recomended videos, comments, feed, homepage recommendations and other distractions. Watch YouTube free of distractions." } } diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index c67edc7..3a87e2c 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -316,5 +316,12 @@ "intervalsChart": { "message": "Отображаются только временные интервалы, превышающие", "description": "" + }, + "tryMyOtherApps": { + "message": "Попробуйте другие мои приложения" + }, + "clearYoutube": { + "message": "Clear YouTube", + "description": "Расширение для Chrome, которое может скрывать шортс YouTube, рекомендуемые видео, комментарии, ленту новостей, рекомендации по домашней странице и другие отвлекающие факторы. Смотрите YouTube без отвлекающих факторов." } } diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 8bbba44..b8b7d8c 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -315,5 +315,12 @@ "promoClearYoutube": { "message": "您想屏蔽短片、评论、推荐视频、订阅和其他 YouTube 干扰内容吗? 我们创建了另一个扩展程序,可帮助您不受干扰地观看 YouTube", "description": "安装" + }, + "tryMyOtherApps": { + "message": "试试我的其他应用程序" + }, + "clearYoutube": { + "message": "Clear YouTube", + "description": "Chrome扩展程序,可以隐藏YouTube短片,推荐视频,评论,feed,主页推荐和其他分心。 观看YouTube免费分心。" } } diff --git a/src/assets/icons/clear-youtube-logo.svg b/src/assets/icons/clear-youtube-logo.svg new file mode 100644 index 0000000..5854613 --- /dev/null +++ b/src/assets/icons/clear-youtube-logo.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/components/About.vue b/src/components/About.vue index 8acfe4f..0938fe8 100644 --- a/src/components/About.vue +++ b/src/components/About.vue @@ -22,6 +22,7 @@ {{ t('review.message') }} + + + + + From 4b4ddeefabfade60c9385cf0d52aaabb9974cc7e Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 16 Feb 2024 11:36:58 +0300 Subject: [PATCH 20/92] Localization --- src/_locales/de/messages.json | 36 ++++++++++++++++++++++++++++++ src/_locales/en/messages.json | 38 +++++++++++++++++++++++++++++++- src/_locales/ru/messages.json | 38 +++++++++++++++++++++++++++++++- src/_locales/zh_CN/messages.json | 36 ++++++++++++++++++++++++++++++ src/assets/css/dashboard.css | 2 +- src/components/Pomodoro.vue | 28 ++++++++++++++++++++++- src/pages/Popup.vue | 3 +-- 7 files changed, 175 insertions(+), 6 deletions(-) diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 6e4ca47..8c51cd9 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -128,6 +128,38 @@ "notificationsSettings": { "message": "Benachrichtigungen" }, + "pomodoroMode": { + "message": "Pomodoro" + }, + "pomodoro": { + "message": "Pomodoro", + "description": "Die Pomodoro-Methode ist eine Zeitmanagementtechnik, die auf dem Wechsel von konzentrierten Arbeits- und Ruhephasen basiert. Bei der klassischen Pomodoro-Methode dauert die Arbeitsphase 25 Minuten und die Ruhephase 5 Minuten." + }, + "pomodoroExplanationIcon": { + "message": "Wenn der Pomodoro-Modus aktiviert ist und der Betriebsmodus aktiv ist, sehen Sie dieses Symbol", + "description": "Während der Ruhezeiten sehen Sie dieses Erweiterungssymbol" + }, + "pomodoroExplanationTime": { + "message": "Während des Pomodoro-Modus berücksichtigt die Erweiterung weiterhin die Zeit, die Sie auf den Seiten verbracht haben, alle Grenzen und Benachrichtigungen funktionieren." + }, + "pomodoroExplanationStop": { + "message": "Nach dem Drücken von 'Stop' werden die Betriebs- und Ruhezeiten auf Null zurückgesetzt." + }, + "pomodoroWork": { + "message": "Zeitraum der Arbeit" + }, + "pomodoroRest": { + "message": "Ruhezeit" + }, + "pomodoroFrequency": { + "message": "Anzahl der Wiederholungen" + }, + "start": { + "message": "Starten Sie" + }, + "stop": { + "message": "Stop" + }, "aboutSettings": { "message": "Über die Erweiterung" }, @@ -315,5 +347,9 @@ "promoClearYoutube": { "message": "Möchten Sie Kurzfilme, Kommentare, empfohlene Videos, Abonnements und andere YouTube-Ablenkungen blockieren? Wir haben eine weitere Erweiterung erstellt, mit der Sie YouTube ohne Ablenkung ansehen können.", "description": "Install" + }, + "completelyBlocked": { + "message": "Vollständig blockiert", + "description": "Vollständig blockieren" } } \ No newline at end of file diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 7e57e18..3d00fc7 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -3,7 +3,7 @@ "message": "Web Activity Time Tracker - Block Sites" }, "extDescription": { - "message": "Time tracking of your web activity, limit and block distracting websites. Monitor your web usage." + "message": "Track time of your web activity, limit and block distracting websites. Monitor your web usage." }, "settings": { "message": "Settings" @@ -128,6 +128,38 @@ "notificationsSettings": { "message": "Notifications" }, + "pomodoroMode": { + "message": "Pomodoro" + }, + "pomodoro": { + "message": "Pomodoro", + "description": "The Pomodoro method is a time management technique based on alternating periods of focused work and rest. According to the classics of the Pomodoro method, the work period lasts 25 minutes, the rest period is 5 minutes." + }, + "pomodoroExplanationIcon": { + "message": "When Pomodoro mode is on and operation mode is active, you will see this icon", + "description": "During rest periods, you will see this extension icon" + }, + "pomodoroExplanationTime": { + "message": "During Pomodoro mode, the extension continues to take into account the time you spent on the sites, all limits and notifications work." + }, + "pomodoroExplanationStop": { + "message": "After clicking 'Stop', work and rest time is reset to zero." + }, + "pomodoroWork": { + "message": "The period of work" + }, + "pomodoroRest": { + "message": "The rest period" + }, + "pomodoroFrequency": { + "message": "Number of repetitions" + }, + "start": { + "message": "Run" + }, + "stop": { + "message": "Stop" + }, "aboutSettings": { "message": "About" }, @@ -315,5 +347,9 @@ "intervalsChart": { "message": "Only time intervals greater than", "description": "are shown" + }, + "completelyBlocked": { + "message": "Completely Blocked", + "description": "Completely Block" } } diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index c67edc7..4f5d33a 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -128,6 +128,38 @@ "notificationsSettings": { "message": "Уведомления" }, + "pomodoroMode": { + "message": "Pomodoro" + }, + "pomodoro": { + "message": "Pomodoro", + "description": "Метод Pomodoro — это техника тайм-менеджмента, завязанная на чередовании периодов сфокусированной работы и отдыха. По классике метода помодоро период работы длится 25 минут, период отдыха 5 минут." + }, + "pomodoroExplanationIcon": { + "message": "Когда режим Pomodoro включен и активен режим работы, то вы будете видеть эту иконку", + "description": "В периоды отдыха вы будете видеть эту иконку расширения" + }, + "pomodoroExplanationTime": { + "message": "Во время режима Pomodoro, расширение продолжает учитывать время, которые вы провели на сайтах,работают все лимиты и уведомления." + }, + "pomodoroExplanationStop": { + "message": "После нажатия 'Остановить', время работы и отдыха обнуляется." + }, + "pomodoroWork": { + "message": "Период работы" + }, + "pomodoroRest": { + "message": "Период отдыха" + }, + "pomodoroFrequency": { + "message": "Количество повторов" + }, + "start": { + "message": "Запустить" + }, + "stop": { + "message": "Остановить" + }, "aboutSettings": { "message": "\u041E программе" }, @@ -310,11 +342,15 @@ "message": "По часам" }, "intervals": { - "message": "Интервальны", + "message": "Интервалы", "description": "Отображаются только временные интервалы, превышающие 5 секунд" }, "intervalsChart": { "message": "Отображаются только временные интервалы, превышающие", "description": "" + }, + "completelyBlocked": { + "message": "Полностью заблокирован", + "description": "Полностью заблокировать" } } diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 8bbba44..edebbac 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -128,6 +128,38 @@ "notificationsSettings": { "message": "通知" }, + "pomodoroMode": { + "message": "Pomodoro" + }, + "pomodoro": { + "message": "Pomodoro", + "description": "Pomodoro 工作法是一种时间管理技术,以交替集中工作和休息为基础。根据经典的 Pomodoro 方法,工作时间为 25 分钟,休息时间为 5 分钟。" + }, + "pomodoroExplanationIcon": { + "message": "启用 Pomodoro 模式并激活操作模式后,您将看到以下图标", + "description": "在休息时间,您会看到这个扩展图标" + }, + "pomodoroExplanationTime": { + "message": "在 Pomodoro 模式下,扩展会继续考虑你在网站上花费的时间、所有限制和通知。" + }, + "pomodoroExplanationStop": { + "message": "按下 '停止' 键后,运行时间和休息时间将重置为零" + }, + "pomodoroWork": { + "message": "工作期限" + }, + "pomodoroRest": { + "message": "休息时间" + }, + "pomodoroFrequency": { + "message": "重复次数" + }, + "start": { + "message": "启动" + }, + "stop": { + "message": "停止" + }, "aboutSettings": { "message": "关于" }, @@ -315,5 +347,9 @@ "promoClearYoutube": { "message": "您想屏蔽短片、评论、推荐视频、订阅和其他 YouTube 干扰内容吗? 我们创建了另一个扩展程序,可帮助您不受干扰地观看 YouTube", "description": "安装" + }, + "completelyBlocked": { + "message": "完全封锁", + "description": "完全封锁" } } diff --git a/src/assets/css/dashboard.css b/src/assets/css/dashboard.css index 8730208..f50eb56 100644 --- a/src/assets/css/dashboard.css +++ b/src/assets/css/dashboard.css @@ -21,7 +21,7 @@ body { } .description { - font-size: 13px; + font-size: 14px; color: grey; margin: 7px 0 15px 0; font-weight: normal; diff --git a/src/components/Pomodoro.vue b/src/components/Pomodoro.vue index 25653be..21579c9 100644 --- a/src/components/Pomodoro.vue +++ b/src/components/Pomodoro.vue @@ -3,6 +3,18 @@

{{ t('pomodoro.description') }}

+
+

+ {{ t('pomodoroExplanationIcon.message') }} + . + {{ t('pomodoroExplanationIcon.description') }} + . +

+

+ {{ t('pomodoroExplanationTime.message') }} +

+

{{ t('pomodoroExplanationStop.message') }}

+

{{ t('pomodoroWork.message') }}

@@ -26,7 +38,11 @@ - + + + + + diff --git a/src/components/Review.vue b/src/components/Review.vue index b12d619..c1cf061 100644 --- a/src/components/Review.vue +++ b/src/components/Review.vue @@ -82,6 +82,7 @@ async function openStore() { display: inline-block; margin: 8px; font-size: 17px; + font-weight: 500; } .review-block img { padding: 9px 0 0 0; diff --git a/src/pages/Popup.vue b/src/pages/Popup.vue index b1f294c..419d084 100644 --- a/src/pages/Popup.vue +++ b/src/pages/Popup.vue @@ -88,6 +88,7 @@
+ @@ -97,6 +98,7 @@ import { useI18n } from 'vue-i18n'; import TabList from '../components/TabList.vue'; import ByDays from '../components/ByDays.vue'; import Review from '../components/Review.vue'; +import PomodoroInfo from '../components/PomodoroInfo.vue'; import { openPage } from '../utils/open-page'; import { SettingsTab, TypeOfList } from '../utils/enums'; import { injecStorage } from '../storage/inject-storage'; From affb0762816c1475ff92d6504b63b78969d4b454 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 16 Feb 2024 18:01:15 +0300 Subject: [PATCH 23/92] Disable changes settings when pomodoro is enabled --- src/components/Pomodoro.vue | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/components/Pomodoro.vue b/src/components/Pomodoro.vue index 21579c9..3716b90 100644 --- a/src/components/Pomodoro.vue +++ b/src/components/Pomodoro.vue @@ -15,17 +15,19 @@

{{ t('pomodoroExplanationStop.message') }}

-
-

{{ t('pomodoroWork.message') }}

- -
-
-

{{ t('pomodoroRest.message') }}

- -
-
-

{{ t('pomodoroFrequency.message') }}

- +
+
+

{{ t('pomodoroWork.message') }}

+ +
+
+

{{ t('pomodoroRest.message') }}

+ +
+
+

{{ t('pomodoroFrequency.message') }}

+ +
+ + @@ -159,6 +161,7 @@ import { onMounted, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; import GeneralSettings from '../components/GeneralSettings.vue'; +import PromoTrackerJam from '../components/PromoTrackerJam.vue'; import WhiteList from '../components/WhiteList.vue'; import Limits from '../components/Limits.vue'; import DailyNotifications from '../components/Notifications.vue'; diff --git a/src/storage/storage-params.ts b/src/storage/storage-params.ts index 09c001f..5683a71 100644 --- a/src/storage/storage-params.ts +++ b/src/storage/storage-params.ts @@ -29,6 +29,8 @@ export enum StorageParams { POMODORO_AUDIO_AFTER_FINISHED = 'pomodoro-audio-after-finished', POMODORO_INTERVAL_REST = 'pomodoro-interval-rest', POMODORO_FREQUENCY = 'pomodoro-frequency', + PROMO_TRACKERJAM_DATE = 'promo-trackerjam-date', + PROMO_TRACKERJAM_PROMPT_AT = 'promo-trackerjam-prompt-at', } export enum StorageDeserializeParam { From c7061ecd48730c8b774a682259b8d69be9ea5053 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 3 Aug 2024 14:53:27 +0300 Subject: [PATCH 58/92] UI for dark --- src/assets/css/dark.css | 3 +++ src/components/PromoTrackerJam.vue | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/assets/css/dark.css b/src/assets/css/dark.css index 0175901..87dffc6 100644 --- a/src/assets/css/dark.css +++ b/src/assets/css/dark.css @@ -71,4 +71,7 @@ } .dark .pomodoro-popup-block p{ color:#303030; +} +.dark .promo{ + color: black !important; } \ No newline at end of file diff --git a/src/components/PromoTrackerJam.vue b/src/components/PromoTrackerJam.vue index 9db7190..c72689a 100644 --- a/src/components/PromoTrackerJam.vue +++ b/src/components/PromoTrackerJam.vue @@ -1,6 +1,6 @@ @@ -39,7 +28,6 @@ const { t } = useI18n(); enum App { ClearYoutube, - TrackerJam, } function openAppLink(app: App) { @@ -47,9 +35,6 @@ function openAppLink(app: App) { case App.ClearYoutube: window.open(CHROME_STORE_CLEAR_YOUTUBE_URL, '_blank'); break; - case App.TrackerJam: - window.open('https://trackerjam.com/?utm_source=watt_extension', '_blank'); - break; } } From 5916b38ca8adb25a881e8a3c8908aa0444488edf Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 6 Aug 2024 13:44:23 +0300 Subject: [PATCH 64/92] Update UI small promo block --- src/components/PromoClearYouTube.vue | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/PromoClearYouTube.vue b/src/components/PromoClearYouTube.vue index 62d4ebb..6bba3f5 100644 --- a/src/components/PromoClearYouTube.vue +++ b/src/components/PromoClearYouTube.vue @@ -1,10 +1,11 @@ @@ -59,16 +60,14 @@ async function saveValue() { font-size: 14px; background-color: #efefef; border-radius: 10px; - min-width: 655px; + display: flex; + justify-content: space-between; } .review-block .btn-block { margin: 8px 5px 0 0; vertical-align: top; float: right; } -.review-block input[type='button'] { - float: right; -} .review-block p { display: inline-block; margin: 0 10px; From f7b12dd2915fecc8a863adc7c53edd90f3f0d985 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 6 Aug 2024 14:03:41 +0300 Subject: [PATCH 65/92] Promo modal --- src/assets/clear-youtube-promo.png | Bin 0 -> 168314 bytes src/assets/trackerjam-promo.jpg | Bin 58602 -> 0 bytes ...ckerJam.vue => PromoCleanYoutubeModal.vue} | 34 +++++++++--------- src/pages/Dashboard.vue | 4 +-- src/storage/storage-params.ts | 4 +-- 5 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 src/assets/clear-youtube-promo.png delete mode 100644 src/assets/trackerjam-promo.jpg rename src/components/{PromoTrackerJam.vue => PromoCleanYoutubeModal.vue} (66%) diff --git a/src/assets/clear-youtube-promo.png b/src/assets/clear-youtube-promo.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f07e808ef3363fdb7299c75a3b3d2ae573285f GIT binary patch literal 168314 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

@EoPKY1K75W7r`&e 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

$qHxyUtfsZV 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�Z;FVSH814H#2(Q^B# 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 +
+ +
+
{{ t('averageTimeByDays.message') }}

{{ convertSummaryTimeToString(tabsByDays!.averageTime) }}

+
+
+ + + + -
@@ -77,6 +91,7 @@ import NoDataByDays from './NoDataByDays.vue'; import ByDaysChart from '../components/ByDaysChart.vue'; import Expander from '../components/Expander.vue'; import { TabListByDays } from '../dto/tabListSummary'; +import { CurrentTabItem } from '../dto/currentTabItem'; import { useTabListByDays } from '../functions/useTabListByDays'; import { convertSummaryTimeToString } from '../utils/converter'; import { ranges, ThisWeekRange } from '../utils/date'; @@ -131,6 +146,27 @@ async function exportToCsv() { `websites_${dateFrom.toLocaleDateString()}-${dateTo.toLocaleDateString()}.csv`, ); } + +function mergeAllDays(days: TabListByDays['days'] | undefined): CurrentTabItem[] { + if (!days) return []; + + const urlMap = new Map(); + + for (const day of days) { + for (const tab of day.tabs) { + if (!urlMap.has(tab.url)) { + urlMap.set(tab.url, { ...tab }); + continue; + } + + const existingTab = urlMap.get(tab.url)!; + existingTab.summaryTime += tab.summaryTime; + existingTab.sessions += tab.sessions; + } + } + + return Array.from(urlMap.values()).sort((a, b) => b.summaryTime - a.summaryTime); +} From 715a6237987a904265172ff2a96ca78efd8b364e Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 21 Sep 2024 20:58:49 +0300 Subject: [PATCH 74/92] Bump version to 2.1.5 --- src/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/manifest.json b/src/manifest.json index 4d3a45a..40eb249 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "short_name": "Web Tracker", - "version": "2.1.4", + "version": "2.1.5", "description": "__MSG_extDescription__", "options_page": "src/dashboard.html", "default_locale": "en", From b01cb63f667d76dfa724df2e5280ea1a630a84bd Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 7 Oct 2024 13:07:07 +0300 Subject: [PATCH 75/92] Review link for edge --- src/components/Review.vue | 28 +++++++++++++--------------- src/manifest.json | 2 +- src/utils/chrome-url.ts | 2 ++ vite.config.ts | 7 +++++-- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/components/Review.vue b/src/components/Review.vue index 8b8b74b..45cfebe 100644 --- a/src/components/Review.vue +++ b/src/components/Review.vue @@ -19,7 +19,7 @@ import { injectStorage } from '../storage/inject-storage'; import { StorageParams } from '../storage/storage-params'; import { addDays, startOfToday } from 'date-fns'; import { addHours } from 'date-fns/esm'; -import { CHROME_STORE_REVIEW_URL } from '../utils/chrome-url'; +import { CHROME_STORE_REVIEW_URL, EDGE_STORE_REVIEW_URL } from '../utils/chrome-url'; const { t } = useI18n(); @@ -32,20 +32,18 @@ const showReview = ref(); onMounted(async () => { showReview.value = false; - if (__BROWSER__ == 'chrome') { - const reviewDate = await settingsStorage.getValue(StorageParams.REVIEW_DATE); + const reviewDate = await settingsStorage.getValue(StorageParams.REVIEW_DATE); - if (reviewDate == undefined) { - let nextTime = await settingsStorage.getValue(StorageParams.REVIEW_PROMPT_AT); - if (nextTime == undefined) { - await settingsStorage.saveValue( - StorageParams.REVIEW_PROMPT_AT, - addDays(addHours(startOfToday(), PROMPT_AT_TIME_OF_DAY), ADD_DAYS_FIRST).toString(), - ); - } else { - nextTime = new Date(nextTime); - if (nextTime < new Date()) showReview.value = true; - } + if (reviewDate == undefined) { + let nextTime = await settingsStorage.getValue(StorageParams.REVIEW_PROMPT_AT); + if (nextTime == undefined) { + await settingsStorage.saveValue( + StorageParams.REVIEW_PROMPT_AT, + addDays(addHours(startOfToday(), PROMPT_AT_TIME_OF_DAY), ADD_DAYS_FIRST).toString(), + ); + } else { + nextTime = new Date(nextTime); + if (nextTime < new Date()) showReview.value = true; } } }); @@ -59,7 +57,7 @@ async function closeBlock() { } async function openStore() { - window.open(CHROME_STORE_REVIEW_URL, '_blank'); + window.open(__BROWSER__ == 'edge' ? EDGE_STORE_REVIEW_URL : CHROME_STORE_REVIEW_URL, '_blank'); await settingsStorage.saveValue(StorageParams.REVIEW_DATE, new Date().toString()); } diff --git a/src/manifest.json b/src/manifest.json index 40eb249..491af50 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "short_name": "Web Tracker", - "version": "2.1.5", + "version": "2.1.6", "description": "__MSG_extDescription__", "options_page": "src/dashboard.html", "default_locale": "en", diff --git a/src/utils/chrome-url.ts b/src/utils/chrome-url.ts index cd97950..abdaae7 100644 --- a/src/utils/chrome-url.ts +++ b/src/utils/chrome-url.ts @@ -2,3 +2,5 @@ export const CHROME_STORE_REVIEW_URL = `https://chromewebstore.google.com/detail export const CHROME_STORE_SUPPORT_URL = `https://chromewebstore.google.com/detail/web-activity-time-tracker/${__APP_ID__}/support`; export const CHROME_STORE_CLEAR_YOUTUBE_URL = 'https://chromewebstore.google.com/detail/clean-youtube-update-yout/kalhfjomailhflienkfajocjodgjipie?utm_source=watt'; + +export const EDGE_STORE_REVIEW_URL = `https://microsoftedge.microsoft.com/addons/detail/web-activity-time-tracker/${__APP_ID__}#review-section`; diff --git a/vite.config.ts b/vite.config.ts index b8ef92a..cf14fdb 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,7 +5,10 @@ import webExtension, { readJsonFile } from 'vite-plugin-web-extension'; import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'; import copy from 'rollup-plugin-copy'; -const APPID_CHROME = 'hhfnghjdeddcfegfekjeihfmbjenlomm'; +const APP_ID = { + chrome: 'hhfnghjdeddcfegfekjeihfmbjenlomm', + edge: 'eepmlmdenlkkjieghjmedjahpofieogf', +}; const browser = process.env.TARGET || 'chrome'; function generateManifest() { @@ -44,7 +47,7 @@ export default defineConfig(({ mode }) => ({ __EXTENSION_MODE__: JSON.stringify(mode), __DEV__: mode === 'development', __PROD__: mode === 'production', - __APP_ID__: JSON.stringify(APPID_CHROME), + __APP_ID__: JSON.stringify(APP_ID[browser]), __BROWSER__: JSON.stringify(browser), }, plugins: [ From 7f3f5f600df7e8ef0c450fcdae72b2b08351a894 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 7 Oct 2024 13:10:20 +0300 Subject: [PATCH 76/92] Fix DE description length --- src/_locales/de/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 547886f..4d99e0c 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -3,7 +3,7 @@ "message": "Web Activity Time Tracker - Websites sperren, Pomodoro & Webanalyse" }, "extDescription": { - "message": "Verfolgen und begrenzen Sie die Zeit Ihrer Webaktivitäten und blockieren Sie den Zugang zu den Websites. Überwachen Sie Ihre Internetnutzung." + "message": "Verfolgen und begrenzen Sie die Zeit Ihrer Webaktivitäten und blockieren Sie den Zugang zu den Websites." }, "settings": { "message": "Einstellungen" From 611e9cc7e30bf61adb477c64154dc124c88455b8 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 15 Oct 2024 14:06:07 +0300 Subject: [PATCH 77/92] Update icon colors for dark mode --- src/assets/css/dark.css | 4 +++- src/manifest.json | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/assets/css/dark.css b/src/assets/css/dark.css index f04f5a4..c6306f0 100644 --- a/src/assets/css/dark.css +++ b/src/assets/css/dark.css @@ -50,7 +50,9 @@ color: rgb(255 255 255); } .dark .settings-tab label[name="tabName"] img{ - filter: brightness(0) saturate(100%) invert(70%) sepia(5%) saturate(3889%) hue-rotate(191deg) brightness(95%) contrast(81%) + background-color: grey; + border-radius: 10px; + padding: 5px; } .dark .settings-tab label[name="tabName"]{ background-color: #303030 !important; diff --git a/src/manifest.json b/src/manifest.json index 491af50..ab16f3e 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "short_name": "Web Tracker", - "version": "2.1.6", + "version": "2.1.7", "description": "__MSG_extDescription__", "options_page": "src/dashboard.html", "default_locale": "en", From 21503529e58b983781738bc58ff6185fca87b615 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 22 Oct 2024 18:18:24 +0300 Subject: [PATCH 78/92] Change color for dark mode --- src/assets/css/dark.css | 11 ++++++++++- src/assets/css/general.css | 4 ++-- src/components/Dashboad.vue | 2 +- src/components/MyApps.vue | 1 + src/components/TimeIntervalChart.vue | 18 ++++++++++++++---- src/manifest.json | 2 +- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/assets/css/dark.css b/src/assets/css/dark.css index c6306f0..b976124 100644 --- a/src/assets/css/dark.css +++ b/src/assets/css/dark.css @@ -46,6 +46,9 @@ .dark .expander.total { background-color: #6f6f6f !important; } +.dark .url-list{ + border: 1px solid #494949 !important; +} .dark .header span{ color: rgb(255 255 255); } @@ -62,8 +65,14 @@ background-color: #303030 !important; border-left: 1px solid #494949 !important; } +.dark .app-block{ + background-color: #919191 !important; +} .dark .app-block .title{ - color: black; + color: rgb(255, 255, 255); +} +.dark .app-block .description{ + color: white !important; } .dark .settings-tab label[name="tabName"]:hover, .dark [type='radio']:checked ~ label{ background-color: #666666 !important; diff --git a/src/assets/css/general.css b/src/assets/css/general.css index 3ba9144..4f086a7 100644 --- a/src/assets/css/general.css +++ b/src/assets/css/general.css @@ -75,7 +75,7 @@ select { width: 100%; } input[type='button'] { - background: #428bff; + background: #5377af; color: #fff; border-radius: 7px; height: 36px; @@ -91,7 +91,7 @@ input[type='button'] { } input[type='button']:hover { - background: #5c9dfe; + background: #314158; text-decoration: none; } diff --git a/src/components/Dashboad.vue b/src/components/Dashboad.vue index cf6503c..b386e74 100644 --- a/src/components/Dashboad.vue +++ b/src/components/Dashboad.vue @@ -87,7 +87,7 @@ function openChart(type: TypeOfChart) { } .chart-btn.active { - background-color: #428bff !important; + background-color: #5377af !important; color: white; } diff --git a/src/components/MyApps.vue b/src/components/MyApps.vue index 3472da6..28da6ea 100644 --- a/src/components/MyApps.vue +++ b/src/components/MyApps.vue @@ -70,6 +70,7 @@ function openAppLink(app: App) { .description { margin-top: 10px; font-size: 14px; + color: black; } img { margin: auto; diff --git a/src/components/TimeIntervalChart.vue b/src/components/TimeIntervalChart.vue index 1286b71..f10c3ed 100644 --- a/src/components/TimeIntervalChart.vue +++ b/src/components/TimeIntervalChart.vue @@ -23,7 +23,11 @@ export default { + + + + diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index 6a53569..27362cb 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -153,6 +153,25 @@
+
+ + + +
+
+ +
+
+
+ @@ -174,6 +193,7 @@ import { getEnumValueTab } from '../utils/extension-tabs'; import { applyDarkMode } from '../utils/dark-mode'; import { injectStorage } from '../storage/inject-storage'; import { StorageParams, DARK_MODE_DEFAULT } from '../storage/storage-params'; +import Donation from '../components/Donation.vue'; const { t } = useI18n(); const extensionPage = useExtensionPage(); @@ -233,7 +253,6 @@ function selectTab(value: SettingsTab) { font-weight: 600; font-size: 15px; } - .header-block .logo { margin: 10px 10px 10px 15px; } @@ -246,4 +265,8 @@ function selectTab(value: SettingsTab) { position: fixed; bottom: 20px; } +.donate { + position: fixed; + bottom: 75px; +} diff --git a/src/utils/extension-tabs.ts b/src/utils/extension-tabs.ts index 29177e1..005b335 100644 --- a/src/utils/extension-tabs.ts +++ b/src/utils/extension-tabs.ts @@ -41,5 +41,7 @@ export function getEnumValueTab(tab: string) { return SettingsTab.Notifications; case 'pomodoro': return SettingsTab.Pomodoro; + case 'donation': + return SettingsTab.Donate; } } From 4def7ee15e34edd6dee67c34be8a84c802ce0b5a Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 18 Jan 2025 20:35:43 +0300 Subject: [PATCH 87/92] Locales --- src/_locales/de/messages.json | 21 +++++++++++++++++++++ src/_locales/en/messages.json | 18 ++++++++++++++++++ src/_locales/es/messages.json | 21 +++++++++++++++++++++ src/_locales/ja/messages.json | 21 +++++++++++++++++++++ src/_locales/ru/messages.json | 21 +++++++++++++++++++++ src/_locales/zh_CN/messages.json | 21 +++++++++++++++++++++ 6 files changed, 123 insertions(+) diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 4d99e0c..c9f366d 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -406,5 +406,26 @@ }, "try": { "message": "Testen Sie" + }, + "donate":{ + "message": "Spende" + }, + "enjoy":{ + "message": "Haben Sie Spaß an Web Activity Time Tracker?" + }, + "canDonate":{ + "message": "Web Activity Time Tracker ist eine kostenlose Erweiterung. Sie können mich für die weitere Entwicklung mit Kryptowährung unterstützen." + }, + "thanks":{ + "message": "Vielen Dank dafür! 🙏" + }, + "coin":{ + "message": "Münze" + }, + "chain":{ + "message": "Kette" + }, + "address":{ + "message": "Adresse" } } \ No newline at end of file diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 976957d..216b4c1 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -409,5 +409,23 @@ }, "donate": { "message": "Donate" + }, + "enjoy":{ + "message": "Do you enjoy Web Activity Time Tracker?" + }, + "canDonate":{ + "message": "Web Activity Time Tracker is free extension. You can support me for the further development with cryptocurrency." + }, + "thanks":{ + "message": "Thank you! 🙏" + }, + "coin":{ + "message": "Coin" + }, + "chain":{ + "message": "Chain" + }, + "address":{ + "message": "Address" } } diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index e7fe7c5..c607eb2 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -406,5 +406,26 @@ }, "try": { "message": "Pruebe" + }, + "donate":{ + "message": "Donación" + }, + "enjoy":{ + "message": "¿Te gusta Web Activity Time Tracker?" + }, + "canDonate":{ + "message": "Web Activity Time Tracker es una extensión gratuita. Usted me puede apoyar para el desarrollo futuro con cryptocurrency." + }, + "thanks":{ + "message": "Muchas gracias! 🙏" + }, + "coin":{ + "message": "Moneda" + }, + "chain":{ + "message": "Cadena" + }, + "address":{ + "message": "Dirección" } } diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 813a064..86f408f 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -406,5 +406,26 @@ }, "try": { "message": "トライ" + }, + "donate": { + "message": "寄付する" + }, + "enjoy":{ + "message": "Web Activity Time Trackerを楽しんでいますか?" + }, + "canDonate":{ + "message": "Web Activity Time Trackerは無料の拡張機能です。さらなる開発のために、暗号通貨でご支援ください。" + }, + "thanks":{ + "message": "ありがとうございます! 🙏" + }, + "coin":{ + "message": "コイン" + }, + "chain":{ + "message": "チェーン" + }, + "address":{ + "message": "アドレス" } } diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index 432def6..29768c3 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -407,5 +407,26 @@ }, "try": { "message": "Попробовать" + }, + "donate":{ + "message": "Donate" + }, + "enjoy":{ + "message": "Нравится ли вам Web Activity Time Tracker?" + }, + "canDonate":{ + "message": "Web Activity Time Tracker - это бесплатное расширение. Вы можете поддержать меня для дальнейшего развития с помощью криптовалюты." + }, + "thanks":{ + "message": "Спасибо! 🙏" + }, + "coin":{ + "message": "Монета" + }, + "chain":{ + "message": "Цепочка" + }, + "address":{ + "message": "Адрес" } } diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index f8135f2..673e348 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -406,5 +406,26 @@ }, "try": { "message": "试用" + }, + "donate":{ + "message": "捐赠" + }, + "enjoy":{ + "message": "您喜欢 Web Activity Time Tracker 吗" + }, + "canDonate":{ + "message": "Web Activity Time Tracker 是永久免费的扩展。您可以使用加密货币支持我进一步开发。" + }, + "thanks":{ + "message": "谢谢! 🙏" + }, + "coin":{ + "message": "币" + }, + "chain":{ + "message": "链" + }, + "address":{ + "message": "币链地址" } } From 20793845555665249698bfc44c9ffe19afe9d43a Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 18 Jan 2025 20:39:35 +0300 Subject: [PATCH 88/92] Bump version to 2.2.1 --- src/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/manifest.json b/src/manifest.json index 59c5bd5..f60fa0a 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "short_name": "Web Tracker", - "version": "2.2.0", + "version": "2.2.1", "description": "__MSG_extDescription__", "options_page": "src/dashboard.html", "default_locale": "en", From 78d1b303980c0432a3cb1f6f83d6d55e20e5dc5a Mon Sep 17 00:00:00 2001 From: Piyush Duggal <63952890+PiyushDuggal-source@users.noreply.github.com> Date: Thu, 6 Feb 2025 13:17:48 -0800 Subject: [PATCH 89/92] change block page url open from new tab to current (#151) --- src/pages/Block.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Block.vue b/src/pages/Block.vue index e0d3779..4355405 100644 --- a/src/pages/Block.vue +++ b/src/pages/Block.vue @@ -81,7 +81,7 @@ async function deferring() { haveToShowDeffering.value ) { await defering(webSite.value, 5); - if (sourceUrl.value != '') window.open(sourceUrl.value); + if (sourceUrl.value != '') window.location.replace(sourceUrl.value); } } From e0e62465e9274d4dd34169e62d1acfba30f02114 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 7 Feb 2025 00:21:54 +0300 Subject: [PATCH 90/92] Remove donate button from popup --- src/manifest.json | 2 +- src/pages/Popup.vue | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/manifest.json b/src/manifest.json index f60fa0a..64b8888 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "short_name": "Web Tracker", - "version": "2.2.1", + "version": "2.2.2", "description": "__MSG_extDescription__", "options_page": "src/dashboard.html", "default_locale": "en", diff --git a/src/pages/Popup.vue b/src/pages/Popup.vue index d5eef5c..51d8460 100644 --- a/src/pages/Popup.vue +++ b/src/pages/Popup.vue @@ -33,10 +33,6 @@ >{{ t('settings.message') }}
- {{ t('donate.message') - }}
From 5b534dbc09674b9d0387e290bfaf3d0f20b36a95 Mon Sep 17 00:00:00 2001 From: Alex Khrisanfov Date: Tue, 25 Mar 2025 22:26:18 +0300 Subject: [PATCH 91/92] Update README.md (#157) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index acf1470..8e3500a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Web Activity Time Tracker Add to Chrome +⚠️⚠️⚠️ **Important notice! The Chrome extension has been sold. So I am not responsible for any changes to the functionality of the extension.** ⚠️⚠️⚠️ + [![Chrome Web Store](https://img.shields.io/chrome-web-store/d/hhfnghjdeddcfegfekjeihfmbjenlomm.svg?&label=Chrome%20users&ogo=google-chrome&logoColor=white)](https://chrome.google.com/webstore/detail/web-activity-time-tracker/hhfnghjdeddcfegfekjeihfmbjenlomm) [![Chrome Web Store](https://img.shields.io/chrome-web-store/rating/hhfnghjdeddcfegfekjeihfmbjenlomm?&logoColor=white;label=Rating)](https://chrome.google.com/webstore/detail/web-activity-time-tracker/hhfnghjdeddcfegfekjeihfmbjenlomm) [![Chrome Web Store](https://img.shields.io/chrome-web-store/v/hhfnghjdeddcfegfekjeihfmbjenlomm.svg?&logo=google-chrome&logoColor=white)](https://chrome.google.com/webstore/detail/web-activity-time-tracker/hhfnghjdeddcfegfekjeihfmbjenlomm) From 5154b83f4143885270072d73abd50a3758396400 Mon Sep 17 00:00:00 2001 From: Alex Khrisanfov Date: Thu, 29 May 2025 14:34:30 +0300 Subject: [PATCH 92/92] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8e3500a..2304c08 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ ⚠️⚠️⚠️ **Important notice! The Chrome extension has been sold. So I am not responsible for any changes to the functionality of the extension.** ⚠️⚠️⚠️ +**The new version is available on the Chrome Store https://chromewebstore.google.com/detail/timespy-block-websites-po/ggomgkmpcnmfhgmpfaphkbmnokllflom** + [![Chrome Web Store](https://img.shields.io/chrome-web-store/d/hhfnghjdeddcfegfekjeihfmbjenlomm.svg?&label=Chrome%20users&ogo=google-chrome&logoColor=white)](https://chrome.google.com/webstore/detail/web-activity-time-tracker/hhfnghjdeddcfegfekjeihfmbjenlomm) [![Chrome Web Store](https://img.shields.io/chrome-web-store/rating/hhfnghjdeddcfegfekjeihfmbjenlomm?&logoColor=white;label=Rating)](https://chrome.google.com/webstore/detail/web-activity-time-tracker/hhfnghjdeddcfegfekjeihfmbjenlomm) [![Chrome Web Store](https://img.shields.io/chrome-web-store/v/hhfnghjdeddcfegfekjeihfmbjenlomm.svg?&logo=google-chrome&logoColor=white)](https://chrome.google.com/webstore/detail/web-activity-time-tracker/hhfnghjdeddcfegfekjeihfmbjenlomm)

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 literal 0 HcmV?d00001 diff --git a/src/assets/trackerjam-promo.jpg b/src/assets/trackerjam-promo.jpg deleted file mode 100644 index dd5f409d4b16635b6d67884f2d2f8f363b322db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58602 zcmbTd1y~)=@+de5hu{|6Ap{8SPJ%lL?j8v4E+G)yf&>Y0aCZ*@0>Rw^!Gk*lck<@& zyZ3+Z?t9;UyIXyxyQh1mx~8hSs(Sj&-(P=!1K9G?a?$_<0ss&&0e|O#R{%01A`&73 zG7=IJ3NkXv6Wk|H(9oU`Vqs(8k`R)T5EBv;kx?!ILKhEab%GEdQV3Zzq6*0(XUQ0S}=8;BX-DIFP?x04a=A zcnFN%e***#0TCVv8SEqm+hOqU9r0-jKdC&QW$fyV+?MUstx6=2gp03!W&^w zbKX_b8K#&g*V<^}y4r_e`n|-sl%~{Rbp^W59CG=l79-kf`#)SV-4FFJubt1~cM9%^Rc>z0p z1mr9zJ=MSJ{}d?NU;m!x1F|DsYIDh{xKJo`ts|56Vs*aa|nRWL-V3W$$*9_32~-;-jx6O~fdAMR|*X{wkK_1`Iv z_-1cmF@DteQKuzTA>x6cpkEWh&<8%|Fq|;LK=fGeZ5Ko6NS$E z8uvxOQL&b1y^6TMSq`*x1=`f?Gn6M#PdQJ`bza1Y6Mo{jg@MoLHHu{$rukwH1+pyu0VCl8v7$!iv^{8lKfX~Q~R0eJxcoCdl|e{?uTnKqin3i&HKyuC+!?JmMf=}Dj(neuzH9L zx+84gA*Kk(^p6qc3ctae?Owl+;=H>&V|l{{GFY-ZKl-c)Wa zXRoB8_`BV(3NS~`QL=U3;}So(+^{mlcHS%RoP2AaY!?yo4sa;*RSBry^?kNvrZW0) z9e;foy7L#vO!r>)3P1fKHh!lPap2CYGAt&4eDSE8kCrh|n-M?(jX$9(XoH|IYaM|C zdXu1hna?Hl6u-`T(+ZE=_-d;~;71VktTiw5X_K)a+0I11D5q~R}lS!a;;Y?HEZ80l=4I2e(5e{&mN zlj1WJ-23+D`gE7%>&`@qb^2z>0gn?OYaxfwh>B{3Vd@#C=eF=!O!&I@H>dLO?~|g{ z!`s1I8Bdd|zfD}KyyeQPTP?Kw;}_GSFgEKXgq*j98QJ@N(Pd@a=1*+CjkEIYhG@#U z&FM(Tx_7-WX2PiIvSUkj*SX-Z5tmo)ww;n)5=gTGBNYHsG-weEVh|Jx7YVbsglM1{ z1dS_nYG&~?hQUAyFJs1&LYF)`Y5R|l@0!A-nf~$YuW{k~`$mlR%o_^owT+20Zh>~G zBA3PncTD6$75zg;p9PnU+5?Ow_vPZ#TXH}3lMI}}nS&h?FNdp)L*#%2BeAJ%Z?b2q zwmTQDn6`T^u~?Xe;W4qgY4f_*&m6XHZ_L+yHeL8m=eS#R(+j)rSu2gN?e=z^ecE(o zKDTEXZ)~(HyX(yn@UlgD_xH#{*D5+2shP#V2j(#~`CL8ju_nK>MhkvszV4#kO zh5`YAyc*E=pata=!7-ts!GaY;xO@OEKM?fkp!b0c?*Nf3ELDivRA3kA*I;sm!~Kp1 zP+`k!vjAlN-%rlLrbh<|^FC;xoDo=H4yPyrU_y_#kT8aYEdbmYiy9YM&y>n3`*Td1|1wl+L;ae=D zguM(S)_{>LyRFk-&nAzB>t^<_vQ+Hb2lq3MRI(;3i+p?DPOf!tX313dZe?lt`!r-$ z$gtnoKB##4R3`sY$@XnSp0+p@Q-sj~bB%$xf%rfmsyXQO#8qJ$iVr$f7LZ^@0vz$G zN6I0ppet1c1Ps(pn=gBZUB8-zZ=7L&WBt9l?;6UNM=AE%)1_YML+HjCZG5Pe^PSJD z(D6C4R;=7-Y^-r>+xMJ>&nmIfmiI7`X4G8_sC)k0z=6fk4v5YVxL)>O;Mev;X4!D% z6@11f8Vwf=YF>U2S|A}9Rsr<5Wse*O`3cU}NAYNb;T4=lA^@sp5hEDjz(O4;6ateR z$a?UH76{4+Ew+DxE2!v*3~F@*t;mti@K z5j6jm<&sLX1gE0w{8u7QKr%y2M%6$J1S6M!019A(!JarADAUI_P{zd==1;KYcl2^5Dy-~!>a5nwX|jAfgA%A{%wYN6PGpb8uGuUH{GPz?5}#~aVDpn-2BKAq|IpD=P>7)$9QW{#WN58 zm>JqeTlUS^Vz__*?+gq1D|kW2p)gz3u@4sM-utkk8~~wO9Ksk03Lg$1d=xzVciP~T zLzD-q@gWM>$wY(UAe}cLom*?qUfA4hY|MzJFWflPwT>DC0Lj$?-Xy*erHW|y@WKVr z+l^Jb_c7W;K3?9L-t#0i-YQr&mLtj6TU%MF)lPjwNSO?$Z-$mVZ^6g>AAnb#cm5-I zD3d+uB%)j;{ILc>8$bh(M5#D6d?^45Fe0b%FyRIQOsa^9pw>cIIXDJ!73gQrPtHF- z8F3(I@tR%pIlyUE2T?}*Vl=Js%vl-5|y!9GC3+0%xpYU>> z4xIxtydcK^0t_UN%FwStfyjx2@=1t@0JwgA&rw5H z!|UhUYFRxPpC#HV!z}vcs}g$j7~$Jjr1jAM{2bimJOKsdv{kgaGR z6AIbF(}BXVsLAHA1m`dY0>JA)03ZJQJBX?(98i}+h?e$Zp1 zbeV?T0s!dFUA<(%TZcOonJI762X?&9?lOMNZvlvjz2Wn#{9e|FHb#_MHVWZFeiWtJtGRCGyn_M1pdj!jnb z$%y$broGP^jFT9)d`Ni{?{}w z%+7$&%c7Wq{tH7z#nn-0<`p0KUSi4FR6ixElFKAIlkg%vHuU32{mEHVMjPY;oZ+=Q zaPQY^b$}v703inqOF+*JvXJK^h^#6RE|3MEW&naB2eTWup0}1OTL+s>7S3FcBY~Nx zip17lY_@nZ9$9vbfT>xGcFK*{O*-J^{o6v{Qs{+}>rVVcU?LS1JC8{fnX+=&`E>2l zEz_>;V^;d)*sF4RUm2f4=%2e$!^3BMdX?+^SxTcqqD|(Ps!*>%o^(bOm=%|&2?O7l zXo8I6k%oe=VVGF(pD@C8ykvpH)s|JLJy<(PLj%AW?PaAib$sn-|Lf++DAxJ(K6m4m zcyH`ouU|vkcNoE_CiJ116P4$d`ly zBxa5PK2(a@0xmEcfCe!Ln7&k~f8-)hbaI7s@6bJEzw_DEsG>K=FTc0B{T*BPF@>0v z9Eqpb%N~=pT}z_@`JUJJV&Qc&pn{@S)?x(M#G}xM#%7p#4rRv{5Ea%mW}&xAvwVc5 z7KYp~!x^j#^V_Cyhl`H_k`D18c6C7j7G(D0!!4uB5zvEc6c4T~&kI;7y# zAetyR9D@X(`rTW<`PEAJerxzxphr8pE;_ogWI%dg{_Do!%bwGP{q?oe?ULJZ$NXED zjG48WHX+YI5EmSrmyhgps-goy0kKFuhxxSmni%lHu497X_xx(UdGqCgq(QN^)qW)aL-bXcM*9Vl(LpMu^` zbF4SvSLo2&`q0qv7#E|}v$TgyBbW3aGi>F)qUq^pp2wal);|g}HB&*_AdG?2wu;NB z2T_eI1+|3J{}94OT~Uz&8sr9$h{x!1l2id-N)mRWOP_6#Bo0yn22GDSsCC>5&5Xcv zMmUx_Yy!zZmIeu;K|%#uoB7^(K}5*PAy2D_82>sYw0alu4g{kfpIlO5f?25`8p!4rAU>TlW5$_z>@}JD$-+f=*9~%uC%9RT0 z%ahw=>W>Rc``*4cR)sL;RjK03BS0aD09+Bc3V6bZ2*5~YqyotY0V!pnCJYfkq{l`C zUItg=b}HtqaRw*hNNPyYsR0OJsDLB+PsW%J)|dvFehs{yeK#u(`XMTaIEaM6A`Va` z1Or|~(5VB7kk>3=0RkK-+)0u^L^LTN=u_YmCICSrWhg$X&ooCdDU!x?0K^taZ`zkq z11hE(Az0{|S)1m(cnpK>a6W0*B^SR81S4rgns5tMP!8fKQ1F!msH3W?;7fXX1RZgj zu>8cwp#UBvD1bqq5cn2QaE9;s#csRI!M|b>#po z5j5Wcnm_$vK?d&?6o(5 zVNwL<_<7-ys)WFE00kcvUqVhcQ7VuMRRdq@y(AQe5sHRZ6DVKA2p7xK9Zmghy+bs}8xWB;qELo)djmFUOPQ5;3 zs2O97Gdh+RQV8jnpPLoZ1y#jpJcfgP9hb!E={MB(%IKInlDcxzs6=#enH#vJa3(xuL7% zvB9by_R7NvXhw^KTPtzp*U>Al9K*0zwr9+W+6ph(M|uLd(!Zk}l@KmhaLlv4YY0N2 z>P;{U9@Geqq5ph?y7ZiS29@}BJUoh>F{Nv<4kwz9Q@0}06k?_uCBV)$sUy0=uz@SP zm25Ea`*Rq5+|4%vDIVofAFo+9#!kGpCVsS8g-bDLZ^K z`Nn~FZRBxuu~rX3>OED8U3dnso{%)B%>*c|+xz`;`3p>TwpHtP+Ypp#{=X`Q>LO#$ zNN0}lKG$D_g+@5Fq6mI9pz}4Be1#OZnOg6&&h{6m-T(Hf^0QoWKVhImLXX5^T@RJr zO6@{4xt$hNUGF%z@5tUZPQfki4Lowy5dnD&mFIJwxH}_6hQMBQk?zWh?c7hZA``Al zrgcClyG!m=6-!t$>W0?OiwL?e6TH?FIvSOP|lMs*Y_`X>0uLnQ)?%2WhN{ENUTs)qR1EJ*&B01&;p*Max zpm~Z~HCy+G;$$d>Xt~7LGM0|B^K}%w|CG2{w!zA%(@@{U5)%sR(56y+aEkFNY?6s)P#%+rQYEgT{ke6`yOtW?L8w|FgE+zx!7%yV zY(;-{bdl*EiFxe+ofu2!x7=<~m|t$-)2_CcDVMC8HK(Y@5_Qftr4i~j7fx)_8Qa-WA22%i zq98usM&^#vvdq2u&t@ov_yO9U+u?ahiyYcdLhK56&r`GgsoqR-vb7l8V?Egh8O~W} zpE-`+L}JtO(vx2ldM%dM`fIW07>n_=)t^gEU%ixrl^KM$=E8IEZ05|nb=+pjm0>eQGW%Z{mx2q;}`x&>!?xD&% z={fhjBGRE=rvsC_)Kw>_ky@ty=^CzNQN#9Fw^u!qq>y5-VvY8T;Y{gQQQUK$D=4oB z`AdFm@y!r4Uh$@keQ>PpNh8lpmXV${MRh6HaAjEahHbvqA2_W>@eX z5izr&a?sezPT!IjojfD#tYJSr;bZA!e1nZQldb>YwUq75^jLek!QpFC4qo42g~c3^ zuPmc$K78v9Sc2u{*XoZ`g7S+Rx(=>CWi&o|EU&}!mhT}njikOMA?Fj{Ci3s85=f<* z`>L6C*9$!Pp1m4Qb!~pgu-R1v<}ZS_HuQMbZx4+I4Tf77i^8?Ec#>0w)qgE!p2*i% z2x7UoOc7=dx%e(j~A=}%oWR6_(rU~0dLOWpslhJ2Z!|W`vrn3Qzdjcn3( zl{!GVPp~_J$oSA)xBhTxMpIL&EK*0arrbhzpgzflXJnO zc2Pk(3D-wW;*czSx@G}NE1NlxA0kE4{4umdYf91NL(FI$@%g3%k@~h4^c3cv12j=X zzQ2B0DRb4(A}Q$UQ=@)HiDmBVsNyn{bt4fstHXUokHvyhTod@Gqlr_(^v}3>Nmz`n zi`-R88v{qkGZI&0kxH|V0>|?5)l&UK%b!1C&vAyVPe4WvDn^1_4HTW;1R@V*~@gX#NItCpx3@sfkd`hkK)q$2_w3M;r#mRo{t1m zv{&k%g=-l&)!&b2b~V!^thrBf$Jk16O4XN7MN@{?P`n;&$S4{tNEa3DWoAu2=Q82M zStiQ2j~00SVpEhh{^{KoF3tYXy5wwK7=E;s^VdmtEoM6I-Utopyv9^>kB$x_OG2Tf=YQ8dl3ALzC5heR|0ONfJ+ zv>rdwyj^Rw^?{-T#@ly}nnsM#=k8fdr7hUuu99Rl)NZYM$A&WH~X~ zx^(@4_nR-%wE8hp&NMv3-dei7Bt3CaF8Lz;PA@t1OQNNlD`odxog@;vUrky14Kq_T zP0IE%RiL`?-Q{h6`?PL;r6;N<+dIuY!EqLB+N?nm?PH{b_en3aCx?mYH4~GWthB(u z`a7NjZ-E0-+IY1Q8yvD271vQEuY`l&=D0iM1!ln<3pDR13plyZV~h{$$yl#L%SoCi8%syAuZag}QL&=gNTU}#RCA>Q+s0v2H)?nCn`k+~JK*W+kRXs~`oDrHu&V4AllS;h# z2GjLBA#ojjkoj*p_(7@_p=V`YGU>{(G~DsM0{Ol0-Hd@ghXkxkYopB)zF(7`YGdk! z>#^b}o;0jcIY7P#q4x8Vc?42@_zO@IuJX!|cA<_hxyz%^jw_KLWjMmGcO(&&c&TlU zMrF|VFvl|D74{_H$L3(#_9Qcv6$g6l{zjJjK*bo#H2kSzOIw78U1l9Yx2)9xJ&YYtQHxV5);^R|j??2FKL9L*>jrO8t{uPW#?k^vfX( zPnx~Gr(Z}($uRr{G=88D=XJdCC~++t&Qmw|MbD<9@rj$EYERpBEt>Qg<>xWV6dwD* zBZl!~m!xWn7|k_V;pcd0XZ&9@%V;dL^Co@|6=iwT*f_UhsddEy=ZTPROH8H&xlbZ+$JR z8UCD9JihE`$MUSK9?CREs2ObQ9$1Xj^^OPc#-LTKFm<9;$XS8PVKrYBiz@a|*&3d< zV8G0?pK)qOcal_&)xZh2wl|)7G(UmG^|>=jJzXJbQ@Bp27iItsM>zyV`gLF8q?2=z zGaY|)!gK7`bl(!SniB;$4LAE!lDg%)u&9X-8(b^GFONnQM?-(z_~iMM@GnT$IY@9n zvq|JEm6x`_nf@4KBlIP@YR*IkJqQRkjOhEW$-A4PO zwRtWwwZ5dg?2U5?kI)NR%BJX^l;Wg(($DH%ak(1GR-l<_t-Q-AtO{Kz}^Pl7*W$O6V@vj|!l2ey+S=7HFQ#+a@iufq6w7a%B zN{ut%T6W@sAzOU)T)sSNhAUhLm*kM?C9OH7Tut5v*@x0gHX~!KAM#==U`{Nzh> zH=O2Q93qwb04wgq84*hNN<`S7(l7B#>0v(|yLc!z-Ik;U{sI=ef2tDWr3&I-hW!e( zEgh`3uNLQYV!II^>$;@e8)kLST`qhV1JJRA zU6dSYNat#hC2pR+}Q+6;ELi*`T(Ug>o{o6<<)Iu4ng)FnZX8fzock>~kU7foiM!3WM7Nb5E z+`pP&YFBJFoT1{(XGfFz9jV~JLx-F1C{=+{PlSnksGK0XDM(DQ)^`&|N!!rs7bu27 zR%sfe%i=yllA}mc{VCo@6IAx$ByFB{rL{KPd^E zaNx%4&3DyF@dn%3(b{NQdmb^^2EBQ^bm#m;G=oi|EULe2qUpL;R%vuNKJ^l-yQ$1& zs%-Saur>PCG^=C$39(}DGsg_p=OakMlCee6XWU{*vxaToDMOE69Xs%5lC^c)@K~1p zOsmy=H>|*~jt&jp8W^OsUkG7Z&<>t?O4u<@&kXeG<5&UkLhe<&q{vC)wfK>cN&Qxhza@kLMzGx5Eo$E<*(qSMmo(*+BA z0pbt3)AzkFUL0BsboGiR}uBaiz{UcO%{DnTftYq6*7e_y({}x z(-G63rgb&CophC5JGN*^qU>Zzur+RrIf~jQ3SUkEyMRvmbQ zj*a|?7Fmu?L0`2rjF8pYe&|lOQa7e#@{l$@x0|o~Cac=pe`)Xy#opv1?Vn3T!Z&P8 z-2+7njF#&)2;mIUHEc{Hb5cd9;r`t=lNEOymC9SN3y-u2$W!XS{QS~%+NnJq-!#Kr zU|M&CxuNLMWg|^)GTl_F?YUb^alMey?~!A&2y?I$D{t_9I0b9U#kg$vcpMI;f0v|8 z$=<}2m6t_J(tU{+v&5+y+=Q%Jv`0NDxK>!W&Q zwy8n7-`fF7#Qdf&7EYAP`<(rkG!1lp>9Y9{q}T9E8z}^s>sXw}eqxc;Y2fuTe0FSf zPUnfWvi^xZOnheJF`Ez`u6Ibt5*OqpoWHJPk^Jx9$v1vNy&50%&rc|xOHGB_?m9Hh zHVFHOT?`%nj6O58lGl)Q9Q+yIHGywI??l^ZuGia8+}-o7cMKpW9L*=bBx2Mc^#PjC>~IlVvvW*Znjay_p)(?L0X-y191ZhRkwH~@e8RF7{41f8e))*P!c6`=rL?1FFw7k!xOAd zpdH5(dp++c%@Jir)WebKlpq#mn_v|?=RNxuh`loFPxfbI=Jmec^R<4w;9uD_nMGyR zy;_>yg#*WWfcdW5KiQ-;`5bite4cDMgeH+<@qx8 zqMg{m)F>|>vumYOrzerd0jM(wvXG8aW zzlk~hWr7lE1s8;?efQ^Le49+8Tc%lUmZKD+qK*T&f$s-})E zK{ewm+@Jms(DA$q%sGA&*D0wEt(y4PrX-RWxG8zeE0WHLQFtLFBT!z+Su%h(SK&y! zBW2|yw_%V(2eg_AYam36{ss6AFBJHi*?9$CZoewI9GfZ_8T)OvTI`JF&OkL|W&hKNrQFP`DYrTG)0_Q7!%L(( zw@+n}IHZex0$xIw%i~70b3HMQBrgt+TUzZa-b`xS(me5&-hPo8en(HCHm8O~(!qmj<10AWgO+~>Tu7_bKt7&-YxqIA z6!hSS|GCmWWzg~}X)6yk^h@ANMf3DSG%ieHT^9Ub!gNh<{Kz%6$#Oenl~)-I^@gz$ z>P+&jOAUXnZ^`e@((C&Y)Cvv>>nlbcl!;=B{{<3w8k^&z)rf5I#}$`8q!SQgoWRks z5mXA|&(wcb9q5B+HtpyS{-F?p#oHv19LgfhRvr^6 z=(d~PwW8A;C%QyHh4bWBr^8-JVAE7YZ0`lCRsRq6Xiv&%w9&|Oz3IrTN&gndRieRz zPX!U0QT-;U)kB@VQ|sy}9U=Y<0(#0Ax>X6jN#jyvAA-+X24V;Jd5LG&Cwfo3 z$Se5Nvw#z2C@}c9o{tW4>mKk_>pP(i8-p`t+(t5KIkn-6k ztrEFGW-adT`h41Hw-iEST#!h}?e>hAJI&~LUDGxQX%fF#H*n#{L>=*17pkcZ2p1gt zy!xuF^=boS%f#z$rvFZxp6TZbHC0R=0UL_BTE~(6aXI{f z{wS0FNjEYcUD9Q`oSx^#e5^T0Z*)PLs!pSQt3O3a`XTKAMb*P!itwqR48|)&jYdJ5 zfOACQeuQR|V}Ve%3xCpy(dWR&b4F;n0+NsE{n5H6>7~+@tz%)nr7dIUsg}g&W`}2S z9IYkELq4x$&JBa)o8C>vt0din|D|4#`}}?uy_RW${;f?~o9cBM&8`QJg5^4 zl>=!xL!ypira;Aqv7ffD!RNJ@#lJS+u2RqDrb{MZx7lghSxh3x^?7Ea8?$luYWGX* zmw*|~ALO1NOU9iJa!MDaa_Xq0^9t-HoIqj<# zTOZ8!9667#Ed+-wJo}vPdxC^n@l)X$j0jg;10@-4?J{cc6O-hLr8?@=5v-srnb{i99iIyx>dEdH!{0q3rny=nIqsicI=J;ALj8jTp zeWi)l8mphED!WR_CPQb|Jb_alRGh%s@J(II68=go%O*boIy8Xy@?B@ai%&rmsqX6P zq_aZ0Kevs#c&z*OS=c!F-w`pDHIL){1^=L({-NpU3lk!N929NLh|LDBx{}3fOpGZ< z`MnTMYn~nNrr_k4Kb z{XULemPtR6mK(o{?Xd5u`I@;tgQZRU7jSw-9BzMM?HMvVuEWCOc=*PP`)l==`Qs~w z26#C#c!?v4^6&}|y#=o4)6&z5f~;`ie`McnbCS=KvsBbaPnF0JeL(p!={Qu(?pgG~ z(rG0j%hY8749h2;FfZBEUkNi>lNaTOmu_exyJ7fv zCe@%<{WMv<^XRiQXJJ`8g3HOA_~T)qGmnolm|F2vZ3amD1xEq!zahI$^yk zALuE*{|gY1XE338mLLUrC7RoayLeI4wiPL7+OwRfv)BnGm7m*>gtso4RTDM9hg$t6 z_^H!k_pPYvFYs)|{H#>QI;UH%Ddv7YdOBkJLtYTy*R}LC%o!=FQhi4C2RS=~R?otl zgMLm(MTPJ{f~QKq@fg36Tx6YfnHZg;aE*kXp>9{axR47+h% zIV!>6;FLLU?JVMf0)iihXxHqHtgJCM?T!941|$vew)f|ky96>!e(JhqVm&>6Bff=$ zIMau0fN4ZvW*o(rREiP)Ba-A)PiD0&YW$ScW_CJlht_7xv6z*Frr*?|4#`9cf24U_ zf8at_okB5e(kFe)T#c{3%ToPQ_4`_BRs^@4t+dv_s>CgoH|R!Msp^>%7R_@qUt zY9Epo_z3Q?c7OM~7m$eo+b{R@z8*aVFL_#6VbQ zHmuUY%Rg_U%LsSN#RWa;H+A%^l71e&xOM(DQ48(q@qXlGd%U*8BHv1lT=+<$)utv* zKsm3H_Q!kU-|nXNx7=^E%0H=5E>RA?O%%yK7NS4=3#{gz_&=Eu({k46x|a56sVa~o zU3XcyaZ3CPEcnZ1jvJ~Ti4E6cEFJOx1uDv8f0=|#^L$O}<&IIU58lP}+eIc9YfstE zy}73eWT@#N%C-rrA>7}}*BaSO!{PeKg9kFt6TXz~2?+&RaU*2u< zF9hhAw!0n$QH-CmXLTG)ndSncI!U&OY+!wdBmIJbu!DfAHYI1-YXf zZN%FzY8mY|Yo9S3qCECjc*6EZjuLA-?INwdGuL8xVhih5-RY~0G#y-wed(S5v%7&% z%J9DcXBw}_C}wHx;hWol%9YKg9I?X_f^&E73d#xmz0C^Y{_foDl;;b1@9&>R&<6KPt`T@r z{M2-y@Y2oNU{PhMEH%Zho^Gmv-X^aNu(t`M##6nEA?-hwHDb_u^SeBtJOHn~pr?(} zfbc`w!rJO5f%JH8ebRm`s;N86-!I`kN!*+lzv&2j34FVdx?S!o%3+sPAR;OMfO08T zmo1iPgHJ1MeZ^266m11X{k2ca7bjLQB42@9camevE^XRbH`P?U8l_ei{Qh_B5!OcS z0L9o<#;41GV>K^X_BPhGk$ktK%GpM4j*6)6Q0oTX3?=VL(3D;?_(*xZ`t}##9pdx( zw)XI~LCkD$&Ne`Ir8Jg_(fl*brFFl>gndN+-0zj?Mo;&qrt=bt_@7FLQmuZn-yah2 z|08>c)~DZDO?K7oi57xu()!kZr!Q`*v`6<4*Et$SwQ0F=^B7n2XWMMW=W*>vghbp= zwxRgQ40Q$|_nMr1#Q5BEn69BuXR;y5ex)7d>FD`o-BGDOSy!yYABz;P90?ke|Mj~R z-DHbm4Vq^jpGb9D7UKHD#b1CgHShszYd-u!-C%3AdU>zX66>m+Zkuu@dtGzo$}B9{ zO6FXzj2C_7Lk*`;@hf;GJNs`}cpO9l$Jm=f8Yz9t=;bqXj!P;rGJ^~n1z|m>Iw-6j z-dXc^4JP+FLA{q*n`$pH@(%z?f~J!wHuLhE@2<&f5Yk23ldoBbv=nw}CS5W=RXV*S z<#eaS)UVjfeQRW2kTG&f^sIT2C78xNq1e??j@`DcnU5)wL|9 zvkRzWYQc*BrOxHGjSd;k*Hr_*E+Y(5`!dFYj*fy317J6>)+8LtPAq=b0H_{K(EV2f1{;nAbdgyh6+qsw>tDU1X^mRnxYbc(R*6eMozU<^mrw zJmsup^9ADms$P#}*m}Lv>__?#)djym;Y+-ty+-BlhxbVWh_IWEwEF(^oHE5L&Sc6u5I*Kp&e%cO&Yqm| zrVXwzb|-pUgj$5%(-48RyB5afA0nDe=^HN++JdC56cJ*Y@kk!aOI6MZPjNq&mqYTV zW*TaNp!pYK-rWZ84i&0t21N5;HuxTUJq$G#a5TKvA=f*58qAR56u?Z7nS65f`p*3o z39^{f^>sI5no(MU(`}yUS2#bTaEQbU6pSgY8nb zksf%+!XGEx&6|G!G0?yxM!&m9j8`Az z?;Y#&@{C*Um3w9lWld?)Q#q#Z>A?pqPy~+q&8t>WDhJJIPUqc8Q=$(d+6p=H;(5y%`wRD#9 zY}LBC^X1_CEiNeq1q^C2fBM>$?Cx&VGy70#zSi`ZG}iH`LZMaAu)n){_uVXWQ#;3W zd+}HGT$!O4Dn3DCPr z7wnfw`*5qmn6&F%T>i$d1DcDidu7Q~zz=Rc@w^ZDycYVP5nkLSYpmK2%Fk-6TzAwY zng0Ohw`;|#2EP4@u)a!9S^W5huc%FnGp6{QA+8{=!R0Q4^P{)-kh4gctt8hsXoIb? z+zSkvvhad?JTjwpjlMIPifXSwe)gfGXPGk!4^b{<7R>s@dv*1Z{mZFP3)lOP-}#vb zel0)z+_?}^e*81IEBLVd`C%N2@~f$xqvKI!lVn@v9ga!gw7va=%zZNX;JQ}~d2LX< z_Zu#Zy}EM_z~2E6aKLMFs&&@Tb|{=?qYD>$DVPv_RC{DfZh@}0l)&{U9cmg(^|>=- zENZvL9>O-`S;4BtaVB}N#z?=o^FoN(^xNSmu5z~Sm+hCIcGX@v@dWIA)ow}{G)i#ndSY)57!-hby7P=VK|c*lNC^I8}42p7?H zv?KgYmCH`5fZoffm285Cj&X4m8l6Kq+9-T365LMAuxkb>R4J_vp&9%%{UF%^$fnH zYdd8^o4&AF{PjC2m6RdgMG3{Zd{^e@t&(=FLFsgcn6K+G2Nby;H;yMA(h`ZIVr2em znR9mWM?TOh3cr5<;$GcYrC(G$c(s6&C0k+TC#CnQhwfw+w)Q!nk&iL*GDl@)=2mMl zCUjy=gYcEm_~7|wVK8W+)(a>cS*D*^_yeG`BN)SL6IUt9HOX~!B9y#0gRNGK$#y?6 zsl2b!cqw7pA^pg$I@alni8JI8+ih@st*7VbGk4czJ%lL?56)<1FvaNRK6g}iFce^4zDzlDY;mufeKJbOFL?MGgkknbes%i`PV&WPR zbFVs|UQQp8uwaQ|s;WgKP4$?&v5F^t_xZG>TgJa>8~4TTU1xA6O(?6Iue$}Fo>07f zgKcTpXU~$)t#-HLN=I&lR?-F2>Rs>l$GEy4o8Kp)yR`k)y5L^)QH0_i^hBLCF;SL) zhY4tWCi}L*d95+pAeeshRsp{nZKU~VwujT4VD`xC-`-ksN%7{KG9E+ge*jJXx;n|b zFFaayVk2?36=9Q`oJkzUVu|)52{5K{7JUj~QzE2AejAdCceS zUmmD&q%^4RUFTO(v%qeXQCpuVw%_w@K&l8R?{#(xbFJ!gLUR2DZA^cGy3)ivsB*7!+BLq} z#q&OW#ws3|GNVox_ntS5I&F;p;(PhSBPmiMP;KU;^Ig-kG!>{%bNbJK0lqI&zz zE-Cs46I@#&rY-8ziJia4hDHtz&A{@M6a*H-9Zad3vrY1IPB|ZDRMg zStsN(zm62wHQ|}{2}pj`^l%;Wo8zz(h(~-bK=^roCSXZRxl7wJysecoG`Xnm>h5ac zQtDc1rZ73)O2o157#*wrDqdN1%}TEyI?9@Q?ZGET#xU}nS!nvD>K#U$<*wbxbi?-^ zuhuBG9EAKNj2=~yK<)Q0ZPCQ0pM{;1msW4ZImfg<{ zS{0Zm7;FJv?aio^@vqzyZ$nK}(Tr}}dn0|Vtu*~>wEXAO)K{3Px6Di8%CqEUdtqC) zuJ)a6ouxDAxXeB}Yrxm&c34i%i`xvtCgxJ_5Fyc@^Gehx_6DInO}^RN+CQUu@?)2A zA?_02^nMyROL=}A{~_rZZ#Kv}-(E{+c`?pAwvW|L)>u5_)MDZGHxQ(Ls?&uH)XG<} zLGhdiHkfg4#|GG!p+8>cKH6hbk>b@=JayJxe?M8~D`(*GrA4+ncbVC>5KbMBn}Tzb!qAx< zz?*$@_?lx}u|+C7m|k5$(RooV7&T&K6U6ymM=sdFYk;0)ZQ=P_Q)q|rY<^XNCEaH# zo6SR|liX3ew&K#$_gW2`TXkikg*tVVt))pl2`hu$bStk17hYeY(^Q<xah7whb$ljT}n} z%#n4e$Do5_rL zWXIXhno>nrbC62!0#$uV_Zbhh;w+W+>XUHh7iynu40IxK)XZedmjk1tqoAEj%)z0~ z?5QfVOY%p@X4XL_Wx<+tmy4|^Inh|?+WgUaXvnek3!ftcR3Zm^rk`~uaAq`h?5F$A z#HID;M8>2zL9GM~d`RAEg=~GVl?a@5SdvWUIKa0%4eIgMYP-!cOmN=DSD0`;jq1Ay zy(~iK0+rcgaq|_gOf3AC_GNj7?+%#MP{J&`&Wo##ctmm`dj%xc&UnflkL3uhiqL(I zVpVuG^hG)2*Npv{qKwc-gbA}P|F9xxDy{+|32Io@o&x?7- zdmcn7?pPiWt6{5*Kk@0e$+O1BV-pK0-0Zw7^$KeEW;)SC^O~dLP|$8PHY*8|7YHgpRwnY##Ea z;`3~{7}XB>+xG+>jT(h6S6G$Gxulu9jtfL6oep)eEH{uX_LR?|Cr%1;2%}DCWE8h>n=8nj-esO;1ZM ze;C+L4HYiNgU*hR)t7%~`K-FC-!ZAHE|)jc2&kjMS$XVZ^Tu);MKvLTU0h!oP#;vb z{ll7))r$4 zU-~Y=Dk**DH?xZTr6Fb-mnG^C)|x!O-Fc<>9s7t)^VdjV^4|<(-cK!hCmS9?66T~A zXk2bwUL9$KQ1nrICAeui%tJ$4#VAXE7(-G}Rm+iUq>#=ZlOaDq5@oRxJ!WPMqf1(t zIV`UZ{GKwd-3IsN`MC5VkERXYlNAaJj6AL!F$g;TZ8TU~XPH&wQervVTlERkiW_S3 z-Keho@qKqMf+Q~)?tiKvNxHV@`r*t&mLE^O=Qs@s)u_h$t(?zt=Gg@aF=opaQOkza z>SmpO)lP?txm>TZt9(A)^*PfdVaxd71uSFAdkIArY=)ouUsh$#VOe>`d1?v+TH=F$&5EgR{X3E1XQxNH+yYD5eAlB?RK>&%7UGoH zj^YJs#`LLPE;vR4+YwaiWhX1uL`9Mo;TraZj!R1QTip+#lClXeKf0Me9iELy6Jm?> z{@Et%{Uj)B{p9`Hai_%Ks-I802|oMmTrAaLo=vz!!Xs95WvaL?mkRcaI@*}me*pej zfb_wHud<~0Lz2cBB8%shX$%tu4Mo9fuj8G|0wYuprTFOm z7aW&A`xOY49{t?iYf2xPFEaah&bk-TRliYSY9vTQE zRV_;gRD!QQ0pim}X{^JY-g?K@e*igS3h$%;9k7dds?nEWqsfUyy|%cza2*%bztKeb z3lFILaFh{tWx41RO1^OmO|BsU%Zqj}XL=!Vq#lzuN9bo0R6EGQk_deiOqBqD99H)wqWiGlpAVzt8yuw^@0q`l!ctb^kDI zHR&02SnBw}XZo~Mvv$ZqO~+)Zz$JFZ^fXv;|5wecB{hTaI!oP)zyiLc1$Pbks$`0@ zFIG~QRV&9Vvs5i6hW)y`1JiQ7-@d;0K2i)-Ze10*yry~e0|!0(X!X&OlaC*Iu>J?1 z&z!JWq@aZfBTvX%vGp_i=Vh~25`$+goF?V3LqqRhnbkgt|DJ5c-mI4A6oFoVwxb(% zv*+w)95D(m>Eo6e&X-jm&twJh-tAs&$Ikd>X`L8%8YvMMJXM|5U6MYKAHHUL{lrqv zRHy2oW`Sv|+Pk$=!m;%ZTOeu4-0^4$i0Nn{`Apd4vfk{nR_yM(90|wez;o`n@p2k% zp={%h$3spglD?UayEFVIb>piuEJ^Rc2g$fI%!I{?VZ}3M$6u^+=f2$`HsN_CfB2ep z{D+XU1RfvjoljqlMXMHLGc^e2g}4I*ax2XO>dmn;R!8>VOnUaaZ{D;JqR$QND35GT z7lU7COCG-7t*{H?w<53`i&2qC~5XFt^Ds<<0RMm=dNKj&a-F5G3VpijxIa zP&gG7Us*KVkRXhf!z{JK#sd zsx?1Y%+#>Pj#h^66KQAru;2v-lNPjGhU#mdlE*R0cpgoY$Q)Z9(*W8n8Zh6`tz_Q# zCy{~i^nLCVh;Rgy!i0($A++xG^Cxol`v|u&d@Q0f9kg|;XQJfiC_PL+%s7sCf&&;u zX+BfUR=haEFjmsLpGW}}VD054|O#!cbx{hlXZPO7GNTYI-YQ{`7t};o}&Ho4Jd#f-U zrthBQ=Y#g}zmfh7;#Y07xp^+Y${r~7?ElpV^bxJVo^1FjWph1oeI*|NLE9xBEz|rU zYsJIGDU@b*tTf!bZ~F~?!r!xoo0Ft9ZQqo&KxP70tMv1{R2?pq=+FA*Oq7_M8YgK0 zNn^i<4?)mtD>$ga*JY96ohHhMYMEPLm~F%3%F}GTd*9XhRNm$=7c=L*r*fVpYG{D} z8mKvGs`&if>>yPM8t_cxqnmW79CJ+fnjHvln9JCpoT@#SkZt-+p-xn18wvj%P{o69 zHC^!^9qY^CtwMA-r9ZRwLdMT%LM~jjSCPHMRE`{d3_gp+fBXlC{R0$gxccmDZ?K-q zB5~f}$)6vw*aF;EJ+U#EkTXxQ_{|@rNY4}|idp(_VkAkp5J=wb=}*Gh>6mEt5{~XvdWnVRL_08RAD)Icfa2iS{HnBKop+1TjWTA zI5#em<{fJTbi*QilG+4gr;&%NjY7DnT+pT*&=&z@_YNY8!513Nu>zRD z3iAmz=lx9}Dg$1k-IYO`J*gn5?h&Ok!~W&j@@3IaNGHl#TpL zK%@$MOqhd~GA1lKfw$$5q87r!heVL-Yb*Hz96G<0MXK;6;YIYDsVk|twKMHRg>I}l z-XAHz28Ckrjv}RE`Eu?#qx@D74GYSNLY}I^Crx3`Ls@GD{B4(U3jl(*p4t$2zwO{A zQ{P~IVPdJOKiC$4lUJ~rR`7MYJt?JiVv~TEAKn$UNwLw;{J8~va?aiYt4W+#v#hV9 zNFEUpsq8XQO2Rf^HqhnFWi)|tX6~uSW@oZR3?9#&wJjo>hkA53I@#Bb~)`BRA*_Efr6^+LvI`_QFe9tK-7>y7|eNK%511%z3A@WTXK zwl9;B7@=fsaS)6V!>7+F>5&akb@D-(3Ue*K(+L0&E1t1q&FT`L=m`Ka?K zo>O$hm_)!1nq@vQX)Pn`|7Jj%LGu=1**~{=TVJ0cdXK4DSzBD5ahVgW&r?z40yQWE zV6YJg-QMqxfM)mr3{8@to~6b1=nqN z)I0?6e7G%{c!V(K7|cqXTsSKaiwC3=UW#;uF|*@NP(0AP7p!gzLdg#^D50zPlA689 z4Jj336B}uRXs&)lVjziJ#6#Sfb~@-%)?78YspthF$2sELq!TaMJMcfeN0FP1T$qvl z0q*E5guu=qoJL5Zkt3SLQyL?U2|h?1JuWKAjznmz6FUzH^U-6;=6WkU@>2lMFUjyR zTA_&kF6N1${8Q$T57JJSe5dwVAd{v6{Q~{EUL&-)hUoO8uiO%t~IzHqb*9N z%9lL0OtS&3Kwoy?)i4;_%d|(uU}8oN`a-h$+35O8kKmws?_g!0(vA3FM*Kx8Z%ufQ zT|U1eo*s(y-A4+T4Lj>>9gM7ABhYK_`gSol>(I&b(UYzz%tFkd6SC)Uo$y5D39)kJ z1QLg}^B6n7dfRNL5HNO0BtK#j>m2Djnikwz8$vG7=N#2dQ}-`5la z8$VYeCoczG(zys*s>wSwiuPiST?F+hs;)JMx=LGxdJ?=FH($(gH+H2f#odEbO**V3 zy+`0&zZy(f9sZd@a;8r?r?Ms`OkcO0@E!gN9Ut7Mr$(0W%tGj^Cr1-HbqBwW1ipG> zh|h0YK^(D0AFHJYeMb%zZqoL7BL4for}%#r=}U4~g^6)N_Ul=FdVO99f)A$<0Q5w{I7Obc zRFoc21d5bH+TqJs10ZkD;!EiwrPn+S2bHL=N?AkXZ6QT2=6K3G+?R11CqZHZpH;p< zZ(+4FD+6q_;rcjsVLrxPw1ENDfGr>ebzed$P7?qRVbs8_zc^qTDRG@Rq!JN?Ymx4F z;gS*kcF@RM8;2kmber^%H`tQS7TgD=q9*~M7*)=~6WwpPhC#*O$iuiXaqo@kP;ii4 zV%*pZWsmD{YgTDExqwCs0?Zl#6hha+&1l8U^Jsi;pd8`F%W75!P2H&h8*f8u|K!bdH7z?Gu6F|-?q^C ze2Q={UEVj+FDbY3jpG0BF7;iJ0IuSp>rwl|9rCEh)x@&brr+#dT0T6ot8bd}ctO#u z|H)}Dz%v$^3oHo-Ak8LRmkBb&%;V-)YbR5umtp%&>+W4LK>#zwSE_JVGG1!&j*!gOeMT5Q6 zYD3J#qpVa`IEDL_M4!`wV>dDNUPT7NoZw|?%Pj&KXTT~I2k8CTXKzu+tO6SW?DIlEmX||A~b$! zql!=Clb!dgBPySK*tx>e51JbaJ=$EFfV5#d%*p31|N#VB$D!$d0PHorYGd`-mr zz{rh|Ay!luK>s80^S3wdFy(o~hlyeZuyZs!A%?7W!tBk&-s@~krzqISJD-Bi1`z&HF`pO*s67PcDTz5q9fiXi7OtVqw zS(T{}gxGd^wAq>kQn&bogf&~XF12%8a@21OA_@f!m_ z$X1yfh~y_75hf`h`?3gTTcKIFR?)o+QswcqDEk9I=AJtb> zfx>P587}_r9zfgM$b2W0ppXoA2Ei_<@2qyA>zA&O6U<(#af)Ajd{dN^C>$wp?c20k^$r$2Qy$B{^(K{zwKN!Nd=Uc*f3mTFLYGq`l>dyn#C|7{5p zN`4@Z{U@fHHI=MO^;T(DaLRhmOM)*2ps5;tUPbECcaIUjq~R-%!l0md5ZFO+{D2@? zw3>rkKGil~p8m5!k+z0B0%#zL^uMZ_RBk=uZye$qBM(}n+#W>B6N} zj@a9`sC?`%De~ZH?@?_FQ`4>_04+jGylM+iRmqBC(pky4O7m=Cm2%3%8BZZdLk3cz z6KjiAU#haKFK%p%nXy$F^2(yP7T`|r4NNZiV|dFTZwe%sGvn}9hrW9nDPp84ABb?e zr|*wo8?lGb@ocpa+22tqr=!<*iA@^5lR^<1Gvs{uMO|!-iYJT1&+6U?X*G^eHf5gm z&#Xt=2iYEYX;38h~(^KNb)ItT%#8G(>f8V-drSO|a+Wqk)#(NbN(6tN9EROHT9 zm*d|ZTabb%SFL^|rgJ3I8i~6bz$p7c1!bC{tsxowInn!vTp7?1WP zXugybcV z_;6r1q+IMT_o5kBuOD}8ZR!{wLNond^8q6sR!7VzI!}e3*6(&ploEU=@gSzJuLERY zyfGz--SA>Q`_KV@vnzlDAyX}S4-emqYc8Zv4?rQ!F#?D_NDA!U$t8^^KH2T3#8P$v z;Tt53k%Vc+tI`yS0KzZ~cSuyrl&s+{_eXLAlRo^|K0jo)nkQHlgb(13MjU3mp^MvA zh9CgT?5x?Tcrkd@vovNzUl&0nNHu@d8DL>YG!8OR##7JYdRZu^w>)d>#6 z5Xbh%LKuet3qh5>fKI9FU%N} zn!6m|8TsH3U~6`WY^Y($xnI3!S0Kh6wZqDVm-BN$mS-b|PA6HaTxR#Vme`T&XC@LJcSB^uq^c z4B;yjDoko@znGpCve#~FO5~=4zLBZ+qczF)0#dlj_9~1)VebGcbpn>hDNzly#`>O- zt0ID^nMK~JB+ba%EOB|(8s!eD{`YO`+GC>^-qu8?wm0^LkIf9((eao>7%UjxXO*mcQU9$+!)1wP;S9W}8;plEi~r3%|lr_Px0>?E6WFSc70)9q;So3~3BsT`8H;5k8gLr>@2#5jEg ze#mBemxlfU5;0`+PL};)-Zd^^h0{;Y9|rtyTbKW98?yibPw@>_mF>&bdmYT|vL*jH zN|Jpa82|SX%%hob_@5)$fywVb*9nK1x6S{3ldNCFCsy^}heGl+=_~5{xi&qVHFze1 z)~{?m!~8I`BvoMkB_~}1td$DCWu`kDkC9MjpBEaGJ(}>aE>!8}YaSsCATy~u)Av$S zP0}6r_Wa9jz7{db5D75Qp8@h9kkhQ{vM};%P6y>*IkrS{Xl-hqJI+04?dwAUxnH7Q z+-YCME@Goev>ox})Bvc-h>_B0A~sGodR2Ek7*QC5D%6}MK_4Ru?XU4gSJbFzM5nB$ z(f_~C})N`zWrK_Y$ozLAcr(zwz&mbaC}m)KunG;2!Uf&3huPcl;|C{is^*d z{n8Mkz}39o$=MlP*55fI%Vy!)g*qy)I@(f@eWSJO2Vd~r*uGL9d;QEB$%u9QxrewL zBxv+)(0N+T%65h>0);`54q5Cu9))2E6WdTzA^MllDj^hXadke_J4P za=~`XNgxpaA|{>lVfE5}HWveVRcVhd-Zpsikp~5in6Z{9@-!!yAxc{Vz(cngC0Wzg*{#xL<7AosXFphaf7LoEePIGPo{e!$;bN4Uo zY$>7o+0<0*6&47@UH*k3dJ86_e(YG$2}0}Bzj4#@{(5?QI9R8= zp0XbaWLn+w=-f{))DwxVKE(^nS9B<3 zO<_2F)welP6L(AfkP~Q)UiCn) z8%qed`m1qSFMa}oTbr87ITm4OH$3pPtKPKhIW+7|m@LYG=JJ-lWO>^kpl8e5PXN1) zh1nq%?i_mk>LE)Dr*Qo{&wKajUfxA-tJ37wT!WQ8d5jE@c)J+ntzrTy6(ix5UPth* zitxx6tcjrFX9}^&b#RA-*ZRu{S*7ip6T_=-i8<84L4w5{T0X} z#KhbA0zJ4=(PH&ep`XJfoSnc_7^qwAccHMe>u}88^PnLs zZ%Yd>k6$LMEx(=KyvEaV3DYcixQ64@b=W71%-eV8%nR8;t7UgZpGeDsc)}m@xr})K z0k|9rX{J7pZO{oM?ZmPHOlD?!^R#SzypGSHDTfQfyA$4@UHSjNxVW41P#T&36_Lhe z1ue;w#KIoqn8;50At}@;z&qClffxJDn+Vt5;cvw`Q#F zX8zF)@$@4ej3lmq3#T9iSkkC-a9d!8_sf{F6}#a#aP{SZ|MycuZ}jQf;KFkn#s1Do zV2RuV)ra&Zh$@ViATAF(J!yim^pQLZ>Frnf4A&ZIVp7ainD#**M$LlLR(F;KSFomJ z?5*3f!oPo+3DD=!?^RkMFpgudn-QcWj9-6#6V5;%t168l&ICpXQ;A9ux~gunXq~B+ zS4pof(}N#IfPP~Rb|Tecl*IeS0o|tF_k&myQlt-vPTJazq^n$>gomX34rH~IxX#A8 zP%OFGI%h6-(WH0VK}nLPRFUe$e1m5<$AjVR`L4`s;@zH@YNg}3 zgPuvooqW_?OE}0hA&=E0FVzEYVmS z2e-jpI9@v!kstb)ken_3MVV~H`)IrU8FK_1B4zs1J|PCj!EQ$){4VDgs(U*hI@}!F z*2Wk((C85rJ^_erALN~x`R*ig(u0g7H62$g@l*SW-m_^7RtGvnVNW|Qt3@f)XzRti z*9NK5{My$@@!=D11>d!=d8^a!O$Dj<3B6n1OY+g+wBiRyW&U8U`2)NrExwQ@A($Vs zR9%6fYvSk=D}}F!PSv+ao>8eftN+CGd+Vt7Juxu#hT%|hK;XBE*r8$Bw|bzS7^mF4 z_Oi^jxO(0YICk1lrMqHCUxDKdj~I`NB4UxI6pBA4x?zbE%+jK>X~6ac?*wF!o&PBcC{&l(5B>bFN>OM}mAF6|?>)m<&l^asFl&Y`>nG8GcVXNwYPdWu!clq7V) zt2Y!iXoA9SB%JBtNK60M4Xm6b^h_c?(DBnLME<;mAc!zHz_zos7iwQU*-AV`?vphR zMPe1aK>kba{3Cp(C(}OY@WKyraE~HN7yrr|-Dh&T&q`~U3wdN>366tX3=vCHpNQ zKa!u%oGmK`t4}%o{1Vlg@FwX6TKO1C z?PY<hgP@1C-15y#J<&8pCFWEvwV4fTZaOx zMzmcEKiQrs3;;a9RbPFGnSw0!Tp?vP0_CH*tk&TLb+c4p6dL3q$Uq3!NB@Y$_KGQf! z=$xW{GnV`2({-81U#YsbPY|PnljSIcW#@Y=>W`F$7wOTt^t7sddFy*kPaC@p?^k@! zw)=}LEDazksVusYQ^?C13MP)*58bV^E*_|S4qRj;sXQmk>ik8|tn_i_#e0XZo~TF_ z%spr^ZxuZU+k~4^VvV{D&+F-@V74(&7Sv$kBytJ|5y3%s$8DvVH-!#A7Nu|kN#S)T zoP%0ec|!8jIWQWeZv5p$&DtOig1gEZ)Bz?R0Uc+&F#THwRWP*LEqUc>VFQOHb9#~! zaa*yDw8Qy3 z)}&NdslW}(Yn{hAsB9!)xpo_jOBnG;N_tQU9cMT~OMH)3TTSruC$jLeM)|(6+Nzf# zgyi9lU?zJ*ard{4PwwW5Wc6{+$E=LAcYG~6R zpkSkXtsipb$;QXWSSIfOKE_J<)r%Dfbh^7#`MI7yUnMO2xhotDNs)|Q$;pmCotA&x zfIJ8jDJ!Cs{YchOS?gUuNpi1^HwP2p3nGgy%;&8}i=v~%N;@nK zW}Sn=g~}Y1(BL3Z+7wkp!qDhcvBWPf9_=w_qGvd%AYjPCmOY5&v#;Vn&m>*YAzz_n zAAX}D=E`$K*^!`61q^(FsmV;FzEH6#^vxtcQ5WOceF~>$)=w^Vdy?Nf@fT>af=m;x zHZXL3BIF$gf;er?U`G10r`&`Y6{9=i$DnpVMMUZQN66`CI1Gz)`iXpY(mb>Re(*5L z7y>Ha^bOZTN$L8|W1ndAR>8hSzi`*{gl1J`%Dl8qeDqt9r`=Gaq72&rb36`qhlsHc zeDrKJb}_L~mu2#TmQ|eaLUVy%e&_CTTAfR!nzWXl#T4mOm6IL9VT9va) zBk`TE6B0#Kp=y-o6%95zYBV3DItK-)*DX?;+VArn=(Mm+d?o@I@+cn|QKE1<2P9bg zF_t(}3`Ea-da1*I-K?wFSo=udui#Z4;(__W!;7m1ciXJ*0S=UQe-_v^O5Z7hfEB~1vtjfNw$8A(a=J~7Z1pCbaa5F_?jNlD#%dvwcKAerk9t=6%E})-{M@Buro_49u>JAW@mF5=n5(PoBXC8KSX6 ze-;98f)GKFLl@hm2ATMh%5u?giU-K>oD5Ry*Q&AK;{~@evz{L83x&>`B%X{Pz=;Pl ztUS0crvU+)#ies`1$pDUZ@N{0Dxf83oW{@2Gp37RIav3#)l^pp-IFh( zibpFDy28o8DVcrw-TdZE@5wvkG7kj)pD%s>jk}+J_8c2`N`{+bFOHl;Lu2`cFUyU0 z#p`da;ooa$ifnrb5C7I-?}fn=R<%FCMhtf0BN5g_6BzirLJ|(Z`>>~foczUl=-HI~ z#gsfY{GWb3G*V>H<`3}qxI`OaqpgQtOeu&X2Z@k_|H7+GgAw(yGj1AZX{=$PuWd?~A{wLbMNrvuA4-$!tKlzI~lFa1n8IjDx za_Rcep5Ig0rJMi358*(*{U6A&XhSdZ12Nb%aIFE~do)qMwur*8L~XFG4SDLU#ZaY|dH!E%d2WX z#*3>nY!3PWh{(mH_FvMC7}J?jZhatDUo&Yz`e0#+kZ=Em{sSQK&sOxGVT)eV_WSr6 zIjAEJNB@0y{2vzvLHI9mHJ{2-Coe^Mxghh8i^{{6Li0{Lu8xc47& z;jjOFd(-f5H9-D(rs$6?ddeW=UvT8xe~5R*vf@-7Pa*L>wi)|B0{1l82u+Xd@wjfh-m5UBPrjSZI(QmVczpK4L9@fgo@+1a6?`aWaSi#_a~(hb4Ks~ zEsgxyxIo+Qhe=Jpm0mRMPn}}_=~0UJ(Ha4R01qk1>xy8wm~`a5*aXq(DC48#d9s*0 zZ~AR~FR_K1ly4aPwM~RC*n6qV7)8FGEP9TEFMff6A%F;C3Cd*zc@lX!$# z{a?w9;F)rUt>6{m-%q9Ij?emkAImr3D*oP;FN8n2LJj}`63e>C27Fp9HL(6@NU3{2 zT*o85O0fhDTnv%6t;dg z!N|F}XZ4|TzXjU#p1l5ooKiUMJ>XPI5W{lSdiTlT5=+3@c(~RfuTh`PBe|w{=ZX)7 zZB<{MUVHDHj0=QwzfJ6IdMv$V=-d1U@H`z2!N9nya6Nuc_`Fm186;8&y?6&xQ4Tj6 zqk+(xT>IUS{+r7NG=L}ndy@3Yq$tr{tDE$H8pX};DFrOMKL0&|ph&g(1FVNCC}8QA zEFd2GjWCIQ3OQV`{s(9n$bB;Y2QX9Pu;CdgJhTavE}9BWdH$Dew2=*wG>?B{Ae&D@ zhmZ#ASQRN)HpjAA!+GCM9kQN8ZqDj69F5E9;I|YiA>S12zezrbj6@EuHU7f3IDxYp z8LUE&Sao@t>3+O*G_lg47U%1mvq8MWwB;j`U$uhbgE|nZ(2MJ)(c|9LOQjp+Ao%TH zS#hx*ayD`E`)1qh7;zT%1Y4S87?$$b)<158)k#IF*Nrdu%X3f=E4#3qZnjS>jP+hZ}eXrbYJ3i&%;BzORK~xJx8hh~7;bRW@LGOO?;-yey|eRv z!Ax4ybcNFqWVpaX1ZiX{R)yMk`O{b&=KWs6`rhBi^$<7?38MGrMK7V=Cn9+NqlRV( z+-unIi9C~gjV<%s)cVDjSgP><0?+L? zL~yS;Ll|#Q{_x6(GHn|CN4{X$=|BDy2di5t>CKhG{@H+HDICSzaC7sb?jPX6n}!H% zBVL#@s(I=rRK}I&&rJcWsSG$Y!t~uaK z6Rf>&Y0={8+S+^J*V!!)WjI!h1&oT{C#Ln$Wh5J9{L3MOj97SVD7St5*t1EuRlYOv zNz1b>824+5X|(z*xaWb|i`ESrcUF0_%9K4V6>}TUd z$meG-<2|jsS3Da5_Ikt`0U=U+$`I;q^!iDbC|rH= z57dByv_L_@ZbVVM>_lY^2HGO0=tf_vJUo+B5nzah#XXx{_2_^?J$MRZbUau%Iwr(! zR~zNsSLf(f5`Y;M0L3P<$4~?V+e@NSh(`bv2Bs(o)G665ci8f4LiG8*qg8~INtgWB zAZQmWU7)VuiTcpV=yP2)*`*3a)^5d%exT0*)7tssF>7}$??%{(H)|jqiL3jn&j3Zx z{Rza4z2lTzq)@J1EskbDeE5D<0H%*N9-8(+Lf|~+e)YchCGN8?v8H)D$rk4-L^USP zcyXYE^X>ps|4G!%n~qC=(o&^%A>(h*spza~kVp2_ zigy&pj}JTK05m_F2F;#HhwLYT4p*bXGJpb6?IV1Iov+7u2Hq4#b`F)bGe@4Mr5j__ zGeEqG{Kl1^CF3GQ)Ciawf5v&AR2|baMezHd`4^T0mDNTC=(nWI{@lGX5_JLwmHqHT z5{LNHPedrC%AQ2u^e5hg#bJlvpti-sx_uBx_`C?wae8Z&tz7As87iyTA9RKRJ`#um z_)cRFqL}MMw-LTm4?o$4aPI@jN0)tL*oJ|fYyp(woCx#EIrpwaGeG{1@c?9e=qLHm zkHI=qF`}SZgvcs-UkvVomh@)r3!wgToh15)ayfbUYqYo`U&D%6jeGzbz9fGDiE=*u zaeC~3425BRJxhy;LvsH#35zLG!rGGM(6%)v3QGZO!TkrFP+0{oJUWtX`746@>qech zM&F=Xz|OdC!z>OCy4i@rJpm7Q!v7T(6ZVE8{!!>dGL91G!2yN<)gQzK30y2qXc==o zjcg9VI1flQV=DRIjfWZ%{|3zoY0Lvi@{sTU3nBv39yu!d@mA6t_)Nb+CH(@EKxcV= zYJ2CAB81h8R8?3~9zi1sQm_YlTZ8RlKuwy zP|W^XmB08y%)T5~MEX8?v+Birfi}{oJpUV%u_jL=bka;^lpCV-^UaBJ00{lpTA+Jt z+{H)V_J5Rt`?VpG&21s*I2sd9J5GX(h z-KaeNF)RXStG)=|71J+OftY>=m@s0T#n7^RIrHaSPb1{e8Vr3)77B0qQSxQTLxaW2Ld1&X1={d^R zg!G<#GHr#ahowY3|2|6j(H37a;hl~VX+0Gqovgl5!>QyYjJoZ!WcS7MQApU_7Qa-^ z)d${vdG?9}QAvEs$}x{l?qE*L3{iga+4ZwIM3 zkFGEp!$@fr4<6z4MoMU5^ghqSlkdaJ3!+w55VC4w3-%&ajcnk?3x_& zvE1GpYn}Ehnu2AePJZ(CN!Wa01vw<_pdH<=b@0ZM9trDT4oq-;M}1_!bh9rSA(wqv zsV*d8ZICf4}gruU@#L44pT{M}qstyC2F6GT#22);077e(s+#n^D; z+PTo@&W#X{pFAc7T=12`R0e_U(B{Y;HYIwAZ@n-nHfA`i9DNbxUo&R7$bP?;t`bZ* z{Adoa9Y~)N-40BB{9dQ-ta};y;V^cYA%##PUF@r7XD8tT?;|QI>iNB>sHiA6zE5+D z>>m{DVbiCgqUwD#Jrlp{DrLaEdJ>hJe2THgk&jOH-uUcAnP1~uwe{7d@%`L!Cf*?X z%^^dT^YcJc(WgTetGjD0aJMv;*|es;Ia&7A7inzf*I=NjciTtbkl9A@?{#ZNrr#`7 zr(-D{uB5`g^i7Dn!wN*(!(G$6$!T2nBw2b%o#*^uXNLPc3OlX*{)@WjKm)J>P7b6eo&y#WHbPWn{BUdPl}F2?#S}?aM9cONYZ#g!4BF}Y7$7$k(EQo}ai*AuASid;gd&^5n$Nb~; z{cGJSfLn~1fN{gOkg1uP~TLrYZ{$~zPrGTiyD1U1Z42;iiKy%mIEa4OU{2LVR zK|Un-dA^P3VG$^P@*9M9_2tI{&TmkvaK@d(JnvHb+uxu>e`=O*n)H^Rnl7RkSwXlb zdA~u&LiH1Xrv2JsseOC3-I}5w14N6o1`67?-9sb(k!^2|ZBuPRy@9zhOFQ%vF+ADN z6%ba7(TkLeJ*rP4m-S|}Vi=q2C(nv|&CUXP=TnDqryHXum=p3r|3LdtX`W~}h?Q^0 zay3Jr={lt*S(ke4jnOGkEG)n!?FzL)d`(gY5 z-6^8bai8vRJ+NC@VzDmsYJ>qig#vW6;|4uav&^_%*Z@cW-k2kkrnu=+YnEb-$_eUM z4q#WXi0J0@u^oB#G0O$0BACyGW@Ah)MiM?lq_F>pkdkXLM<8eSrKooXeYcu z5^U3$2JvEq36E>|s+m)sS?>`V>eF-0LY2z-4G%kzT~E;mbn_e3+2{uz_pvvs0rmvY z{BcH9h*B%9bSL>1s>Q6)O0lsFjHq7|ovssb+ZO*B3P;S+t^Ia@P8KX4So4j--rIl(Z`XZC{PB zp>zBIGIByujL?{i5R^wqr$4qSIr~ohmBKW`K9wcPfXtVqO$w7c<4#<0m2V)uD_%ku zEHZN!gtZ_9ijGRuSlUjd1cIQNEm4l-3BpKjT-_`iS(3u+DBc3B967hiL!!7F@-$H& ztAk$@%CwS5yepw;pbJg|7;tS5bib|p*$3}mJtH_$ zMmp9L5b;>LZ<(+B6(K|??2ZV+C*?qiKRwnOSfK3m2&|2nu%(1pjryIz=2n4}VRF^8 zR1nO5gCv3OTn!Z607N40M=cIhcjfc#Ph9|lk)HbUbUnI1pgiN5)8ij>^Xolp*8qC! zRSU+0+!M-CTl5pt;4fyQ?8oA3mU-UQCT}pyL^gvc;aHBl&i#*ngtzz4;jh$R*Z=uU zTTflmQ<3&%>$K5t`R-)qp5XBLK>=@czeZSE{82EiiXVEh1`q*&+Si=cKKMG6UbBq* zEe~E9H9Orb3Bu<;Do;xA48Rmpen-6VFz~eug_J6`zI6dD2KbT@#QD6uMB|pdl}qY) zO%ry8k~XkW8P|~j2U~@UA24wx5xN(z8x}2xBfmnKX#1&CnO{fWzWrr_Y7Rc(9x;Ok zMZl##-%us73kJR9>j>CrNR>fbQamA)DferXpH7dSmN$sFx;hoyJ~ph$--%4BN5)!w zpWod*OFewRwahqy{H{_*`(gjrM-AswmV2BP6^$wd=WKGa;hr+rmiNkx6^3+!dokYr zieAvKbeTIXx5rT=0uHAGJ-9D5Khuv*r}BZZ^4usUXll)OTjJ0&Lo`tJC<2bjR5R$& z!o`MF$~ES$&qim{GbHytHX@-ZUnAZVSJuARRj=xOpPLu%RGM|eyIQLRoi&Gl#FLnE zPJlM)dhh~1&?m;Mrj2K}(GNhF2YK{gl7stSQ%56(S#I8UlXH-}eA}nEjo@<_W#ccF z<}s>g7+s_!vR7!0_1WX^3*k!Nrg{|!*)cStBumh!Jn`OxJwikHu#Q!hgeYX1j&8ic zG_EFgq^k*qM>!|_qDG)|QJPQhV zh$3gTt@2eLr$EtwP?>NR2n%{j{F1?kwf<~#0@?6V! zAyWVIsUjMG%tLA7#V5rdc_nV|B1AG99_iUED(L5!yvF04qAH4f${cbDT;cKGq`uib z50Z#3z~p0iWs>TuCR38(xX<6qHi@wWjv^@F$`ljKOM>*P_>}J34W%%>DRM*864B<0 z7Ck7Fp5Wbx4;-!wPB(=orWc8YZ z0X`}eCJ0}f*%#r3|78|}nf9)uUX8X_{9y}WLtqQ`65zs3seY0AO*fQ-{xCb;7nA`@ z&BOeWpjqB)OLgWBpWI3{EP+8tS6Ei!E}Di5)sulXS&-l$HQ^fG$Cvb81})i-vc@fN z6`$i@CMwsY+a4iiL#M^(FB7RVX1hSc7`Q})Hsyyo^}@fjKvF&Ur2G_FkT+%%^Rydj z8)*+V7kw-1UO_rV!3y1D`}WsdTvgz1JtG&Lhifi>jRSHKqIP=RqyVl90z*0Hbm;lk z^TfK;_B!dkW#~)UfI8ij*Lzu%u5OlG2G+mC#+syLnI7^kSPG#4F{u2n2w6tH{S|Rk zC+HQMA0wm0szNKG#ic5hJ1=r4xv74D6bmd|u~{DLhjEYBr>K;r>8!lBLci#Cxb$so zFQbQ1fm}EF=%yz54H6>o`Qb;_j-;81i5T8M4eLWCnekU_$o6wBgSO)XBICZ3LhngN zYOW7Mz4nNPvxyCija9=EQG?p{O0R+yW8hT1XV&9Hgf7`mlzE^0og`%1tc>FVCCd=t zzu}d~q{Y&4N;oCtAVhlvBfUK+C47CCc?;av%DrN^KMBW6`eVAwRX=B@)gMR7Sh7vT zxO2vIhZ?A0sDvJ{=1Eu=7FrV#_1+DX2N-9%A9qOi(hoF7Gqb#5Hn_e<*1a1YK1mgx z?6cS>*Gj|`)BV`|!mE<`8z_&$N=e#)*B87v{)^=03u8Nm>r5_VX;)`tE}KNv0>#pb zTr~Rp7O}Y_RCBz#SO=U$EjCDb(j6OS042?iRu&sgBFM?WT51qt^Tx5sw+Oofu6RI) zPP>L=b#KHu1ZkNCg-N7|3-ha|!YB3D>GqjWw+Nv zJBex4M)cfvLrxJ(CX{SzX$0?!R^(;k1T?STVhZ3!YI{%RmN{5=Tw|m=Lt%%2#$cd2 z>oB@X_ShHTdDgI9iegR7fQPF^3=E5XVX)&oZ4kk+83KK@2SK~;i^zK_CxK16fn}1Pb8#_Y z30#?uvc6Nk6gy1U7((NZeOLCnFI~&p)mC6J4q_9(;`$wJrWIe*+C-+1ErB(z!f0R; z4n}MXMZ1IUQ^0A*$dwqpO*u6a0<5CL6eseQ+cv!7SWtryC2?QkKrxrXyi%4M0E?2Eam0 zg(9BaQ*Y~*Q+PVmR~@eP>!U~oc)zy9#jU5p_X);JyF@K-cqI^*lRX$;al_44Lm;- zow2(J=XcJvM)R5}P{l~HBrm{_s=Y@8*qo_&SIGM>7}Fgd!4%sV1@XOd43NkENn`05 zDiNYDi3=s2K}qAe1w1^Wb8X}ZmRcgo?hzOqgJA&b2Q*c^za;S+JlegF!`eD6>A-Zg z%4>D)AbO0c=8|1a2M_Jb{rJuuqb4>ziSPFjN95x>?p0p=vQ^D^D>nG0`)}Q#c(I=G zOKtaqb|-_yEEl=!C==a_L8bP|AW#I!oTb3zhM$?euxxS&w;2dtQ6zfWM!x2*i^uHV z4E+auaRHz0`sBspm*gXo?D+!wU8gJqe*Ry)lpXlLCQ0|!VLtD4A_5j=#QrBRsiN=2 z{3bd4VGca6+8aArhu;V@wG?MC_JVE&FbSZ20zQTZV3lp+UEZpxy#20VU+dE%5KwK5 zwHfb-j7Sa9GKWh7zwVC3$a!oq*B;8YtVEf&*Kbh3%gXt>M>u;-TGj~b@L?1)iQ7dn zD+DH8^>Vn@XWeHQC)=CgWU1XN%%Wj;MeB?}%a%iDcGHnbPjTBw{h_Ckrz+k;EtkqIsMxE1w?xFH<+ob9`M~_)oIy$W0^H! z8t7J@x={kxDeg;=+PHXf0i5VAJu_pkxKq2Fyk6s9zJp1$;>f4;;$krzxYi-;T2UJ= zV|xF6lauofJKzwjEJXu)4dIo<+y@-kx% zXh^LFFDvr8Hk#iVCVA^3l$j(jkH!_d-iJ_*Xx9;Qk+*2UjH?{->`%*^*OQ6cxZE$@ z6;3JdoV(m?F`=KjQhsYbJld@|nf2SGqBAr8C9V5F6>M%%_V%7W)^wLFPv`bcj^Pf{W~{vCSkZ$Ik=6~;8aJh1jP#r7?DDnP@lOi$CC6$-rWP-q(`s$8nn|5Cm&%QDAMCO zlzEaA+(g72&R*Jz>g$$uV4AP+}5OcmtjMAI1} zt_77U*pkH2zNR*Mce8rB@a1C-Zsd^6p@oE|6DB_oR+6^rVW3Yoj>fy`BI{C{F-}2( z{kKU(aw8f>;@`3XjuiREsNP3ujqHo+8uZbHX7 zE@dr6Iq)^unte^!zX(MZ21Azd!#%@A1FLQLdK&`3hEw<1Qyu|230%Rf?9i#2FM6$h zWV?hC2Xx_oPU@Lv>p&45#cZnG{tRqxcbaYydV%RnQ`B{U;l!glh3wBJ6k_7~C+3rL|2D|L)ZJ zK*N!T!~Pfa!L};Yj^VNFM{x$_!wlvn6!m_30`bqvkF5LlQBKV?T*p-B0v(dW89wBZMVAv@U4^y6 z6)jxk*SmHLVR7bi878W|z}9Mmccjb2y5Vk_b=04j5U+JH+)U3Rbtmev_$9&e5jHAm z2RO>Cj{7z_`tCvcu~r(fg&Z@am{AKLrnsIukCi4|tK-)_n&mZg6|WgMgo?ZPKWWtU z!d+yYG1mny+s(MhSJ@$Psj?cxVx;iej~?TjVbZC<*Kh%@zw~%1$XRir^pdRi@GN{P z?A!8Dufi#_Cu+E+X%7&dc7t1sYQoWLFjq2WwR48qrbl9pA`<(O_V=xQ04dg+C%R)2 zY(Fh?d`$KYNE04pIWj3MuGXfGTx?@uIcOP7`#Z5?##KcXpAo;Ot+(}2(|7={R04JxrDq|38!znsaJ}Au9 zq_5$~buFfIL2d&BO;y2G$H##$p#~Y_V{%PZR*;2bONZ7>v+LTM)Sk-dT9}GsJEhO& z!c$Cpq<9=T49ySl?CXKCR(3W0X1A=xFhm}oO)Wo{W>2(L%Ux48h~k+mN0d~75wce- zPv}9#E`+4*tap_NdDFz|OLMd&if22@|4rsz#p8wd7%LH@XcS*BNDw6^V{dJZc3})} z@%&EIpjhsUk0i%b<{B$2Kb%p-Q6sB{PP#Nf29%w3~{MZL0&@W$N@M%o@xF zrgTcKxHc>q)eD+Vh7QjB3_EOkDRuM?szDRabF)SB2oduac9SKXFRJ2UU}r)`EjiN? z_?+eqQu<}ev!}%h-C4LIvBX#?gO<_U5C_POF44)NC>%bVS}`P-XuFh`aKY&gAP39` ziS`dtH9#j#mdKUbE68-{XvO4`Q9-I=&?nCp*+vy33ymB6@phtgYnQ!NOtNzFp$0ne zGTxWKju9JKf7p*dP%ot`vft{MhOAr?&W>AgFIC`ajIN-uWHuNgWBuT& zBEkXB!uW9F=^Jb_Y;niZa3Z;x#5rH+Q6JrDe6O57LTWZCt%oK+mhKBy6vOxyiampn z!ov0eK7w}aP%ASwJ1wbVF?nZUPQ?0(^i>jrIZHm=%(QtH$Lu$hUnjui1BlXo&QTL# zqP7GbY!ks}N#eNCdOl1Yh}=f(tFgD1?5dpMRHp_tL!k^;($06e zB<%XSn$U(R=c$8gO<C_Qg7Ht(a8w!Lzc-{(=_f8iv-;s9`RV84e@Jmtr|gHW_AU47=0t5cBpFxL=^L z;3U(r*)UbvcnB>bzjKNsnGA>tVq02n!WiD^j4SrV`zBF>Kx^^)2TzS*_sVp2R1v=F zY5Y<%O>2!N{rc@S>wKQ!u3{8)SQ>ZFsxyrb&Y?cj-)Jt23R-o=JL@joYvg)e3~I#Y zJNA$SFN@VPq2fGSExtFq24XRaS`Dx@?qnlpy~E{N;LfM73S^#2vizCkTjMHs!G{!z zLekGHmj+3!{Osv`u+y;`l3ylKpDn15C1<4Wn{4zt$RCDVEya{0iq{dj#M7DwG`C@4 zM#c6yPD};zj;}eZ+T7pj4=n_ka6g;H{wWrgP?7@svRFRe)G`nma z8I&J#GV^*hKl8L9TZkpOYss>2>_{OaGHv5cf9PR8G&n%lcd?cl|3Na;s{EQQhI8Ah z#6(w?5U$eFVuswiC!h`y(HzBOtMx^mPSS7C2qAS0Rg*^A6bk*%2!pxi8PlZOd%kbI z>KHZl!!UZi>IjrrJy^rBu1T|dgsRY#u4ehvFl@)&^aZBN7=WSxdh4EGxBUTTe&9>c zcxY|SqQGPQO1szA;MFRi!@9Iq!}I(STv|(xhrv5B=I@~6-`nVai$HuS+%2fz`Wj{J zH;D8J?yh`EkmmtB*KWFXS3a(qCz~dBxq5ml2kv@o257Ga!~hhHPN;9t6r#0e=5;rB zs!`=a)ta8^OX$=IPV{d>0DWN>)fi~yGDSAwr?muioe50)2p?)}=+;qMeej z6_huL)UlKDqgc0*glg(zR^Mt4W5cVbr@x%B6vk<^A%xHeh!Ww;k*5T}7Jid@FGU%* zwlqN@LptNsnmGE&TtLIwTaVLG;I-KZD@K>{?YnqrDxWXIcjcjg`jzag+Ez!xUv8?k(xK0k6ZD35x^P*w)AyR7aJ-~|O6&_@Dd&_AFB z@vC9Y>ojrgba)!?G#vC<;!t|!}&56lM8{1mLHqqZHlL!9+o%=pEhJf_M32o=p0u}!B`NF*HD;z za`h`KCKuztN$Lo$Q9{={Wo5Etz1{-J(!OAgD15JgR@sr3Y(qUk;=~%crZ=O5cJQZA z#TD`>rU#!bcXjC{3hRQ-zkXd7s(;y6$mrVrLyo271C#}%Qx;vmu{rr|TDW$~hfoGI zQETy&L(_f@G{uUS8!5&)y|G13!Fb;rK}R6U2$Hbz2*xzV6$d;PJ8JYw1C$JY|FzXh zziEIWxLGA$_e;ApLb+Tm=_x6a)c8(gKDo{LGiJf6<6X(3u7WAn7H%0KQ6TH;>fh zzRHj^^=w^4bCqN9h$B>1L!Jiyp|zhxu@EOB_@0W(7^aICjINIzWHgKtvQUo9WiTG~ zn)q-EvLo_)q~`;+A1wtE-+eS8Tb`uiBfScpgxSE3F_{Terxq+gauSPH*Z!d>UE-Jv z8xa9Pwzs81MiNWJb5=0fx-ip^66WiI$*Wp{;}l6L*#jw0=1bsN8}t*J z&|#Zbq57LTj!tpnv)UR#p=og|@NXzWW-6#E5QJ&aRFKg{AvZhi`H#im-JSjRwN=Oy z<*wjsmKWKjDO-rKIez?7XU~dEkTrNC3xk3OJhog!F&J%~k3DP57%^bLE>#_NhywGC-d5 zQ5?hd+F`Ezr+%Z4A_6q9WyQqHalvoL7{`8VPdopNpyt4jIKL2n2|M~b|9eELyj&Qd zT2A%v<$=_CCLO=NjfmFU`{4Vp4Z@B8jFRbOGEz(P6wMzyA4iwSm;M@?Z*DYlZ^!4 z^t%l3lNgtzfqe4&iedkVz2p1%+#3859WSs^o@4*`Cw!Rzhnp{UZwlC60l7D1~IPPm!B2S`W0W2 z1&{l@_2Fthy;H?Z>*OZRpXeATnIAzCA@F!D`V)8^FJ`W>KNAL^!U3zABOQJ)u(qWm z;}C`gkVclDkqWLlQA)ybf>DactSU!ft4<-+g&YPv6Hw~NlQ`%69Q#T&wzBpC=$^qc z`OwR8nI={ExGHDDIv^6F)2drxk62KxBP;`QQek&`^M*wzl=#?npe05`5&f%_2~bwh zXp74){~uq#DANZe4hHox!%P=RrL~_S@AvSlM)m_WOl=4B@?6=oeuJv_l#C`FeR&?_ ze(_1K_@A;&u|E=YJ$fzQ_|lNBtwq-I% z6*_RvzbTJKeKJ_Y`rX-8#3r6`G%T|n@) z+fE7?7uQJm4T?`|)leBLAtJ{)A@|rj{tZfiA*7qAi^YUum4Y|tChpPSh}w^2kTG}E z^%<7O%U->v35+LH8LS3y<&mdw9k2~MZ#>(1pk4rmtw5Gpzm;-75GTdN0{97h2YyO6 zy3_IB^Dp$@GfCjHpEvt_;L7sIa`o>&#`eqhDS1wky+#$ulua z?OBac<-i>TA86Q~f4Ss;W%Mr3pJKzS3@`>WYKKLnlSu{>mNoa76nwC=hI*%mUAt9M zbw?4SqZ#b8^%cG|-Wkm>eX_>+edlrx%%{GK8G6AHbZk_CJ_>Q@q(+6<_6xuCi8JBz z+k1@q(ZJnyje7)Qz~D&7S+5#*`a8Ty|N2@Pnd1o{zD%{5rG*n z(7tJ|>ck@n>wkd36q!+jUUUU}qFJ-_KRHZ#p<}>|`*#Y*j?Vc`PX3uW?(3QLwX1%1 zxZR&NC%o>d-%oy2T`khPlJhHcm}a`mYghkovXrg-t^Zl<-r%1l4G)g~Q|+gJYw(xR zztnD5XY!C(@#R4n`whZ;k|SRud%U0R1b3SDf=Syja<7R}p`ux7IT&Lh&Pg?5DD;xC zDB_>G^m)6QAo@038ty~aE^p*?;RXg?BPi2ZjbrFEXxM1ibMU#C6f;4Xvcq!I*>sm* z1<)(olDVRJ=Q%M30*?30WZA1k%!;(RO1Vn*3F%8)oG{pM8RT|ku^1~VT-cdR2~|Th zYnkoGv+zar+WE5b3@7efndGJ*d9w%N!_1N$P{z>ed6ibVeYU8Hk~F=zc^6xVQM9@( zDoISQqF9k!^BH5UBROB_mV&|Bn<{z<>dPdDy|LQc=!T~P1C;t;l~5DO=|$x+#AMfa z)QVs^7uH(Pn@~?oCmw@CeT8QH257jS6(-rSdhcJQ&=;z!VqXw^d?#FrvYf4%lI}=O zG4dOfkC>gD^e(hf_FWMKQ-z^-&0V8TRx>X2D|=}To(2xttUg{&Nsc6Q5yr&FUS`HW z_GnDWgW%^Mv)*6Cz&~gLFw2e7X)$2hc2_sQVHOaWKpKXL}#$zFfh_{WK++T~;Czr+4tsRs6Ei@U(S-=MgAyc46c zN1k0X!p0cW(T-h5)neHi=38(y$5wDx7%@q$TJ}fX(id-`Y_Pk!6SkygvC{gY%@i!B zNX}tO3Zc+HAx~JDebGGlVPZZ-Q0$_~LWa5!b(SotoqMWscGx6)NzJdrGb=Xa5_{J3 z5{?N$>eGPLUed#01y?v{|7?PY(;Y0;z;`ndU9Q9yPwSu(M?Bg1n*%sksDNcUbq$k| zc^28r?>j~&6}9=qj_pBUYfv4#HcfiZ)<@P_HtQv)UOtC06jE|(&RPBiYS_(YxmQJN zIV{YiAGwrjETGYX&h)oNt|qbXeTcFu@~p&qEjM8`JzN7Isa^C8;=I&6e6U?b@@6J^ z`BIv-gDk?=R?{9#gsoT;gCsWe+0GQvHF(9<_Z#4R^ zPXRQ0*2Z%rbg(ZN4c>c3y(ZFm)v(Zi|2ypv3KBrxGPt%vYqvB)ya}VHMYI3ZkCSvo5 zWh3~5q0760)z#}por39?Mg&+fW-o3@(c!TNoTxV=xY)}ny><#DMBqFFh1ZQVm%83| zh%CKgB5H{%BIe0 z%1IHEI#+aLWnicZDUhXu!Xhr#5+s!i!Eg}4FP;@KEUmZsZ~(8R8EZzeVj$3?;J7*7 zJ)$`cVhhwgPhG9aKf`cjsPb8IvhJYQqg(k+EWC&Pdu%#x(>7Vb_VlbmN$|t<9KVPp zlE&zdiA1vGY^}1&8IbIDG_Yq(6BXVw)7GP7R-iUnP|5|ws$kn$D7s$4BcIam;?0s| zDNc~WVP;hE?>K(w5TtQwg9uVxL)TNf0_8}ZynxYzRWuZ6csGMvKf9lgYRIQ zzkhhshCj`k)b$?AqG)-6|2N1X1+J(*xk#_+UxUGg(ns0=N$L=7I03iZlYz!wTr3;w=VFSn8qvieMAsNH6To`rgavhBn{4P0OKG^#~4(i zBtAVj|MR2V;cTN}+BGna`mn5MSH^hwy%!IvgX555cokO87&s!Z)yuwbWnt|6W72w^ zd$QW{g=F7t%QThwL7{pW+QM-?WvZxJ638yE)H)w^R)(-fx13<+AkQ^%N@}szyxn3# z?fX{Kh>OLn5^J6)+hMeWWO0s@K}A!Utf5xEn3R%TVyG_0@vjCPBGyl_<|*yZSTH$h^M@jkz*e3lU5%E%Sk!W_Rd{E>KCt+N4^EU{g7wd!b*BrZL7?t|g>SbIEV;^p>%Zw_0 z3{lMpM~8MD9j0C`(;sJiC2CCcJ~OA^GkeW+1`AgU=?ZKs)19xuDKxi=XS6G+E_N?r zVKdb+g=m~R5or?7ywcmVjrzVl3uY0vnxM)~+$(k{XJDJ`_KgqkC zCN|rjCPbHwW}f+SIn5c%Y%y=%&;gR2V=zAvriolIULE(a(Ay%(O(FM zzU$@@k<|Es?8Ru&m=Kj>O%Ss2OW6yxH585ZmR&rTVkL;#z1o)>5;0ML{$V3kBSp@5 zdAshcEEG!2Yp$f!R1eL*SW=S?m&~L78jXKqe2Z~7Fp*272)3W`uqhhq!`MorjqdfN zk95&|P@}+7gSbGriP`8GAg8ED_gpC}+PAw3!ZI1NA%ClQ_{~kNnQl4pc);D_O;zUn z|C}-B`Ej?Wgz^;#xywl?2O)lid=!}rj~t;5JoA8A2%opH0$IeADUpA zyi(?QA2{to^W56ioM#gBUyYKU0O%bYR@I>Hp;go{TWeVK1hw0)*7;0mWTHb6vse+e zn(k7_Mvn0`+NsV(F{9KQuBUHY0E{^btwrLaLvWdbJD{T(?}5 zn$fPGn-d(Xb+v?XRYtcV;MGp+OcMun(pDvfy(bOj^2GZA6mKb2sF0m9l!k);?qAUjlF! zIM8Lfl$NR+n5BbWx9sa@{0ow-SQl2=*HC9z19>P zd#0QhOs)sQIFF+Mx!`;zyrhGCu-??W?R48|-N+)fL%IH0Yor?Z|KO5aUF}sS3vcmj zxRrXo=L`u*BNA{o!maM47(5@A3vd2rxDk?dLtOqc*C}B8T-DBtFL0MaZSqhF zYHBelG?VLgK%x9^W%Z^EZ=~-yw;?u3xH`uUS%VWH>+YO#!i_C`>>0^ zRRT}N6Ls!~6V78PS?wBK=1(eQ(KArj_|5IXUl|du!j8Q0y%F|E8%?H<9RE$S>lx$0 zhR$qHb$R4}&W<=yTOYqvk1!q6MNdAs3@;o0$?Iv8-)1^SN^9XRm08VT!!_*?a*fE= z8!nXX*ZnAZ9%lz%Nw9~D_(^)_V0IZB(0*u;z`hkNx4#>zO$JTuKDl~BAlUfiAAaY1)**Qa; zXUP`yXfhLM-qFR?3a{UmXd&-ppxTtN4vb|F%P=|ztC9NF%Y-K|sRdnJ2ByrqTjL+T zo3-@FqjY7U9vV&HqB&5Lqo>UADlJ7@Cz2G`G(A6`8r7TFp^Vr?nQN_{l**9Q@b1gX z1iME255^F_i-vNU;Twb$rQo8tUN-P)yT@P#Kw}(U36OwMEnI$yJii^DqC)Xf+Y&O%oj1KI9n1k;5fo@&mHvHA zr5KlQ{u}LR$G+qC5s|KHQy$gYeCDgyOOvvbUw0Y3St`evCll#kjfL!{zd#wT|Y< z(TJH#im{#|~b??k*%75V^RSiYhgj-GMJ{#4C#EH`b?Z}bBcEmhLN z9sS`OF1$2L2nYqX9YZ#oWQmrNQ3`^H@Buqn$au07!Pv_a{~=7CHlANVCsI%#re}p? zA{RLs_aK2RD43Y{?~5;JiKp9y`6?{45PFE6Y$mP#qEGGj+(NA;o~c}2&+1pPOAzRw z8b~Z&jx`Nq0(XrrpxF-(;zW*s+bM7WZPBL zrIWI0tiYR+L`@$2C(`EMsf&LlgjfpvVoKr07;0~*e=Tc0><{K=ge*)yTDU+mwRBrO zpG+@f*kh%LZ~M}A_fota7trVrZx6ER#}g)!3^cVIUY4!AHE8+N>`CKxE_<|@wD^Oe z{&Q%p0=g>TcH(6Qc_%G>Tv)vf>B^bTbSN2H}H042n8e(Mn#X&mrafy zgr|2WbL(nsP_D)=2+VvdJ_(JOjZ}YNPRyoF@ckhCTjLVGs zEz`J5LLozvNsZe`5t1Bzd*qz&yyrdV`_B7&e|u)HS!?!Q`~R%<{Ga`-we~z?^T0=> zdn!-G9SD$ASkydo8#88ShdQD%mciA9w4&me)~*oylzj*kX6XDQR58nLz=B7;3HG_v zXi2UagUR2mvWI{=^3e1+Y^Q^ujqex-S~pss*F#dnNqaf&t1-U4_`vSs+r#~8yoy+H z|IY?Ng+fh5kW-`jt^rc!(>ZB8@5>`l7oR&O7`*W25YhJRako$4*0y-g5j^JVp3{6k z-&(YTsLo$$ao+?!04!NFl&lrJ28MK3PWKPX;u;105(%b$VLCa8#(GprL&g8OmCc9U z5|a*aek#U)ZFeK7$3tbk*d%eWAQjdcd(5mmd$AB>qgbjrVgF69D}3%dhXSy!vYxil zxA-pw3~h3>3bIr+!7A`bsGsb?SByZ)YQC=n5@3%|xFLKcD~x*i9>AQS%>Cew6S|L9 zv_cMgACG%&I^n;oF0*a^Z!?g)&3`y-|KQoeL{GSuN)LrN-*GOF1wm zd#=T(uNF$uVTvD1$Z>X}4GK8;G~op#7isXPY^l`EJUfY1_itG-wEBNb(xTu=c{VLy z6q0~jj8uXgy*@;`L z`M6W{Y}uv0El-nBMTBXJ^XmP#%@Zszt96!!j_eS#zNw56ELKgnyoqdUsoP%a?%}L* zV1I;hL7O%t};5*Ze^=wA-(}L z#}))l3X^DAH*61)gS)5y`S#Su`fk@*^{UEFdH6A@$S_%)ZPtiN-fx@CpnPuCKvwId zt&m;lLLyA%qHl^y@8pFxPvA!PWNM{O*J$H#C>RUe=Z2P$)#mxZ;*b}>Jl8?4p-!vL zSbA6|ciDEwBT~uHp!9(cy5X3|&&%X3(MuZ;l2C9qKUa=sl?LbNngYHhV{gw?$fQiH za?T#WZv`)a``Xxdj;5=y^3y3_Gsr@}2r!9*t%mQHI%tHQVW+L%cs)+$zkm*S8&1l+ z(Nxc4nz@fx`A$Y}+cdoK@txy41g}-)vr6hBl!U1V{Psl`+hokBmvbwDNK|LP{h;^a zFkBjlB_PxAY|beAdHU<#wo{T^r-R(&h*s)Ir z*Q_^kRKyMqE7?n!%K@Q~cbP<1S2^sn(0*ag7;`nEqfSuoOTH<OZ0{!=dc>VzPa_+SEB^86Ag|*SH=L=%fS!JE1=MblNu+#ftl6=b zOKHY>>KR&(i#-;}w!=kD{JQ0atY$@&)B8v zyax_iaGg?GTYsKaHQBw9Gwj}21L9dwwVp=8wn#Z zkNV-Xqs?;sR}So)!XDzO4d6*HHtTq?y(+QlHlnTG>cFVaf+D6qr_`n1D$p?aLd_s` z(zl{mNHWke=;(DXYpEw-#jhtirR4Zm+p1l!}{UrQ`vO@?x9e9}$(H8L^rCo605EU!(v7opwi5TN$`WEUtf2+%U?dU(x(%?~o8 z;0|>b4UNwmrf2Mh5dFr(X}e~^N1R?xx%!I=THQ_9+a$p>>3#G~_yKf&1zdT?zA7-I zjF+Ob&rDe)tM8j2DeKO!sf(R6lHqMqBhhQ8nlnu#(9cr6l-^u!tPFHs>|y@Wt@)?f z?Y|tf{LB3JUmdYoWqpVk)ZwKQJrPSeIZYOyApw&Y6bty$cokOXY<>bR!38i&TxUyt z<=zH?-q0IA1n(RZa>`dBT* zw2J;ga(ExC%ws1sQRt04C6cHrzN|AVA zpARR1ekANNAh(%d5&S#k^nnO7L9;ULaKhXmC1^E6#DRfDgJ-~fC=GRx^Xl*7RkTm{ z++i!+Ouv9v$kF^42T9uDS4}zH((OckWdpwKxBw?KZ=&b^Um><+f#X5kg*)(|9kB}l zTb!vb72Z0==uLNxftj#U5h~DaoMmjUw`}=k6kN=dD09%jac$Vz9cfZBro#$bYs6XC zE+w;iqV9U~5$Ci67sLqCG0~zAvVp&kSw+c%ua*?_7+MYu+qkLsEqJSPXqbi*<8Fuw zr)PcLo-FBh&~;$vcF@m5J7G@@&U{qK8H}O6HZw4ixg_K`xBfl=AHj7_qTQKGU-}`& z{y4FSyl^9Vlai6nm3!+{BP3tm*bQzN@;?WPkk*kW z-QV|nx1sRnbz7|fls()L3F7A8A+P9zpDhehM1E34P(m0%eW$^!E!i3Si$l+_?2fk? zu2AAvBF)#NxEGYW&0MXFG+-Nu_i-gjcH6o`?quU*Q^yNG6-{}x=ws?N;=XePki`h4 zxPHOf%C)*ZxjMhxC^86Y%j>$3RtgCBrgmokgXuDB;e|!KfTY>z4vgA0_1^s_FInHP z7A4UF>{Enf*IivtT86acylfZg_G7C|u#wt$Rj$=n$P z914+5t+RFl=|hAs)T>AJxOY!CbMHY0YV@W%EkF(pzc-$Gs5f{~PMNdD#?eiEymqSf zwuznGwuct6sTFNCN(Dk~>$y-wMkwD9po<@EmT&hjohSL??^b4E4)nl-6I!NylKg3l z4z)3Y9M;1GJc8$>-?%E8Ntoq*7!dP&Gn?lJHIYzwTQ+L*e0>0}h+&W-LLmr}82l14 zu9acRts}x0B_nJ1O-e}Wh`i91!okvy6Gt9;=-e{0`ULOl(qF!F9J`lR-{|Q|xa2t$-Z)`(pf%8ME->>A!bqr%;aC!?az>;4 zMc0ArqHnckj~(vK3UCl~6LqB|VWGFWci$vJ9dD<9d)LSbF*|Bk*N{wqM32t2oa7&Z9l!9RsOs2W~03PN20-LNTocH-fPdm zkNC&mwX;>Ks$4V536|cfh-0dDkw>4ReBE`++dRwsWh*$rlFG4G97AhOwJwK<+7eDb zSYOf1*!uKG0oeTo$iWs4uZR!<9>Te0PKyWTjOwdU{nfxdGYC&`PXK2yKGHUZT{*gOEHBld{IqLe;~nbHT71qjcvtz^1UgZ zRPh$T@9M}8V#VrVR)`&H32S}B49xQM)kjLZgdgeckbULZ5jK;kTTu})WvNjMuDZfe zSTU(t6jfOdRVf*)F{;%V8j#EBdh#_XmPfmfHSyE5w%Ef@&-mjSQ^^fsf#vBu8nt8` zYv~^NZV$44)>oe5U+HY@HFU`soCeKgCW>`igt?h%b9-lZeBwg}ZrWGC*q&rK0s0Q$ z#gcz;;D<;6ZWhVDnJot}9TCp4e7{rg61YQE22(o)G^~S}oMy_TE@&n{twiJkNYDT# zKF?Oq!3Q?Nko-#*>>rGnWO~w-D<1@eY_ApUv4=g@V7j<^jGqTy>9cPtat*m2M-pko zy@e9mAG>DeUcpIRh|7fz+&X&~;&S%C-ThTn zK-r0dMlE4i!uExM{MSwA=6i4Qm&oMxW4GCgIMX8G-#I#+yqO|~Se+O(23i&f?HP?_ zhpdbJ#JBpARTw_;xZxeDVWKk%oRSY`Y$-pSurB#_ORsDJyMJoO%6a>4y+tG6f(Sd8eqW;;e;8j#b_O0MVZQB5~|%>zG*q@t2kr;6~8QH&!7u@30&*DD14AB z?juq-ta6pFWI3ycgo=M>>%MBBbwbuK$PGb4&9qQ0nzWF$X3MH8kk>jDNWl%BPZS27 zhH4MCUDX{`MCR7f1qgFUfr)R>87%~5T@ycdKMlVQdk0)+kc28202Y%WBc{*}K -