В Панели разработчика (по F12) в консоли есть строка поиска, в которой можно отфильтровать, какие сообщения показывать, какие нет. У меня есть сообщения, которые я хотел бы заблокировать на постоянно. Можно это сделать через СВ?
Отсутствует
vending_machine
vending_machine пишетоткрытия и закрытия боковой панели?
SidebarUI.toggle('viewHistorySidebar');
Спасибо, но что-то не действует на Gesturefy. Может это должна быть какая-то другая эмуляция нажатия кнопки Показать боковые панели? Или спереди чего дописать?
Отсутствует
Была у меня старая кнопка Fit to Page Width и я ее в ЧатГПТ загрузил с просьбой оптимизировать. И он ее даже не испортил, а что-то подправил и все расписал. Поэтому я загрузил следом кнопку Save+... И получил диссертацию с вот таким примерно содержанием (только для 1 функции пример):
Некоторые предложения по оптимизации кода:
- Вместо использования addEventListener, лучше использовать this.oncontextmenu, тогда не нужно искать контекстное меню по ID.
- Вместо использования e.button !== 2, можно использовать e.which === 3 для более надежной проверки на правую кнопку мыши.
- При вызове document.getElementById("contentAreaContextMenu").hidePopup(), можно использовать e.preventDefault() в начале обработчика события, чтобы контекстное меню не отображалось вообще.
Второй блок кода скрипта сохраняет выделенный текст в файл на рабочем столе.
Некоторые предложения по оптимизации кода:
- Использование nsISupportsString для конвертации строки в нужную кодировку данных строк будет более корректным.
- Вместо использования convertFromUnicode, можно использовать encodeURIComponent, чтобы сохранить текст в UTF-8.
- Лучше использовать Date.now() вместо new Date() для повышения производительности.
- Если вы используете nsIAlertsService.showAlertNotification, вы можете получить значок текущего документа, используя content.document.icon.
- При использовании метода nsIFile.create(), вы можете проверить, существует ли файл, и выбрать между записью или добавлением текста в существующий файл, используя один вызов init().
Отсутствует
Была у меня старая кнопка Fit to Page Width и я ее в ЧатГПТ загрузил с просьбой оптимизировать. И он ее даже не испортил, а что-то подправил и все расписал. Поэтому я загрузил следом кнопку Save+... И получил диссертацию с вот таким примерно содержанием (только для 1 функции пример):
Интересные замечания от ЧатГПТ
Отсутствует
Можно сделать удаление из папки Storage в профиле (подпапка Default) папки, созданной конкретным сайтом?
Скажем, сайтом, на котором сейчас находишься.
Ну и чтоб два раза не вставать - что насчет моего вопроса https://forum.mozilla-russia.org/viewto … 85#p804785 на этой же странице?
Отсутствует
beggrr
Отсутствует
beggrr
Я запустил этот код из консоли и он удалил из папки Default все, кроме папок с настройками расширений. Это так и должно быть?
Я просил код чтобы удалить папку одного конкретного сайта, а не полностью очистить.
Отсутствует
beggrr
Ну не стоит воспринимать всё так буквально.
Видимо, это было предложение помедитировать над Services.clearData как таковым.
Отсутствует
появилась папка
Надо полагать, в окне CB-редактора
была нажата кнопка «Внешний редактор…»
с файлом -> Temp_ExternalEditor/custombuttons.76952
Такой файл должен иметь расширение .js,
и должен сам удаляться при возвращении в окно CB-редактора.
Значит что-то пошло не так.
Добавлено 13-05-2023 10:51:50
kokoss
нажата кнопка «Внешний редактор…»
Да, такое произволение, зачем-то, ещё и на СКМ повешено.
Отредактировано Dumby (13-05-2023 10:51:50)
Отсутствует
Надо полагать, в окне CB-редактора
была нажата кнопка «Внешний редактор…»
Скорее всего, удалил папку -> открыл окно CB-редактора -> нажал кнопку "Внешний редактор" -> закрыл окно CB-редактора -> появилась папка с файлом .js
и должен сам удаляться при возвращении в окно CB-редактора.
не удаляется.
Да, такое произволение, зачем-то, ещё и на СКМ повешено.
ясненько
Win7
Отсутствует
не удаляется
Странно. У меня удаляется.
Но, это если окно CB-редактора явным образом
было обретено как снова видимое.
А если что-то неожиданное, типа закрыть окно CB-редактора
прямо с панели задач, или, например, с ней же, заказать показать
окно самого браузера и там нажать рестарт, или что-то иное подобное прочее,
тогда, конечно, не удаляется.
Вобщем, это древний и не совсем продуманный стафф.
Лучше не пользоваться совсем, или пользоваться, но с учётом сказанного.
Отсутствует
Вобщем, это древний и не совсем продуманный стафф.
Лучше не пользоваться совсем, или пользоваться, но с учётом сказанного.
Я не пользуюсь этой функцией, видимо случайно нажал, по мне так лучше бы этой кнопки вообще небыло, раз это древний и не совсем продуманный стафф.
Win7
Отсутствует
лучше бы этой кнопки вообще небыло
Какие-то проблемы скрыть?
@-moz-document url-prefix("chrome://custombuttons/content/editor.x") { [dlgtype=extra1] { display: none !important; } }
Отсутствует
Какие-то проблемы скрыть?
Да, потому что не вариант узнать селектор этой кнопки ни с помощью инструментов..., и attributes inspector...
скрытый текст
Спасибо!!!
Отредактировано kokoss (13-05-2023 13:44:25)
Win7
Отсутствует
Да, потому что не вариант узнать селектор этой кнопки ни с помощью инструментов
Эээ... about:config
Поиск: devtools.inspector.show
Всё — в true
Вот она
data:image/gif;base64,R0lGODdhpwIsAncAACwAAAAApwIsAocAAACAAAAAgACAgAAAAICAAIAAgIDAwMDA3MCmyvD/+/CgoKSAgID/AAAA/wD//wAAAP//AP8A//////8GBQYLBTIvARItAjIxNBMoLDk3NzkAAFkAKFYWNWknAFo2N08sO2Q/QVE2ZndFAABFADJdNhlWNzpiLABjOCpGAFtVOFBUOWNjPVFHUTNfbjJ6TQB9UABuTzJ5bjJCQkNERlVaWlxcXHBxXF50XHlgZlJxcHAALYADPqstLokzPbEATpwAVKkcabQ0SqQxZIwzZL4IbMsAYN8ZY8YAc+g0Y8UxdOhCM5ZKNa11O9JUXoNLTKtSZYtMY7RwXoN1eJVgY7RSRclLY8ZOY9dNcdhyQ9lqTeJhZNB9cspzdPxfi31ijn8Ti/cfveswhdQyiu4vrdEso/MsvOwmuvs+r+ozq/U5tvcf1t8JzPwJ0PkaweEbxvwb2+kX2vQU5O8szdgnxfMj5d846Ms04tEp5uFRi5Zdg6dfqL5xho9xjq5iqqBMhcxKhdZAnMtVjelep9xHo/JKvelfo+xapvNduvdxhcJlk+pjptthpeRL9r5T+bx5w51/yaNZzdJUw+dD7cZG8sNZ6cFn3cp5w9102clhwellw/h8xuF7w/mAUgCHZTSAXlCAXmeIZVKPdXWLdYyFXNiOU/WKaduJZ/XdAKriAK/nObXiOcbtZrrmZs+TinWsjFmmhmarqH6JiYmNjZuciYqdiZaUlJaKh7SdoJaLo7euk4mioouuoparso2lv5y1pYe6opa9so2+sZekpKWopbKqt7eypKSypLK5squ3t7iKhcCdluGCpMWMpdyGstqSo8OVscybttKJpuyGs+2MuPCauuugpMaipd+rssCivNiypcezssCuuu+Sw56Wx6CqxJ6vyKOHwd2B0c6E0dGUw9yLx/Opwtu0zeez4/nGqInFtKrzj8fpj+T5ttXutvPXyrLjx6vQytPT2evQ89bW7PLv39D42+zw7NLm4eLs7PDn/Ofs/v75/Oj9/v4AAAIAGAAI/wCLCCyioaDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkwwFapiRDN+ElzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1Cj0iRoC1+0q1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jzei0yw6rev4ADCx5MuLDhw4gTK17MmKyGZI0jS55MubLly5gza16swe/mz6BDix5NurTp0xoUnF7NurXr17Bjr9YwQbbt27hz697N2yvt3sCDCx9OvHhg2tmSK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfLx35dUyO2MufT7++/fv48+vfz7+///7uVYdJI45g8t+BCCao4IIMNujggxDWF6Bz4ZCz3B2UOOKIOBF26OGHIIYo4ogkRjghc+G8kUkhkmQTzhp2UNJII5hYWOKNOOao44489sjgicsRcsYbbBTCxRZYBGLHJJRQUglzvpAwiHIvVDClj1giGIsFO9iY5Zdghilmc7SZY+aZZk5DSBpnsNHGFVlkUUUgdyxJyThoRjmImVtaieafgAYq6KCEFmrooYgmquiijDbqaKBbdvnopJRWaumlmGaq6aacdurpp6D+WWagighyRhxwxCGHGVpkMUcdddz/MYkleUppTjEn5GFrqLz26uuvjeIKCLDEFmvsscgmq+yyk44KaBddpCGHHHjMAYgWTTwhBxxz3EHrmd/Y+soP4Q5Srjnn4goAAH+csC4AGzxCghcWABCEsGa+skM3I0hqjid+bgnvJeeGu4e768a7K7oLh0uvvXzWC8Cw6I4AgJXnAnzwuxtcInDHtyKM8cIhrwtIud+M8IM5Ak9c8bpdtkyxmSm/O/LDQURsMsN7nvvxJSW7rK7LL6y7MrgpuLBuzg7Xm7M5RQPwA77m6CtDwkD/3DTEUBvN7Ndghy322GQT6uyfp0ArCBxCMFHF20zEQYcbeESCJspS4t2zlLg+/02zrSnHfMEg45r5wskkZLBnMTEMfu4rQRQM+OR7/l15xYKbO8KwsQyO7hLd5J23Bp5Lvifkt6JgruiX9w0uCQcPmzLnju86O8ueW85z4OR0rjntq+8dfNX3nuC363+eGzHTm/Pu++uEH324mcWo/njk/faeO89ld+/99+CHT+nZaJ6Sdhdu9LCEDz4wscQZZoRhhiR3S/kCEbtbvK6VsXiwSf3CM9zJUrCJbyyBHOHKwcpeIQIptUxqNdtfACM4MeVxD2qA6N//MFg1crHuBboK4ANX9g0Cokx/G9iEBl+HAfyxzH8CVN4KOag7vQlwhocz3Qhn+MIN5kuCZ5qhJ/+IoLzpvUKCJSzgAbvGOYlBcFdGBKL4pkjFKlpRbOQ7kylKkbZDBKEHYOwBFtakBjRkAk3gIMEXekAOc6SREW90IwkYwUM5MsKOIRvWEIcoxz2wYBMx8MMceRjHQs4Rj/ryxiHNFEdhzRAGw4LkG9P4BSEY8o511Bc5JnlIGBCBkCPIwNEeCYg49tBMkDzTJRt5ggzC0BySPOQbeUjLV/awendkJAHNNERWunITuPwXEfh4Jk8S8pCO9F8wr8jMZjrzmZqizTmmSc1pXqMU2DyFIqwgBCFgQRCCIAQhBFGNaoLDYoCYJicZcY43HuAERDDnHNs5gnhq8ByxAIEG2Pn/Rk8M4QmTrCc139jOeRKUoImcpzoFqsFzprOhBAxoBeBoUIMKlJqeLChF2enJd8ZTnXPMqEPx6T+C0vOh/htoReHI0JJujqSbOOgcz/nRc3iUmjedpiY7x06MxtOhNIXpTi/Aznzus5qeDOpC7em/ofa0mlCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspo1qtKcKimwmc3zQQtaioDqOYGg0o1qlJ7rEsRd09iCvFKzE3TV6DkFQdCWAUGm/LTo/uwK0r4CQK/4rNdEz/kueEFCoIidZst+cIIuCRaFm8DrY93Z2d5JNrFPFdhE5Ylavvo1shfjp/4SpkKJ/9GVso8VrSDeCQAOmOCpov0pCRyrV976tqeAnWYnYEYO2ALgsMP1q3F/e9bqWve62M2udrfL3e56l6tplao51srWtp6Ci9k1aTU7Adnvqleq4CCgOuX73eu+96rxDS127ytV9mKVv/UNsIAHTOACG/jA3A2veEnRhPJiMwum0O59Y8HGAAN4oPTNL4LFeuGpani/CqUqhZuL3xBv+MQoTrGKV8xisSp4qstgcBNmbIplbFe971ythU3c4up2eMAdzjFwq/rjHhv5yEhOspJdPIElO/nJUI6ylKdM5SpbeZovvrKWt8zlLnv5y2BGcpbDTOYym/nMaE5zmces5ja7+f/NcI6znLMLgCZDdR94zrOe98znPvv5z4AOtKAHTehCG/rQiE60ohfN6EY7+tGQjrSkJ03pSlv60pjOtKb3XOeobvrToA61qEdN6lKb+tSoTrWqV83qQHf6zq2OtaxnTeta2/rWuM61rkn96mru+tfADrawh03sYht72L2m5rGXzexmO/vZ0I62sJM9TWlb+9rYzra2t83tPFP7HN0Ot6nRIQgjmPvc6E63utfN7na7+93wjre8503vetv73vjON74FgY5C00MeAA+4wAdO8IIb/OAIT7jCF87whjv84RAv+LfFTfFQo8MI1Ki4xoNNDSP0W9DyyMfGsz3xkZt80oL/yPjJV15raghC0PQQOcujXfKZ2xzRRri5zled80DLY+fOrjnQh97nnhP96J82+p9/jvRiC73pRFc61Kcuaan3melUB/bTs35zq3P96zgHOdh3vfWxn9zreqbHNMZg7jFMgx5mBzva9Yx1P+fjAAuYxSwWcACZxx3UZf+7xue+jwQoQd1KSIDgqU54PNedz/HQu+QlH4/Fbzrwe/aEzRRv+UDDAgDO2PXcDW8ERaDjJehQhBES33mkN34fj9dz5GexDXz0ox/42IbeK996S2Nez57QA57TUQHO9z7P96iX8H+Ndnocnhoz6bgS4J5nzVd2+Tt/Bwj2oX1aqyMX+hCF/w7Gn4tM/yIagH597PGcj93PZPZ+30fyh7BnWBS/4t3vPp+/H/7y61kdOrB+ifZ71bd8/FAC2Hd8+xB8woZ201B6L2EI5mYIL6F608BnyWd8Q/d5oDdr9TAL+xB+AlhptDCC6udnB0B7NaF7B6BnyacBxpd891dxHBh6e/aBISgKsoB14ReAkEaAeMaA+3CAzpB86xJ69gd3sCB888cPJsB5sNABQ1gCUohnB0h/euaEUCiFWohn+neA+1MC13cPFzAPkqV4QrgP6dAB+kCFeXaFeGaEHdiF3AcCbXh9U7guVSiHAJCA8ncBvbA/cEeGZngxnJcO+4OG2LeG70AB6/+yfHIYeoR4hsOXiIOGdmx3ehJ4bhR4cWOAgRaggQqYaeqAfiIIau/gf0Undn2Wdy5BE/iwdy5oATmwiCIQijpXijmIC+jnhbYgCiN4aEC4gMuXhAgof7hIfPSwhAcofF2IiFxoAjBYiVj4hk+ohgAQjZzXfXC4D7qghJBoARUAd8qojFPoDE44jdhIf82IjAlAh/q3D0tohSWAhVH4h3D3DhdAfV5IAfYohTJIjuO4D7QwfFJojkSYDpIYiu2YgQGphgNZkGpYhYGGdub2EuqGkVaXgf14hPSYiBwZh6E4f9zniB2IfBYwDI64fI3okchoiBxpf+cghoLYkgMJhjD/iYtvSJNFOJIWMAQxWXxBGYNOJJQpuZId2YEcyZE2CXc4GXpPuWclmIN1d4p4ZpW0MH7nkJXjNwXhdwDj14v1MH46AG77gIN+doJ9pnf9UBP9oHeziAD7OIQmgAAWMJM2uIZ3mJOKh5MXY4aKZ38JwIdGqZJ9mJQLqXhM6Yg3yZN5CHpL6ZNEOZi4KJhS+XPhNw+jkGe0MA/AeJZdeZXi54MESZY/N5Y6MAUhOIzWdzH0sIYFiGdRuITHSJeUyQfb54SugIWhsJt7poXJh5u26YXbZ456No/uSI/oWAKhp4/0oJu86ZuwGYR6AI/bJ5ssOZe2SYb5eJ155pxW+IQh/0mELriP5AmecbiP00mM48mc5cmPf2aRRqCR6KaRoKiYFtCcuAickomSeImM+kmUUvgOPhmg8rcC+iCZ92ACuBiZipcOziie/UmP2Jd8/+mQDEqZg5mhKImflDmgBcp9/emQyVidtTmFfniVm5mDZGmKnymaP0cLvQijOQiC9cAA8hB+4HajmLmiq+hzfsaWbgmXHeoJzWmHoZgOWGik/KmhHeqOCzqiPgmilBmgDsqRENqOFPqkJDqZGKqTKgqjv7CjsyCCp/gOplimL1qCZvqZaKoPrJmAiIiHj1mNWuhP3FiX+3gPKxAM1RieCYCnuUmTejiRfIac3BmbsEB/8//ohHJJD3zqp9h4fX6ZjXmGnOvJn4K4Z+gJnNpJjCW5qYsqjyxJAQM5p++iB4lKnaHqmoKGiR43AZs4gRPgiffJfdpppPhIooKYfBiQndSnqyLJeUaKnrqqpF3qCbnQoLjYkutCf9zJq66Jnsj4q8OqrJKJrZMJpTpZrLnakx7qrAAwBNRKrXqmDyt6im1KlucggvXgozRqlWP6rnk2png2lT8KaALoijURiwswiwnQfUbqkHu6Arvqk73KrIG6rE7apUHoDMYKru4oruT6qdRKmJT5LuCagdp6rukKjDg4pu5KljpQfqmorps5smQJfnGqZ+sJfEOwhP4Unq4wjnn/mgBLuIRK+psmULP0cLPEaaj1F46cR56T2JdPmLN6sLMvO5x1eKnLZ5yeOohgmpzbqZMJOZCJerSz6AxN255eq7WfGp9+9oCKEIG0OgEWeKsRa6gOG3wviIVtO6zn2LYD65PDAAUOiqvwCZtvqwcXawEagIXJl7ckarhgeqX7yZwR66DlarFjm2foSqME2a5uqqbyQK/n+plYeQ6auw/2OrlpyYp8loLbsIKz0IId6oTDsH0xqQfz6Lf9CbfMirgN259E2LgK+7j8GLgeiqVsiLd6W7Wie4q0kIJU+bl4JrKXm7zwCqd25muClobI6If3yIz1mIdHapvv8AEq8Jp//6q9T2ud1Ytn30iqIvmP1WcDWKiF3fu9O5t8CUi+2EmP9gitc0mH1VeF90iS8niQ/DuQC8i+5kusPZmA/nuP05mEr+pnzodx0bd68Em3ydecc8mAf8uxTJiffIuSwuecFcy30eqTRumh5Rubf6ul7ojB4qihMuikFOyTH7ynHAzCCiu/O4l9KnyZVHmWOHqmmEuQM9rD4Yd+9KqjZ7miaJmvS2d37icT8Aew2LjBite918jCTkq7+FnCijvDkFrDNPy7FqDDJ6rCivugwUuZJczDZ6oDLpqjojCjk3uK50eVRSy5LTuLguiG6HuA41ibNwuHO5uFgJyb1/i0L2mp6P/7h4HoqpVog1ooyIQrMeNIv4ucyHvoRCm6gIXKyJuKk3mgnYhogxw4riLZq4D4yTQZyhPMxHtGeqaHeqrHercaqsV3gJmcsa6ZgbhsyxqYfDngkjapy/tjhlRstc46BHwsrVorMeCKywlKxTgckslJosF8ksOcyDVpktDqzIlsg3mmiz2olSw6fnCMmaMJbuoqCrhAzqBpzl6oinymln02e7V3e7m3e3vGkfzAAlRLrEPQy9yasPgpzTdMi8LMmPhZWTbLzd/8zYoLkjJsteH8xnhWCzSKmiU7ml3pCiDYwxrNstGrbNq2qnvWtLRm0oGG0oCm0opGeKSXbrR8atT/3Ger6tK5VtOChtOGtsSPZpWAhq+ufHWANnuTp8+IJqyUptOBxtOf5tODJrohCK+ANozLhtM7XGtO/ZsnOmhbXWiNp3ZsZwRu18qkxtTvmZ5mfWto/WdfPWjfF2lA7We/IM/zTLp2h3d6x3fxV2jxuNRVu9ORK2pxXWhSLdWuNtLVVtKRq3nhq9WDzWeOfWhvfYnD1tbOhtm6NteJRs+X5seiKGmavXFWPYrP9nqmPXWendqlVtqsvWyo/dpHt9qyHWquXdvEFtu4vXO0vduadtu+DWwpF9xU53Iw19fEfWnAndy5dnEqx9xD13Ef53PIDd2SttzWbWvkpm/c3d3e//3d4B3e4j3e9cZv/hZx6J3e6r3e7N3e7I3d2R3f8j3fuQbf9H3f+J3fra3YZqnf/v3fAI5q9h3gBF7gBp7YnnbgCr7gDG5oA97gEB7h8f1t7l3hFn7hGJ7hGr7hHN7hHv7hIB7iIj7iJF7iJk5w33Z7Kr7iLN7iLt7iYBDjMj7jNF7jNn7jOJ7jOr7jPG7jL/7jQB7kQj7kRF7kRn7kSJ7kSr7kTN7kTv7kUB7lUj7lVF7lVn7lLp7iVt7jXN7lXv7lX47lYj7mZF7mZn7maJ7mar7mbN7mSq7lbh7ncj7ndF7ndn7neJ7ner7nZg7nfP7ngB7ogj7ohF7ohn7oV//u51Jue4je6I7+6JAe6ZI+6Xqu6FHO6JSe6Zq+6Zze6Z4+6XU2cOdg5Zgu5NRADZ+e6qq+6oGOD7agAwWhA1XB6p8uCzWwEDWAC08e6gI36i9u6w2R6z9e6kE+DdNA6/0A7Awh7MgO6ePX4jVQA3WeD7hw6wdwewegAcz+57KwELbQ7Cqu7AWx7YTe7Q6h603O6wHn6y1u7g+B7i1O7CyeD+W2boKQD7UeEfBe6PkA6wuBDJyOCwWx7/1QEHXu7tfeD9leELLw57A+AwwQD7cXD+auA+Du7ghB8IE+Axog8S4eD9ru5OoOcOzO4hzv8S8O8tLu4vK+4mPNboLw6Sf/D+Qqj+j+zhAAn+kLXxAJf3sGT+czz+IgPwN83u0zgPIqHg8c3/DIHvQTH/KF/vMvLvVLPvLyUPIrTvVTrwEv3vIqbm74Pu/m9uNGQA8qXm5mH/VcH+Raf3sU4PEzYPF4XhBhz+ICf/RAngwUsPffDuj4wPEG0Rcq3vYtPgN7T/RiTvgFv/Y/bvgUgPhojg8FgfQrDvKd4eJ7n/l7T/lD/vY0T/RKT+b9fuuMP/jargN1v+Kan/mcr+ZST/orv/gungyQL+tAbvVYb/pCrvhef3tj7+K/D/xpTw/mlvaE/vMzkPMtTvieb/t5rvj9wAAr0fr9oPdw3/d8fusCrwEC/x/70N8P8UAByTDx44/lig/94V/+8VD+Z97tTP/i0v/+qo/0nn/k9f/jtrD37I/lNRDxbQ8QGjTEY1Cj30GE/SjES7gw4UOIESVOpCiwogaJOpL1izeDYj8AE+SNHHlOosWEw/A9RAlx5UQjRiTGhEnvoJIERmx+5NnT589+KJFpQBaxZcN4tnQAZdrUKMaJDDTMyBdxxsaD8Sg45dq1n46iFpEtPXgU4lWvTIcajFiDqES0adPqGAgxH9t4Gsg+dIiwL9C/cgUzDAo1IcqXfAkfDCyYq1mWhh92/Ip1YkiSJU9K7ueWQeIDByQmfkhtGs2IMadRS20zgaB+OmPvlP/dT0nMBLFjxrRJb/dB2UYE3f7tGzfwnEamMW05tGjkiBRseUSolQIFrH37zri+0Tp2hNyvM2zsE3LCuxrYJtT6cEbH69cPineo4/re+OQJO3Roiz/5vYCC7LystoLou37o26q8ng4QCBeJhhFItMkMTEhBhRjyjzD69OtnQ6Bm4OwgXBg4KJ/zAuMvmetsKbA7v+Lryz4KyOpvu/w4io8xFqVjKh8d3BpRoBp0qAoiFRmi0UbqPqwvPwwZ7EkgKqu0cqLp8OvRxa8owCwzk556SBYqdVhsNIlMQw0i1Vhj06bg4KTNJiWWQ6i2OPtJYDmdcLqTttx8g1OJfgQVULL/giBKETy/vPuPMYZm4JJHHTn0UMqPCDzRrfWqa3K+7BZ7L0Ok5iNVOw+50y+upgYc0dPoGEqGS1SdclCDYSKc8MBPSyVV1fkujRRTMR/KZ4bEUjyTP4+0Is/RSF1ciEXFft1O2H5mVahZYiGqgYG8hhwoUSSXNXdbwuyLpz1S2+12Ik0Lo+gvCrhd7EuSwlSUs3DLtMwlitZ8SOCB6RHEzuB208m3goGjx7iYYDOizoRkY/ggQXKrLeNDEXJu3+hYJIzdyhSScV0LdURII8YgNVm+jqOa6kj2Uk5wv8UMdKjHnZda0eWFNGJ20lYNA0vesQ60Wcf4bNxvR7XUk8it/+cqlAhVofcDOp6sgaLrzH6SzkqvWEudMRmSNWLXIbR41q9rhSD9rsZ2Wf6JMFcPIs2vc91WSKlsN1wbZ8agjnmziXTQocmzs/VSJDARj4zKGnJFEyaZUss8tQQIdXg2hy/+M/TNgVMCttFF57g2P38S6i2Qy6VW5YNYRpVk2ktOhrpHdSCaJ02lGtUqy0jua3e5DRzVdg1PVigZn8mbIUDmDHMLlwelPuvf3Pl22feiJSe+7Oejz5b3Z83/iUxZqqthhqrZJ39rUNNGW+dI7w+2fFKRzxD3drGqJ0AS0r6KRDNfJW9/C/GImW40HpeRCnyHE9J6CIS8uGxHf/jSTP+xEkIXgZiIInsbmBEQeCKCVcwIufkcnuhkp8+BTjkVMxgM8RSozM1QdOaBytE8WKrpUGpwLpNUQxxVO1p5aII8PCGJpgK2hMzub977ShKR56y4tct7EPzPEquHEHyIiErIigiLsBKPjfjIV/X53ZReJS+JmDEroSqcEpNoMg/9JIztO0gFEYILMpbLbC5a2xETJC00buWK/OndHdXIGEIu7SPfCte+CNIpKkJqkfqxBeDYhsgIsvGL8HrjqNYWyfOBBHL5gktdUjIVqo2QImNQWC2FAxPUtXBOwDmOCwu1G4nRyXO1gRhtBHGcELlSInnBZAQXx7RauQtG34kU48j/YzifgNBKVapaHOPzL7ZZM0H1eo+MYLZFR1bTKUe51a6WGR/qfMdphTtnMqGYl15V6DrinGKGZiBONb6LImJs5vxORaMz5oieEBznP8mTxH96T54KQShTOKRMjmiPhFq0lkNPlUauoS+U2OThRSKiuJX5rKLj5KA89PUQ7FVJNHkZRkcCGZGNIiQfx7SlcJroGKCOzikx3eY2IRRUpH4ESEUVSDeT6peGPFV8TtTAUaXKFDK5s518vCpS41GDGkARMGK9Glm9IlCKENVKVu1qUkVEVmb+hEEtfSlMhaQBCpHlqzntB18hMg0YthWptRnqXYtaA7YKVrGLjSpUFwtW/4iglLE9wYVbKOQgxE5Ws/MyqyCRita0GjazmxWMWpmaWM5GhK5S9Wtp3ERarxAWtrOlbW1te1vcPhW0oJVrZ3M72coydbQ+mesqO5jU1v5WuctlbnOd+1zoRle6013tU5M7XexmV7vb5W53vftdqVYXvOMlb3nNe170ppe84lVve937XvjGV77zlQh76Xtf/OZXv/vlr2Lt218AB1jAAyYwfemKDwQnWMELZnCDHfxgCEdYwhOmcIUtfGEMZ1jDG+Zwhz38YRCHWMQjJnGJTXxiFKdYxQsOycNcfI4JxFjGM6ZxjW18YxznWMc75nGPffxjIAdZyEMmcpGNfGQkJ/9ZyUtmcpOd/GQoR1nKU6Zxi11MDxhTWctb5nKXvfxlMIdZzGMmc5nNfOYcW/nFaGZzm938ZjjHWc5zpnOdwazmh2XZznvmc5/9/GdAB1rQfcYzlgd9aEQnWtGLZnSjmYwPKhdaz46mdKUtfWlMZ7rMkJ6ypHMcj2PY4hjx0HSpTX1qVKea0pyWsqdvPAxbECMesB6Gqm19a1znWtdgZrWOk5EMIru6xkkhdYyJvWtkJ1vZy2a2jXud42QsINgTuLKhbTwMYM94GMSwcSe9bYt8aBncMgb3t8udbWOPe9zNZne73f1uGT8bx9GedrUnPWNbFFvGSel2uGO87ikDfN3/A7fFjImhbn/DW+ELZziq5X1jeg9Z2DQexjEozu0aC9zf3t54uPFB8ANMQN29/nbCRZ7wgW8cbTHGR1LCDfCGx1zmM0f0w20ccSFPfMbHTre+8Y3ycK8cH7U++QRgHXR0g5sYzx73uvBt7o7/Ox8YT0Y+EE5zrGdd63S2+QR+/fVhLODryQi5j3WubVvUFNYLKDuNNV70ooM7GR9/OcqXnvFOtl3q5I76yeeeD2BffeuDJ3zheT3vBSRe8YtHN4/PvvODy3pWet/73lMucnwEvu7klnXGw30An78d7uAGfDwgLXjDp171q1dy12mM8yA/ft62oPzbhU70Tm6+81Jf//nPJwB631f+8sTINupZf3zkJz/Hrp8x7IEs+9nrXfQc/3exQV70YUjf224HuvA9bv2X51354yc/8pkvY+f7WJX2DnIyiF5++Mdf/nA+f4zT3+N4QH/+++d//9tcf69rvB/DB/3zPwM8QASkMgA0MrpKQAd8QAgEtJA4BwqswAi8QAzMQDabwAqkQA38QBAMwUibgA70QBE8QRRMQYkjwRJcMRd8QRiMQRmcQRqsQRu8QRzMQR3cwQjjwA5UQSAMQiGsMhb8wSE8QiQMQR+0wCRsQid8wCU0wSecQiqcvyi8tyNTgE/QAD3wsXpwgn24MS3kwh77wjD0QjCsQjVcw/9WK0ImZDJ46MIyTEMci8M5PMM7ZEM93MMku0IggwcQ2ActZIZ0kIoFMAFmiDE7vDF4EIguhIUqMYd0kMN0SMQJWMRLFAhLbEQyrAcbuAEyzEQN2ERNnABIpBJz4ENVXEWzc0Mp9LFKtMN0cIJ3oEU5xEQa44cVwMMJMMMY4wcpEERQOMNFrIc+iDFYQAddxMN6MAFzUABQQAdjREZpPEZTRIdepENW3EZurDE/BDItDMQJiEVmWERcpDFY+ABsjDFfpMZpVMRbjERTVEd2TMNk5ESBMAd81IBUbMdu/Edu/MYf4wcWsIEwJEdzlMNxdEQZ08I09Ed4YAZgWMdLvEX/S5wxh9wHX7zHi7zEjsxGXgRIkdxDgfQxWNDHLkTIW1RIMYzGCVhGGeMHHJAFPCzGXawxaJRGe5TGm2THnvzFnxxJoVzDkuSxWRTETyDEcixHPeAHE0DFGnPKUkTGfERGS5TKqkwHgVBHrEzEjcRGrdQAegxLejTFqhxKtJzCoiwzaAzJtHxLuNyxtRwzSEzFuLxLvLyxucxLvuzLMttLvwxMwdwywBxMwzxMJitMxFxMxsw5V8TCxoxMyewxxZxMy7zMygTHLWRJHfNHGhtDzsQxz9yx0bxM0yS8zAyyc8yx0pyx1byx1hRNbTxN2ty61JQxQERKQjRERITHOmTI/1PMx0mMsUr0TUWcSk7sQk8ExXgcxeN0zuDkx9qcTqy7TRmLxZSkRVs0zqgMynYERmEkRjl8x2SESXZ0xpwkz2qkRpCkTvecOeuMsXA8yKVMSBxLR4r0x2R8x4p8zqrEz3oMw3uMxH3sx9l8TwR9t/h8yYKkz4i0T+JkSPn8hIfUxoicSNy0SJykUI3cyYh0zY+MzQQd0WRb0JOUxfpcSR3LyZf8SZmkyQz1SbdMz52sh5+0UV40TxLd0WWLz6McRJXESunMxad0TqocUli4yiKVTrJUxiL1yp1cSLEEy61cx1O0Sx7N0lxb0ClrSy390vjj0iirSzAtU/ITUzNNU/8hRFM1bVMUZFM3jdMPhFM5rdMIpFM7zVMExFM97VP+49OG3Ew0dMsJDUXSPNDORFQ/XVQ5A1TXDE3ZJNQY5TERtbFKZVRMPbP4zE0g5c1NhNTnfMRIHM5x/FTcRE6GXM5Q5ERShE55zFRYbbMFxc5x1M53UFEb09H2fMlg9NL+7EVrLM8bRc9oVE/13NVYTVZNfcwgm89SfVBctTEADVAZ209r/NUCncd1/MoCzdZLVVZw1bIFJUiDfFam5M6wVMiMRNYLpUhz/MgJyEhu7cgPnbFvDVd8hTITRUlzhVAcY1EdfdGaHM+glM9irdEbDUpdzVeGHcEShMwc+9GkDNL/JcXSmHzSaj3LJP3FipVSrsTYr/RYKp3SI7XYhj1ZJ3PUJPNVlG3ZQ1PZIyNTl51ZQYNZmr1ZW7NZnN1ZU9NZnv3ZS/NZoB3aRhNaoj1aRDNapF1aCWTWJBOEdRQEMJBUQUCCMiCyflCFVeiHGctae5BWQgTVHcOHJJDUGiNbs50AtI23smWyfqACbHzbIzjDte2xJCVVIMtaVGgFIrvbLqxblmvbwE1bG3tbPDTcL5PbMHxbHhCDGGNcx40yw1UAHyBcIwPcHkPcsRVcnKzcKUPcusXcI1NcJIPcJDNdq8RbLgNUqO0xebjaJfNasFXdAeRcHRNdGgNc3O0xyuUB/989XLh1NtvVMb8lsnbg2yErXszV3eHdsXiIXGODXjJ73p2TXiejXsq13CLb3U+zXhzj3uydMupVW8Hl3jMb3yRD3+L1MjGFhzTkBiSIX2ysWtidgKq1Whl7XRmDX/ydAP7t365Vhb2VsXVABQP+2ho7UTnsXR7Yh7VVBmyMB991XGXwXd8thwnQhgnO4ETgAWbwAUbAByKIAh6Y2wdGhwq24HJI4QvO4A3Ghz+gghIOQwlu3Hj1XBnTYN9FB9RlYR7AYB12XAWwAmv4XVPk1xprh1Q4CFVgh3VoBVRghyiOseONMXtoBQHe2gloBwNG3gTmVxEmYQq24B/24XKAYf8Zhl5lsF4InrE2buN4tQI4HuI5toKQ1IYO/mBGcGEbZuAGRt3ord7HlWEbtrEgjuMibmA+LuQJaOPsxQcQnoAa3mNtiFxtYAQ89mAQZtxCruExVmFJ9t09HuJExkM41uHG5eRPbuFJvmEHjuRWDmUe2GM07mRRRmQjjrE3JuMzHmFbnmVcVuRYpjFA9uQbO+RanttAzmBL3mMak+B9eNsQbls4Vl8k7jIuPcoJyIcxCMPWFYn6lbFv1t9t7mb7LQdujmYlkNQqngB72FrZ1bG3xeDBbWR0CF+2pduynWdtOIJ48GcxgGQMVoYzpmZsZF59jmYqOGMfKIe3vWccduX/fH7oZSbfhJ5nyqVkZ9axdWCHKl6HVWiHkEbedrYHVHAHr1WAJfYxgaZohGa5hqboRpbelyboS8YHQLDpEM7pcrhpQKixfv7n50Xbed43epZk6UVfpCbm4M3dfV7ojM7gaRZEHF5bytWHhlbbn7bnIVbofQhqgJaxh8bnetZqXYZoja5ntCVrly7frYbgq85qnD7rubbnlobbuobrSL7ksg7dmMbrt0Zrqc5rinzmyCXrs31qhnboph7frtZcGrtk6j3hih4zE1VIbkCEGBvn+pWG+EWCdSTnzI6xzE5n22Bn5O3oCfDabHVqPKTsCqbIuuVrqZZsRhjqtr1pg7bo/3yOMdrW7TDc5XX046/eY5lG39l25ktG7B3L2pXu6HbwaJJG3nfmWlb4WlZABQRu7Rmj7JfmbW046sgW7/D27RVehHjA5PNO7/BWBvTe6By+7dsWg992ZgVIBEHet6RWYwsubN9WbkYg67XG4fK+4R82Nl6265+2beplYWyM7d6W5Qtm7gIf8ODub96W8B/uXXqu4Qv28B9e2/AG8XKg8KMOXYMmcbIm8RtDXwg3ZACn7KWm662uMcYNQxlXajGLz2bEbM2239CG3XxYZyCPMdH+8cy2jfgVbxprZ9WO5+XjXBkn3eT+bwYP6NyeanvO8Ayv7ymngrkla74+buitcv+pZu4VTQUthm7ppmLq1uLrflyt5drb3e3vFnEml8+Ixud4WIRmUAZzuG0/B3RB//NAB2r5ft761mVeVGpHj1xIVmj/lur/JmsGpmd8ptxEcOb0fmZMxsYrj3SZpnLB7fSGjGiJNvADF/XgrVtT1/NNNzb4fnXwLgdaR2wBL98Uh+8Vh+8Wl17SjewY3+0Zl+RPF0MfIAIcJ3YdD7NsTkN5mFr4DfIYS+chp3aRmFogl4cfz7F2Ful+KGB74G6xXuh4q1wJpkiK5vO5fehQL1vKRYdIT/dUT/V/lnQZX224XfG51eB1RF92l3Q0zzFWcIeP9ug23+I3t24EXm1VGPf/V+3u3bb0qoZ3H1jHNd63Wd9oGG6GeEiEM/4Djwf5jv94DCbdK793io4HJn/0/EZbSI5bMKfhdt/3iKZ1Yz/1fTD3SMdIK0iEMHz3V1b34MXnntfzRt9oWof5i0/1o3dlno/opx9wed9zVL/1ig/uqsdDAUf1YC/2QZZ5ZVZ5vGZ26B1ioB9kZW5kW3fceeeBf/feO3Na1UxD+pUGHlaCz8bgqgUDQ8j7vfff+NVsJZdfnDRgA0ZpAW6FOB9bHzDiCj6CRIDoW9blFtZhjU7voX58YG7kEp58yz9wzz9wzOdtvb5l4obc02/h0Qdi1Ed1jobnJmbz41UAxD/p6p6A/+u2fQNmBx6T8RSm5+CHZNaf6bAvd4qM95hX/otnfrEP+kR33NL34xLn/A23/upXYcaV/Of37dfneuvn4aZ25ahGZYwHcM0Xg+2ffAbe6OBfZIgG3uQP//XH+Mvv7+wtfww3f+IXffMHCAU+9k0o2I8KuoIKlfHgUQ5fEoLKEmpryAOdQIIKKzZMePAIQYEWy4nkwcggFZAFOZ6EKBGjj5EFlZ1EqVIbyIMnGR5JBFOmwqBChxItalQogAnnljI96vQpVKLcEBWcGvUq1qxat3Lt6vUrWKIujeIDFLRs2LRqj2qr2RYt1oMa1xaFu9JtTbpCx0a1q/cvVLmABxtNyv+0KWGt+ZQgQQJmbuLIkidTPmrxMubMLjNz7uz5M+jQokeTxheTB0jSDScwLDdBNWzQphumjg17s+3cund7Zu3wNe/VlYkaPnxuOPLkypczb+78OfTo0qdTH1r8cPXs2rdz7+79O/jw4p1eRzz+PPr06tezb++ecvml7+fTr2//Pv78yeMfX9tPFSqtcGXPKv0ERaCBRP0XoFGwMJOOHhPwVdCEE0YlGEqQcYdhWBwqZKGFQR3EgxgKOQhhUf8VmNaJEW4VIlkRHVWhjP4hNMFHGsHY4IMupqiKPUQheCGAAqalYoIGAUlUi0cd5FFKOtbY1ZM4RqkgFSRe1aRR/wX/OdSQgRUJGH9/tWOkVmEWpCZRZ/KIIohT7nhUPCUqVOdfJbmmFp4S+qCSbybN1FBNDAl6p517TSnhokP1OQGXkUWa1ZxDVcroXJceVRIPc1VpaaNHTTqUl0KueJWba6Jy6jqoMEjlkkONKtSnimqoVa1OPfrUrCLGKhSbT6U6gT2rJtjqq1mViVU7qfTzHzvrtIIKO9QWlKo9rQC4YjuuosmKkQSOyYqrrrojLbXWTjCsrObAEyE+REShpaENlVOvQ/j8kWWiyiQ6U0ILJTRRQQpYQfAEBiNssIYLWyHlrRNwVKLB1jREEEdaAsxoPCr1OdHH6IQs8ATxdKpTvPOW/4hvOdokwgMzPtT0KCzu+uhrsgq46uwEyAqY7bZJBlXzuwWfts9YBJtM72WuTSzxyzEzkjJqSMs4EcssS9xQifpm6THXCQ8UVMbojGin1k9XfDGkNheFLCr2LMggueW6MzeaQ2G7Sjsr2uPsf+4AbSypYxYE95dCEe3i0m5ZZDa/g8qkthUWd0pU2WejFHZBjz69ddiLv12u3ADSXS4qd5uet1B7923g38+qIri2hJOnlHFarcOOm+vwzbeR2KbupQI8BwWuqqoHGabvfafK7ow+lFMljTpK/6m/Z8l5dctTA6JM92WB/5ZZQo3v/YehunQQSTJLPHVEGVE4ZccYU/8svTb3t6z//Bq1hadppncjvuCkY33albCMFDiFIChwxVLeU9iXvpfIb4L9Y18Bj1CnALLmIVdLSPUuSIWHXA8hFRRbpiLyqUfxZX0jFMhJ2vKUBv6qVMEqVZvy9rqesWNd1HogDvUWrgIFkSzlm4gLA8bCGrmwfTHMywRX+C8rKdFOTXTJCY1Cw8TZ8FQKKWJQ2LXD3fmQHUD8VWFwh52s/Idnu2sH74I3RAOxIkjkShywVlRHYrGKd3G8lpHgoYFBasAcoHoJpiyYSG3saSiMJNueGKmMRcSDEZKkpCXvhUlHarKSJesI5vByQiyOTWKNLJlKRsSDRAiwIaxUJSv/V9LIEREkaSCs0f8YccApOmVvSSIjD4dUR0ES0pC2siDBGBKwRL7vLrncoIze8kFmMlOG77OlbwLGqX3IUIqKtGZbsugUMpaqbnHjY5LMiccw6nBFu1MF38yox3UqJFXkBBIxB2nMoCzNXt28UckSRUBRljKUVOxcvx6H0LvchZQRE8o97Ug6dCpEnUURozvZAU84CpOe1lGjea5SvIzC8XlznMAecQRPoa1pnhTlYUnl2JdphnCRp1TICSsYj0U0Qxnm0CVPfQrUnv7UUUEtqtGWuRGCzkVPRoNM/UQE0IOiJCE59QERaklTXOpSl3ZCYC9PergeBtOlTgkhwnJU/028PFMMY5EmImsKTvgh0kogOeE/q/hNpl4lorHrYoL+uiSf1bOdBmqVO8pKxyARFpBjValHheLJpVJ1if7j60bClteF+mkf3mzm+5z6FL8CbklhEixjvVXYMLozdYpFaWqTFZRlYYUV7uidH03a0sV+MVbIo+gei3es3Mp0Avks5CFZY9WCVpCUActe56A4WQn9oRnxYKW+rIvd6l7XNWrNbne/eCO11u9JJ5xudCULqJWsFydzcW/JoAg+AE6zgm3lbFRStcBrERFIHT3uPsXbSNPsw2TLrJJOc4KQtjqXwAZGIU5LWV6EYLOq5wVJRfT61M4pGCYPbVOBWmUPBP/9LUjC3W2JL2pYdHqpoyrmbz9EDGBLFbR+GcZvgj1rwoI6CsMX4axLTKPhCYsMisIKcdxInAoTG0/JkcUo7Po7YrMehbZR8Z3sokVcndmto1xWF0pPmtK6nWvLqEvsWacZqD0ZioT2WoidalUrgaBDyHS2sw/qnGe7hiTPQp7Nb/i8EkJB2GiPm/NpHCISlSy6z1WjqsQUTFflSq57lawTp25KlC+7tliocKOreujipwBaIqjxSUny0mbQPfHSbj1NoU793DevmdWJnEiqxWYRHZMI14lm85tZUmgxBaiOC1rFmM117JQGhdPucHbPQg1cejp7Qa1gNlsOzS9fA2X/1cIWp1R7/RN7jagn4/7NtxOt1B8Vu3SrSvbwtoXtgp0Z2sgSNZXTaJz+6McrlfKLX6gz14B/heD9PjjCE46VudbHygq/iqbCA+j1PrziFr/4Xyb+4fQ4HOMe/zjIQy5yjHd85CY/OcpTrvLslHzlLn85zGMu8620fOY2vznOcy7yml9FTcHCSpMuVdMIRk4soRKvxqASca4IfXsbDzcv+9eloiv96FHpVYdWWpSfm6hHKbqSeG8JsRhtXK3JVWTMzX6kqQ7N6yjneVR87kWtBN3qUr97VMCK96LovS52pzHFyT4jp2Ol75rqu9GfTjZCQ8rtyOF6QbD+dbHv/ZhM/1/U0v8CX+hSRoKoVDxgctV1FL0dpPKJy+pQemZzpk4Bq2gVz7ol26G5jWogsWXWmga6ru3r0QHdnJZsT5DGIepOhDaZjhnBsrWdLEvBT0JUSS2vquG+aWkLm9d83ydVdm36YDvU7zt3/OYrv2nM57WWGEbgthUNTLULnrRdD3sDyV5A1q6nalmPZsW5zWH7oHrZsAzVRN0Aip+gaM6gcU0Bao2jcE5J7MP5fdKhEF/2KVg5RJ9kOeDRRCDxSWBL9N5dDQS4SWCJIOA2eSDUwIz7fE7ZoCD73czIwV2XmJYXhYnO9NDunFhfSE8HYVNNXVEJaVjYcRD4wAXC9IkRUv+EV90dDIFWZQVeXfBgEW5VCkEM+wTQZw2hFD7EEWlYEr4PEtZIE1oTpI0gsMTbiBlJHd0gD+ngaiWM8exWVJwPXIShjlGenwjQuuXhk3xh+DkUFg6Q1Z2Q54nNEyUhIgahn/zYUBDiCEXYIXZhIuphQJFhs/FY+N2JayRhBkGTjnnQHfqhy8ngUFiU3CWIG6rel8zYMcEVpckVXlTYo9RLnUWTLule+PXTb9ASE/IYLXIY6L3VpBEMLDaUms3i4wijLu7JAekeLzJTFv0iQ82QO91WvcWhKrJTRZ2THBoXISGXUFzSZPXJZrWQmmnPSywjkMXPQPig3SkT3p1X0yz/Y4Vx3lDAIzXJ40jQ4zSpnfkwIn4lTCIYoD91VZ3MVV6p48uR4oGU1vLU4KmkokrNnd9hzDDi4VoZY10h4UD0oS2iF2eBpEBkVS9mSkcCFAYOnkW6YxVOoyseoRWdZC1aJEjmopGN5NgNG4F9Sv7EXTXCUbNh40QmCLsgyUs9xU4R1czYSTky0TkiU5E5ip04FUs6SZRMyHlJFxRhU8dEgaaJ1+1NSVby01aqmSWSCtjtijJoBHq1FUKexJPU5CiaHr/5ZD+kmBvqoERCFiui450NxINdFVt2mCxaUUT8GTvqmYZwJGTM11SW0igd5p59HkpEHab8ZYH9mGACo0du/6RhIo2fJeb68VNMNuYFPqZGRCZoDoxlmko/FM+IxeFe4hD0lIoO9uWHcFcs5aKPLdfYIQw6KtdoFl98BSfBmGHYFeIoFdRw2hL7IN/UQU4jLadJtiTCnCVaCmE8DFhBtRWR2dhFDCfMMWRvvduXkFlBkFlelgtZnRWsDYq5VZp8CpstZVq5+QSgOU5HZBroXIR76USlOaKs8advREx+wqdPyGet0ecH2efX4Od79ue5Oc3j/CcVxJqiFdR96plFGJmQ2M3hkM56xl+9sec2upZT/OWEng3CtFmFGSdFPE6mccpMUlqtCUWuLWKnZFELlg3uoQ0v5Wip8ahC+ahZev+ooQnKjP6ahN6XsLFojILSQtKlzjVHT1bpgVCkyTEclnYpmVCpl1bGM3op5IWcxoUpmqoFeaYpm7apm77pX6wpnM4pndapnSIFmN6pnu4pn9apnPYpoAaqoJqcnJbpURpqVkie5UlG5iVHo34FAjYe6XFFqRhl4cyeVyAq0DkelkAJoMxJ07XkwuFF203qVlSq1l0q62SqlnaFolaJ2T3qqbId2mnF0EUFl0Yep+pb7mCFoZ6iWihqcO4gFM4U6CUgkmbc3+kFzewqG6HRUUAPq7LUURRLq0oqDNIKrVZerZ4dNUFF9BWisDoFGBmFtHaFpirEvRXFq27rt/6F6HH/K4WchmXeKlICirg6K3HkqU8GTUfpn/5FG4MMDreoFpO4DQoin04sX+VcDPdxTLEmLPkxrOWgH8U8jHgC32OyzQOiYPatDC7i6NE8bAU62uV0YCaKDlEQFsEeFuncn0oZ7LqgSWPBjYDIXg81S5bpn/x9muyoFoHs0MG2XwdmTtEx4Fl4n9W8RO5NDvaBIEHkCl+o7FCwbO20lqu4mwKlnmOF6KvYrA9Zi85CC8++ns/iTcIUSOwMLeMwntFqzPWlX8NezjEhUe8xpbaFjdZQoApR2Ac1bbA97ddELdtNLcLezr5lxQOhlOC4FLCy2OyckT3spRFtzP98ptE8UdgB/6NYdCEYYq4hOiGifdiTFGIhTiL1WF0haqEenq7nZqJT0JDgoOEWdW1vfYkvOVCBCFe2pCdj/dFLsSEwQRaMKZ0k9q0QguoWVuXdASElEhxwVmt/za7y1O7M0kqs5G7k7q6z9C5swZRYCW97BhHl7sXx3iF+meMnjqGH2lIgzqScCaKOnG9GMC8zOS/1lE9QRO9VFGpGudjjAtPuuNgdFQRuEuQuZklORqNCUWYDysQz8gUDS6kT/mNHDB0/YswmWp2F0KL70g8uIh5EkdUAz1NE2a5FXS8PjRWCCJfsmYtKNVlEYmMK79ABS2BBVpZAcbAt2u9AaSSl1eQjjRYJy//TYp2wCqte1natABuxC59ZDAfWDAtNCq/wDS/jZmXiD4cWJsLoW3XPQf0iX9Dje/owVwGx0njoECsLv0LFkJQwbwVwEY+apdLJTWLVAjOnTHKuo9wxSUKjHqOvxNSrTGJwWWrwu6LdTvrtS0xITYpwUDRxRyExtjgkExfxlyUWUAblqdhgHKJW8SIlFGWxZVXkNVHhXqFxQgjxV1btHJtwD9FmuFiyCjdxJq9LexZMKnTyFDMQLUtL3o0yXKLkDl/WXSDnB2twXi0yHqJX0oDiKxIeaL3kKqtxKyNur/Yc98ZmP3QLkyWJDr5Oi1GZl9yweDrmhumkZCoRvlJBae7/72mms2oKGWv8y0F8ppCZ7iPOaxXS2bDdM0oM2Do75z53lmS1ZutIWUe9joh1rZN1rTgDySavCQ3flpHo5Ser7ZIVrznXWG/iWBf3D2YGJnNJGGGi8v7uIYjJzpQtFkNzoy+lmApHtD1MNLFUdKpgdJI89G95YzHR2FyApxDmmHnx2HcBZngmplAH2Z41F3Nyj4NpZkkPZiiiNMloRaGaqOoh23nCsBIn1rp6mVY/RdlYKIa2j6c86IQOiv9UqKQFqIaqNaAdCkMQrqzpaC0djYQCWiOtWoHOq8PKNU3pddkQ6DhJW0dZ2xqe2bJNLhSvK6fFVtxgGbSkp7m4YWND/xtZ560YcBut+fVZRChPJOiNehuhYZPULqu6IvY8KbZj201mPzaJThTiULYqkJV6xmFje5q0bXZHQCmBmraSGjXYjTaHJrC4beh8JiO9IuisBZpwt0Q/Fq5q72viwtyVTkZ2F9yybrfCNbHOYSD4ZAd4f5ysOod4XzM2r9HKjWliuLe/2R18JxxvXyt4cArbSEauUkd9U2vFnbdz7DcbX/egFriBH3gMtjGCLziDN/h9/KmDR7iET3h0QDiFXziGZzhh+K9/MxBEdjhylO+A2Dfd6Su2nqrhXEW5nnh0CloiqzjYoeWnNoqAK46JE0mQ1DHOrCpllOm4yquNeGpOev9HiNR4qWZryHG49O40iVeGiG9FuqrKtTbJCf74i6GeR7WrSgP45UFVO1+zlf9IZAnRcvj4jS9q6Lkrl89hxNrqooRrQcvKmZOcgsfuKvjrPAGsbA/s1f7sq3AZzwA6/fV2/V2LavGu2EobMK8wzq5LabFD2c4f2gbtlLtNFlEtRAFtn9suYaGtwHIj/xGt23K25ASu3FYsWmpMySKg1qT2XHAepkeypgfNp2utksjssNRsubSCpwt6wuzMoFvL4AhIwLZL0XAgoQlgg84t0kAtURQtqQeKqV8sqjuS4D6aAiTCwuh1x1Lg3Up7AivVhMD64RJqnVera9kWAH/4bjn/EBre7n6p1P557xrKpr3rTGLR++QSkdqq4e/6Er3h4Phmb5OnsxtPr+Q69PTervXOyPlmofqyD/vyXUxSohbLif5edT3bpbtXr5TZrpLg7hzp7mvqNpDEe7zre8JHOft+ofoqV8srovkCTBKlr1Ou7wq2b9+SECVupyfp84BJoiJWSMZvzEwgtLkTuF2+1h7JMQu7lDo9btjCcAFb9pdwGZq9cLqn4dS7VhtJMSrS8ESty4rc8AmO0yvzVi0XsRJPdizj0zcGGAKDMcSfMRc/nR3aaCmnVziqt1FIMiwTbxLXsJEAfsnTEelIvdY37mHl+6mYfY3p3sv7mnXuIRYP/3Py2n04hbRLXiRrQCDGSjMO50s0bXBQW3POKTkcf6/TMz03jzOTJ4lNK8mpIEnxsAJZzT4crUOQzP5Igb0u7zQtC22Kcv7Kpv33rj0LOyQS2zHZYL7NG/Pd6wrmwiTasfJWGD5sUfIss/Qlj9Uto5bi5/IbOz6Ii+zpW159PnVdkeXz63AqT39RDFyDqpshB+cjOTLq4xyHw2bsAEQ7VPYmKEjVb0JCgwgntFvVr58qe/YeTmA18aG9VPYiuks4oeNHjQw/gpT4MaK9hao8jiypYFUrhC4/snLXrpXCgzpJUuynkWDDivA0FNVgrqRCH/uSNi3pEKJEnxaD4kwINf+lT6BQ1w0kahRpUnxLP8Y7sk8bD3QJ44n5qIDsBLP7+lFBB5cpSipny7qdgC8JU2Vr5fotGPdv4KSDPyrj6zQpVqkVL3IdeDXnBK0bMV99mLIdu5KbObJEaTohTc0PDRJcmPBr0bAvEY/NqzSv7Xhq8X4ELJhwSdtlz6Yl3PZt3Ll17yIGuZfpcru/JwyOxyihNkZ1y+ntnnA4+MBw1/YWfzsh4/SPIbd3/x5+fPnz5wOYcA5/fvqaUfUXbRGVVS5KiJX+PAIQFY+6QkW0qS6KKMAB7elvpwlR2WnBgRToj8GCOBRtoQ1FyzAoVv6bgMR1PlPlvwITfC0hCAVUicP/BOGDi4cc0WtvwQYpo5FDBf0zKcLSUGllQPjSyhGdungQYzAcc/xOmSknWBI782KE7rAceSiHuih98JJKK5kTTrHseNiRxyEdNBJJIA2U8aINg0RxSDv7M3JG/i6ciUKESLTQRgINvNG5JdVKz8oqj0ikudvCDK4kRZuk4kkxyWT0yytzzNK5uh7DMjHg1PttLB3/GnNNT5lMtVNOuzvTtzQ9ZXO/XHXdlVfI7MtPv16FHZZYp/qpqNhklV2W2Wbhm6ux79hiz9ld1/nv2mGnqpbbbr097z1o05NWLmq/PZfZX4E9B912ey3wQHflnZde+bTLDrvGWq3XPUKR7XVb/34F5pe69+69Ml9GcR2Y4abUBbbhiCWemOKKLb4Y44w13jiph4PlGOSQRR6Z5JJNPhnlkjzGL+WWXX4Z5phlnpnkldmlGeecdd6Z5559TshmZ1My6d+SIMxM3qPbg4WZdPSQr+BqzxQ1N1szdtIwfLVeuumncw0YMgtPTFZp+oZuimmn3Zuay1KFpfW9qHc9+OCE0vZ62bLnOzupu9e267nH5NYVbvcGz5XuhJ3ye9igm+X7PavqlXzxrqG2+nHAmzo8WVjJ7RU54vLijmu1vy66qZCqpVw+yD9iHLLCa114b83jxnw/cUm323JnWY/Pdd5Nj912NGlvvfj2OJ9Pd/8qPi8J9l4dp2/BnOxpRZUABeUQzhizP/IjyqtPKMOc7DwIQvCvz76i8xESqMPOIIPFHHieVsAKa1TdjQfsqiRzUvjT35rw8QdMmYstn1ITk7DGKSstyS0CVFVTIPgXA/LgLHCRlpOeZMEDMkVK0VEgWwxTuKgpwzD0sx9kxrc+7VGEfe8bkkmCgifwwaQrO4GfjxByERciS3z9yUn6MkOixdXPa/zLl6UaWB0vdaqCEtxXUiwllxHyzy3/m5IUmVJBbfjlXiZMkwrxlpQWYu+FP/ohQ4IIPiKSj3tHXKEV+7dAtTRRi1DMUQTzN0EqemktSkxgB/NYDi66yi1f1Jr/GG+DwtchkVjTk49POjIhd2RlRVVBmvc0mZoVucMnC1Gd0aSSoJSM8noE6mR84IId7eADEOlZS8EC6ANXMmIs5ZDdX2JZHXT8hlahc1upuNNKhG0uMNzJJXOEabTp+ECXdtkdL2VJQt/0siTqqU7W+vVJS2bFRjZJJVUydBBKskREKGLHOH2oRlOepCGZOWe8MBmVGiqvl4MBpuaESctkOs+YdZsdc2ApSy0NM6C4/KchrUAXKjCloIuhVHvm+c3J9HAi71zlPE+DEXvCJ6L6/OdxDONPhxrSlscUy0hDGinjKeWW+2SoQyGKzcYEx5HNkmR8sqXON2XrbJRz0WXi/0k+bK2TNeYs2lA9SpWAwe9QRZ1AbI7SFC3xz0om9aWWJtUUrH4pjPwsaZoSd1AqLlGhwBGoE1+lGJHe5qvfEeZ1KPg8nh71TVO5FlRtdLaeXgtGDakRKNX4I/n9VTRMBapEqDqbsjyxHGEl6ey2ph2zVgo7zISsE4NTMC0lzpcRpSsV7doUxOa1sBg97FERNJDF2qOxXoWsZK0JLpVa1jlnfQ464spZyh7mNqDVZy9HW6nSLmun8Dntj14rv5EEtYhH1VNL/vXcizr1X6Fpyu/ac1XFDbOWknLrROWiONoW5rdlzS1m8TUpRfpmKQQdb9SK25eyfPdKx3XPcjGqV/92aJeUQUFsYAHsyf4aVqqnRZ9Emhsu82ZWrOlF62U/Itn6bokvnkUMaK+jjePgVxv6/Qh/sXtg1SYYrwu2R4PdU9/z9pOsE15vhSHMW/xSDaEbRmt5PcwWEIu4WMmNXCbfZJmNZoQzUpWMPQpskniR5k2o3MlTMhPbpHDVOebRDW9qM97NIWYuxqktcKflUJfqhS/S+eV8fdDZwIxlzcCZZnjsa9ubNgaBTlkyavvRGtXQ0DP2DKxqRiKQpiZJcntGMpMf0hXYGqWqYgFzcRaFXtyUmTkHxXGY1UJnvZQnLlc9y5nwl4iq7Uib7lF0fw9i6DfJb9VbabRXIO1Y8Ez/Gi2VFqZ51KxpLnH6l+sldahxTWormNrO1VzP8Xgl5Pf0aDUYPVqdBksnOdkI2nq6jIUWXKRXc3t7e9J2vLqbKEDKyomPOrPbUl1hQGJNU1Zia3dI5etRKbCrWI0mBiHVVVh1EZBS6hQj3c3sEbvJnTM0It+yPWU47glAM3rTuG0oGmtP+57tYSKmoNScTc3bVaBCD47hvRZLSSlh/0MpekiVnoQRnKcIV22BJP4jikP74tmLU3w2nimPy1vlISczmplScldxeYTzPmjLq/Py4kUtLQbXlbMjhtifXT0p4qoOubSOda87Ez1aVwaQv86wuoSdPWMvSdeTRfWG+Ysk/2X3GWj1JXW546xKz6P73S2WdwruuO7OcjvfCV94wx8e8ScbfOIZ33jHPx7y1Vp85ClfectfnvKTx/zmOd/5+Yy9mZ7XmOZH86+IIGtbeoNP9ETvreUh83hRe/1+Zi973M2H9QbuZk9Q1x7Vlz7uSfn97pOVe2elirwWM37kSS+S3js/7twt3dNglefWE2v2L1WerbI/n9pz//ZOEThTjA+2pgTM/JHbJPDVP5/0U1R787McrLhZ9uVDvvmtfSf49H8gyu1wfiApTLBDkOjojjClg/AilxSlf/BnH8ijgDhugdwCVtaEgyhwvByQPOgIv4Arl7qqgiowUnJJA9ssPf/qLzl0JN/2iK0eiAW1IRF4gBlsCR+IIAowaB8mpZAKCZE8CAfpCAVr8AbPQgchiwdD8IIyyDnIyClgKI0waqgSJAqFRH3QCIgy442csCIAUH4Eq0PaYcHYYQpx6E+ycBWgIgBXaJ/izJc4ML+u4zoCqKHIowTJKwI7yA0N8FJYUAGhiQFdiQXvEAUngAk3L/+ijcqgLxE1IzOSxHDcCkzyKZC2w3YyzQf0wQS3xgGrJNiiKc6Uycu2hA2jpKE4saWs6hJNcFJkqpYwsTxKsdJyKnWch7LEBD1Miju04QjMoi1yaev8DfxOTZmgyRJpxxfHDhjFSxidZ5nsgsLCJpz/CEu10A/1vEmjupCTLMkiQKkRN6ob1UlytiWdegrQhCL4IOM3FHC+JDHE4DCttgoW7yIev8wTT/E64MYSXZHGzmMYPfH6HOY+1uV0og9pwCbRBsvKhINV3KK3tONMtMjjyOVg8EcI2TDEEgdW8gUiRZAibZC3NuvKxuQ7RBAjM1AkFcIKKhKkgrENOVHC8EU74FAMqOOVvMz28qIkgcO3nIIm35ExbrKyfPLnBjEp/OvbqgtZSAzRkIap/Iuv/C8zntIkpkwcHa61qmIoau3L8I1V1CKu2pER4rAr5bEiOzIK7FAx2nGzHBJwIBJHJBLwarKLyA7zDtEgC7JoEm1s/1YSrr5r7AgqvpzRB54hayby2NBhOtIystBqAG1DvoCj1BDTxtwDLggTXAYjJ7dqMP0iMpOHJ1lSPXCsYBInJsNyJtNSKIdpmDIzNLkkBFEzGV8SYbpKFOHDKA2LGhlCKTdKxZxyL5VsLw2iGhli0FQs0OIjTMBkvFysHNxRDiHFGQ/TM2myOf2yHgOzOSxzH2/rHUPsHzsmICFmPwJLqgrCKsPR4RLyt1blNvDiMeEML5QhYSbSB8TgMclDzRrzzdqsluzzmWgnPrFjUvLTJPdBPg/DPwlDFoWPFm9tH3YjOIYtL9SsNHtxPPhzKSB06IaOQHWyNlfqATH0QRdFS/94bdQS00MPI/mKMqkmotUuI7BgZNWowrkWLZQ24s+k6s9sQnJgZNAW7TjV8zKVEzjoDCzj0CQTFC4SFPYgEDHcE0XhcykOdGs6dAO/8yMOEUHcgeK29Obi6HZYDpAQMEfO4oAgBS+MSaXIAzDljVSqz6H4bRSb41JM7txCMkRT800LtJXYVHMWVNJUxVHQlFVSzgXrqEJnslAZRd3QDeT2FDIXdSvrKN0gxVGDDlI1k0nig1BapEgMpVBchAp5iCrGzdo69eE0ZLBsyLVWxFNfxOGsrUsNZyHZzU6Z5A9rqU791A5Z5TsshUxx8EwjRU3r5k19dZtQCFA5T0sj5uz/kk1Xug9Lp5Vat29hnlU1d0VaO69ZcWZbqxVcq/Vbh2Vc6zI8PyZc01Vd15Vdc6Vb2xVe41VeL+9d59Ve7xVf765e85Vf+9VfZSb/3k8RdQ94dC5sns97+I9TEVZX7k9gjG/4eMVhoad3hM9gCedife8kTu8c5U9tmihb+6Ziia9YwIZjA6yjGnZkeaVcQRR58LBl9QIPo9VWcIxX2Mb6+LJ2clZ6zpVl6ENgCRYR50P6hrY9irYJGda0ZghtesdzGOb+kDZXJvZ1VnYRd0Vqy3E/YAfGaIdqjVZblJaTUnZqrZZm7Q4dww8yQidm144odVZZdulsGyZgVyGG3mQK/6fQhqzHCtkIC7/Heuw2/riwPAEQDKNCDAeLDLvthpCsY5lQgyqFBXfDoXDpgtziAm21DnPVagpRz/5WiBgxhlh1/ewGkrioqzx3u5BmfDykDAE3fJCGC0mkbBb3cSGptgrpkFT3JQLFCc1nFXIo3HJiHVqBQb4Q4QxWb4zIiABwjeToaWBQBlNKkO6QCOfLBnEwcw9pMdaSBXuwtoRQexGQjwZoYYSpgrrEAsm3Bb8EZJHwg5yi5zizj1qlAEPoCPmwfuPUMAoQi6bOZ2/G/aLxKHmPISrqGsszGwn4G3X0G/dKnpBlHE+Eb8hzbbNGphAGOZoxQlEUHg200g6mXP9/B5wu6aIsWPxSSi7bMD7C8ZNGiWzDsRvPaZUmWD66FqZUam1Qgz9MmEZGBKmiwh1UxCFwgp0yyodr1J5o+IgtKuPkdxd3cSYlkYNXEZq27tMS6jOXkUh3h22vWO1EUYudgm0Xapo+LVvL+KQ4GPaCiTNVGJck8YxxEaDgOHwl8Rnjo24FJYhpNDeNyqherTybsiL2alWVbFUjgiol2CqZasREQ0h1mDufo1WoswWDLeBS0iO3Bk7lQ6i4h88WIpK5KhThQ3JIrCbA9CCDpMF6ND21kozHKi/y+PyQEqMCC7H26r9a4SkF+ZQtjsGAmckG600iOVHjahXnCzUvmZb/RxOt6E6Nj8ktZ8xtg1JuIDKNwYgxS3kf3fjSBmlK5MaZ8cWsQqe3XBKA10WAJ6mQ+1hCbBmQfQrB0HOJ27nJYC04U2E4eUIkjBNFShcy3isoD4MIIEoxHdODSRE6CUOEIdGT5ak3be5OEEUZWdiUoyuQq8uf9bIkWjkzUDhcZPmbF9aAS9Xhcvm/drnJfBmjU+K1VhrB3OOYFSeZixQ2sbOZYwwmAS+aXwmnqbnOMtNBz0RuQoc1yevF3rgvtc+21GtHzPnG2oY+9tjPXtQ1HE5GiWyeI/gncLRFc5SeS4JHP3rKfrSrCYIVkCaS4Ux0HrI5MTBE4wzO+pNWGlow/+jShc+6yMZmlGsjQyvtogPtlHiYNJzL4YxMfgIrksfMPGjZYp/M5g47k3TZiB2OpQPN0YyM0H7EmMPSNOnMikc0ziBwP9cthSf0RHkrtcP3QuW6zRzbnFN7zkp7Qy2tQy1adMTM0rDsNs7YRM2snP3C0z50qgN4P1A14pJEVEF1VBGR2oLkVD8kVa+NClsVcZk7sKJbup9lU0hFFyv3aZ1E3XS1rvOlk9/DVNmnnW65Rp4YFdFjUFe0d+8E2vyk22bkS/cE48YNpCFD4MrkSxy7KH03suMO2iibeEFZoqFb5x6kwQliUGJa4zwbOSylq+I7IylZ3RwbU0eo3roSTP8WVbwJFUBBXOhWRUdGXEG3yMQztd0oueP+e+nO7d/Q7cPbs8UDTlL3Y1+ptW3nxer+VciH/D16fFp/XF7gjsiXnMmz1LibHMqjXMpH78mn3MqvHMvnxciznMu73MudXJ2/XMzHnMz1uMpZVm2RPEy1VW2J5Wvn5c2bdngm5s3f/GRTdluClhDNNj7KT2nvnEXjLmjjXGTnfIfFdj+Cp3IMvVhAltBPQ2FXb2RxFldAVtIZPZLOnM2Nsc2FpW3V/D0evVhUpIcA2m/Gj5LXpLdEfVhUBw0L3Wv+J8N84DFYHc/3efo4hQC9l1L9vGPZWdAZlnFkvegQUDBGyNYbHZ7/Qp3PiUWYkj1rKXbO5TaWca/ZezbMc4cFCylzC2kFZzbrFIhy64IRdHd/M1d9czB7y1dVvCgGZ3DXKRVtcHe7Qtd1D8J2vfA/nLdvO+LV++Z0EeOMa5N3w8fe3SffuZDfYyhErPKR1FCZxaXgabQgHiJjSWQKfzcNnyZ0tCnTGmo4Jl7j9Z1IWJdDWkHj9XbeIV7OGtTSGGPivXCILlZPdGhIivd4R8Tem5dpAV4NkxDgEnB/pRfe0d3SCJHeXyJ4/2RvY9fg42flvWZ+t+R7jz59FcUtYl5Y8u+gBoeo0yS88KmaYlK402SMd2vOiFEwY2qhdJEXp1jZ6CO7eXiC/5t4hq/RQtz7va+p2m8kVum+Q67F7lXJieOJHClTRMssPmxC8KOSq4cmzxNYpiPoisestqHRh49YiRei8PWcNoItB21KkSIXvR3+d9qhJbqRiM8Q5b2JyBqYVutxoRLK7aUYjY8evQM/iF1dnmDfWr3ZmSaLmJjxQtG22TQ9PtBZNbFZqxhD+cN9U5zk1Eb6koHSFrdTO44ZJPejQIIiYAhssHoZwdIaNmCZNiZXDMbkMai9KbpfaME/SMRftU52sXEErnh2xNzBRADslwEtzwFiVb8JrOzB04BQg7kJDBv2o8KDR6JyDB+iazhBGyOMHDHaE0jQXjtUJFG5Y9iuFf/Dj/0UpOrHMuSEmBMOJlzYUYEPHvsmxBOz88i+hxEndjzKCpU9jCkxKlA5YWRJd+vYtbPaqirDqlr7qRJZ0qRNhDgx4kvSUxk6jQw16uzZllE8uWImKIvI46LPukdzvmyodULgplHDuhursCNbiwx/NrwbUa/jjBspn933tq/mzZoBTDgHOjTnvg+FTrjMEJ+PoVQuoj6N1q7e0nAxzuWokwjc15lTr7b4GnZadL0px9U49+ft0Zy9CqQ5weVAlOyYVm8Ys2DUVapOMq/YOh5P43u/V1T1HCRD6Q2vWvcIUrvg66NV71Mt2fToq+xauY8KVVdfzaRedkt9x1h5DWn/w9doBv7HFFQKTEXgQNpBx5l9+InXE1vg6TWac9MRxlArI9I331UpBcZVdV6JhGJ9sanloVurLSgXXfYlONlo7G113WBQQcjcYq01xteORypYIyM6RUSReVJy5Flook35YXQ3CoeflrutJh6ICZq1JUPKlDNZb8Vdht9DUQonW3HxCGURcjqWiaVDX3nlXXR/rfTnTIEayGc7LyFWVk4+oIMPIGZSNCaCe3bX0I+CTncpdvEdGBiiHU12ZmP6cWZPK1ax4h1h7Qi0jlJ+Tmegp31pY9qYyjTo4Kb2BIrSkCga+CpDstrG15mNPrrgqCEOCGB7fe6KaVUq+ifQi6v2/9OqPdA2NGxDqKk1J2vElWnnT2wuiuR3ll77Yq+AYtqtqPtok1e6XKKrYLgWLZdnnlVaec6UT/JQmV1QEnVEInpBRtFdCY8bUcEc0RsZraxVxnBxCCt82k48fTtubRlFTFlydVFcr8AlXWcPSS9ZKlhJS7VKkrabsgIVzj56rBfFfDFo3oQksexyS7zS7CrSNlvIaYyaEcWDUAPz8KZmLmmbij1Ck+SOV6i0Il9SJgHL2ZP6Ae0bXhL3BazSW5v09tIyEcR1iBBF3WFEdZktstUrR2fY2ycpLS1WMaPioipfa6e0jMONTLCXOJq8McRQ+nj00IBT2HhzEImh1tTlVP8uOuQbTQ1iv8z9a6Xqrr8Oe+yyz0577bbfjnvuum/GotO7/w588MID3+TvrF85fPLKL898884/33zLJKkHffXWX0+7ahEpi/vxoGEPfvjij09++eafj376zHsfsPruvw9//PLPT3/98bNvf/76729WPP7/D8AAClCA+DgKPgaIwAEWkH8MbKADGYK/B0pwguDDhzzygcEManCDHOSgPBborQt2cIQeBCEFT4hC8kUQS+06ivR8xxGvQaVC5oEOhqYEC2akQw+4C04Od/gdmsAMOiKagAybw6wYogdTR2khDnXIw7StzYifM88Po6iZeJBwixrcoQbjwREtZhAWFKD/gAgsQAFncBGDYEyhG99ovRVOyYkY4ZOUSEQT6X2NbdS7oZSu2MPYMASQzBEir/wYISQeKE90tCIUwVO1T+GKM4TM4hq56MUMtrEhYszHPVhAjzGqcY2bhKMpTyk8OX6ncVK5Tgu9tkeyEUZsXGPJiwxES5PkcnAkUUmpFEc9jMDCHPDgIdT4MrCeJNMnJMPHH6oImcsNs5h9QRrYAveSlrFjl0dszwxbuRWZyUcBAlEcVH6JCpA0jmYqGWcwB0nMKCbomJxskHh4wJd7VmaaelDAJxJlmzGWUQ/vgAIGQ2EOMlJAD/ewARpB4IkyUgAEoSylTzAY0TJWwBz5gMUo/xWqh3RQ9B0XqCgqT4rS3KkyV/24Zc7sgbRA3XJT7lpJgQQiHWDZ8KYt7U7LupZEu6HDTQ6hwpuOJRvVjO5IwSEVTv9iyAl5B0MkatZMXmrLr6CqKqWq6U9n2tOl8Wmr7OgqZ1A2niwpaE2Okk1OPsGMo4ixoAc1ByjvsQK65iMUxbiAOe5hAnNkko1hzOAnQ4lBj+ZDrwjdISgQa9GUSnay/voMwKYkILBQyIm0lJt88Figv+m0j+rpXawSkpiORJNRgoRTY/BCNdRogyJN3QxL2CPEutmUiVVVlWEyuw53sMIq1yGMgYAbJHYEd7hXiZdaDRYZexlMMrCNZENggf9FTmIwHRJNo0d3yF2J5mIFoWysHr5YWAweVpT5CG8Z1YhdTVJ2vvQ1z0o5k1kiGZFZ0ALr3EALq/i4Y7SYoolpaZqh37QmOMHhF5xm61ofUYiGfhqupng7Q6sSKb/s6M9/jLsp5AKJP/6BYQyXpCTJ4Io2Du4LLD6Quosu1qCGlcJj9epJ8u5VsENAb0DVC0r24ri9elBsPiJb3yQr+b6buVa2tqWnA7FkV1jrx0gORKIfZWfAL7lysNbzJ3Z95bQ36ci5hmrUoh61TJfRyUWKwxn9/kg6lPpyTb0aKCcrpVSnStU5N6VnkVRrzKZqB6qcS0W9nFm6H7KP1eAqV4H/UqACofREjzuq0XnoGKH3eKhJf+zJIL8DjROlh0Ir4AqK3gMF50Wykl9NWSY/zZyMk9l+D+S1VWgnKbrWmmEYIrYBlyRn6QybboN9uOqQbTOV61hEeqK98aCMUR57E8MkbGu6we1liAM21wQnuMMpRYYFuRqVBUcoWs9Mc+bOGnPmCZGHiW5glZk2bv7Zl05e8pIW1fe+OehqWAv8pLIeuHlqK6XeGTx7Ivz3Fj/IEQs6vIQLrzjBLds6i+cJ4TUsyTs13q8DJnDkCjQgyUluQpCrfIIFX7nLXw7zmPOv5TKvuc1vjvM4Yhx5Oe+5z38OdJXu/HtBL7rRj470zdA8/+lMb7rTQb70p0t96lSXbNRlVw8n9O0oCgBFjHGX9a1zJB1xjR3Zq472tNP36t+pRx/4IYWth91HXgfe3DUDD63Lzp8AVbvf/45Ctk/AFoQvvC1wgZF6PMPtwkIID+thgxtogIf+dDxD0oEQGE8A85OfACz0Ave+wf0XGgBBTzgfRdR7HrV9j07dL2/5evDhE52vCULiKnva630Cdwe873/fQMEfwPCEP0BDOI8QJ+hjBbWpR2C7DiLoh136Wuf7MMnOeI7wwwRxxX71/zl9fPe+I9nn/ffN4XxzSL8Pg0RH+qF/3a8Df/70f5/gJ5AMwydj7MQs+4v1Mneft3oaAP9jZwd9Z7d5OpRQuQAPZYcR/MB8x1d2ZIeAZzd+HNGAEnh5zDB36UBMrBeAIOKB9UeCJZg+94d/hLd/lUJ7CRFF/qR1IVgPzHeAcVWDGwgPuUAMtKAO3Wd5EFgbFahDE4h7u3cUGbiBG9iB/Zd4eieAl9d6JiiFU+g8KIh/K8gRn/eE6+F1MhiDKoAOebcP6QBjYih9fGAN8MAAfQeE3FJ9XmeGddeGfXF3ceh+WscPLOB+EcgQIRh/VAiIgbg+Q9c+ewcK+yCA23d75tcTn1d5TuAKxEF7RXYRnBdXeeh+YNgRcwh7GjCBizhIZMF1r7d5i+h8oliKBHiHjQiARij/iK8Ii91DiAYnhkdxgaMxTLGoi7s4O1YIRwjIEbe4GcDIi8VojFLii8eojMv4c8nIjM8IjTDnjNFIjdVocNNojdmojbE2i9vojd+ocdgIjuNIjg4kjnlyD7MgMukodtFBCzqQC32hAO8Yj+tBC+p4FPwwCu34buowDFE4Ae9wDu8QhfUwBe2oAKJQA+zHHAbJj7Z4kA0hkAR5FPewDUzEHPdgDMNQiBgxka3nkL+jAPtYKSSJGwrJkOQXkfKIkrhhkg+IAyKTkCspj/sYkppxk7xHk7/zkebRD8mwD+yIEULJdfQoj0Zpj/i4iS/5iueIJUTJEFB5hPXYFzn4Hfr4/5ANCZA9CZEPCQ8pyRk52ZA0yZUcYZEY2RzqIA+aUZaJt5O485UYEZdVCZZumZVzyS11yRD8EJNYEpdiqZLN95a605ZhuRBSKZUdYZV4R5WcgZW66JRthw39kI6uAI8T8As6oJk6cA7qsAA6UAw6kA3C0pi/0JiLOY+XOQH3kAvvqI5YeQ+imRPb8A7DQAw9UQ/DwJENUQ9bKQ+9KSw1sJAToAvCKZznIAwMKQzQICwpCQ/CyZw1IZzsZ5AtKZ01EJ3PiZ3EaZw1EDDv8JutZ5HI8I/RQZu2iZu62T79oA70wJbhuZc3UAM2sA/VOZz6KAzz2RP5OZzCYAs1UAw3wP+c2hmdxFmXuuCeDYGgDMGfw1kTKcmf1DkFCnmQCTmdeckRC3qd7MeX9SmgFsqQ9TALFFobC2qfBxmSCFqcxnkOK3qcExChvDeiNTCYE8AP8kmfGxqcDgqevcmeaxmMkymR7lmZl5mZm9mZnxmao1kTpXma9Zia9ciarrkPsCmaPwqIkTka7yCksXkO80ikSqkOs/AOZFqPi8kQpimXTxqVnAmm+qgPotCRlWIM33kO92B8AZmgwMkcHWqXe7mPIwkXc1kPt8AQCOqnfXgDXyoK9FCoh+qohkqc7gmYmqGR8sCe9KAAdRqQd5qn70APtambt+kjcsqbi5qQ9HCjzLn/nA6ZkMg5Be8Qq33wqJN6qGCZkyHpkIlKqBUqp/WwqMRZiKnanH+aqDaKA/oQrMXKe6jaqH0YkcAaMLpwDilKqTR5k676q86aoE5hqnvZl+DKj+zZkVyKKWe5mm5KC2EKF2Napu9wpk66pvOarl+6rnD6reRKhVq6GRQZlfgIDOzKEOqQDfBQsPG6GWjapP/aEwHLD6LAmfJ4DM2nm7oJpHyamxULpBlqA92akwhaqw+6oy+qCx0LrT2BoNp5nCrrnTqZlQ2BrqCqABPLmxU7DGuZqX1osxvLm9gakYgarjAancu5nPAADV/JsnPaEMLQkUx7sryqnEMLDSG5nNw5/58JipcwWoglm6A32rIY6rK2qrUnK7TWGrZkK7QMOrU/2609KzJcq6Amy5Y44a8SCaRCGbCrKaYFe7CkmbBsqrcNq6oQO6d1W4L82hcaWRZ4K7ATQLAGu5gKq5iAy7j6uAtMmhM024dKy6fqIgrRSpNG255ga7Q58bn1ybalyy0FirajEbOaqrm8N6c5O5aCibKqGrRVK7RFe7R9oLqacayJ6rVfK7JpW7YR2aoxSazFi6wyebp86Qqs26u327xk26pse7Znq7vXS73B+JYzCRfg2xe1SQ+K6xSay7iBO7B8G7mNObn0WrmjcLkcQb5SiLhs2aUA656P6bjsi7ANof+m3EK5+ouVtKC00RG790CqiYcTGWuxVvOswTsKtlAbhBq0ldKo1loPQbvBInOsnPG6M1sbCiwytOvAN2u6hWitxwoPvkoPvPuVHZyhzim9Bfq7pOvCu/pYDgl5WEvDpou7cVqI02urv6vDjhqT8GCywRuuLYwZGYy94vuqQIzBbVsR6lCuQiq7MKu/NmqSj9u3CwvAgOu36uuw+2jAV3zA9He/ODmZ6YuZmtmZ/vuwSJqm9VjHcpzHnBm/VSoKmFspsRuQFaupG/nAjimf23moL0qc0Tm8LcufHTu8zGm2keyelrzIxGupF6mnIuyRhGxEo9t2OIq6t/vB/MmqR9v/uzAqnHKrCwy5vNHxrPHZyqqayJAMnc2ayxY6BYh6y4zarZPcvKv6yNXKtrEMrLnMnb2coCvaPs7MyttptuKry/QpzMIcQ2pJfpNJu2acoEc6x5CbC3vcPgFMzuTcxw+bDVi6r92odoKKdCHLe5KqtvVcO/IMO/jMP3hajrIIMGv8dMUJ0E6XzDT6sv0siG2M0AvN0OKj0A0N0RHdPA8t0RVt0btD0Ret0RsdOxnN0R8N0vblziFN0iWdPB7dEYiplDmBlCytmu640g/IlHPkj1s5kAVZo7LsoKNRqZuRk4UZlZwsJRq5mx0B1NmbO/C8HjOt03rZuqa700u9dR9M/801WRvEWtXeGtW7c9SkAZQqjZAtjRstPY8x3RD8C4sobZYxnZgY6L5ufZVMPSWda9Q3TYc5zaw8jdddKZF2ndJCjSDaPL5+7b0H/TpZm7UY6NRIfYR1mdji6pdgGcuc8di509W2eJhsbdZwzZhxbdhsPNLBUw9vPAuWGY9HKseeCZqyKcZ3TK9RGpWtqQOvuY+xCcjrcZ6kmrEq7Jt8qp3s56LemZz2jJcEuqMSap3GfZ3MGdzfCZ9/TZ4LoQC5nZ5F3c1G/dxeS5/2yaGjkJ85GqP+CaACutwKeqBtq6ENypB4GaMn+sQXmteQetzNC6zQAKJ9OKM0md61fN86vf/T7A3f6p2PpKyjBd6j5sDOiafFeqq3ph3HSKraS1rGri3A9qiaUzrbVVrbVyrYU6jW5lqvYKq+jkumZjrhmEnGYuylbzoKQsx1nCqQ/MzgvAeQ2nfBN4mVSk2okgq0zcettQqyPH6thn2pmbqpdirjoCqq6FmqKsytq3q8TwyrsvoOtCrkt/qnZLurTRyivlqtwUqtVRzfIcnEyjrEIcqtWu7C8S3LPnyyr7rlWzfFkE3nTYTFHrng6Lri6zri7mrirY3i9FrGe66qLZ6vd+7hoc3Vi9vFRAnG7fu38EvAhCuxFKuxfdjAO3sUcNu6QU663TmtcmutSZu0jL3JAyH/s7F7wjgryqsemG47qce6vdAAw74L6n3htEvbPnHOrLNOtcxdy/Gd68Qpt17bkUSc3u1TtcuLlysqt3Pp6wf5wU/N6cRuxfRLtwAFngw7AXnr6P574u9b4d5cx4Vb477n0ebL7d6+t+Ic7pw96AQsv7cdyM3Hued+kqBbwdAgysV7w+txuqNew4X9HSGs6rPb72Hps6acu1Jb6/++iUErvIl85vbMvWWrvLOMl1T9vDgQvXLZ5dSbqMuu8SGa8W5uvMs5vAcMmNSc1Z9cvsaQKJ7szX0O7oAu7vEuuJZ72/Vrgh+ev4Lrxe168wobwCe+mH2cxpk7wgvMm5l+6Sy5/78SP8EVbPJyDsW3K8N9eMHTfuqdnMBOH8p7quknqcJsy8IuXOtbb96rK5c2zLrM6sSpesQ8/Ow/fJJB/K3Fa7a/68TCcPcn28Ny78L/LsV7L+YAf+36KpFaXA+FmL78++j/S+FIL6Xyvg9Lz/j2q+i/M9qU2cUPHs4HS84Ufs4QK8fp/MdM/8m6WchRvxnYbLXP7Mi/HM2SnMiUjL2YjMmz77qcnOois+Tued1hScorfMGoLLRGG5e9/8qKn/g2msi4z6LRTMm5r9PMXMyxfM0xScy/bK2xDKK+zKK8TP4vqvzDa7LUnMzWjP2y7xAdzpvc3O9wDM6TX/qBbqOoz/+Z6Iz5AMFPVLZ+6uRNQJhQ4UKGDR0+hBhR4kSKFS1efAhgwjmOHTF+BBlS5EiSExSM2ldS5UqWLOvdUvhSoTBoCGm2nCBzpU6cNmtOuNnz4b0DQo0eRZpUqUWNHT0uhRq1pa4a56RexRqy3o0aNaakzBqW4dauX8WeRZtWrcqmTq2uhRtX7ly6de3exZtXblunev3+BRxY8GDChQ0z5Pv08GLGjR0/hhwZcGKOki1fxpxZ82bOCSm/7Rxa9GiK+OKdRp1a9ep4+Ei/7vwZ9mzaKk2zPu06LT55+Xz/Bh5ceD55umsfbyy7Ja6iGPONAVuynypUrVbCYpZOzwR8SaL/f+xH5cj3hN3JRww/HqH5hNi1q7S3qt9D99s/si/t3SF+ivX39x7Ot+IiUgCU8547D6R4gIOFAgpEsIACZwIMLh7kLlxMOZZssSUZ56BrqR3rVPKPP5xMxIg//0qKbz6HVkxRv/wS5E7G/rKzj6EFKfTNQojgyVEhBFXaMZ97WKDnN1gm5LFHDJ8kTMOVOOzQIXic2IcbRBDS8jlBkAAjJW6QQKKMCeRBIiVBtmRIAVRQScVFERGa7s0R27ETITyre9EcILkjIgoe1NOGBx7EmCAeHvYJjxGGwjt0vT+oGHQffAKNNFFDHVXACmsMZZRSRCdQxlBDy5kAFj+DTMie/1aos65OPhVYZR04+2HlzTfdaUjVP03yAdQJCo0Un0krLdVUVBXlwVFjKR0v2VMZulRQQg1FVNFQHfVVDwU+MWehIin0MaEro4MFnQm05BIRL8EUk0wz0VQTkW/DbWhHTxykoAJz8lnStwYp0CMdEOh554Iky4WyYb2kVInKKhdKB8sJhhQEnXyUQFWacjBGVUt5zHxUFV4VmlOh6exRIM6EWnZxInx8QFWZcswLD1VtGIln1HxHnbmc8NAJemh8AEFIGXQU8MHRnRHquTwbI7IHFXdWTmhlN9mZYB2uW6QoZ6lDvZnmoWsE6+ikiTabCnVRLI9mUm/2Tuydo27zE/9mFNpxhhry8Rvwv/NhuOLo6rEYY405nsBjkNdFZGSEvt1bx9+OTFLgCd+BwrdQzNEOlMwZdrj0uiAuSWIPFYIlyIwRHFJLdiFH6MsEwUZ5xAlyfdOe3VHxHaFcg4dHA+M1wFch9nZ+elhHIaUxUaD1U5o9pZk9lWny8EabIrDX4ZV34GFWCPfij09+7ISa39n6t2XEnge6U1K6+4aWZ4T95ymNvvWEduxKPgIYQMK1h1XpSN7roBM7RMxudrZjHasSdTkkKWlC6eCXhACmh9+QznQfhAvqSEKl1SWkHiYIkshQxUAHbqkfSgARQ3CXkJTZI05Ym8B05EMnVewwIvj/0x+wiAAWYvkMb+5zXzwc9TIfbM9ncHPI99xhw35ozWWt8qFE+KM/99lPicqj3vuiU8TuMW+JT2PaEOnzAXVNsEk+OmGQ+LGC6KjwYiCSHZvY9cIYIgQWbBQXBTMHsM117jfaCVgBQbjIEG7ELTjhUAkpZrEcHkIaKUHQC9EhjzBNIGONK4fkSnYyGo6oRTYMXg5VkcqVnc946VuPd5iGjniM52w2456Opkc/ooVxZtHRnrh8FsyJtKhl9jhlKlh2xcld0ZXIexQVUAU1W7qti8T8pfrqR0xqydIHtKymunDpM4VQjm9NUiRCDIcQeFSOTpbEJHQ0yUk1qctjojSn/+V8g7l8vCNCFDjYwCrgioPdAwUc9CAjFYoVEY7EFs2xEiWlQbKNkUmPFl1XJ9fUkKrdyk26uhp1VsEKlumKax9FBde0GKxmIYRYTqvmEsvJUvkhMYzDMtXSmshEZSVtWlQDqSpRMdJlxkx4u5IZS1Py0u7Vj1TTIhYPeslLn8qPWiw946aGFdOF3GshvOHRgBRyrgK1MSETRUhFkXDRtWa0Xl7NFzrRmdCF1nUpDbXrYWa4yNvgxjhj6QNUwCrXAIk1r4dVCl4RO5i9LjYufcVNZHPjWMoKRbGVxWxmNbtZqVyWs58FbWhFWxHPjta0p0WtZkubWta21rUfXO1rZf97P8nWtjWzxS1eYpvb2Q6WsMIxLG+Fq5bdtmRIae0jSeqkO5LAKIdue656opmpGEXPfte9CBTpg6OSkG+776nI2ZwbVyU5CEIanOtw1ZuW4rLkuHe07kdSVhLnnm0iubSIdmMZHf3+cGoSGS9IvPsi7oYXugEO5D4rqDm50nW9D06sI/syJYlxCBcMOde7zPSuTo6pTGdKkyfZ1NU3XTFlsrpTniawJ+ayblUuzSmkRgUp6nKPjDjFFrUwNR73SUt+PtZZjp9VKR1ba6k51lajUvViGb6KTyieXIn7AbOqqXQh3YKaVod8LUOpq1tw1ee+HOQvQgrMQQU7WMIWBmH/NndWwoopyQEq/NBJYpJxr2Oc40AkiJBFjmQLmQ4p9dRiK8ZswFqsG3SlB2hFHzHR8+Nm3Go2P1KJUX1oy1nRFK08udkMZ9J0Hn6jaDUcqtIegX5ZKtwk6IeordKanqp9y6k38hppwWXmnOdApwfROanNv05KeyOSDNVdOUdDkobG8NhAPbIJgjLM4qATIj7fDW/awGPn8aC5kKfZl3vSaiPeuOjN8+Cvi/zBz7ip+lX9mNGl+1tUMXcIvt/1boYfPdkzYakpZbmv25s2tj5tPciAYZBfE2pdB4G9cKMIe9iRXEgcE4JsZYuJ2e3KIQxvF+0Vm/KGq+ShD3VoVIf8/zvcQGuit0elP6b9lIzmvim6ZaTuSuMYUUA8I6d8oEaJSJGKK7t3Klhh5Yh8UZvoMPmLAHlOBRO8kMBBJJMczHCqg8Thw5akQtZJ8UwqYZMatWco/6wyky2khvJBZdZAzkN76FtH4ynUyfc7M7knKpxG34832bYPRamLm8SsZaimWnN272OWgb9lOUTNUfkcM5mnLnszUe32r+50v5UOfNzz5k6mD7yf/wzomAlKD4MitOqnL8nVQ5JhECVbrWzdEjc0OuLySRmlpBYpSVF6UpNORMZKa/mpIHWEROi0p0wNvlSvqtWnEr+NyZom9HHsrJtWnvlM1QZXgYrUOhF1Av8djRPMtjaRqA5eab836+TA5ZBx/bZCqId/SFSv2SA+prF68a37fxPc+Pd/IvPPrJkxFOlyjPvDP9uSrL/yvwWECABkwAeEQNxywAikwAo0rQm0wAzUQMzCwA30wA9cqA4EwRFcQMhCwASkrRNkDQWMCxEkwRfcDBNUDRaki/zTP+BSQBvUP/5rJLcAjaVgjol4r4Z4ryEEj1VarocwQJBAsPv5L4tAsCRkPJIjOz4hMPCSiyYcORIpsObqwobAmi3suSySwocoNdYpsP6KiCbUQeDgwa4yECNciCJMrpBovxvUDuAgnXEZmPNikjc6nTerjKiAuIiQQyHpo0O0CBz/mi9oo8KQaMJuii+FYKpU+UKzazEsesTc+S77EECrQotIbAlRhMJLBLS1s4jGakQwREU0BC81hIgmvEPhmLoJ+BNFRK7owEWLmEX3y0OF6zx+YrD0ogsXjAgSiqh94DBlbD10kAYyIZNyeEZoDBl5uRhC+JJOYghb6R1pQwhurA7xsZp1GBGvcRVY0ZM3IToX+xVmcZQkowJGALJO+ZRFoTFE6RRL2Sksc4gTow4+iQ+Rmo89sbJVZMftYJppgrFIgUdGGDJEucemWhorMLxviqpmMRF+PEUrNAkp65o8OcehekR+ZBaIpJRICSJ39CMm20ZdgTyOZDGhAshVEEhv/1wxdfxGl+yVF5tHTwGVLlLJJQMSMIMaYjQXSkoVdVlGipvGaGxKJKjGD8sHbIQXouy8gdGDXMuHz8HKe7CBCAEBMQOoNWM6sSSzRMJKg0EYhUmnvRDEH1SKYquzi8mzj2lG+Jq4GAKZjUGVT1qIFmFEU2o8l8EdWqkitMM9ZBoRktIipKm5u9mlyWka58maTYs0iFhFoLOa3ZmixQweg2Q/cvo0neGZm2sbszKaMMrHUmmj5oFFTOQhUgJMk6makEqlh7jM54o1a3JMp4KI2fzMETk0tqtNzvRGVxEeZJKPM2w1GWEap3FIX+rN9FM/zuubvwmcwGnLdUIIxLGzjv+xy5RINrzMxfLkM770JL+jNX3Sys9BkntYgfYshgswh3swgV3TwwTzPAZrz13rtbZswbeUCrk0oLy0OIojT/JsIQRdCK8xteMczPmYIZJCTinak12hPL4xFauCnssDlu8At/WRKYmYL2r7Hna40M3suGxDH4ZonneD0Q5dnprJqU+Uqk6pltZcok8kwIg4u5hx0K5hB7AhqQxVCNZMCHBLTb7bUIV8CAcNzGtLJROdN5VKmRR1ByhdJSO9NG5KoiZ9kRwBoL8ZoMEpF//ROnxhIASlQ7BY0Lv0IwnaEYNzEGdYEu2gUwrIhRVIks/5RV/7H0GyoHzIU4TjIEB1Sx//HNBCNCEUMlDIYdNEjKE3FU/qFNIHXdGORKrvy6J2YId18B0LXceiG1EhShvntDzuSDlF0wZyIlGPq6JVOlFPZQjQbIhWpcScM9UyKhvBc59OKT5W3VHqcVLMFEwgVSlz3CHG9D3x0EfBC7VlKdWI0NLgJDu0+zjlnI8gvVKiq1aZQVX+CiO8W6NwI0aJS4g5Aos1vcs2xThIhdNUWbpA7SdD2icpEB2tNBI+3UrQGYL8DMZbCxh9JVQ9SKRaFAtjhAhGncuuW5x9QBN1eaHomFiEoKf0ZFCUkQ9bsdYVW8cBo5VWkNDBRCZm4lJVBVHFGxVi8lLvoDtScdVXRYjH/zMmZaIi2LRFbdu3l6UmaB0ntJkl86C7X/UBMbAv1yRWivBHUmqH5ZTVZW07nTVDa3LZbzKJRFCGlMgmpd1YbMtUtdNWVKrZjr1ZPenaqG3RNrE8L22ivtvahsinogTEhODOdjJQTdoYiEUCiVUCiu1biwU7BI3bqxyzJPGEfwWYMZsHfv2cewBLsqRXz/MnBwm9fhm90gPQHnwkQoSohsgwJcCoxgETQ2ijaZwm010XjMpYtQvHkgKp2wse3jmZoZvZoPrIbpSI8su+bamqcuCm4Ss+G53WNtEV3BsqCu292x2f4mU19js+rdrdRvlEVAFe89MpdDjaHWWpHnWI2//jFfDbVpwk0tvsXqx6rkEpvqTxmfKTiOXSPebdPaEiqo5KKU1FKnB8yVZgVomAvkgrFefDMeWbNVhqw/1TQLICBbN6PYR4RjAgXQaORgiGytRtK4qzysi9wQDZwwx+v2IUUBAK0iAFNB9aQsp6TRi8DxR0iHoILLUo4AzmvxeWqzckrg/+IPrluN+RzRzGrBNGYdKQQRVcDRoMYhWkwbVQ2B9W4iW2jCRm4ieGYsNw4iim4irOiym24izWYiS24S324sco4hM84v7D4i/2wDC+rd0AEA6m4fgrY4UIQolw15AQQ7brFVPErpGQsbogRR7iyDq+iD7Ou0lsDzx2RLj/WBEfZgg2XOPhaOPJiUNJJeT7YhDzipA/5BGErbo3TgiGdYg5Zgnm9CM83qINHd77itn1yTEXNeWVWmUAM+SGsNWPEGQnnGRLxMLfjDZuzETlrV8fxTZ62x0exmVPfMKKkEWjtJLtAOWRKBJhLDNlZkBORghk9Fws0bA7ysZ4+TB6EbGS4Uj83clfCT5L2TEikqkbiypEWWeoMSKtQjxp2jJ0VuViOZabSzR1IaOGFEoJkknd8cdw1pVWCEke5sdy5jdnOZZoAVOVpEdh0UgSu5WAFMmmjdXOrMlLzUmAdDLraAdV4Bp6UwD9Jd/24MkmfehFAUrm+7L16zxyWYhz/2kPpRyDL9mwmoYXCp6XEFuTC5Zbs/wXtDwztVSzzPU/ap4AAqXbxLmzxQHPxxGZscNZ4GxfUFuPTpsmpCUb89Aerra8I5pOm3FnWINRTJPn0/RqS3m0UEtlM1y7RvxRKkvMqlZIV6ue07Qfu9Yp6GzfyPu+zWQFdwjsQatNHArS2ZyixPTUjeWVdnAHWgVXsHhO50Gi6dw8pstO7DRTrUNK76TLvnRqUIJqP6vOWoPmgTUkP+W10aFApFbqVDm2ZmShZqudEOvHcuSaVpLawlOf+lO3riY3d84yZRFr7gCELqLM5G6fdisb6NXVDp0IarPJTK3Zfhjfk+WP+KG0+v/BD+3OTSXMohMd7O8jaKj9xmRFb1F1bHoTWcM8WftpWV7S7jCl1zIVoM2OU4pRU9lethaq7e9A04B1OkLNIEMFRgh0bU9GV7x0vf6mbT6KnpT5Vv8S16XSVeVmhOBDFQ3/n1Eh1+LuGeT27ehcqu0uhyBKI0L+ubdmrpRBqe81bwr/nxE9N/gZ0e+OovCu0vEWkfE97x8XUlGlFfCB3ciWzArHvFNmnaXrRYBd8AlQ1/JscIvzbwhfcup8ZoF9ukMyWKlr7S6Oy4lhiK3jb0bxuov9pHuSak5csbM9WbHZr1kq63impRElV+FG2f+ppu3W0Z5d0qAlVjqfm8VzxLT/+9pMheyZhdo3t+o8v7xtsry3xXFW3OEpUyaLDjQf12hMf1pLtwdaXQeTgWyveW+WTdVfcttUvWwM1mDOBgu7lfKKmyewAyV8Wk/95KfJHUuButyDMmoyBvOkoLOHYL1KXWAKjr3ZI16Qct+Svh+l+sR0TmetSj7j67LkC7Iue6qWEvFp53aWQpVPXDno1T6I6L73fV34LV5t3R1nX754Kz/klr7ym3SOkjL6VSne+ZoYF2Fu/JqgotVVY9YSPtLsUfX/TV/2HeCvamQcjGksKatHdT3QbStkdysR82k34mBEneZg/yz9qb+jUGSkCOFRpQ2Cnws0HmMWFqyG38Ex/4Y/pH4NHtXHAbzlkBj5o8DhTYQNlD8sNLYtmI95jzfjojf6Kyb6o1f6pediRWX6p4d69kr6qKf6qresqbf6rBd5IR7iD5R5rbd6GUanR+54p3+SMvTC9+gvmbt5qajlMeT5EjnmS8tjRI7ljmIHtA9kQ377Aml7nOBDS0avudXAr/eLWcYIubcutufjWL6IElZ8iGB8utBCvz70vX9FH5Cut/8VscjyAZfmCjR8YrcYNJFKqiSZL/mwjCOTlDB9FxKEamh9uPXITIWym7TCmBzn7aiWSumxJgUym+OOhU6Qkhx+UTnfTEFoh/bJeIvoVunofzaJWrkVcWzefgYUI//7feIG05cj/nwRsntO/pVVqoQ2ieZPiecHWzbHfa5ph48zeSzrjsBbyaF06bFCynSxWGucSpuubYBAUmbChH5KkCDZN0EeQkQFBVVDuE/BJ3MEL16Mly+fJwoeK5jLB8vZRlge9aQDQe/dBXr54mGMKXMmzZo2b+LMqXMnz54+cQKYcG4o0Z9Gc6ZzotCgQoL5lJSbIAgdxqlSozolRFAaOoMOuTmM2U+Vu5jtWolVZU9Bqn4X2brVic9HVGXl8CVRqIwq3qYT+hLs24/KXbqDqcZU4MPv3HKHLx4ejPUvIIJ7FTOaoC3zTXuo3I21B1mtAlTsJqw7bW9VXJyNJ9j/Bbz3b96LgGnvk9z4ceLFtg1TQVwwuGTblWGjw6yZs811qJ63JXiWoD20E1iJTj1dZ7wjfjFSZIYxqd96Sgsq8fs0qtWLVgVNzqd1AlevE8BOCD9T48Z7LFyWRNI7UGwUijnp6AEKgDAd1aCDD0IYoYQ0BUVUURM2CIseGEmDBGL5jKEQN1F1iBA6IPrFEEJIOJZeTau1Jp111z2Himis2HgRjqJNAI8GP2pgUUyAbSYbX7UFhuRmBBVZ22wyKcMDYkTWxYOV6Nw2QTxWWlmOYt91xhpqZeH43FrRXQQjQT4CKSRGRDJiJG62KclZk3oJh1GUU9amTZVXZrkll176/7ZTaBht106NnxWkSnRs/uhmTN2BiZGGBF06npsdfhjifSSueKKnBKmIUIuVZooRf/n4B6BIJKXjkUckabjRSxjimquuuzZYoYXn8MpTPSZsGJMgYOyD4qdPKTSVsqSGRRBTL4qJqHX2tHVoo9WOVa1NcMqZ5W1LLienNlaKARkV3lE5V27BBcpcfoXmpOY67mDbT2hwYaRmTuA6eSRjdTIZZ8Caoasuu30W9i6WSGop75c8aSujdKeBl4q3OFFaEywfoDNssQTxswKYxybr6YjMSiVqitGihyrIk9raqq0j5TOgrfkgiPOtwQIdtNC4+mrh0EidV5XLBrn8FFXwXf/EsrQu0jRWWdZSxxq2PDbKdWiQBilTX4phudiWVE1MUNqUHiZn1fDmRXZfc3VF2G9+pV0va2zZA+PW/L6FJtiSJjmRD2Xvc/a8eBfKNtx41tR23IfPfXhxgdGbd04VT7Bdvhix4s50g9PUsUz6XUTemuLJ5GyITKPo9FVRUx0zeJ+wTnN//+VsgUcqmURBBa6odA8Kevx8tPLLM19T0Rc2PxM8ShnU0ARPmUqQIEiAYQhV2Cd0X6jTvghdP6XVCJoqqKyCHfqm5VcjxjfNZSVnUR6RCGJR8oAV/1GdiweZcRt4fGC/vxiwf8PhQf74kkCFBFBKmutM+hrFPvehSUf/z7natxJ4PwbqzzJdEqECAzjAg/XmgPVT4GBA6EArQZBLyaHX5tSitkWVxTlmWgdrxjK/mihmUImpiEymNxFQCKd6SHAI+LCyve597yDh48b4akcRwmVkZ1rcIhc3wqDogTGMQXveUMSok2eZMY0NyhLQ/KXGCbHxjcurRx9sgsZg4UMeXdyjFuWBDzkCMpA7ISOwBBmTOxoykW+CWBs3pkifxPGR0UMkr/ARj0tiMpOa3GQ8/ijJTwKSkKAcJSlLacpTojKVqjylKFfpylfCMpaynCUtS9nKWuIyl7rcJS976csJ3PKXwhwmMYtpzGPmKpjIXCYzm8k8S3IymtK8/6QnhzTNa3bSmbRUpja76c00QjOa1VRkHvlozi36cUh6POce0/lNV3IzWLg4QE4oiRE02pNiahkLKmYkEzc+CBbMQJCusiRQgsqEn/7slyMxolCPDXRkNzmoRBNqw5l4Bn43eWjWYhQTihbuKCCdSTnbOc6ZKAAUKavUPUd1PZc2aFXs5CKCdvZFgsg0eCLwHUnOedN3ojKevLKFLZKBk3w6xaVI1Ym2toPRhoo0ogWF2Ehn4tSYANSqC7WUVBHGg3SNjS4TqOpMODcaDubEqVnlKkIjuROyqsqnN4HHhpaKT5geRaYz1WJNbfXTVdksQOz8KVBNKdRdEbWoNDEiiP+euFL6oKNEppIsi8QnkOsRwrEz0WGOOjcjzraiTBtch3VSU531WUdRGpUJLMxB1wV+VW0PnBcMtaTCP1AhtvwbYWtfS5Pt8LOfE1jN+sSk2vld9aOu3ZDj7pIXu2BquTThrGiOK62LBhctasKOxWhUQdZKd7f9U4AVrAFDOQmKM73VwxV1x8efGvEisPjeGByrLK5Qthz5texA5OPY9u7nZifRWT4MFDw93MMGvgNBR37nkr9upMHCC4nPDpySlbQkeYVlpVB+pbzEKjYmqlsPfcpxX/qqZ1TKgg+J28NQfV3Uc3uLjr8U0EOtfSY01SEId5lKHLtJC8iUsUzZHBP/nDntJLk6ZlTodnwdHiW3JtDVkhjwEg952QRGOrYOdjibQR2LqcdqhSpNbqOcOyEHH8d50u1yp6WNzKAG+YjznOWsYdURxDwKIbE0TOwprrw0xU1ZsYmh0rL84C7AOSNQgc3xn3usgMChKMYFzHEPExwIeX51b2BftegCZVpBXtxwKg+rKxAb1VIjUxZYThzoqI0KP/dBhKtjkpqudRdG/HIjdnZsL9HhkHRQkqG4ICaoLlEJyTpxqmj7Jibt4LC7wtYTVtQ8F+/o5NahUe0Gcc3jGjnbLWKekb+mvcim5M1Ix1bgTFLFnxrIGd75kHfyUkWQdAiJ1bT+M4ph3RRZ/7ea3/Kt6Jt5JisKOGMkCIqVrHKxApcYqK+jjuvuXIUzhs9KJJrWMKlJaepcJTbVFxGZv2ft6rv+OywBVwigbX2aplrnfVdzYzvYsQ7R/LrmPHGX5AbmlyufWzNRcWtNPJcttdiLHTo3y1ZpMuV4VDkJ1sByTbStlqWPhkf5ArO4oUxuMpMUSekOGNAnOrOCvzfPxMJIyQatsn2zvN9JTTlBVg5Z+Z49i5+umRQURGBWPbzR6RiCTTnNO8H+nWd68BlhO/7Jj+OKqCIX8XlQBLv0MIQq5LPdQpDVslojijXO8frFEpNBG7fCLbpORd8yaO7C0e1yw5mMu+hkOLTREP8nMu7H1lbfeo9u5/Va8o5unjsZm7RD9Db6XNY72vu2KIr0ahMckMJ2ukKl22xSqj1NUIdTuaYuafDIneWVcCLMe4jznJeH510Xd0S7We8i+YhLPEH4+QtvHoE30D0W/GDDu8Q7+A4FAM9HEA89GA/yNJ7jPRLkYYgt0FNNMJYUhUWHQNFWZA99ZA8VLdGrtZxDoZb74ND7dFaZXA0rYExGMQpqgBtOtFADIVBtrVAMAUoCTcb/4AQJqs8F9Y38EAR16WBO8M8JGQ7VWVQ/cRd1eRs/tc+N8GAQehda2cT/aA7+hFAE5QmiEU5JdZE7XYQRpZRwgE8Fco/3YGBlaWD/ZXEgE/EbgMmEXu3VHkFYHHLRAjJgIjkgM90aavwQZFTLWg0N0d0hOU3TSWEEHakRF9IhF3lhYKzTIm5EIw5iA3aY0XScCjYUjnAQIAqNIE7iJ+4cNokiNZHUKIoTKD5eJUIPKrJiK7riK8KTKpYRLNJiLdriLaYRIa3ILvJiL/riLwJjMArjMBJjMRrjMSJjMirjMjJjMzrjM0JjNErjNFJjNVrjNWJjNmrjNv6iLnLjN4JjOIrjOJJjOZrjOaJjOqrjOrJjMHpjO8JjPMrjPNJjPdrjPQqjOZgiNpmDL+rjPmpSP+LjNb7jQBrkQSJkM+pXGpRKQjqkM/5jNAnk/z2awyNCYh9NJEJU5EVGYkY+JDMWJDfuQzkQIxjQgxT9okmipEo+IzooQvo1JC+yZDSWAzdoQkwC40wqY03e5C9SBU4ihE764k8CI08CpTV63kvio1GW4z6g5E7a5FEypT9aJDp55FAqgVD2ok5q5TLCIR1K3EvwYk55xE4h3GB95DOG5DYSRAIMY1fuIleeZEsqJUPm5FzSZFQWI1ymZLJI0VT6ol36Il+uiGD6IlN63kKk5TQCpjg6pULqZfgQxEE05i5+pRbFgzDaJWFyD1525lMy42XuVVhmpmXWzOF5mk8tZjOupTZehFsG5lOYJD1cT1bOZTkowvH1GYcggf8mkAr3yEMU+aJvEkRdlgpxLoRu9mRvcgMYBKdiIkEa1N0vLqSKSKf4SOdBoMOI8CY9cMJkpp9imuQhNJE0GGYvGiZiMMRs1mZ0TidCnCcvVudneogisCRuuqf4aIJ5ckMaNOdtvuRc7kOAHsSAbuVzWud7XucEvKR6SkRW7oM0IKd+/qZzEuVhmudROqhEgKdkHsR1cuB1Jih0OiWyUBGI9qaKaAIHymeGPuguzmdkjaVq7mIagA+LvCR7yiaA6qZu9maFPif2yKgvrsqBSZo5HFiCLZiEqYRYmiZHyApIpKaFqQRLPNhqgqQsnoM4YgRs7qImYA+ydIh+3WeOeub/TLJkZIlpfW7lXLokfKoISz6mTrophHKKfaoIfgqjc5rKS66oYOrkPlDRiu7im0bnjQ5jfNbnmpJpnhrnXgqobVImnvbpfvqnf5YpEpxkVBAop25lhC6qo0YnFRmqibykUxooQhAqfaopqJaqMr7pkJqIZPEpjibEUz7miqCqBYpqnRJjrvokiyIBf9BZsdpZaarqjbIko0pDpsqlFKVps7qqUm4nkW7EkT5apDHapFXapWWaTc1oxd2MgGxrqC0Ili5ja2Zjl8pnqbDkijrrmeLlqsIrgPbiqhoqoEYqffYpn76reXLIgqZhjfJm+kGrZwIrGjIofCKqZpbKZNjn/1z+acEKpsBSVlD+G/f4hSJYrKX2Z3NurKaOAT3QQ4CObMm26UFYKm8S6ptCbPhQFr1yYL2q7MUWI8Q+a2Hypqdmj1LCLHzuLKVarC/6BWiuSDmUyrvF29J60dHG5H4GpcT+56TyK7/KbKaaCk7yB8YhnMKhxME5HMR9q1+FK6ug5sUdHK1sHLKi6zGqKza+pkzug7tKbbyu5LzO7NTaKi/i66NyaBrqpH9qgpnWrH8eo+Hy4j7gZaCu5GPma8MGI6A6bsSq7Mei51GmLIs0K4AirqryJ6baKz0kgCK8qeiSrs+uyL927mQt6uQmBNJ+ad6qqt5CLTIii3ZSbup65v/qhsqNnl9CVOuo8qLgom4wJuxhLuyw0iiyxGSuvqve4mfOMufsYm1lFS9/JN499N1KMBrgie3ggeuTmq3FkevO9ExPsW3bFuPbXmNb/iKYHoSc2qdTSqdSJmyu2ijuVm9hPoVv+i3v3uou0gM6xK+Azi9KDq3cPuV8vmgDfyay1CXkAqO+QmjuDujtDu+InmFc3ubmTioGe+6lQu+pZh4Js6lMGjAIv6hLqiQE32pNrsiq5u+iGnAytrCByqqH0Orxmmqhnqr5WeDxDvCHFmziGm2hCqtokm0Mg0/nyu/t1q8DB/Ch6q+9eoiwrkiR0h9H3F/wVID+iW3/EeCViq//zQigg3nxASagk6qvMbKvNY5k5MpmxlZWPoxuBpYIVnQIcVLR/oZKcp7qRXRIyKJhHnNgYpYIchbv+16EIsDvFePxFJvI9dyxX9gs0Qpy+tnx/L6nIkvmwOZkU6ynvSryhI5wQjToqabyp56hIueJ7GxyAAvq7MbwdCIyi8gD0sLuMH7PHSdm/DaFyjayZHIgHT/mLHsyi2Cx8V6E0eYwEmxkO3nkDJdqYnJgVMRyIUcyH9Mnfj5zFnNkF6WvEs9U+raxML7xOTOjzPrkwR6xOmMpYRJw1L6zMXImPs4zNkYkJ11l6mLuOEZzONuKPHhkQEMiQcMzMaZzQtvuoBkt/6jQM0OjawUAQdVu4z3XI0RLNDTuM0BuUj93NED280avyEKT9Emj9DFWAAdUdEq79EvDNGtqaUzTdE3/YgXgA0vb9E7zdEznIS4CtU9kwF/QgB0G9VEz4E8j9VLXxFATtVEzdVR3k1JLdVU79VO7Ujh59CYZ4l9sNSZ1dVVPtZaKdVnjxFX/xQcswClKkiIKtCS6NR1Kolk7E1U/yDzVE14dklLpdU+EBkc9lUdlSFdhSAulC6YQNggKV2BHDmpBFEIBDVmhdT/gQwgcACOG9VuolF3xNUv5BDmfE2m6F/6ZZU+ZE1TTdTHZtYNI3lH1dcnNnYPAHLUIdlRBNq5Anf98JTbT0QQnXkSU6TZCBdBh44pkQ4a+VPZlbxFUvxZnCxqEgLY5iTbFje+4DlZqe9NqN0jILZZSNJbGnlh+7RcH9ldmaexmtaBnXQRoidZnkNYPssNpLbZ1tZt00RYPvEvC4ANuMZBCBBF+25YAZQRxr1fRWUd2DdcqFJdb0Ld600SBN1cECdC5FGGAEyFytFBsjdVytZdT68v5vIRlL3dMxBem0Jd98Zt4wyh/YdZ/EZGi4Z8eHGmSKhgBMun/UZyESWmFncSFWSnHYfcyafdRoJpMjJih9dnJdXZss5ihuVia9FCMXcuMqV612Ji+4Jj69A2XcU3kCJm6FFlkCJn/mhEZThF3Wi3UkpEJvnB5d+HE0x02uWgDEZRDPBBBnKzZw0BOkGUh/A31hyuAX1XADNTZxN1b0kyAntUmifjZ+6Eckxcae6BNor3htZZrtkoapVkapk23/HUazhwpgogakAf5MQ25URS5qpWc3QHao89a3cHd3bmct+3ernlLr2nXswFb+ggfG+2WnqeZsXEJu+V2ks1IsyUdt61g8FUfFk0ZmS8HkzADICjDMzDCuhWGDMGGtrdbBQC6reCDJVXAvB3rwIlYvr2dkj/3q5ucwGEKwW1t2not14at4G0cxwHW2cJK2mrcppV6M536T3D3Ia5dbLO63L0aux+8TFid//TJXEf9ts3hnK5j3b9ADM89TrD/HNUV+7Jdy9GFGx9WvJvfBJwXDJGtC9SVXUjtBcb3OaZ4+/ngw0aEQM3XPGaqnUS1ncHHeqsvucL3vHB8TBZib/eyyvb+HaR97/0Z+veJK+IZ/fk2/b+bOlkfTWvPxIi9jvkxS+apH/mwX7O4jKyHXj+MXneNPODkxyqkXoKfD+sxX480e0KNeV7QjZHIHvcNOE/sXu/N2O/xtty3yRsSH5CRy14UCSDovZFUTp+HRwbIfAUMQ2UTgziPh/iR39af39ym3+aBffuNPaB5H3V7cf118UeAcaOJcZPOYXWf8RincfEcD6lT/TAFvP9PQKBNTKD1aOAFpqEeb6D1gN5oIOFajOCi8IgJ8lgKfpcSusYDvaD+hMtsYeF/s5tN6CAT9poPsqCZQGHJH9DJI0dgVAYW4n1uweDtWEQGKAA+VEAxZIAlZQBmk7hShCHt8L4FmuHvn2FUrCFATMg3Zt8EaegUfDI3gWFDhvHyRZQ4kWJFi/niOZwA8WLHihk1hhQ5kmRJkydRplS5kmVLly9hwgQw4VxNmzFx5tS5ch07hj1F9lvVj6G9oTuRJlW6dGUGfBUy0iiGL8SseFex4iNZrw/Tl/jkeRRbUZ5Wh2DHeizrlW1bt2/hvp1p82Zcu17todJ7VCMrVO4aGiX/epdwYa80oD7MEO+ABsNI8WGVPJly5atmNUa2vFky5sefQYcWbXIu3XOjUadWvToujQPxPrCWPZt2bdtuS9O9vZt379D4MtgA6Zt4cePHC+eui5x5c+fPoUeXPv2k8prUsWfXvp17d+8urZ/+Pp58efPn0YcOn559e/fv4aPUbNkz8vV3cR1AeW9WQZL8/ZsAQJz6UYeeAodZaKR7thlMp3fOeUdBhhQQhZ4JKpwiwJIqrKErryCUUCQGHZygQGxKLPBChlR0KUQF69EQpheDUifBBRskCcEJQ6Ixvrt8JEyBYzZsKUiNjjwrrI7WKqmfZPYZ8L/+GpKyrfvsssWW/2ROsnJEKhny0qUWJ6iHR41IROrICldsCZ4PmUoyzBxNItNEA12MEEYZX5KzITNxLFEkQEfyEZ4aarChzR+X8vOtIYtkyVFHOfJouJEAFRNNMAXklC0s49JyS0xR5M8VHfobEBh6ftHBVR3OafXV09RxNRcBc6EF1UgneGeYX1cktNdfE/SVWHlE7PWcew6wEcZfxetRHkKFQVTRDuE81EOG+LkhUf/ebKjabSfQtqsYC9KFHn5GqdaGgrSFhqF3pj1zTmRu3LEhY4e5kN8L64FWwGaHQVEkegHVBVFEz2HX3X3QnUDdchGVt9d6t1IQwRsZxNfggIeJVlhpCYUHGv82Jxj3XG8TvVBlhurxVtGI1WV3H35AoWfciimuweKYW44YZhnVFUa8cOMdqdtvgf62Z4u1VfTpMoled5Sbc+5ZaoTtvfNXBRUwZhhiCgp77IJAFg/kZ2+E9B5jTku7VwUhPBjjlBH9kOsC5dGo0o4uLdPgeS80dVdVWX0VVlldpdVWXHXtj2/waDKNMFFHRdLge2Cd4JdlqVy10wClBFABWpaF9fRF5+yHTEJJhFRAOhVo8MkojZFHRWYJPwldlMv9kB8cAqwwWobCpXof44cPkOZ1b5BXGGjquYWhiU16W3c8y1SQxN1tN5D3XunR3s6ShO5Weuqrrv561jPWaPf/3C8e/51gux5pejZ/F+Wc5/sXt1vwr2o204XUUvYz60kMYAO0kNCUx0CjIa8P7mNgSIz3p/YtcGIm4x8H6fE8AyqqecBDiYomxyJ19C1M+iGf7ChEpIYMSR/0sx89auc6KPlOQxmUnzqOx5EZ1CAfQywiETHikHcMbnZE4dxpPoe40VUJTKZD3RNXd6fjpQRUcMEcl5Q4oQGpIxtStJKUyMgQMkoRSad5nfcaJLs0EY53aUIYsYYxLTyy0CHTw5CFKNiQAwaLTw1Jnh8TKDEEipB4hlxYDbY4ohzdD2Z0c6OB6qYikP1KHnYM4R4HxafmaTBd9NAWw1IirH/Z8X+g/+wezFypkf1ZCJHTe14t5fUm/rGMhKOIESAT2TNU6vKBLNNQ0xQ1Lmi86ZSQDAkEm5bLR55mlqacJjKt9st1Ec+EJVklnZr4J1D6qk3kpJDYWLjJPJKPd+rko7gshsgeTYgjiMqHPe2ZxHmdiV5hotIaQ1c4TqExG2osY0D3lT+SdPEtogJjlYwhxn8etCCiOyOY0jgBgFYUfpnkHqHMts5wwuwc8SjcJKcVyZL4EXjJo5AojlnIQAYTkRmCWAEbiTyLpcSTlZzXJenh0RAer6c89M8oh1ZKk7UEdmQDH1EgVI9IjoxD/mMTLm8Zz/URsJTs0oU8gInIpfbxZA8k2v//qma04b2jD2PFVCFptsydXu8cbHJrBGs2iq8CEmgILMk9nCo+cM6xTJE80WAOO6QDqG2LUjUpSnBZqH49ZCwgeRuPYDhGik7AogPFaEE1ulnRzWuyKmGoW7T0UM05sT/8sNA9rgYPHVzIZg2pbbn6szo2OqQeKDLnKwurERhiKBkHcGIcjVE+sonzWCGBh4aEgUCXvhSH/tNI8p67PGD+MYTEgwcJc1qm8HZpkviDmW/71dt+kBOwpCuvO0WCVKSKdx/f7S6v0AfHfgC2fMhVbpEIBV+N1IObFsouVxl4YAsZD8E1u0EfgIdIAhfPqmZNF1pLqVYcsHXCJPEhXqn/F94SPjC8Inwwm1C83f80iL8pvBMf2xsSO6kIUisU0HJnWFyiCNghCoZfgYJYWSUOTqpUvNlrYzvbCdx2yVdDXm5pUT6EArklp22LLVxIqv2+CrStmgUvViQr8YhZo64q6G4bsqP7hTSPbF6RsVhYNwGJTaT/Ogm2HLywhrHsZzK7Gcucqcwl8/l6NZhCzcY7Lr+uGKo4pHMe1XwgZ1Hym41OicIgOV+JGXpiioYfBh+9vYIdoHx0Fs+/2PzO+ALa0PsQ9PPw5jObNnhdOYvwThUN1h4WE1ExzXDFwuXpQfm5aTLKtSgeCV1rhbCAtjbwrj/9w1EXTmzLfdvZhgWs/5CeZtsYIlLYTmNnZalE0D9UNVqYVB/12olzZmaIl8H87sbJu3O10sGZA+rilViZUeP2t/x2ONJ+D9wkCnByBONjcP9AUDu3a8t8KlMfh4zvNvxm1LULJqhhwRicBPc4Bg/O8I9rx1eqHvlILH5yla+c5S1necpdHnOZz5zm3oH5YyDOGZ1fpuY99/nPT37zwqA7LWNpEtCRnnSll0fohPlb0SmSDj1MJHBLt/rVsc6cpt/l6VCXiNSpnnWxj53sttm6XSoFCwpQQA/vgEJEQmEOtbP9HjawAAVA4Im1450e+iz73wEfeMKcPS4ccTvczcGC8q3g8PkIRTEuYI57mP/AHGCXSNUFn3nNb14mldMNaziSjr1TwBmwcIbURb/3XKyg73G3fEQwz3nZz572DiE8XAz/doncQwo5a3w+7sF6x1d+CGGv/fGRL/vbvyXta69A3z1R/HzMvQLzEH7c73F3EPQ99sn3/vetvny3dN3rFuk++NGffpqL/+FLKv9Fjq5++c8/5ux/+M7xz3P675//Qff8cvovAAVwAKvs/66DABEwARXQ9gxQpRbwASEw/ewvAimwArFuAi0wAzWw5zBwAz3wA1WuA2NCAUBhHwYiQE4QBFVwBYlDBGECHvRAIAiiIVKQBW3wBmXDBVMCHpwgQGABHWRQEJCgDIIQCcD/oCC4AQmGcALkAQkKQhAQISEUCgepsApfQgdPIh168E+2MB+UoBwmQBDQwQvBUBrKIQUFAQy5ARHkgQgx5BOYwQrlcA4pxzQc0CtgIQYdIh0UJAUPIgXXcA0ZQhDD0AkdIg/pMBEVcaEa0C7qwQT0kFtWwD/8cAxnMBARYRAzsR+UYAYbAhY+AAgXcRQXEQtNQgvBJQ4ZohJPkBPRQR6OMAyB0AzbkELgkBRxURFN0SR4cHlAQRRlsCD+UAmUMBMnIAmRIBO5IRahUApz8RnncBdRgiugsRqt0bQa8Rq1cRtVQxq58RvBkTSyMRzJsRw/ZRzNMR3VESe8cR3dERrb/zHrci7/suId7dEw4lE05rEzjoPo3i8f4u8eBfJK0FEl8iMlhNANGUIQYlHGlAC/RqIGRcIfyULihKsEC1Ehw7Ah5echV0IiS+Jv5k4E7s4Z0uL8BjIlc+L2UislavGEPFIlQNJvhKwkYLAhXvIkOBEiRWImR6JS7kHxJML0TlIljXIpWLIlRaIXGSInE3IVCUEIj3AnvTATm3AJmbAYDUIJlbAcFIImxSJwmJIhfhAnFfIpBSIqjXAfqFIJrFIJ3fAqM1EauBIJysEZRYIj9M75zGH6THL61k4P0mH73uECuO8oEXMnklIp93ALm1IjX5IMZXEnv9BEYjItGeIggv/RFlWRso7oM43I7yYAFbkwQHKSCd1QMsWQMsFwJ2mQEDITCCUyITrTIYBSKCOCKBvP9fQgZ2AvMYEzJhYzcz4xEh/TISJzBg+CE+2yIehSFK+yKzezOBuinogIn5BoOBBxD3nkNJNTGNGBOcEwM5EAOusSDGdyO21z93DTL/Mh9dbOJPPw8oKzPgvQDl3CoQYMEjXCO1NTOcNTCQzBGBuCIfdBHgh0FT2RLEPRMy0FZvjTtiYROSHzP8GTEwdUIwwUQTUiPRt0PSMiKPsuN03y995TD4hSNO1zRUsiKVWrMU2zQhX0Qh8yDTV0DC/TMv2DNkH0QRuCNMulNlGTQmem1CACdB9s1CHE0As3xDU5My/Zs+/e4e74jvpcYfvuAQWmDiVZlEVZMsuWsgeZsyvH1C4rcSc5ERHG1BiRsTzJ0y6/UknUoj56kQSBsUzLAU/P9CHTdE0HkStFkS7tEi9DgvzKj0u71D7z8Tc4wyJhBk5YgyLLLyATtVInYFGtbh/p0VEt1UsLslNB1QYxNVRJ9fhGtVRRlfNONVVZNfBWtVVhdewCAgA7
Отсутствует
beggrr
Ну не стоит воспринимать всё так буквально.
Видимо, это было предложение помедитировать над Services.clearData как таковым.
К сожалению, мой уровень чайника не позволяет медитировать над этим Services.clearData. Увы...
Все что я смог родить, это
Services.clearData.deleteDataFromBaseDomain( "my domain", true, CLEAR_ALL = 0xFFFFFFFF, alert("Готово") )
Отсутствует
мой уровень чайника не позволяет медитировать
Уровень чайника — это уже немало.
Просто медитация тогда может длиться дольше.
alert("Готово")
Не-не, это ты скормил четвёртым аргументом
результат (прям сразу) вызова функции alert(),
а не саму функцию.
Если бы я был веб-человеком, то попробовал бы начать с чего-то такого
Services.clearData.deleteDataFromPrincipal( gBrowser.contentPrincipal, true, Services.clearData.CLEAR_DOM_STORAGES, () => alert("Готово") );
Отредактировано Dumby (14-05-2023 00:22:09)
Отсутствует
Спасибо, Dumby, получилось.
Вот мне бы еще в консоли как то скрыть некоторые сообщения. Дело в том, что я заблокировал в Ublock Origin некоторые домены скажем play.google.com и теперь в консоли полно записей о том, что загрузка с этого адреса не удалась. Среди этой кучи ошибок бывает трудно найти то, что нужно. Каждый раз фильтровать сообщения через строку поиска не очень удобно.
Отсутствует
Не знаю с какой версии
// try {(jsval => { var dbg, gref, genv = func => { var sandbox = new Cu.Sandbox(g, {freshCompartment: true}); Cc["@mozilla.org/jsdebugger;1"].createInstance(Ci.IJSDebugger).addClass(sandbox); (dbg = new sandbox.Debugger()).addDebuggee(g); gref = dbg.makeGlobalObjectReference(g); return (genv = func => func && gref.makeDebuggeeValue(func).environment)(func); } var g = Cu.getGlobalForObject(jsval), o = g.Object, {freeze} = o, disleg; var lexp = () => lockPref("extensions.experiments.enabled", true); var MRS = "MOZ_REQUIRE_SIGNING", AC = "AppConstants", uac = `resource://gre/modules/${AC}.`; if (o.isFrozen(o)) { // Fx 102.0b7+ lexp(); disleg = true; genv(); dbg.onEnterFrame = frame => { var {script} = frame; try {if (!script.url.startsWith(uac)) return;} catch {return;} dbg.onEnterFrame = undefined; if (script.isModule) { // ESM, Fx 108+ var env = frame.environment; frame.onPop = () => env.setVariable(AC, gref.makeDebuggeeValue(freeze( o.assign(new o(), env.getVariable(AC).unsafeDereference(), {[MRS]: false}) ))); } else { // JSM var nsvo = frame.this.unsafeDereference(); nsvo.Object = {freeze(ac) { ac[MRS] = false; delete nsvo.Object; return freeze(ac); }}; } } } else o.freeze = obj => { if (!Components.stack.caller.filename.startsWith(uac)) return freeze(obj); obj[MRS] = false; if ((disleg = "MOZ_ALLOW_ADDON_SIDELOAD" in obj)) lexp(); else obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true, lockPref("extensions.legacy.enabled", true); return (o.freeze = freeze)(obj); } lockPref("xpinstall.signatures.required", false); lockPref("extensions.langpacks.signatures.required", false); var useDbg = true, xpii = "resource://gre/modules/addons/XPIInstall."; if (Ci.nsINativeFileWatcherService) { // Fx < 100 jsval = Cu.import(xpii + "jsm", {}); var shouldVerify = jsval.shouldVerifySignedState; if (shouldVerify.length == 1) useDbg = false, jsval.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon); } if (useDbg) { // Fx 99+ try {var exp = ChromeUtils.importESModule(xpii + "sys.mjs");} catch {exp = g.ChromeUtils.import(xpii + "jsm");} jsval = o.assign({}, exp); var env = genv(jsval.XPIInstall.installTemporaryAddon); var ref = name => {try {return env.find(name).getVariable(name).unsafeDereference();} catch {}} jsval.XPIDatabase = (ref("lazy") || {}).XPIDatabase || ref("XPIDatabase"); var proto = ref("Package").prototype; var verify = proto.verifySignedState; proto.verifySignedState = function(id) { return id ? {cert: null, signedState: undefined} : verify.apply(this, arguments); } dbg.removeAllDebuggees(); } if (disleg) jsval.XPIDatabase.isDisabledLegacy = () => false; })( "permitCPOWsInScope" in Cu ? Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}) : Cu );} catch(ex) {Cu.reportError(ex);} // bootstrap-loader.js https://forum.mozilla-russia.org/viewtopic.php?pid=795196#p795196 try {(ios => { var subst = "bootstrap-loader-config-script"; ios.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler).setSubstitution(subst, ios.newURI(String.raw` data:,/%2A%2A%2A RDFDataSource.jsm %2A%2A%2A/%0A%0Aconst NS_XML = "http://www.w3.org/XML/1998/namespace";%0Aconst NS_XMLNS = "http://www.w3.org/2000/xmlns/";%0Aconst NS_RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns%23";%0Aconst NS_NC = "http://home.netscape.com/NC-rdf%23";%0A%0Afunction isElement(obj) {%0A return Element.isInstance(obj);%0A}%0Afunction isText(obj) {%0A return obj && typeof obj == "object" && ChromeUtils.getClassName(obj) == "Text";%0A}%0A%0A/%2A%2A%0A %2A Returns either an rdf namespaced attribute or an un-namespaced attribute%0A %2A value. Returns null if neither exists,%0A %2A/%0Afunction getRDFAttribute(element, name) {%0A if (element.hasAttributeNS(NS_RDF, name))%0A return element.getAttributeNS(NS_RDF, name);%0A if (element.hasAttribute(name))%0A return element.getAttribute(name);%0A return undefined;%0A}%0A%0A/%2A%2A%0A %2A Represents an assertion in the datasource%0A %2A/%0Aclass RDFAssertion {%0A constructor(subject, predicate, object) {%0A // The subject on this assertion, an RDFSubject%0A this._subject = subject;%0A // The predicate, a string%0A this._predicate = predicate;%0A // The object, an RDFNode%0A this._object = object;%0A // The datasource this assertion exists in%0A this._ds = this._subject._ds;%0A // Marks that _DOMnode is the subject's element%0A this._isSubjectElement = false;%0A // The DOM node that represents this assertion. Could be a property element,%0A // a property attribute or the subject's element for rdf:type%0A this._DOMNode = null;%0A }%0A%0A getPredicate() {%0A return this._predicate;%0A }%0A%0A getObject() {%0A return this._object;%0A }%0A}%0A%0Aclass RDFNode {%0A equals(rdfnode) {%0A return (rdfnode.constructor === this.constructor &&%0A rdfnode._value == this._value);%0A }%0A}%0A%0A/%2A%2A%0A %2A A simple literal value%0A %2A/%0Aclass RDFLiteral extends RDFNode {%0A constructor(value) {%0A super();%0A this._value = value;%0A }%0A%0A getValue() {%0A return this._value;%0A }%0A}%0A%0A/%2A%2A%0A %2A This is an RDF node that can be a subject so a resource or a blank node%0A %2A/%0Aclass RDFSubject extends RDFNode {%0A constructor(ds) {%0A super();%0A // A lookup of the assertions with this as the subject. Keyed on predicate%0A this._assertions = {};%0A // A lookup of the assertions with this as the object. Keyed on predicate%0A this._backwards = {};%0A // The datasource this subject belongs to%0A this._ds = ds;%0A // The DOM elements in the document that represent this subject. Array of Element%0A this._elements = [];%0A }%0A%0A /%2A%2A%0A %2A Parses the given Element from the DOM document%0A %2A/%0A /%2A eslint-disable complexity %2A/%0A _parseElement(element) {%0A this._elements.push(element);%0A%0A // There might be an inferred rdf:type assertion in the element name%0A if (element.namespaceURI != NS_RDF ||%0A element.localName != "Description") {%0A var assertion = new RDFAssertion(this, RDF_R("type"),%0A this._ds.getResource(element.namespaceURI + element.localName));%0A assertion._DOMnode = element;%0A assertion._isSubjectElement = true;%0A this._addAssertion(assertion);%0A }%0A%0A // Certain attributes can be literal properties%0A for (let attr of element.attributes) {%0A if (attr.namespaceURI == NS_XML || attr.namespaceURI == NS_XMLNS ||%0A attr.nodeName == "xmlns")%0A continue;%0A if ((attr.namespaceURI == NS_RDF || !attr.namespaceURI) &&%0A (["nodeID", "about", "resource", "ID", "parseType"].includes(attr.localName)))%0A continue;%0A var object = null;%0A if (attr.namespaceURI == NS_RDF) {%0A if (attr.localName == "type")%0A object = this._ds.getResource(attr.nodeValue);%0A }%0A if (!object)%0A object = new RDFLiteral(attr.nodeValue);%0A assertion = new RDFAssertion(this, attr.namespaceURI + attr.localName, object);%0A assertion._DOMnode = attr;%0A this._addAssertion(assertion);%0A }%0A%0A var child = element.firstChild;%0A element.listCounter = 1;%0A while (child) {%0A if (isElement(child)) {%0A object = null;%0A var predicate = child.namespaceURI + child.localName;%0A if (child.namespaceURI == NS_RDF) {%0A if (child.localName == "li") {%0A predicate = RDF_R(%60_%24{element.listCounter}%60);%0A element.listCounter++;%0A }%0A }%0A%0A // Check for and bail out on unknown attributes on the property element%0A for (let attr of child.attributes) {%0A // Ignore XML namespaced attributes%0A if (attr.namespaceURI == NS_XML)%0A continue;%0A // These are reserved by XML for future use%0A if (attr.localName.substring(0, 3).toLowerCase() == "xml")%0A continue;%0A // We can handle these RDF attributes%0A if ((!attr.namespaceURI || attr.namespaceURI == NS_RDF) &&%0A ["resource", "nodeID"].includes(attr.localName))%0A continue;%0A // This is a special attribute we handle for compatibility with Mozilla RDF%0A if (attr.namespaceURI == NS_NC &&%0A attr.localName == "parseType")%0A continue;%0A }%0A%0A var parseType = child.getAttributeNS(NS_NC, "parseType");%0A%0A var resource = getRDFAttribute(child, "resource");%0A var nodeID = getRDFAttribute(child, "nodeID");%0A%0A if (resource !== undefined) {%0A var base = Services.io.newURI(element.baseURI);%0A object = this._ds.getResource(base.resolve(resource));%0A } else if (nodeID !== undefined) {%0A object = this._ds.getBlankNode(nodeID);%0A } else {%0A var hasText = false;%0A var childElement = null;%0A var subchild = child.firstChild;%0A while (subchild) {%0A if (isText(subchild) && /\S/.test(subchild.nodeValue)) {%0A hasText = true;%0A } else if (isElement(subchild)) {%0A childElement = subchild;%0A }%0A subchild = subchild.nextSibling;%0A }%0A%0A if (childElement) {%0A object = this._ds._getSubjectForElement(childElement);%0A object._parseElement(childElement);%0A } else%0A object = new RDFLiteral(child.textContent);%0A }%0A%0A assertion = new RDFAssertion(this, predicate, object);%0A this._addAssertion(assertion);%0A assertion._DOMnode = child;%0A }%0A child = child.nextSibling;%0A }%0A }%0A /%2A eslint-enable complexity %2A/%0A%0A /%2A%2A%0A %2A Adds a new assertion to the internal hashes. Should be called for every%0A %2A new assertion parsed or created programmatically.%0A %2A/%0A _addAssertion(assertion) {%0A var predicate = assertion.getPredicate();%0A if (predicate in this._assertions)%0A this._assertions[predicate].push(assertion);%0A else%0A this._assertions[predicate] = [ assertion ];%0A%0A var object = assertion.getObject();%0A if (object instanceof RDFSubject) {%0A // Create reverse assertion%0A if (predicate in object._backwards)%0A object._backwards[predicate].push(assertion);%0A else%0A object._backwards[predicate] = [ assertion ];%0A }%0A }%0A%0A /%2A%2A%0A %2A Returns all objects in assertions with this subject and the given predicate.%0A %2A/%0A getObjects(predicate) {%0A if (predicate in this._assertions)%0A return Array.from(this._assertions[predicate],%0A i => i.getObject());%0A%0A return [];%0A }%0A%0A /%2A%2A%0A %2A Retrieves the first property value for the given predicate.%0A %2A/%0A getProperty(predicate) {%0A if (predicate in this._assertions)%0A return this._assertions[predicate][0].getObject();%0A return null;%0A }%0A}%0A%0A/%2A%2A%0A %2A Creates a new RDFResource for the datasource. Private.%0A %2A/%0Aclass RDFResource extends RDFSubject {%0A constructor(ds, uri) {%0A super(ds);%0A // This is the uri that the resource represents.%0A this._uri = uri;%0A }%0A}%0A%0A/%2A%2A%0A %2A Creates a new blank node. Private.%0A %2A/%0Aclass RDFBlankNode extends RDFSubject {%0A constructor(ds, nodeID) {%0A super(ds);%0A // The nodeID of this node. May be null if there is no ID.%0A this._nodeID = nodeID;%0A }%0A%0A /%2A%2A%0A %2A Sets attributes on the DOM element to mark it as representing this node%0A %2A/%0A _applyToElement(element) {%0A if (!this._nodeID)%0A return;%0A if (USE_RDFNS_ATTR) {%0A var prefix = this._ds._resolvePrefix(element, RDF_R("nodeID"));%0A element.setAttributeNS(prefix.namespaceURI, prefix.qname, this._nodeID);%0A } else {%0A element.setAttribute("nodeID", this._nodeID);%0A }%0A }%0A%0A /%2A%2A%0A %2A Creates a new Element in the document for holding assertions about this%0A %2A subject. The URI controls what tagname to use.%0A %2A/%0A _createNewElement(uri) {%0A // If there are already nodes representing this in the document then we need%0A // a nodeID to match them%0A if (!this._nodeID && this._elements.length > 0) {%0A this._ds._createNodeID(this);%0A for (let element of this._elements)%0A this._applyToElement(element);%0A }%0A%0A return super._createNewElement.call(uri);%0A }%0A%0A /%2A%2A%0A %2A Adds a reference to this node to the given property Element.%0A %2A/%0A _addReferenceToElement(element) {%0A if (this._elements.length > 0 && !this._nodeID) {%0A // In document elsewhere already%0A // Create a node ID and update the other nodes referencing%0A this._ds._createNodeID(this);%0A for (let element of this._elements)%0A this._applyToElement(element);%0A }%0A%0A if (this._nodeID) {%0A if (USE_RDFNS_ATTR) {%0A let prefix = this._ds._resolvePrefix(element, RDF_R("nodeID"));%0A element.setAttributeNS(prefix.namespaceURI, prefix.qname, this._nodeID);%0A } else {%0A element.setAttribute("nodeID", this._nodeID);%0A }%0A } else {%0A // Add the empty blank node, this is generally right since further%0A // assertions will be added to fill this out%0A var newelement = this._ds._addElement(element, RDF_R("Description"));%0A newelement.listCounter = 1;%0A this._elements.push(newelement);%0A }%0A }%0A%0A /%2A%2A%0A %2A Removes any reference to this node from the given property Element.%0A %2A/%0A _removeReferenceFromElement(element) {%0A if (element.hasAttributeNS(NS_RDF, "nodeID"))%0A element.removeAttributeNS(NS_RDF, "nodeID");%0A if (element.hasAttribute("nodeID"))%0A element.removeAttribute("nodeID");%0A }%0A%0A getNodeID() {%0A return this._nodeID;%0A }%0A}%0A%0A/%2A%2A%0A %2A Creates a new RDFDataSource from the given document. The document will be%0A %2A changed as assertions are added and removed to the RDF. Pass a null document%0A %2A to start with an empty graph.%0A %2A/%0Aclass RDFDataSource {%0A constructor(document) {%0A // All known resources, indexed on URI%0A this._resources = {};%0A // All blank nodes%0A this._allBlankNodes = [];%0A%0A // The underlying DOM document for this datasource%0A this._document = document;%0A this._parseDocument();%0A }%0A%0A static loadFromString(text) {%0A let parser = new DOMParser();%0A let document = parser.parseFromString(text, "application/xml");%0A%0A return new this(document);%0A }%0A%0A /%2A%2A%0A %2A Returns an rdf subject for the given DOM Element. If the subject has not%0A %2A been seen before a new one is created.%0A %2A/%0A _getSubjectForElement(element) {%0A var about = getRDFAttribute(element, "about");%0A%0A if (about !== undefined) {%0A let base = Services.io.newURI(element.baseURI);%0A return this.getResource(base.resolve(about));%0A }%0A return this.getBlankNode(null);%0A }%0A%0A /%2A%2A%0A %2A Parses the document for subjects at the top level.%0A %2A/%0A _parseDocument() {%0A var domnode = this._document.documentElement.firstChild;%0A while (domnode) {%0A if (isElement(domnode)) {%0A var subject = this._getSubjectForElement(domnode);%0A subject._parseElement(domnode);%0A }%0A domnode = domnode.nextSibling;%0A }%0A }%0A%0A /%2A%2A%0A %2A Gets a blank node. nodeID may be null and if so a new blank node is created.%0A %2A If a nodeID is given then the blank node with that ID is returned or created.%0A %2A/%0A getBlankNode(nodeID) {%0A var rdfnode = new RDFBlankNode(this, nodeID);%0A this._allBlankNodes.push(rdfnode);%0A return rdfnode;%0A }%0A%0A /%2A%2A%0A %2A Gets the resource for the URI. The resource is created if it has not been%0A %2A used already.%0A %2A/%0A getResource(uri) {%0A if (uri in this._resources)%0A return this._resources[uri];%0A%0A var resource = new RDFResource(this, uri);%0A this._resources[uri] = resource;%0A return resource;%0A }%0A}%0A%0A%0A/%2A%2A%2A RDFManifestConverter.jsm %2A%2A%2A/%0A%0Aconst RDFURI_INSTALL_MANIFEST_ROOT = "urn:mozilla:install-manifest";%0A%0Afunction EM_R(aProperty) {%0A return %60http://www.mozilla.org/2004/em-rdf%23%24{aProperty}%60;%0A}%0A%0Afunction getValue(literal) {%0A return literal && literal.getValue();%0A}%0A%0Afunction getProperty(resource, property) {%0A return getValue(resource.getProperty(EM_R(property)));%0A}%0A%0Aclass Manifest {%0A constructor(ds) {%0A this.ds = ds;%0A }%0A%0A static loadFromString(text) {%0A return new this(RDFDataSource.loadFromString(text));%0A }%0A}%0A%0Aclass InstallRDF extends Manifest {%0A _readProps(source, obj, props) {%0A for (let prop of props) {%0A let val = getProperty(source, prop);%0A if (val != null) {%0A obj[prop] = val;%0A }%0A }%0A }%0A%0A _readArrayProp(source, obj, prop, target, decode = getValue) {%0A let result = Array.from(source.getObjects(EM_R(prop)),%0A target => decode(target));%0A if (result.length) {%0A obj[target] = result;%0A }%0A }%0A%0A _readArrayProps(source, obj, props, decode = getValue) {%0A for (let [prop, target] of Object.entries(props)) {%0A this._readArrayProp(source, obj, prop, target, decode);%0A }%0A }%0A%0A _readLocaleStrings(source, obj) {%0A this._readProps(source, obj, ["name", "description", "creator", "homepageURL"]);%0A this._readArrayProps(source, obj, {%0A locale: "locales",%0A developer: "developers",%0A translator: "translators",%0A contributor: "contributors",%0A });%0A }%0A%0A decode() {%0A let root = this.ds.getResource(RDFURI_INSTALL_MANIFEST_ROOT);%0A let result = {};%0A%0A let props = ["id", "version", "type", "updateURL", "optionsURL",%0A "optionsType", "aboutURL", "iconURL",%0A "bootstrap", "unpack", "strictCompatibility"];%0A this._readProps(root, result, props);%0A%0A let decodeTargetApplication = source => {%0A let app = {};%0A this._readProps(source, app, ["id", "minVersion", "maxVersion"]);%0A return app;%0A };%0A%0A let decodeLocale = source => {%0A let localized = {};%0A this._readLocaleStrings(source, localized);%0A return localized;%0A };%0A%0A this._readLocaleStrings(root, result);%0A%0A this._readArrayProps(root, result, {"targetPlatform": "targetPlatforms"});%0A this._readArrayProps(root, result, {"targetApplication": "targetApplications"},%0A decodeTargetApplication);%0A this._readArrayProps(root, result, {"localized": "localized"},%0A decodeLocale);%0A this._readArrayProps(root, result, {"dependency": "dependencies"},%0A source => getProperty(source, "id"));%0A%0A return result;%0A }%0A}%0A%0A%0A/%2A%2A%2A BootstrapLoader.jsm %2A%2A%2A/%0A%0Avar {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");%0Avar {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");%0A%0AXPCOMUtils.defineLazyModuleGetters(this, {%0A ConsoleAPI: "resource://gre/modules/Console.jsm",%0A Blocklist: "resource://gre/modules/Blocklist.jsm",%0A XPIProvider: "resource://gre/modules/addons/XPIProvider.jsm"%0A});%0A%0Avar OPTIONS_TYPE_DIALOG = 1;%0A%0AServices.obs.addObserver(doc => {%0A if (doc.location.protocol + doc.location.pathname === 'about:addons' ||%0A doc.location.protocol + doc.location.pathname === 'chrome:/content/extensions/aboutaddons.html') {%0A const win = doc.defaultView;%0A let handleEvent_orig = win.customElements.get('addon-card').prototype.handleEvent;%0A win.customElements.get('addon-card').prototype.handleEvent = function (e) {%0A if (e.type === 'click' &&%0A e.target.getAttribute('action') === 'preferences' &&%0A this.addon.optionsType == OPTIONS_TYPE_DIALOG) {%0A var windows = Services.wm.getEnumerator(null);%0A while (windows.hasMoreElements()) {%0A var win2 = windows.getNext();%0A if (win2.closed) {%0A continue;%0A }%0A if (win2.document.documentURI == this.addon.optionsURL) {%0A win2.focus();%0A return;%0A }%0A }%0A var features = 'chrome,titlebar,toolbar,centerscreen';%0A var instantApply = Services.prefs.getBoolPref('browser.preferences.instantApply');%0A features += instantApply ? ',dialog=no' : '';%0A win.docShell.rootTreeItem.domWindow.openDialog(this.addon.optionsURL, this.addon.id, features); %0A } else {%0A handleEvent_orig.apply(this, arguments);%0A }%0A }%0A let update_orig = win.customElements.get('addon-options').prototype.update;%0A win.customElements.get('addon-options').prototype.update = function (card, addon) {%0A update_orig.apply(this, arguments);%0A if (addon.optionsType == OPTIONS_TYPE_DIALOG)%0A this.querySelector('panel-item[data-l10n-id="preferences-addon-button"]').hidden = false;%0A }%0A }%0A}, 'chrome-document-loaded');%0A%0Aconst {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm");%0Aconst {XPIDatabase, AddonInternal} = ChromeUtils.import("resource://gre/modules/addons/XPIDatabase.jsm");%0A%0ACu.import("resource://gre/modules/addons/XPIDatabase.jsm", {}).defineAddonWrapperProperty("optionsType", function optionsType() {%0A if (!this.isActive) {%0A return null;%0A }%0A%0A let addon = this.__AddonInternal__;%0A let hasOptionsURL = !!this.optionsURL;%0A%0A if (addon.optionsType) {%0A switch (parseInt(addon.optionsType, 10)) {%0A case OPTIONS_TYPE_DIALOG:%0A case AddonManager.OPTIONS_TYPE_TAB:%0A case AddonManager.OPTIONS_TYPE_INLINE_BROWSER:%0A return hasOptionsURL ? addon.optionsType : null;%0A }%0A return null;%0A }%0A%0A return null;%0A});%0A%0AXPIDatabase.isDisabledLegacy = () => false;%0A%0AXPCOMUtils.defineLazyGetter(this, 'BOOTSTRAP_REASONS', () => XPIProvider.BOOTSTRAP_REASONS);%0A%0Aconst {Log} = ChromeUtils.import('resource://gre/modules/Log.jsm');%0Avar logger = Log.repository.getLogger('addons.bootstrap');%0A%0A/%2A%2A%0A %2A Valid IDs fit this pattern.%0A %2A/%0Avar gIDTest = /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]%2A\@[a-z0-9-\._]+)$/i;%0A%0A// Properties that exist in the install manifest%0Aconst PROP_METADATA = ['id', 'version', 'type', 'internalName', 'updateURL',%0A 'optionsURL', 'optionsType', 'aboutURL', 'iconURL'];%0Aconst PROP_LOCALE_SINGLE = ['name', 'description', 'creator', 'homepageURL'];%0Aconst PROP_LOCALE_MULTI = ['developers', 'translators', 'contributors'];%0A%0A// Map new string type identifiers to old style nsIUpdateItem types.%0A// Retired values:%0A// 32 = multipackage xpi file%0A// 8 = locale%0A// 256 = apiextension%0A// 128 = experiment%0A// theme = 4%0Aconst TYPES = {%0A extension: 2,%0A dictionary: 64,%0A};%0A%0Aconst COMPATIBLE_BY_DEFAULT_TYPES = {%0A extension: true,%0A dictionary: true,%0A};%0A%0Aconst hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);%0A%0Afunction isXPI(filename) {%0A let ext = filename.slice(-4).toLowerCase();%0A return ext === '.xpi' || ext === '.zip';%0A}%0A%0A/%2A%2A%0A %2A Gets an nsIURI for a file within another file, either a directory or an XPI%0A %2A file. If aFile is a directory then this will return a file: URI, if it is an%0A %2A XPI file then it will return a jar: URI.%0A %2A%0A %2A @param {nsIFile} aFile%0A %2A The file containing the resources, must be either a directory or an%0A %2A XPI file%0A %2A @param {string} aPath%0A %2A The path to find the resource at, '/' separated. If aPath is empty%0A %2A then the uri to the root of the contained files will be returned%0A %2A @returns {nsIURI}%0A %2A An nsIURI pointing at the resource%0A %2A/%0Afunction getURIForResourceInFile(aFile, aPath) {%0A if (!isXPI(aFile.leafName)) {%0A let resource = aFile.clone();%0A if (aPath)%0A aPath.split('/').forEach(part => resource.append(part));%0A%0A return Services.io.newFileURI(resource);%0A }%0A%0A return buildJarURI(aFile, aPath);%0A}%0A%0A/%2A%2A%0A %2A Creates a jar: URI for a file inside a ZIP file.%0A %2A%0A %2A @param {nsIFile} aJarfile%0A %2A The ZIP file as an nsIFile%0A %2A @param {string} aPath%0A %2A The path inside the ZIP file%0A %2A @returns {nsIURI}%0A %2A An nsIURI for the file%0A %2A/%0Afunction buildJarURI(aJarfile, aPath) {%0A let uri = Services.io.newFileURI(aJarfile);%0A uri = 'jar:' + uri.spec + '!/' + aPath;%0A return Services.io.newURI(uri);%0A}%0A%0Avar BootstrapLoader = {%0A name: 'bootstrap',%0A manifestFile: 'install.rdf',%0A async loadManifest(pkg) {%0A /%2A%2A%0A %2A Reads locale properties from either the main install manifest root or%0A %2A an em:localized section in the install manifest.%0A %2A%0A %2A @param {Object} aSource%0A %2A The resource to read the properties from.%0A %2A @param {boolean} isDefault%0A %2A True if the locale is to be read from the main install manifest%0A %2A root%0A %2A @param {string[]} aSeenLocales%0A %2A An array of locale names already seen for this install manifest.%0A %2A Any locale names seen as a part of this function will be added to%0A %2A this array%0A %2A @returns {Object}%0A %2A an object containing the locale properties%0A %2A/%0A function readLocale(aSource, isDefault, aSeenLocales) {%0A let locale = {};%0A if (!isDefault) {%0A locale.locales = [];%0A for (let localeName of aSource.locales || []) {%0A if (!localeName) {%0A logger.warn('Ignoring empty locale in localized properties');%0A continue;%0A }%0A if (aSeenLocales.includes(localeName)) {%0A logger.warn('Ignoring duplicate locale in localized properties');%0A continue;%0A }%0A aSeenLocales.push(localeName);%0A locale.locales.push(localeName);%0A }%0A%0A if (locale.locales.length == 0) {%0A logger.warn('Ignoring localized properties with no listed locales');%0A return null;%0A }%0A }%0A%0A for (let prop of [...PROP_LOCALE_SINGLE, ...PROP_LOCALE_MULTI]) {%0A if (hasOwnProperty(aSource, prop)) {%0A locale[prop] = aSource[prop];%0A }%0A }%0A%0A return locale;%0A }%0A%0A let manifestData = await pkg.readString('install.rdf');%0A let manifest = InstallRDF.loadFromString(manifestData).decode();%0A%0A let addon = new AddonInternal();%0A for (let prop of PROP_METADATA) {%0A if (hasOwnProperty(manifest, prop)) {%0A addon[prop] = manifest[prop];%0A }%0A }%0A%0A if (!addon.type) {%0A addon.type = 'extension';%0A } else {%0A let type = addon.type;%0A addon.type = null;%0A for (let name in TYPES) {%0A if (TYPES[name] == type) {%0A addon.type = name;%0A break;%0A }%0A }%0A }%0A%0A if (!(addon.type in TYPES))%0A throw new Error('Install manifest specifies unknown type: ' + addon.type);%0A%0A if (!addon.id)%0A throw new Error('No ID in install manifest');%0A if (!gIDTest.test(addon.id))%0A throw new Error('Illegal add-on ID ' + addon.id);%0A if (!addon.version)%0A throw new Error('No version in install manifest');%0A%0A addon.strictCompatibility = (!(addon.type in COMPATIBLE_BY_DEFAULT_TYPES) ||%0A manifest.strictCompatibility == 'true');%0A%0A // Only read these properties for extensions.%0A if (addon.type == 'extension') {%0A if (manifest.bootstrap != 'true') {%0A throw new Error('Non-restartless extensions no longer supported');%0A }%0A%0A if (addon.optionsType &&%0A addon.optionsType != OPTIONS_TYPE_DIALOG &&%0A addon.optionsType != AddonManager.OPTIONS_TYPE_INLINE_BROWSER &&%0A addon.optionsType != AddonManager.OPTIONS_TYPE_TAB) {%0A throw new Error('Install manifest specifies unknown optionsType: ' + addon.optionsType);%0A }%0A%0A if (addon.optionsType)%0A addon.optionsType = parseInt(addon.optionsType);%0A }%0A%0A addon.defaultLocale = readLocale(manifest, true);%0A%0A let seenLocales = [];%0A addon.locales = [];%0A for (let localeData of manifest.localized || []) {%0A let locale = readLocale(localeData, false, seenLocales);%0A if (locale)%0A addon.locales.push(locale);%0A }%0A%0A let dependencies = new Set(manifest.dependencies);%0A addon.dependencies = Object.freeze(Array.from(dependencies));%0A%0A let seenApplications = [];%0A addon.targetApplications = [];%0A for (let targetApp of manifest.targetApplications || []) {%0A if (!targetApp.id || !targetApp.minVersion ||%0A !targetApp.maxVersion) {%0A logger.warn('Ignoring invalid targetApplication entry in install manifest');%0A continue;%0A }%0A if (seenApplications.includes(targetApp.id)) {%0A logger.warn('Ignoring duplicate targetApplication entry for ' + targetApp.id +%0A ' in install manifest');%0A continue;%0A }%0A seenApplications.push(targetApp.id);%0A addon.targetApplications.push(targetApp);%0A }%0A%0A // Note that we don't need to check for duplicate targetPlatform entries since%0A // the RDF service coalesces them for us.%0A addon.targetPlatforms = [];%0A for (let targetPlatform of manifest.targetPlatforms || []) {%0A let platform = {%0A os: null,%0A abi: null,%0A };%0A%0A let pos = targetPlatform.indexOf('_');%0A if (pos != -1) {%0A platform.os = targetPlatform.substring(0, pos);%0A platform.abi = targetPlatform.substring(pos + 1);%0A } else {%0A platform.os = targetPlatform;%0A }%0A%0A addon.targetPlatforms.push(platform);%0A }%0A%0A addon.userDisabled = false;%0A addon.softDisabled = addon.blocklistState == Blocklist.STATE_SOFTBLOCKED;%0A addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;%0A%0A addon.userPermissions = null;%0A%0A addon.icons = {};%0A if (await pkg.hasResource('icon.png')) {%0A addon.icons[32] = 'icon.png';%0A addon.icons[48] = 'icon.png';%0A }%0A%0A if (await pkg.hasResource('icon64.png')) {%0A addon.icons[64] = 'icon64.png';%0A }%0A%0A return addon;%0A },%0A%0A loadScope(addon) {%0A let file = addon.file || addon._sourceBundle;%0A let uri = getURIForResourceInFile(file, 'bootstrap.js').spec;%0A let principal = Services.scriptSecurityManager.getSystemPrincipal();%0A%0A let sandbox = new Cu.Sandbox(principal, {%0A sandboxName: uri,%0A addonId: addon.id,%0A wantGlobalProperties: ['ChromeUtils'],%0A metadata: { addonID: addon.id, URI: uri },%0A });%0A%0A try {%0A Object.assign(sandbox, BOOTSTRAP_REASONS);%0A%0A XPCOMUtils.defineLazyGetter(sandbox, 'console', () =>%0A new ConsoleAPI({ consoleID: %60addon/%24{addon.id}%60 }));%0A%0A Services.scriptloader.loadSubScript(uri, sandbox);%0A } catch (e) {%0A logger.warn(%60Error loading bootstrap.js for %24{addon.id}%60, e);%0A }%0A%0A function findMethod(name) {%0A if (sandbox[name]) {%0A return sandbox[name];%0A }%0A%0A try {%0A let method = Cu.evalInSandbox(name, sandbox);%0A return method;%0A } catch (err) { }%0A%0A return () => {%0A logger.warn(%60Add-on %24{addon.id} is missing bootstrap method %24{name}%60);%0A };%0A }%0A%0A let install = findMethod('install');%0A let uninstall = findMethod('uninstall');%0A let startup = findMethod('startup');%0A let shutdown = findMethod('shutdown');%0A%0A return {%0A install(...args) {%0A install(...args);%0A // Forget any cached files we might've had from this extension.%0A Services.obs.notifyObservers(null, 'startupcache-invalidate');%0A },%0A%0A uninstall(...args) {%0A uninstall(...args);%0A // Forget any cached files we might've had from this extension.%0A Services.obs.notifyObservers(null, 'startupcache-invalidate');%0A },%0A%0A startup(...args) {%0A if (addon.type == 'extension') {%0A logger.debug(%60Registering manifest for %24{file.path}\n%60);%0A Components.manager.addBootstrappedManifestLocation(file);%0A }%0A return startup(...args);%0A },%0A%0A shutdown(data, reason) {%0A try {%0A return shutdown(data, reason);%0A } catch (err) {%0A throw err;%0A } finally {%0A if (reason != BOOTSTRAP_REASONS.APP_SHUTDOWN) {%0A logger.debug(%60Removing manifest for %24{file.path}\n%60);%0A Components.manager.removeBootstrappedManifestLocation(file);%0A }%0A }%0A },%0A };%0A },%0A};%0A%0AAddonManager.addExternalExtensionLoader(BootstrapLoader);%0A%0Aif (AddonManager.isReady) {%0A AddonManager.getAllAddons().then(addons => {%0A addons.forEach(addon => {%0A if (addon.type == 'extension' && !addon.isWebExtension && !addon.userDisabled) {%0A addon.reload();%0A };%0A });%0A });%0A}%0A%0AObject.defineProperty(%0A AddonInternal.prototype,%0A "providesUpdatesSecurely",%0A {enumerable: true, value: true}%0A);%0A `.trim())); Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader) .loadSubScript("resource://" + subst, new Cu.Sandbox(Cu.getObjectPrincipal(this), {wantGlobalProperties: ["ChromeUtils", "DOMParser", "Element", "fetch"]})); })(Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService));} catch(ex) {Cu.reportError(ex);} // https://forum.mozilla-russia.org/viewtopic.php?pid=780458#p780458 //(async xp => { // var imprt, ids = [ // "custombuttons@xsms.org", // ]; // if (Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).inSafeMode) return; // // if (Cr.NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) // var {XPIInternal} = (imprt = url => Cu.import(url, {}))(xp); // else { // Fx 101+ // var g = Cu.getGlobalForObject(Cu), te = new g.TextEncoder(); // var imp = g.ChromeUtils.import, {XPIInternal} = imp(xp); // var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); // var rph = ios.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler); // imprt = (url, id) => { // var subst = te.encode(id).join(""); // rph.setSubstitution(subst, ios.newURI(url)); // return imp(`resource://${subst}/`); // } // } // var load = async (file, id) => { // var rootURI = XPIInternal.getURIForResourceInFile(file, ""); // imprt(rootURI.resolve("startup.jsm"), id).start(rootURI); // } // var proto = XPIInternal.BootstrapScope.prototype; // var func = proto._beforeCallBootstrapMethod; // proto._beforeCallBootstrapMethod = () => { // proto._beforeCallBootstrapMethod = func; // for(var {id, loader, file} of XPIInternal.XPIStates.enabledAddons()) // ids.includes(id) && !loader && load(file, id); // } //})("resource://gre/modules/addons/XPIProvider.jsm");//
Отредактировано vitalii201 (16-05-2023 10:00:57)
Отсутствует
Farby, забыл указать. Добавил ↑.
Отсутствует
vitalii201
Странно, но мне удалось такое воспроизвести на версии custom_buttons-0.0.7.0.0.30-fx-bootstrap, то есть сжатые поля для редактирования. Попробуте почистит папку startupCache в ручную, и стиль для черного режима в userChrome.css, если надо
/* * Edit this file and copy it as userChrome.css into your * profile-directory/chrome/ * https://forum.mozilla-russia.org/viewtopic.php?pid=799907#p799907 */ @-moz-document url-prefix(chrome://custombuttons/content/editor.xul) { @media (prefers-color-scheme: dark) { * { color: #eee !important; } tab, tabpanels, #accelkey, [anonid=qstextbox], image.checkbox-check:not([checked]) { border: 1px solid gray !important; } tab, tabpanels, caption, #accelkey, [anonid=qstextbox], menupopup, menuitem, menuseparator, toolbox, textbox[multiline] { appearance: none !important; } caption, input, textarea, menupopup, #accelkey, [anonid=qstextbox], menuitem:not([_moz-menuactive]), image.checkbox-check:not([checked]), scrollbox, textbox[multiline] { background-color: #23222b !important; } tab { height: 24px !important; border-bottom: none !important; margin-inline-end: -1px !important; } tab:hover, menuitem[_moz-menuactive], checkbox:not([checked]):hover > .checkbox-check { background-color: #52525e !important; } tab[selected] { background-color: navy !important; } tab[selected]:hover { background-color: mediumblue !important; } fieldset { border-color: gray !important; } .cbeditor-textbox { padding: 2px 3px !important; } label[control]:hover { color: #ffa !important; } #textbox-contextmenu > menuitem { min-height: 22px !important; } #textbox-contextmenu > menuseparator { padding: 0 !important; height: 1px !important; border: none !important; margin-block: 3px !important; background-color: gray !important; } } }
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует